Tokenizer::setVarIdNew: better handling of class variables
This commit is contained in:
parent
a971e1530b
commit
bb4184ca03
|
@ -2874,6 +2874,23 @@ static bool setVarIdParseDeclaration(const Token **tok, const std::map<std::stri
|
||||||
return bool(typeCount >= 2 && tok2 && Token::Match(tok2->tokAt(-2), "!!:: %type%"));
|
return bool(typeCount >= 2 && tok2 && Token::Match(tok2->tokAt(-2), "!!:: %type%"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setVarIdClassDeclaration(Token * const startToken, const std::map<std::string, unsigned int> &variableId, const unsigned int scopeStartVarId)
|
||||||
|
{
|
||||||
|
// end of scope
|
||||||
|
const Token * const endToken = startToken->link();
|
||||||
|
|
||||||
|
// replace varids..
|
||||||
|
for (Token *tok = startToken; tok != endToken; tok = tok->next()) {
|
||||||
|
if (tok->isName() && tok->varId() <= scopeStartVarId) {
|
||||||
|
const std::map<std::string, unsigned int>::const_iterator it = variableId.find(tok->str());
|
||||||
|
if (it != variableId.end()) {
|
||||||
|
tok->varId(it->second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void Tokenizer::setVarIdNew()
|
void Tokenizer::setVarIdNew()
|
||||||
{
|
{
|
||||||
// Clear all variable ids
|
// Clear all variable ids
|
||||||
|
@ -2887,12 +2904,15 @@ void Tokenizer::setVarIdNew()
|
||||||
std::stack< std::map<std::string, unsigned int> > scopeInfo;
|
std::stack< std::map<std::string, unsigned int> > scopeInfo;
|
||||||
std::stack<bool> executableScope;
|
std::stack<bool> executableScope;
|
||||||
executableScope.push(false);
|
executableScope.push(false);
|
||||||
|
std::stack<unsigned int> scopestartvarid; // varid when scope starts
|
||||||
|
scopestartvarid.push(0);
|
||||||
for (Token *tok = _tokens; tok; tok = tok->next()) {
|
for (Token *tok = _tokens; tok; tok = tok->next()) {
|
||||||
|
|
||||||
// scope info to handle shadow variables..
|
// scope info to handle shadow variables..
|
||||||
if (tok->str() == "(" && Token::simpleMatch(tok->link(), ") {")) {
|
if (tok->str() == "(" && Token::simpleMatch(tok->link(), ") {")) {
|
||||||
scopeInfo.push(variableId);
|
scopeInfo.push(variableId);
|
||||||
} else if (tok->str() == "{") {
|
} else if (tok->str() == "{") {
|
||||||
|
scopestartvarid.push(_varId);
|
||||||
if (Token::simpleMatch(tok->previous(), ")")) {
|
if (Token::simpleMatch(tok->previous(), ")")) {
|
||||||
executableScope.push(true);
|
executableScope.push(true);
|
||||||
} else {
|
} else {
|
||||||
|
@ -2900,6 +2920,16 @@ void Tokenizer::setVarIdNew()
|
||||||
scopeInfo.push(variableId);
|
scopeInfo.push(variableId);
|
||||||
}
|
}
|
||||||
} else if (tok->str() == "}") {
|
} else if (tok->str() == "}") {
|
||||||
|
// Set variable ids in class declaration..
|
||||||
|
if (!isC() && !executableScope.top()) {
|
||||||
|
setVarIdClassDeclaration(tok->link(), variableId, scopestartvarid.top());
|
||||||
|
}
|
||||||
|
|
||||||
|
scopestartvarid.pop();
|
||||||
|
if (scopestartvarid.empty()) { // should be impossible
|
||||||
|
scopestartvarid.push(0);
|
||||||
|
}
|
||||||
|
|
||||||
if (scopeInfo.empty()) {
|
if (scopeInfo.empty()) {
|
||||||
variableId.clear();
|
variableId.clear();
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue