Tokenizer::setVarIdNew: fixed TestTokenizer::varid_in_class2 test case

This commit is contained in:
Daniel Marjamäki 2012-04-22 08:51:19 +02:00
parent 79af6f65d7
commit 71050bc586
2 changed files with 43 additions and 27 deletions

View File

@ -2901,6 +2901,41 @@ static void setVarIdClassDeclaration(Token * const startToken, const std::map<st
}
static void setVarIdStructMembers(Token **tok1,
std::map<unsigned int, std::map<std::string,unsigned int> > *structMembers,
unsigned int *_varId)
{
Token *tok = *tok1;
while (Token::Match(tok->next(), ". %var% !!(")) {
const unsigned int struct_varid = tok->varId();
tok = tok->tokAt(2);
if (struct_varid == 0)
continue;
std::map<unsigned int, std::map<std::string,unsigned int> >::iterator structIterator;
structIterator = structMembers->find(struct_varid);
if (structIterator == structMembers->end()) {
std::map<std::string,unsigned int> members;
members[tok->str()] = ++ (*_varId);
(*structMembers)[struct_varid] = members;
tok->varId(*_varId);
} else {
std::map<std::string,unsigned int> &members = structIterator->second;
std::map<std::string,unsigned int>::const_iterator memberIterator;
memberIterator = members.find(tok->str());
if (memberIterator == members.end()) {
members[tok->str()] = ++(*_varId);
tok->varId(*_varId);
} else {
tok->varId(memberIterator->second);
}
}
}
if (tok)
*tok1 = tok;
}
void Tokenizer::setVarIdNew()
{
// Clear all variable ids
@ -3005,31 +3040,7 @@ void Tokenizer::setVarIdNew()
const std::map<std::string, unsigned int>::const_iterator it = variableId.find(tok->str());
if (it != variableId.end()) {
tok->varId(it->second);
while (Token::Match(tok->next(), ". %var% !!(")) {
const unsigned int struct_varid = it->second;
tok = tok->tokAt(2);
if (struct_varid == 0)
continue;
std::map<unsigned int, std::map<std::string,unsigned int> >::iterator structIterator;
structIterator = structMembers.find(struct_varid);
if (structIterator == structMembers.end()) {
std::map<std::string,unsigned int> members;
members[tok->str()] = ++_varId;
structMembers[struct_varid] = members;
tok->varId(_varId);
} else {
std::map<std::string,unsigned int> &members = structIterator->second;
std::map<std::string,unsigned int>::const_iterator memberIterator;
memberIterator = members.find(tok->str());
if (memberIterator == members.end()) {
members[tok->str()] = ++_varId;
tok->varId(_varId);
} else {
tok->varId(memberIterator->second);
}
}
}
setVarIdStructMembers(&tok, &structMembers, &_varId);
}
} else if (Token::Match(tok, "::|. %var%")) {
// Don't set varid after a :: or . token
@ -3037,6 +3048,10 @@ void Tokenizer::setVarIdNew()
}
}
// Clear the structMembers because it will be used when member functions
// are parsed. The old info is not bad, it is just redundant.
structMembers.clear();
// Member functions and variables in this source
std::list<Token *> allMemberFunctions;
std::list<Token *> allMemberVars;
@ -3119,6 +3134,7 @@ void Tokenizer::setVarIdNew()
tok2->strAt(-1) != "." &&
varlist.find(tok2->str()) != varlist.end()) {
tok2->varId(varlist[tok2->str()]);
setVarIdStructMembers(&tok2, &structMembers, &_varId);
}
}
}

View File

@ -3418,8 +3418,8 @@ private:
"8: void foo :: bar ( )\n"
"9: {\n"
"10: POINT pOutput@3 ; pOutput@3 = { 0 , 0 } ;\n"
"11: int x@4 ; x@4 = pOutput@3 . x@6 ;\n"
"12: int y@5 ; y@5 = pOutput@3 . y@7 ;\n"
"11: int x@4 ; x@4 = pOutput@3 . x@5 ;\n"
"12: int y@6 ; y@6 = pOutput@3 . y@7 ;\n"
"13: }\n");
ASSERT_EQUALS(expected, actual);