From 3f78862069271e4ff595fc12ef0ce3fefd99ee25 Mon Sep 17 00:00:00 2001 From: firewave Date: Fri, 29 Nov 2024 21:54:57 +0100 Subject: [PATCH] Scope: made `symdb` a reference [skip ci] --- lib/clangimport.cpp | 6 ++-- lib/symboldatabase.cpp | 65 ++++++++++++++++++++---------------------- lib/symboldatabase.h | 6 ++-- 3 files changed, 37 insertions(+), 40 deletions(-) diff --git a/lib/clangimport.cpp b/lib/clangimport.cpp index 4199cb95f28..a45f982e1fd 100644 --- a/lib/clangimport.cpp +++ b/lib/clangimport.cpp @@ -628,7 +628,7 @@ const ::Type * clangimport::AstNode::addTypeTokens(TokenList &tokenList, const s for (const Token *typeToken = tokenList.back(); Token::Match(typeToken, "&|*|%name%"); typeToken = typeToken->previous()) { if (!typeToken->isName()) continue; - const ::Type *recordType = scope->symdb->findVariableType(scope, typeToken); + const ::Type *recordType = scope->symdb.findVariableType(scope, typeToken); if (recordType) { const_cast(typeToken)->type(recordType); return recordType; @@ -1400,7 +1400,7 @@ void clangimport::AstNode::createTokensFunctionDecl(TokenList &tokenList) Scope *scope = nullptr; if (hasBody) { - symbolDatabase->scopeList.emplace_back(symbolDatabase, nullptr, nestedIn); + symbolDatabase->scopeList.emplace_back(*symbolDatabase, nullptr, nestedIn); scope = &symbolDatabase->scopeList.back(); scope->function = function; scope->classDef = nameToken; // TODO: pass into ctor @@ -1615,7 +1615,7 @@ void clangimport::parseClangAstDump(Tokenizer &tokenizer, std::istream &f) tokenizer.createSymbolDatabase(); auto *symbolDatabase = const_cast(tokenizer.getSymbolDatabase()); - symbolDatabase->scopeList.emplace_back(symbolDatabase, nullptr, nullptr); + symbolDatabase->scopeList.emplace_back(*symbolDatabase, nullptr, nullptr); symbolDatabase->scopeList.back().type = Scope::ScopeType::eGlobal; clangimport::Data data; diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 83063fcf24d..24458584d19 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -140,7 +140,7 @@ const Token* SymbolDatabase::isEnumDefinition(const Token* tok) void SymbolDatabase::createSymbolDatabaseFindAllScopes() { // create global scope - scopeList.emplace_back(this, nullptr, nullptr); + scopeList.emplace_back(*this, nullptr, nullptr); // pointer to current scope Scope *scope = &scopeList.back(); @@ -285,7 +285,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() scope = new_scope; tok = tok2; } else { - scopeList.emplace_back(this, tok, scope); + scopeList.emplace_back(*this, tok, scope); new_scope = &scopeList.back(); if (tok->str() == "class") @@ -350,7 +350,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() Token::Match(tok, "namespace %name% %type% (") && tok->tokAt(2)->isUpperCaseName() && Token::simpleMatch(tok->linkAt(3), ") {")) { - scopeList.emplace_back(this, tok, scope); + scopeList.emplace_back(*this, tok, scope); Scope *new_scope = &scopeList.back(); access[new_scope] = AccessControl::Public; @@ -426,7 +426,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() // unnamed struct and union else if (tok->isKeyword() && Token::Match(tok, "struct|union {") && Token::Match(tok->linkAt(1), "} *|&| %name% ;|[|=")) { - scopeList.emplace_back(this, tok, scope); + scopeList.emplace_back(*this, tok, scope); Scope *new_scope = &scopeList.back(); access[new_scope] = AccessControl::Public; @@ -468,7 +468,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() else if (tok->isKeyword() && ((Token::Match(tok, "struct|union {") && Token::simpleMatch(tok->linkAt(1), "} ;")) || Token::simpleMatch(tok, "namespace {"))) { - scopeList.emplace_back(this, tok, scope); + scopeList.emplace_back(*this, tok, scope); Scope *new_scope = &scopeList.back(); access[new_scope] = AccessControl::Public; @@ -706,11 +706,11 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() if (tok->isKeyword() && Token::Match(tok, "else|try|do {")) { const Token* tok1 = tok->next(); if (tok->str() == "else") - scopeList.emplace_back(this, tok, scope, Scope::eElse, tok1); + scopeList.emplace_back(*this, tok, scope, Scope::eElse, tok1); else if (tok->str() == "do") - scopeList.emplace_back(this, tok, scope, Scope::eDo, tok1); + scopeList.emplace_back(*this, tok, scope, Scope::eDo, tok1); else //if (tok->str() == "try") - scopeList.emplace_back(this, tok, scope, Scope::eTry, tok1); + scopeList.emplace_back(*this, tok, scope, Scope::eTry, tok1); tok = tok1; scope->nestedList.push_back(&scopeList.back()); @@ -718,15 +718,15 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() } else if (tok->isKeyword() && Token::Match(tok, "if|for|while|catch|switch (") && Token::simpleMatch(tok->linkAt(1), ") {")) { const Token *scopeStartTok = tok->linkAt(1)->next(); if (tok->str() == "if") - scopeList.emplace_back(this, tok, scope, Scope::eIf, scopeStartTok); + scopeList.emplace_back(*this, tok, scope, Scope::eIf, scopeStartTok); else if (tok->str() == "for") { - scopeList.emplace_back(this, tok, scope, Scope::eFor, scopeStartTok); + scopeList.emplace_back(*this, tok, scope, Scope::eFor, scopeStartTok); } else if (tok->str() == "while") - scopeList.emplace_back(this, tok, scope, Scope::eWhile, scopeStartTok); + scopeList.emplace_back(*this, tok, scope, Scope::eWhile, scopeStartTok); else if (tok->str() == "catch") { - scopeList.emplace_back(this, tok, scope, Scope::eCatch, scopeStartTok); + scopeList.emplace_back(*this, tok, scope, Scope::eCatch, scopeStartTok); } else // if (tok->str() == "switch") - scopeList.emplace_back(this, tok, scope, Scope::eSwitch, scopeStartTok); + scopeList.emplace_back(*this, tok, scope, Scope::eSwitch, scopeStartTok); scope->nestedList.push_back(&scopeList.back()); scope = &scopeList.back(); @@ -747,7 +747,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes() } else if (!inIfCondition.empty() && tok == inIfCondition.top()) { inIfCondition.pop(); } else if (isExecutableScope(tok)) { - scopeList.emplace_back(this, tok, scope, Scope::eUnconditional, tok); + scopeList.emplace_back(*this, tok, scope, Scope::eUnconditional, tok); scope->nestedList.push_back(&scopeList.back()); scope = &scopeList.back(); } else { @@ -2787,10 +2787,10 @@ static bool typesMatch( const Token *&new_second) { // get first type - const Type* first_type = first_scope->symdb->findType(first_token, first_scope, /*lookOutside*/ true); + const Type* first_type = first_scope->symdb.findType(first_token, first_scope, /*lookOutside*/ true); if (first_type) { // get second type - const Type* second_type = second_scope->symdb->findType(second_token, second_scope, /*lookOutside*/ true); + const Type* second_type = second_scope->symdb.findType(second_token, second_scope, /*lookOutside*/ true); // check if types match if (first_type == second_type) { const Token* tok1 = first_token; @@ -3437,7 +3437,7 @@ void SymbolDatabase::addClassFunction(Scope *&scope, const Token *&tok, const To void SymbolDatabase::addNewFunction(Scope *&scope, const Token *&tok) { const Token *tok1 = tok; - scopeList.emplace_back(this, tok1, scope); + scopeList.emplace_back(*this, tok1, scope); Scope *newScope = &scopeList.back(); // find start of function '{' @@ -3565,7 +3565,7 @@ const Token *Type::initBaseInfo(const Token *tok, const Token *tok1) } } - const Type * baseType = classScope->symdb->findType(base.nameTok, enclosingScope); + const Type * baseType = classScope->symdb.findType(base.nameTok, enclosingScope); if (baseType && !baseType->findDependency(this)) base.type = baseType; @@ -4415,7 +4415,7 @@ void SymbolDatabase::printXml(std::ostream &out) const static const Type* findVariableTypeIncludingUsedNamespaces(const Scope* scope, const Token* typeTok) { - const Type* argType = scope->symdb->findVariableType(scope, typeTok); + const Type* argType = scope->symdb.findVariableType(scope, typeTok); if (argType) return argType; @@ -4423,7 +4423,7 @@ static const Type* findVariableTypeIncludingUsedNamespaces(const Scope* scope, c while (scope) { for (const Scope::UsingInfo &ui : scope->usingList) { if (ui.scope) { - argType = scope->symdb->findVariableType(ui.scope, typeTok); + argType = scope->symdb.findVariableType(ui.scope, typeTok); if (argType) return argType; } @@ -4496,7 +4496,7 @@ void Function::addArguments(const Scope *scope) while (Token::Match(typeTok, "const|volatile|enum|struct|::")) typeTok = typeTok->next(); if (Token::Match(typeTok, ",|)")) { // #8333 - scope->symdb->mTokenizer.syntaxError(typeTok); + scope->symdb.mTokenizer.syntaxError(typeTok); } if (Token::Match(typeTok, "%type% <") && Token::Match(typeTok->linkAt(1), "> :: %type%")) typeTok = typeTok->linkAt(1)->tokAt(2); @@ -4515,7 +4515,7 @@ void Function::addArguments(const Scope *scope) endTok = nameTok->previous(); if (hasBody()) - scope->symdb->debugMessage(nameTok, "varid0", "Function::addArguments found argument \'" + nameTok->str() + "\' with varid 0."); + scope->symdb.debugMessage(nameTok, "varid0", "Function::addArguments found argument \'" + nameTok->str() + "\' with varid 0."); } else endTok = typeTok; } else @@ -4546,7 +4546,7 @@ void Function::addArguments(const Scope *scope) if (startTok == nameTok) break; - argumentList.emplace_back(nameTok, startTok, endTok, count++, AccessControl::Argument, argType, functionScope, scope->symdb->mTokenizer.getSettings()); + argumentList.emplace_back(nameTok, startTok, endTok, count++, AccessControl::Argument, argType, functionScope, scope->symdb.mTokenizer.getSettings()); if (tok->str() == ")") { // check for a variadic function or a variadic template function @@ -4719,23 +4719,20 @@ const Variable* Function::getArgumentVar(nonneg int num) const //--------------------------------------------------------------------------- -Scope::Scope(const SymbolDatabase *symdb_, const Token *classDef_, const Scope *nestedIn_, ScopeType type_, const Token *start_) : +Scope::Scope(const SymbolDatabase &symdb_, const Token *classDef_, const Scope *nestedIn_, ScopeType type_, const Token *start_) : symdb(symdb_), classDef(classDef_), nestedIn(nestedIn_), type(type_) { - assert(symdb_); setBodyStartEnd(start_); } -Scope::Scope(const SymbolDatabase *symdb_, const Token *classDef_, const Scope *nestedIn_) : +Scope::Scope(const SymbolDatabase &symdb_, const Token *classDef_, const Scope *nestedIn_) : symdb(symdb_), classDef(classDef_), nestedIn(nestedIn_) { - assert(symdb_); - const Token *nameTok = classDef; if (!classDef) { type = Scope::eGlobal; @@ -4793,7 +4790,7 @@ void Scope::addVariable(const Token *token_, const Token *start_, const Token *e // keep possible size_t -> int truncation outside emplace_back() to have a single line // C4267 VC++ warning instead of several dozens lines const int varIndex = varlist.size(); - varlist.emplace_back(token_, start_, end_, varIndex, access_, type_, scope_, scope_->symdb->mTokenizer.getSettings()); + varlist.emplace_back(token_, start_, end_, varIndex, access_, type_, scope_, scope_->symdb.mTokenizer.getSettings()); } // Get variable list.. @@ -4806,7 +4803,7 @@ void Scope::getVariableList() // global scope else if (type == Scope::eGlobal) - getVariableList(symdb->mTokenizer.tokens(), nullptr); + getVariableList(symdb.mTokenizer.tokens(), nullptr); // forward declaration else @@ -4951,7 +4948,7 @@ const Token *Scope::checkVariable(const Token *tok, AccessControl varaccess) const Token *typestart = tok; // C++17 structured bindings - if (tok && tok->isCpp() && (symdb->mTokenizer.getSettings().standards.cpp >= Standards::CPP17) && Token::Match(tok, "auto &|&&| [")) { + if (tok && tok->isCpp() && (symdb.mTokenizer.getSettings().standards.cpp >= Standards::CPP17) && Token::Match(tok, "auto &|&&| [")) { const Token *typeend = Token::findsimplematch(typestart, "[")->previous(); for (tok = typeend->tokAt(2); Token::Match(tok, "%name%|,"); tok = tok->next()) { if (tok->varId()) @@ -4976,7 +4973,7 @@ const Token *Scope::checkVariable(const Token *tok, AccessControl varaccess) if (vartok->varId() == 0) { if (!vartok->isBoolean()) - symdb->debugMessage(vartok, "varid0", "Scope::checkVariable found variable \'" + vartok->str() + "\' with varid 0."); + symdb.debugMessage(vartok, "varid0", "Scope::checkVariable found variable \'" + vartok->str() + "\' with varid 0."); return tok; } @@ -5056,7 +5053,7 @@ bool Scope::isVariableDeclaration(const Token* const tok, const Token*& vartok, if (isCPP && Token::Match(tok, "throw|new")) return false; - const bool isCPP11 = isCPP && symdb->mTokenizer.getSettings().standards.cpp >= Standards::CPP11; + const bool isCPP11 = isCPP && symdb.mTokenizer.getSettings().standards.cpp >= Standards::CPP11; if (isCPP11 && tok->str() == "using") return false; @@ -7277,7 +7274,7 @@ static const Token* parsedecl(const Token* type, valuetype->container = container; } else { const Scope *scope = type->scope(); - valuetype->typeScope = scope->symdb->findScope(typeTokens.front(), scope); + valuetype->typeScope = scope->symdb.findScope(typeTokens.front(), scope); if (valuetype->typeScope) valuetype->type = (scope->type == Scope::ScopeType::eClass) ? ValueType::Type::RECORD : ValueType::Type::NONSTD; } diff --git a/lib/symboldatabase.h b/lib/symboldatabase.h index 796bd0852fc..f2189d6ba65 100644 --- a/lib/symboldatabase.h +++ b/lib/symboldatabase.h @@ -1037,10 +1037,10 @@ class CPPCHECKLIB Scope { enum ScopeType : std::uint8_t { eGlobal, eClass, eStruct, eUnion, eNamespace, eFunction, eIf, eElse, eFor, eWhile, eDo, eSwitch, eUnconditional, eTry, eCatch, eLambda, eEnum }; - Scope(const SymbolDatabase *symdb_, const Token *classDef_, const Scope *nestedIn_); - Scope(const SymbolDatabase *symdb_, const Token *classDef_, const Scope *nestedIn_, ScopeType type_, const Token *start_); + Scope(const SymbolDatabase &symdb_, const Token *classDef_, const Scope *nestedIn_); + Scope(const SymbolDatabase &symdb_, const Token *classDef_, const Scope *nestedIn_, ScopeType type_, const Token *start_); - const SymbolDatabase* symdb{}; + const SymbolDatabase& symdb; std::string className; const Token* classDef{}; ///< class/struct/union/namespace token const Token* bodyStart{}; ///< '{' token