Fixed #2680 (setVarId: variables with class qualification don't get varid)
This commit is contained in:
parent
c27ecf5aeb
commit
2b1277aa64
|
@ -3603,6 +3603,11 @@ void Tokenizer::setVarId()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @todo better handling when classes in different scopes have the same name */
|
||||||
|
std::string className;
|
||||||
|
if (Token::Match(tok2, "class|struct %type% [:{]"))
|
||||||
|
className = tok2->strAt(1);
|
||||||
|
|
||||||
// Set start token
|
// Set start token
|
||||||
if (Token::Match(tok2, "class|struct"))
|
if (Token::Match(tok2, "class|struct"))
|
||||||
{
|
{
|
||||||
|
@ -3621,9 +3626,17 @@ void Tokenizer::setVarId()
|
||||||
const char c = tok2->str()[0];
|
const char c = tok2->str()[0];
|
||||||
if (c == varname[0])
|
if (c == varname[0])
|
||||||
{
|
{
|
||||||
const std::string &prev = tok2->strAt(-1);
|
if (tok2->str() == varname)
|
||||||
if (tok2->str() == varname && prev != "struct" && prev != "union" && prev != "::" && prev != "." && tok2->strAt(1) != "::")
|
{
|
||||||
tok2->varId(_varId);
|
const std::string &prev = tok2->previous()->str();
|
||||||
|
|
||||||
|
/** @todo better handling when classes in different scopes have the same name */
|
||||||
|
if (!className.empty() && Token::simpleMatch(tok2->tokAt(-2), className.c_str()) && prev == "::")
|
||||||
|
tok2->varId(_varId);
|
||||||
|
|
||||||
|
else if (tok2->str() == varname && prev != "struct" && prev != "union" && prev != "::" && prev != "." && tok2->strAt(1) != "::")
|
||||||
|
tok2->varId(_varId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (c == '{')
|
else if (c == '{')
|
||||||
++indentlevel;
|
++indentlevel;
|
||||||
|
|
|
@ -196,6 +196,7 @@ private:
|
||||||
TEST_CASE(varidclass9);
|
TEST_CASE(varidclass9);
|
||||||
TEST_CASE(varidclass10); // variable declaration below usage
|
TEST_CASE(varidclass10); // variable declaration below usage
|
||||||
TEST_CASE(varidclass11); // variable declaration below usage
|
TEST_CASE(varidclass11); // variable declaration below usage
|
||||||
|
TEST_CASE(varidclass12);
|
||||||
|
|
||||||
TEST_CASE(file1);
|
TEST_CASE(file1);
|
||||||
TEST_CASE(file2);
|
TEST_CASE(file2);
|
||||||
|
@ -3481,6 +3482,22 @@ private:
|
||||||
ASSERT_EQUALS(expected, tokenizeDebugListing(code));
|
ASSERT_EQUALS(expected, tokenizeDebugListing(code));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void varidclass12()
|
||||||
|
{
|
||||||
|
const std::string code("class Fred {\n"
|
||||||
|
" int a;\n"
|
||||||
|
" void f() { Fred::a = 0; }\n"
|
||||||
|
"};\n");
|
||||||
|
|
||||||
|
const std::string expected("\n\n##file 0\n"
|
||||||
|
"1: class Fred {\n"
|
||||||
|
"2: int a@1 ;\n"
|
||||||
|
"3: void f ( ) { Fred :: a@1 = 0 ; }\n"
|
||||||
|
"4: } ;\n");
|
||||||
|
|
||||||
|
ASSERT_EQUALS(expected, tokenizeDebugListing(code));
|
||||||
|
}
|
||||||
|
|
||||||
void file1()
|
void file1()
|
||||||
{
|
{
|
||||||
const char code[] = "a1\n"
|
const char code[] = "a1\n"
|
||||||
|
|
Loading…
Reference in New Issue