From 02122258598b3c3bec547dcf750aecfe3f816764 Mon Sep 17 00:00:00 2001 From: Robert Reif Date: Wed, 13 Jan 2010 07:59:47 +0100 Subject: [PATCH] Tokenizer: fixed typedef issues --- lib/tokenize.cpp | 7 +++++-- test/testsimplifytokens.cpp | 8 ++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 2ed03445c..cfcd72660 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -455,8 +455,8 @@ void Tokenizer::simplifyTypedef() Token::Match(tok->next(), "%type% :: %type% <") || Token::Match(tok->next(), "%type% *| %type% ;") || Token::Match(tok->next(), "%type% %type% *| %type% ;") || - Token::Match(tok->next(), "%type% *| %type% [ %num% ]") || - Token::Match(tok->next(), "%type% %type% *| %type% [ %num% ]")) + Token::Match(tok->next(), "%type% *| %type% [ %num% ] ;") || + Token::Match(tok->next(), "%type% %type% *| %type% [ %num% ] ;")) { if ((tok->tokAt(2)->str() == "<") || (tok->tokAt(4) && (tok->tokAt(4)->str() == "<"))) @@ -482,6 +482,9 @@ void Tokenizer::simplifyTypedef() level++; } + while (end && end->next() && Token::Match(end->next(), ":: %type%")) + end = end->tokAt(2); + if (end && end->next() && Token::Match(end->next(), "%type% ;")) { typeName = end->strAt(1); diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index 368592c08..28afaae21 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -2408,17 +2408,21 @@ private: const char code[] = "typedef vector V1;\n" "typedef std::vector V2;\n" "typedef std::vector > V3;\n" + "typedef std::list::iterator IntListIterator;\n" "V1 v1;\n" "V2 v2;\n" - "V3 v3;"; + "V3 v3;\n" + "IntListIterator iter;"; const char expected[] = "typedef vector < int > V1 ; " "typedef std :: vector < int > V2 ; " "typedef std :: vector < std :: vector < int > > V3 ; " + "typedef std :: list < int > :: iterator IntListIterator ; " "vector < int > v1 ; " "std :: vector < int > v2 ; " - "std :: vector < std :: vector < int > > v3 ;"; + "std :: vector < std :: vector < int > > v3 ; " + "std :: list < int > :: iterator iter ;"; ASSERT_EQUALS(expected, tok(code, false)); }