Fix some bugs in new Scope Calculation code (#2060)

* Fix for too much information in scope name

When the scope calculation encounters code such as 
"friend class X::Y;"
or
"template<> class X<void> {"
it will now reset the additional name component of the scope that is about to be opened.

* Made sure new scope name is reset after being used
This commit is contained in:
rebnridgway 2019-08-02 18:55:08 +01:00 committed by Daniel Marjamäki
parent e66e6549ee
commit d2b9c1f15a
2 changed files with 6 additions and 1 deletions

View File

@ -1059,6 +1059,7 @@ void Token::insertToken(const std::string &tokenStr, const std::string &original
if (!newScopeInfo->name.empty() && !nextScopeNameAddition.empty()) newScopeInfo->name.append(" :: "); if (!newScopeInfo->name.empty() && !nextScopeNameAddition.empty()) newScopeInfo->name.append(" :: ");
newScopeInfo->name.append(nextScopeNameAddition); newScopeInfo->name.append(nextScopeNameAddition);
nextScopeNameAddition = "";
newToken->scopeInfo(newScopeInfo); newToken->scopeInfo(newScopeInfo);
} else if (tokenStr == "}") { } else if (tokenStr == "}") {

View File

@ -2873,7 +2873,11 @@ void Tokenizer::calculateScopes()
if (usingNamespaceName.length() > 0) usingNamespaceName = usingNamespaceName.substr(0, usingNamespaceName.length() - 1); if (usingNamespaceName.length() > 0) usingNamespaceName = usingNamespaceName.substr(0, usingNamespaceName.length() - 1);
tok->scopeInfo()->usingNamespaces.insert(usingNamespaceName); tok->scopeInfo()->usingNamespaces.insert(usingNamespaceName);
} else if (Token::Match(tok, "namespace|class|struct|union %name% {|::|:|<")) { } else if (Token::Match(tok, "namespace|class|struct|union %name% {|::|:|<")) {
for (Token* nameTok = tok->next(); nameTok && !Token::Match(nameTok, "{|:|<"); nameTok = nameTok->next()) { for (Token* nameTok = tok->next(); nameTok && !Token::Match(nameTok, "{|:"); nameTok = nameTok->next()) {
if (Token::Match(nameTok, ";|<")) {
nextScopeNameAddition = "";
break;
}
nextScopeNameAddition.append(nameTok->str()); nextScopeNameAddition.append(nameTok->str());
nextScopeNameAddition.append(" "); nextScopeNameAddition.append(" ");
} }