diff --git a/src/tokenize.cpp b/src/tokenize.cpp index d26e69cd3..e5689cde7 100644 --- a/src/tokenize.cpp +++ b/src/tokenize.cpp @@ -2309,6 +2309,61 @@ bool Tokenizer::simplifyVarDecl() tok2 = tok2->tokAt(6); // The ',' token } + else if (Token::Match(tok2, "std :: %type% <") || Token::Match(tok2, "%type% <")) + { + // + // Deal with templates and standart types + // + if (Token::simpleMatch(tok2, "std ::")) + { + typelen += 1; + tok2 = tok2->tokAt(2); + } + + typelen += 2; + tok2 = tok2->tokAt(2); + size_t indentlevel = 1; + + for (Token *tok3 = tok2; tok3; tok3 = tok3->next()) + { + ++typelen; + + if (tok3->str() == "<") + { + ++indentlevel; + } + else if (tok3->str() == ">") + { + --indentlevel; + if (indentlevel == 0) + { + tok2 = tok3->next(); + break; + } + } + } + + if (Token::Match(tok2, ":: %type%")) + { + typelen += 2; + tok2 = tok2->tokAt(2); + } + + if (tok2->str() == "*" || tok2->str() == "&") + { + tok2 = tok2->next(); + } + + if (Token::Match(tok2, "%var% ,")) + { + tok2 = tok2->next(); // The ',' token + } + else + { + tok2 = NULL; + typelen = 0; + } + } else { tok2 = NULL; diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 9e79f7f03..b484df4d2 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -153,6 +153,7 @@ private: TEST_CASE(vardecl3); TEST_CASE(vardecl4); TEST_CASE(vardecl5); + TEST_CASE(vardecl_stl); TEST_CASE(volatile_variables); TEST_CASE(syntax_error); @@ -2202,6 +2203,23 @@ private: ASSERT_EQUALS(res4, tokenizeAndStringify(code4)); } + void vardecl_stl() + { + // ticket #520 + + const char code1[] = "std::vectora, b;"; + const char res1[] = "std :: vector < std :: string > a ; std :: vector < std :: string > b ;"; + ASSERT_EQUALS(res1, tokenizeAndStringify(code1)); + + const char code2[] = "std::vector::const_iterator it, cit;"; + const char res2[] = "std :: vector < std :: string > :: const_iterator it ; std :: vector < std :: string > :: const_iterator cit ;"; + ASSERT_EQUALS(res2, tokenizeAndStringify(code2)); + + const char code3[] = "std::vector > *c, d;"; + const char res3[] = "std :: vector < std :: pair < std :: string , std :: string > > * c ; std :: vector < std :: pair < std :: string , std :: string > > d ;"; + ASSERT_EQUALS(res3, tokenizeAndStringify(code3)); + } + void vardecl5() { // don't simplify declarations of static variables