Skip to content

Commit 4be9c3c

Browse files
committed
Scope: made symdb a reference
1 parent 0a880e9 commit 4be9c3c

File tree

3 files changed

+37
-40
lines changed

3 files changed

+37
-40
lines changed

Diff for: lib/clangimport.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -628,7 +628,7 @@ const ::Type * clangimport::AstNode::addTypeTokens(TokenList &tokenList, const s
628628
for (const Token *typeToken = tokenList.back(); Token::Match(typeToken, "&|*|%name%"); typeToken = typeToken->previous()) {
629629
if (!typeToken->isName())
630630
continue;
631-
const ::Type *recordType = scope->symdb->findVariableType(scope, typeToken);
631+
const ::Type *recordType = scope->symdb.findVariableType(scope, typeToken);
632632
if (recordType) {
633633
const_cast<Token*>(typeToken)->type(recordType);
634634
return recordType;
@@ -1400,7 +1400,7 @@ void clangimport::AstNode::createTokensFunctionDecl(TokenList &tokenList)
14001400

14011401
Scope *scope = nullptr;
14021402
if (hasBody) {
1403-
symbolDatabase->scopeList.emplace_back(symbolDatabase, nullptr, nestedIn);
1403+
symbolDatabase->scopeList.emplace_back(*symbolDatabase, nullptr, nestedIn);
14041404
scope = &symbolDatabase->scopeList.back();
14051405
scope->function = function;
14061406
scope->classDef = nameToken; // TODO: pass into ctor
@@ -1615,7 +1615,7 @@ void clangimport::parseClangAstDump(Tokenizer &tokenizer, std::istream &f)
16151615

16161616
tokenizer.createSymbolDatabase();
16171617
auto *symbolDatabase = const_cast<SymbolDatabase *>(tokenizer.getSymbolDatabase());
1618-
symbolDatabase->scopeList.emplace_back(symbolDatabase, nullptr, nullptr);
1618+
symbolDatabase->scopeList.emplace_back(*symbolDatabase, nullptr, nullptr);
16191619
symbolDatabase->scopeList.back().type = Scope::ScopeType::eGlobal;
16201620

16211621
clangimport::Data data;

Diff for: lib/symboldatabase.cpp

+31-34
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ const Token* SymbolDatabase::isEnumDefinition(const Token* tok)
140140
void SymbolDatabase::createSymbolDatabaseFindAllScopes()
141141
{
142142
// create global scope
143-
scopeList.emplace_back(this, nullptr, nullptr);
143+
scopeList.emplace_back(*this, nullptr, nullptr);
144144

145145
// pointer to current scope
146146
Scope *scope = &scopeList.back();
@@ -285,7 +285,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes()
285285
scope = new_scope;
286286
tok = tok2;
287287
} else {
288-
scopeList.emplace_back(this, tok, scope);
288+
scopeList.emplace_back(*this, tok, scope);
289289
new_scope = &scopeList.back();
290290

291291
if (tok->str() == "class")
@@ -350,7 +350,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes()
350350
Token::Match(tok, "namespace %name% %type% (") &&
351351
tok->tokAt(2)->isUpperCaseName() &&
352352
Token::simpleMatch(tok->linkAt(3), ") {")) {
353-
scopeList.emplace_back(this, tok, scope);
353+
scopeList.emplace_back(*this, tok, scope);
354354

355355
Scope *new_scope = &scopeList.back();
356356
access[new_scope] = AccessControl::Public;
@@ -426,7 +426,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes()
426426
// unnamed struct and union
427427
else if (tok->isKeyword() && Token::Match(tok, "struct|union {") &&
428428
Token::Match(tok->linkAt(1), "} *|&| %name% ;|[|=")) {
429-
scopeList.emplace_back(this, tok, scope);
429+
scopeList.emplace_back(*this, tok, scope);
430430

431431
Scope *new_scope = &scopeList.back();
432432
access[new_scope] = AccessControl::Public;
@@ -468,7 +468,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes()
468468
else if (tok->isKeyword() && ((Token::Match(tok, "struct|union {") &&
469469
Token::simpleMatch(tok->linkAt(1), "} ;")) ||
470470
Token::simpleMatch(tok, "namespace {"))) {
471-
scopeList.emplace_back(this, tok, scope);
471+
scopeList.emplace_back(*this, tok, scope);
472472

473473
Scope *new_scope = &scopeList.back();
474474
access[new_scope] = AccessControl::Public;
@@ -706,27 +706,27 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes()
706706
if (tok->isKeyword() && Token::Match(tok, "else|try|do {")) {
707707
const Token* tok1 = tok->next();
708708
if (tok->str() == "else")
709-
scopeList.emplace_back(this, tok, scope, Scope::eElse, tok1);
709+
scopeList.emplace_back(*this, tok, scope, Scope::eElse, tok1);
710710
else if (tok->str() == "do")
711-
scopeList.emplace_back(this, tok, scope, Scope::eDo, tok1);
711+
scopeList.emplace_back(*this, tok, scope, Scope::eDo, tok1);
712712
else //if (tok->str() == "try")
713-
scopeList.emplace_back(this, tok, scope, Scope::eTry, tok1);
713+
scopeList.emplace_back(*this, tok, scope, Scope::eTry, tok1);
714714

715715
tok = tok1;
716716
scope->nestedList.push_back(&scopeList.back());
717717
scope = &scopeList.back();
718718
} else if (tok->isKeyword() && Token::Match(tok, "if|for|while|catch|switch (") && Token::simpleMatch(tok->linkAt(1), ") {")) {
719719
const Token *scopeStartTok = tok->linkAt(1)->next();
720720
if (tok->str() == "if")
721-
scopeList.emplace_back(this, tok, scope, Scope::eIf, scopeStartTok);
721+
scopeList.emplace_back(*this, tok, scope, Scope::eIf, scopeStartTok);
722722
else if (tok->str() == "for") {
723-
scopeList.emplace_back(this, tok, scope, Scope::eFor, scopeStartTok);
723+
scopeList.emplace_back(*this, tok, scope, Scope::eFor, scopeStartTok);
724724
} else if (tok->str() == "while")
725-
scopeList.emplace_back(this, tok, scope, Scope::eWhile, scopeStartTok);
725+
scopeList.emplace_back(*this, tok, scope, Scope::eWhile, scopeStartTok);
726726
else if (tok->str() == "catch") {
727-
scopeList.emplace_back(this, tok, scope, Scope::eCatch, scopeStartTok);
727+
scopeList.emplace_back(*this, tok, scope, Scope::eCatch, scopeStartTok);
728728
} else // if (tok->str() == "switch")
729-
scopeList.emplace_back(this, tok, scope, Scope::eSwitch, scopeStartTok);
729+
scopeList.emplace_back(*this, tok, scope, Scope::eSwitch, scopeStartTok);
730730

731731
scope->nestedList.push_back(&scopeList.back());
732732
scope = &scopeList.back();
@@ -747,7 +747,7 @@ void SymbolDatabase::createSymbolDatabaseFindAllScopes()
747747
} else if (!inIfCondition.empty() && tok == inIfCondition.top()) {
748748
inIfCondition.pop();
749749
} else if (isExecutableScope(tok)) {
750-
scopeList.emplace_back(this, tok, scope, Scope::eUnconditional, tok);
750+
scopeList.emplace_back(*this, tok, scope, Scope::eUnconditional, tok);
751751
scope->nestedList.push_back(&scopeList.back());
752752
scope = &scopeList.back();
753753
} else {
@@ -2787,10 +2787,10 @@ static bool typesMatch(
27872787
const Token *&new_second)
27882788
{
27892789
// get first type
2790-
const Type* first_type = first_scope->symdb->findType(first_token, first_scope, /*lookOutside*/ true);
2790+
const Type* first_type = first_scope->symdb.findType(first_token, first_scope, /*lookOutside*/ true);
27912791
if (first_type) {
27922792
// get second type
2793-
const Type* second_type = second_scope->symdb->findType(second_token, second_scope, /*lookOutside*/ true);
2793+
const Type* second_type = second_scope->symdb.findType(second_token, second_scope, /*lookOutside*/ true);
27942794
// check if types match
27952795
if (first_type == second_type) {
27962796
const Token* tok1 = first_token;
@@ -3437,7 +3437,7 @@ void SymbolDatabase::addClassFunction(Scope *&scope, const Token *&tok, const To
34373437
void SymbolDatabase::addNewFunction(Scope *&scope, const Token *&tok)
34383438
{
34393439
const Token *tok1 = tok;
3440-
scopeList.emplace_back(this, tok1, scope);
3440+
scopeList.emplace_back(*this, tok1, scope);
34413441
Scope *newScope = &scopeList.back();
34423442

34433443
// find start of function '{'
@@ -3565,7 +3565,7 @@ const Token *Type::initBaseInfo(const Token *tok, const Token *tok1)
35653565
}
35663566
}
35673567

3568-
const Type * baseType = classScope->symdb->findType(base.nameTok, enclosingScope);
3568+
const Type * baseType = classScope->symdb.findType(base.nameTok, enclosingScope);
35693569
if (baseType && !baseType->findDependency(this))
35703570
base.type = baseType;
35713571

@@ -4415,15 +4415,15 @@ void SymbolDatabase::printXml(std::ostream &out) const
44154415

44164416
static const Type* findVariableTypeIncludingUsedNamespaces(const Scope* scope, const Token* typeTok)
44174417
{
4418-
const Type* argType = scope->symdb->findVariableType(scope, typeTok);
4418+
const Type* argType = scope->symdb.findVariableType(scope, typeTok);
44194419
if (argType)
44204420
return argType;
44214421

44224422
// look for variable type in any using namespace in this scope or above
44234423
while (scope) {
44244424
for (const Scope::UsingInfo &ui : scope->usingList) {
44254425
if (ui.scope) {
4426-
argType = scope->symdb->findVariableType(ui.scope, typeTok);
4426+
argType = scope->symdb.findVariableType(ui.scope, typeTok);
44274427
if (argType)
44284428
return argType;
44294429
}
@@ -4496,7 +4496,7 @@ void Function::addArguments(const Scope *scope)
44964496
while (Token::Match(typeTok, "const|volatile|enum|struct|::"))
44974497
typeTok = typeTok->next();
44984498
if (Token::Match(typeTok, ",|)")) { // #8333
4499-
scope->symdb->mTokenizer.syntaxError(typeTok);
4499+
scope->symdb.mTokenizer.syntaxError(typeTok);
45004500
}
45014501
if (Token::Match(typeTok, "%type% <") && Token::Match(typeTok->linkAt(1), "> :: %type%"))
45024502
typeTok = typeTok->linkAt(1)->tokAt(2);
@@ -4515,7 +4515,7 @@ void Function::addArguments(const Scope *scope)
45154515
endTok = nameTok->previous();
45164516

45174517
if (hasBody())
4518-
scope->symdb->debugMessage(nameTok, "varid0", "Function::addArguments found argument \'" + nameTok->str() + "\' with varid 0.");
4518+
scope->symdb.debugMessage(nameTok, "varid0", "Function::addArguments found argument \'" + nameTok->str() + "\' with varid 0.");
45194519
} else
45204520
endTok = typeTok;
45214521
} else
@@ -4546,7 +4546,7 @@ void Function::addArguments(const Scope *scope)
45464546
if (startTok == nameTok)
45474547
break;
45484548

4549-
argumentList.emplace_back(nameTok, startTok, endTok, count++, AccessControl::Argument, argType, functionScope, scope->symdb->mTokenizer.getSettings());
4549+
argumentList.emplace_back(nameTok, startTok, endTok, count++, AccessControl::Argument, argType, functionScope, scope->symdb.mTokenizer.getSettings());
45504550

45514551
if (tok->str() == ")") {
45524552
// check for a variadic function or a variadic template function
@@ -4719,23 +4719,20 @@ const Variable* Function::getArgumentVar(nonneg int num) const
47194719

47204720
//---------------------------------------------------------------------------
47214721

4722-
Scope::Scope(const SymbolDatabase *symdb_, const Token *classDef_, const Scope *nestedIn_, ScopeType type_, const Token *start_) :
4722+
Scope::Scope(const SymbolDatabase &symdb_, const Token *classDef_, const Scope *nestedIn_, ScopeType type_, const Token *start_) :
47234723
symdb(symdb_),
47244724
classDef(classDef_),
47254725
nestedIn(nestedIn_),
47264726
type(type_)
47274727
{
4728-
assert(symdb_);
47294728
setBodyStartEnd(start_);
47304729
}
47314730

4732-
Scope::Scope(const SymbolDatabase *symdb_, const Token *classDef_, const Scope *nestedIn_) :
4731+
Scope::Scope(const SymbolDatabase &symdb_, const Token *classDef_, const Scope *nestedIn_) :
47334732
symdb(symdb_),
47344733
classDef(classDef_),
47354734
nestedIn(nestedIn_)
47364735
{
4737-
assert(symdb_);
4738-
47394736
const Token *nameTok = classDef;
47404737
if (!classDef) {
47414738
type = Scope::eGlobal;
@@ -4793,7 +4790,7 @@ void Scope::addVariable(const Token *token_, const Token *start_, const Token *e
47934790
// keep possible size_t -> int truncation outside emplace_back() to have a single line
47944791
// C4267 VC++ warning instead of several dozens lines
47954792
const int varIndex = varlist.size();
4796-
varlist.emplace_back(token_, start_, end_, varIndex, access_, type_, scope_, scope_->symdb->mTokenizer.getSettings());
4793+
varlist.emplace_back(token_, start_, end_, varIndex, access_, type_, scope_, scope_->symdb.mTokenizer.getSettings());
47974794
}
47984795

47994796
// Get variable list..
@@ -4806,7 +4803,7 @@ void Scope::getVariableList()
48064803

48074804
// global scope
48084805
else if (type == Scope::eGlobal)
4809-
getVariableList(symdb->mTokenizer.tokens(), nullptr);
4806+
getVariableList(symdb.mTokenizer.tokens(), nullptr);
48104807

48114808
// forward declaration
48124809
else
@@ -4951,7 +4948,7 @@ const Token *Scope::checkVariable(const Token *tok, AccessControl varaccess)
49514948
const Token *typestart = tok;
49524949

49534950
// C++17 structured bindings
4954-
if (tok && tok->isCpp() && (symdb->mTokenizer.getSettings().standards.cpp >= Standards::CPP17) && Token::Match(tok, "auto &|&&| [")) {
4951+
if (tok && tok->isCpp() && (symdb.mTokenizer.getSettings().standards.cpp >= Standards::CPP17) && Token::Match(tok, "auto &|&&| [")) {
49554952
const Token *typeend = Token::findsimplematch(typestart, "[")->previous();
49564953
for (tok = typeend->tokAt(2); Token::Match(tok, "%name%|,"); tok = tok->next()) {
49574954
if (tok->varId())
@@ -4976,7 +4973,7 @@ const Token *Scope::checkVariable(const Token *tok, AccessControl varaccess)
49764973

49774974
if (vartok->varId() == 0) {
49784975
if (!vartok->isBoolean())
4979-
symdb->debugMessage(vartok, "varid0", "Scope::checkVariable found variable \'" + vartok->str() + "\' with varid 0.");
4976+
symdb.debugMessage(vartok, "varid0", "Scope::checkVariable found variable \'" + vartok->str() + "\' with varid 0.");
49804977
return tok;
49814978
}
49824979

@@ -5056,7 +5053,7 @@ bool Scope::isVariableDeclaration(const Token* const tok, const Token*& vartok,
50565053
if (isCPP && Token::Match(tok, "throw|new"))
50575054
return false;
50585055

5059-
const bool isCPP11 = isCPP && symdb->mTokenizer.getSettings().standards.cpp >= Standards::CPP11;
5056+
const bool isCPP11 = isCPP && symdb.mTokenizer.getSettings().standards.cpp >= Standards::CPP11;
50605057

50615058
if (isCPP11 && tok->str() == "using")
50625059
return false;
@@ -7277,7 +7274,7 @@ static const Token* parsedecl(const Token* type,
72777274
valuetype->container = container;
72787275
} else {
72797276
const Scope *scope = type->scope();
7280-
valuetype->typeScope = scope->symdb->findScope(typeTokens.front(), scope);
7277+
valuetype->typeScope = scope->symdb.findScope(typeTokens.front(), scope);
72817278
if (valuetype->typeScope)
72827279
valuetype->type = (scope->type == Scope::ScopeType::eClass) ? ValueType::Type::RECORD : ValueType::Type::NONSTD;
72837280
}

Diff for: lib/symboldatabase.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -1037,10 +1037,10 @@ class CPPCHECKLIB Scope {
10371037

10381038
enum ScopeType : std::uint8_t { eGlobal, eClass, eStruct, eUnion, eNamespace, eFunction, eIf, eElse, eFor, eWhile, eDo, eSwitch, eUnconditional, eTry, eCatch, eLambda, eEnum };
10391039

1040-
Scope(const SymbolDatabase *symdb_, const Token *classDef_, const Scope *nestedIn_);
1041-
Scope(const SymbolDatabase *symdb_, const Token *classDef_, const Scope *nestedIn_, ScopeType type_, const Token *start_);
1040+
Scope(const SymbolDatabase &symdb_, const Token *classDef_, const Scope *nestedIn_);
1041+
Scope(const SymbolDatabase &symdb_, const Token *classDef_, const Scope *nestedIn_, ScopeType type_, const Token *start_);
10421042

1043-
const SymbolDatabase* symdb{};
1043+
const SymbolDatabase& symdb;
10441044
std::string className;
10451045
const Token* classDef{}; ///< class/struct/union/namespace token
10461046
const Token* bodyStart{}; ///< '{' token

0 commit comments

Comments
 (0)