Robert Reif: Fixed #1162 (add support to tokenize typedefs with templates)

This commit is contained in:
Daniel Marjamäki 2009-12-29 07:28:00 +01:00
parent d3d3ad101f
commit 84ce6ba75a
2 changed files with 80 additions and 17 deletions

View File

@ -395,11 +395,6 @@ void Tokenizer::simplifyTypedef()
else if (tok->str() != "typedef")
continue;
const char *type1 = 0;
const char *type2 = 0;
const char *typeName = 0;
bool pointer = false;
// pull struct name { ... } out of typedef
if (Token::Match(tok->next(), "struct %type% {"))
{
@ -472,10 +467,51 @@ void Tokenizer::simplifyTypedef()
tok = tok3;
}
if (Token::Match(tok->next(), "%type% *| %type% ;") ||
const char *type1 = 0;
const char *type2 = 0;
const char *typeName = 0;
bool pointer = false;
Token *start = 0;
Token *end = 0;
if (Token::Match(tok->next(), "%type% <") ||
Token::Match(tok->next(), "%type% :: %type% <") ||
Token::Match(tok->next(), "%type% *| %type% ;") ||
Token::Match(tok->next(), "%type% %type% *| %type% ;"))
{
if (tok->tokAt(3)->str() == ";")
if ((tok->tokAt(2)->str() == "<") ||
(tok->tokAt(4) && (tok->tokAt(4)->str() == "<")))
{
int level = 1;
start = tok->next();
if (tok->tokAt(2)->str() == "<")
end = tok->tokAt(3);
else
end = tok->tokAt(5);
for (; end ; end = end->next())
{
if (end->str() == ">")
{
level--;
if (level == 0)
break;
}
if (end->str() == "<")
level++;
}
if (Token::Match(end->next(), "%type% ;"))
{
typeName = end->strAt(1);
tok = end->tokAt(2);
}
else
continue;
}
else if (tok->tokAt(3)->str() == ";")
{
type1 = tok->strAt(1);
type2 = 0;
@ -548,7 +584,9 @@ void Tokenizer::simplifyTypedef()
Token::Match(tok2->tokAt(-3), "!!typedef"))
{
// Check for enum and typedef with same name.
if (tok2->tokAt(-1)->str() != type1)
if (type1 && (tok2->tokAt(-1)->str() != type1))
simplifyType = true;
else if (!type1)
simplifyType = true;
}
else
@ -560,6 +598,18 @@ void Tokenizer::simplifyTypedef()
}
if (simplifyType)
{
if (start && end)
{
tok2->str(start->str());
Token * nextToken;
for (nextToken = start->next(); nextToken != end->next(); nextToken = nextToken->next())
{
tok2->insertToken(nextToken->strAt(0));
tok2 = tok2->next();
}
}
else
{
tok2->str(type1);
if (type2)
@ -572,6 +622,7 @@ void Tokenizer::simplifyTypedef()
tok2->insertToken("*");
tok2 = tok2->next();
}
}
simplifyType = false;
}

View File

@ -2294,6 +2294,9 @@ private:
"typedef struct t { int a; } T, *TP;"
"typedef enum { a = 0 , b = 1 , c = 2 } abc;"
"typedef enum xyz { a = 0 , b = 1 , c = 2 } ABC;"
"typedef vector<int> V1;"
"typedef std::vector<int> V2;"
"typedef std::vector<std::vector<int> > V3;"
"INT ti;\n"
"UINT tui;\n"
"PINT tpi;\n"
@ -2303,7 +2306,10 @@ private:
"T t;\n"
"TP tp;\n"
"abc e1;\n"
"ABC e2;";
"ABC e2;\n"
"V1 v1;\n"
"V2 v2;\n"
"V3 v3;";
const char expected[] =
"typedef int INT ; "
@ -2314,6 +2320,9 @@ private:
"struct t { int a ; } ; typedef struct t T ; typedef struct t * TP ; "
"enum abc { a = 0 , b = 1 , c = 2 } ; typedef enum abc abc ; "
"enum xyz { a = 0 , b = 1 , c = 2 } ; typedef enum xyz ABC ; "
"typedef vector < int > V1 ; "
"typedef std :: vector < int > V2 ; "
"typedef std :: vector < std :: vector < int > > V3 ; "
"int ti ; "
"unsigned int tui ; "
"int * tpi ; "
@ -2323,7 +2332,10 @@ private:
"struct t t ; "
"struct t * tp ; "
"enum abc e1 ; "
"enum xyz e2 ;";
"enum xyz e2 ; "
"vector < int > v1 ; "
"std :: vector < int > v2 ; "
"std :: vector < std :: vector < int > > v3 ;";
ASSERT_EQUALS(expected, tok(code, false));
}