Fix ticket #25 (simplify "void f(x) int x; {" into "void f(int x) {")
This commit is contained in:
parent
6ce23670e5
commit
e764cc4f95
|
@ -67,6 +67,22 @@ void Token::deleteNext()
|
||||||
_next->previous(this);
|
_next->previous(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Token::replace(Token *replaceThis, Token *start, Token *end)
|
||||||
|
{
|
||||||
|
// Fix the whole in the old location of start and end
|
||||||
|
start->previous()->next(end->next());
|
||||||
|
end->next()->previous(start->previous());
|
||||||
|
|
||||||
|
// Move start and end to their new location
|
||||||
|
replaceThis->previous()->next(start);
|
||||||
|
replaceThis->next()->previous(end);
|
||||||
|
start->previous(replaceThis->previous());
|
||||||
|
end->next(replaceThis->next());
|
||||||
|
|
||||||
|
// Delete old token, which is replaced
|
||||||
|
delete replaceThis;
|
||||||
|
}
|
||||||
|
|
||||||
const Token *Token::tokAt(int index) const
|
const Token *Token::tokAt(int index) const
|
||||||
{
|
{
|
||||||
const Token *tok = this;
|
const Token *tok = this;
|
||||||
|
|
|
@ -176,6 +176,15 @@ public:
|
||||||
*/
|
*/
|
||||||
void printOut(const char *title = 0) const;
|
void printOut(const char *title = 0) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace token replaceThis with tokens between start and end,
|
||||||
|
* including start and end. The replaceThis token is deleted.
|
||||||
|
* @param replaceThis, this token will be deleted.
|
||||||
|
* @param start This will be in the place of replaceThis
|
||||||
|
* @param end This is also in the place of replaceThis
|
||||||
|
*/
|
||||||
|
static void replace(Token *replaceThis, Token *start, Token *end);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void next(Token *next);
|
void next(Token *next);
|
||||||
void previous(Token *previous);
|
void previous(Token *previous);
|
||||||
|
|
|
@ -897,6 +897,7 @@ void Tokenizer::simplifyTokenList()
|
||||||
}
|
}
|
||||||
|
|
||||||
simplifyIfAddBraces();
|
simplifyIfAddBraces();
|
||||||
|
simplifyFunctionParameters();
|
||||||
|
|
||||||
for (Token *tok = _tokens; tok; tok = tok->next())
|
for (Token *tok = _tokens; tok; tok = tok->next())
|
||||||
{
|
{
|
||||||
|
@ -1278,6 +1279,90 @@ bool Tokenizer::simplifyCasts()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Tokenizer::simplifyFunctionParameters()
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
int indentlevel = 0;
|
||||||
|
for (Token *tok = _tokens; tok; tok = tok->next())
|
||||||
|
{
|
||||||
|
if (tok->str() == "{")
|
||||||
|
++indentlevel;
|
||||||
|
|
||||||
|
else if (tok->str() == "}")
|
||||||
|
--indentlevel;
|
||||||
|
|
||||||
|
// Find the function e.g. foo( x ) or foo( x, y )
|
||||||
|
else if (indentlevel == 0 && Token::Match(tok, "%var% ( %var% [,)]"))
|
||||||
|
{
|
||||||
|
// We have found old style function, now we need to change it
|
||||||
|
|
||||||
|
// Get list of argument names
|
||||||
|
std::map<std::string, Token*> argumentNames;
|
||||||
|
bool bailOut = false;
|
||||||
|
for (tok = tok->tokAt(2); tok; tok = tok->tokAt(2))
|
||||||
|
{
|
||||||
|
if (!Token::Match(tok, "%var% [,)]"))
|
||||||
|
{
|
||||||
|
bailOut = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
argumentNames[tok->str()] = tok;
|
||||||
|
if (tok->next()->str() == ")")
|
||||||
|
{
|
||||||
|
tok = tok->tokAt(2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bailOut)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
Token *start = tok;
|
||||||
|
while (tok && tok->str() != "{")
|
||||||
|
{
|
||||||
|
if (tok->str() == ";")
|
||||||
|
{
|
||||||
|
tok = tok->previous();
|
||||||
|
// Move tokens from start to tok into the place of
|
||||||
|
// argumentNames[tok->str()] and remove the ";"
|
||||||
|
|
||||||
|
if (argumentNames.find(tok->str()) == argumentNames.end())
|
||||||
|
{
|
||||||
|
bailOut = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the following ";"
|
||||||
|
Token *temp = tok->tokAt(2);
|
||||||
|
tok->deleteNext();
|
||||||
|
|
||||||
|
// Replace "x" with "int x" or similar
|
||||||
|
Token::replace(argumentNames[tok->str()], start, tok);
|
||||||
|
ret = true;
|
||||||
|
tok = temp;
|
||||||
|
start = tok;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
tok = tok->next();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bailOut)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
++indentlevel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool Tokenizer::simplifyFunctionReturn()
|
bool Tokenizer::simplifyFunctionReturn()
|
||||||
{
|
{
|
||||||
|
|
|
@ -139,6 +139,12 @@ private:
|
||||||
*/
|
*/
|
||||||
bool simplifyRedundantParanthesis();
|
bool simplifyRedundantParanthesis();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simplify functions like "void f(x) int x; {"
|
||||||
|
* into "void f(int x) {"
|
||||||
|
*/
|
||||||
|
bool simplifyFunctionParameters();
|
||||||
|
|
||||||
void InsertTokens(Token *dest, Token *src, unsigned int n);
|
void InsertTokens(Token *dest, Token *src, unsigned int n);
|
||||||
|
|
||||||
Token *_tokensBack;
|
Token *_tokensBack;
|
||||||
|
|
|
@ -73,7 +73,7 @@ private:
|
||||||
|
|
||||||
TEST_CASE(doublesharp);
|
TEST_CASE(doublesharp);
|
||||||
|
|
||||||
// TODO TEST_CASE(simplify_function_parameters);
|
TEST_CASE(simplify_function_parameters);
|
||||||
|
|
||||||
TEST_CASE(reduce_redundant_paranthesis); // Ticket #61
|
TEST_CASE(reduce_redundant_paranthesis); // Ticket #61
|
||||||
}
|
}
|
||||||
|
@ -749,7 +749,7 @@ private:
|
||||||
std::ostringstream ostr;
|
std::ostringstream ostr;
|
||||||
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
||||||
ostr << " " << tok->str();
|
ostr << " " << tok->str();
|
||||||
ASSERT_EQUALS(std::string(" void f ( int x, char y ) { }"), ostr.str());
|
ASSERT_EQUALS(std::string(" void f ( int x , char y ) { }"), ostr.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -771,7 +771,7 @@ private:
|
||||||
std::ostringstream ostr;
|
std::ostringstream ostr;
|
||||||
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
||||||
ostr << " " << tok->str();
|
ostr << " " << tok->str();
|
||||||
ASSERT_EQUALS(std::string(" void foo ( ) { if ( x ) int x ; { } }"), ostr.str());
|
ASSERT_EQUALS(std::string(" void foo ( ) { if ( x ) { int x ; } { } }"), ostr.str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue