Fixed #1671 (simplifyTypedef: support for more typedefs)

This commit is contained in:
Robert Reif 2010-05-29 07:52:06 +02:00 committed by Daniel Marjamäki
parent 3fb0260ef1
commit 1a25183e8f
2 changed files with 42 additions and 14 deletions

View File

@ -743,7 +743,8 @@ void Tokenizer::simplifyTypedef()
bool ptrToArray = false; bool ptrToArray = false;
bool refToArray = false; bool refToArray = false;
bool ptrMember = false; bool ptrMember = false;
Token *functionNamespace = 0; Token *namespaceStart = 0;
Token *namespaceEnd = 0;
if (Token::Match(tok->next(), "::") || if (Token::Match(tok->next(), "::") ||
Token::Match(tok->next(), "%type%")) Token::Match(tok->next(), "%type%"))
@ -925,9 +926,12 @@ void Tokenizer::simplifyTypedef()
tok = specEnd->next(); tok = specEnd->next();
} }
} }
else if (tok->tokAt(offset) && Token::Match(tok->tokAt(offset), "( %var% :: *|&| const|volatile| const|volatile| %type% ) (")) else if (tok->tokAt(offset) && Token::Match(tok->tokAt(offset), "( ::| %var% :: *|&| const|volatile| const|volatile| %type% ) ("))
{ {
functionNamespace = tok->tokAt(offset + 1); namespaceStart = tok->tokAt(offset + 1);
if (tok->tokAt(offset + 1)->str() == "::")
offset++;
namespaceEnd = tok->tokAt(offset + 2);
functionPtr = tok->tokAt(offset + 3)->str() == "*"; functionPtr = tok->tokAt(offset + 3)->str() == "*";
functionRef = tok->tokAt(offset + 3)->str() == "&"; functionRef = tok->tokAt(offset + 3)->str() == "&";
function = tok->tokAt(offset + 4)->str() == ")"; function = tok->tokAt(offset + 4)->str() == ")";
@ -1044,7 +1048,8 @@ void Tokenizer::simplifyTypedef()
// pointer to class member // pointer to class member
else if (tok->tokAt(offset) && Token::Match(tok->tokAt(offset), "( %type% :: * %type% ) ;")) else if (tok->tokAt(offset) && Token::Match(tok->tokAt(offset), "( %type% :: * %type% ) ;"))
{ {
functionNamespace = tok->tokAt(offset + 1); namespaceStart = tok->tokAt(offset + 1);
namespaceEnd = tok->tokAt(offset + 2);
ptrMember = true; ptrMember = true;
typeName = tok->tokAt(offset + 4); typeName = tok->tokAt(offset + 4);
tok = tok->tokAt(offset + 6); tok = tok->tokAt(offset + 6);
@ -1218,11 +1223,17 @@ void Tokenizer::simplifyTypedef()
tok2 = tok2->next(); tok2 = tok2->next();
} }
Token *tok3 = tok2; Token *tok3 = tok2;
if (functionNamespace) if (namespaceStart)
{ {
tok2->insertToken(functionNamespace->str()); const Token *tok4 = namespaceStart;
while (tok4 != namespaceEnd)
{
tok2->insertToken(tok4->str());
tok2 = tok2->next(); tok2 = tok2->next();
tok2->insertToken("::"); tok4 = tok4->next();
}
tok2->insertToken(namespaceEnd->str());
tok2 = tok2->next(); tok2 = tok2->next();
} }
if (functionPtr) if (functionPtr)
@ -1428,10 +1439,15 @@ void Tokenizer::simplifyTypedef()
tok2 = tok2->next(); tok2 = tok2->next();
Token *tok3 = tok2; Token *tok3 = tok2;
tok2->insertToken(functionNamespace->str()); const Token *tok4 = namespaceStart;
tok2 = tok2->next();
tok2->insertToken("::"); while (tok4 != namespaceEnd)
{
tok2->insertToken(tok4->str());
tok2 = tok2->next();
tok4 = tok4->next();
}
tok2->insertToken(namespaceEnd->str());
tok2 = tok2->next(); tok2 = tok2->next();
tok2->insertToken("*"); tok2->insertToken("*");

View File

@ -4309,6 +4309,10 @@ private:
"typedef int ( C :: * const type6 ) ( float ) ;\n" "typedef int ( C :: * const type6 ) ( float ) ;\n"
"typedef int ( C :: * volatile type7 ) ( float ) ;\n" "typedef int ( C :: * volatile type7 ) ( float ) ;\n"
"typedef int ( C :: * const volatile type8 ) ( float ) ;\n" "typedef int ( C :: * const volatile type8 ) ( float ) ;\n"
"typedef int ( :: C :: * type9 ) ( float ) ;\n"
"typedef int ( :: C :: * const type10 ) ( float ) ;\n"
"typedef int ( :: C :: * volatile type11 ) ( float ) ;\n"
"typedef int ( :: C :: * const volatile type12 ) ( float ) ;\n"
"type1 t1;\n" "type1 t1;\n"
"type2 t2;\n" "type2 t2;\n"
"type3 t3;\n" "type3 t3;\n"
@ -4316,10 +4320,14 @@ private:
"type5 t5;\n" "type5 t5;\n"
"type6 t6;\n" "type6 t6;\n"
"type7 t7;\n" "type7 t7;\n"
"type8 t8;"; "type8 t8;\n"
"type9 t9;\n"
"type10 t10;\n"
"type11 t11;\n"
"type12 t12;";
// The expected result.. // The expected result..
const std::string expected("; ; ; ; ; ; ; ; " const std::string expected("; ; ; ; ; ; ; ; ; ; ; ; "
"int * t1 ; " // simplified to regular pointer "int * t1 ; " // simplified to regular pointer
"int ( * const t2 ) ( float ) ; " "int ( * const t2 ) ( float ) ; "
"int * t3 ; " // volatile removed, gets simplified to regular pointer "int * t3 ; " // volatile removed, gets simplified to regular pointer
@ -4327,7 +4335,11 @@ private:
"int ( C :: * t5 ) ( float ) ; " "int ( C :: * t5 ) ( float ) ; "
"int ( C :: * const t6 ) ( float ) ; " "int ( C :: * const t6 ) ( float ) ; "
"int ( C :: * t7 ) ( float ) ; " // volatile removed "int ( C :: * t7 ) ( float ) ; " // volatile removed
"int ( C :: * const t8 ) ( float ) ;"); // volatile removed "int ( C :: * const t8 ) ( float ) ; " // volatile removed
"int ( :: C :: * t9 ) ( float ) ; "
"int ( :: C :: * const t10 ) ( float ) ; "
"int ( :: C :: * t11 ) ( float ) ; " // volatile removed
"int ( :: C :: * const t12 ) ( float ) ;"); // volatile removed
ASSERT_EQUALS(expected, tok(code, false)); ASSERT_EQUALS(expected, tok(code, false));
checkSimplifyTypedef(code); checkSimplifyTypedef(code);