From 166e2a2cb80684c147e14966c835c61382b63f6f Mon Sep 17 00:00:00 2001 From: Dmitry-Me Date: Fri, 18 Dec 2015 10:24:02 +0300 Subject: [PATCH 1/2] Extract duplicate code --- lib/symboldatabase.cpp | 61 +++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 36 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index df9fd9f30..6ff439b59 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -2528,6 +2528,29 @@ void SymbolDatabase::printXml(std::ostream &out) const //--------------------------------------------------------------------------- +static const Type* findVariableTypeIncludingUsedNamespaces(const SymbolDatabase* symbolDatabase, const Scope* scope, const Token* typeTok) +{ + const Type* argType = symbolDatabase->findVariableType(scope, typeTok); + if (argType) + return argType; + + // look for variable type in any using namespace in this scope or above + while (scope) { + for (std::list::const_iterator ui = scope->usingList.begin(); + ui != scope->usingList.end(); ++ui) { + if (ui->scope) { + argType = symbolDatabase->findVariableType(ui->scope, typeTok); + if (argType) + return argType; + } + } + scope = scope->nestedIn; + } + return nullptr; +} + +//--------------------------------------------------------------------------- + void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *scope) { // check for non-empty argument list "( ... )" @@ -2587,24 +2610,7 @@ void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *s const ::Type *argType = nullptr; if (!typeTok->isStandardType()) { - argType = symbolDatabase->findVariableType(scope, typeTok); - if (!argType) { - // look for variable type in any using namespace in this scope or above - const Scope *currentScope = scope; - while (currentScope) { - for (std::list::const_iterator ui = currentScope->usingList.begin(); - ui != currentScope->usingList.end(); ++ui) { - if (ui->scope) { - argType = symbolDatabase->findVariableType(ui->scope, typeTok); - if (argType) - break; - } - } - if (argType) - break; - currentScope = currentScope->nestedIn; - } - } + argType = findVariableTypeIncludingUsedNamespaces(symbolDatabase, scope, typeTok); } // skip default values @@ -2956,24 +2962,7 @@ const Token *Scope::checkVariable(const Token *tok, AccessControl varaccess, con const Type *vType = nullptr; if (typetok) { - vType = check->findVariableType(this, typetok); - if (!vType) { - // look for variable type in any using namespace in this scope or above - const Scope *parent = this; - while (parent) { - for (std::list::const_iterator ui = parent->usingList.begin(); - ui != parent->usingList.end(); ++ui) { - if (ui->scope) { - vType = check->findVariableType(ui->scope, typetok); - if (vType) - break; - } - } - if (vType) - break; - parent = parent->nestedIn; - } - } + vType = findVariableTypeIncludingUsedNamespaces(check, this, typetok); } addVariable(vartok, typestart, vartok->previous(), varaccess, vType, this, lib); From 06ff87741525f80328b797adb2a32c4da39dec1b Mon Sep 17 00:00:00 2001 From: Dmitry-Me Date: Fri, 18 Dec 2015 15:46:12 +0300 Subject: [PATCH 2/2] Typo in variable name --- lib/symboldatabase.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 6ff439b59..15b66079f 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -365,22 +365,22 @@ SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *setti // copy/move constructor? else if (Token::Match(function.tokenDef, "%name% ( const| %name% &|&& &| %name%| )") || Token::Match(function.tokenDef, "%name% ( const| %name% <")) { - const Token* typTok = function.tokenDef->tokAt(2); - if (typTok->str() == "const") - typTok = typTok->next(); - if (typTok->strAt(1) == "<") { // TODO: Remove this branch (#4710) - if (Token::Match(typTok->linkAt(1), "> & %name%| )")) + const Token* typeTok = function.tokenDef->tokAt(2); + if (typeTok->str() == "const") + typeTok = typeTok->next(); + if (typeTok->strAt(1) == "<") { // TODO: Remove this branch (#4710) + if (Token::Match(typeTok->linkAt(1), "> & %name%| )")) function.type = Function::eCopyConstructor; - else if (Token::Match(typTok->linkAt(1), "> &&|& & %name%| )")) + else if (Token::Match(typeTok->linkAt(1), "> &&|& & %name%| )")) function.type = Function::eMoveConstructor; else function.type = Function::eConstructor; - } else if (typTok->strAt(1) == "&&" || typTok->strAt(2) == "&") + } else if (typeTok->strAt(1) == "&&" || typeTok->strAt(2) == "&") function.type = Function::eMoveConstructor; else function.type = Function::eCopyConstructor; - if (typTok->str() != function.tokenDef->str()) + if (typeTok->str() != function.tokenDef->str()) function.type = Function::eConstructor; // Overwrite, if types are not identical } // regular constructor