Skip to content

Commit 06e3c9b

Browse files
committed
Scope: made symdb a reference
1 parent e799f3c commit 06e3c9b

File tree

3 files changed

+37
-40
lines changed

3 files changed

+37
-40
lines changed

lib/clangimport.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -588,7 +588,7 @@ const ::Type * clangimport::AstNode::addTypeTokens(TokenList &tokenList, const s
588588
for (const Token *typeToken = tokenList.back(); Token::Match(typeToken, "&|*|%name%"); typeToken = typeToken->previous()) {
589589
if (!typeToken->isName())
590590
continue;
591-
const ::Type *recordType = scope->symdb->findVariableType(scope, typeToken);
591+
const ::Type *recordType = scope->symdb.findVariableType(scope, typeToken);
592592
if (recordType) {
593593
const_cast<Token*>(typeToken)->type(recordType);
594594
return recordType;
@@ -1360,7 +1360,7 @@ void clangimport::AstNode::createTokensFunctionDecl(TokenList &tokenList)
13601360

13611361
Scope *scope = nullptr;
13621362
if (hasBody) {
1363-
symbolDatabase->scopeList.emplace_back(symbolDatabase, nullptr, nestedIn);
1363+
symbolDatabase->scopeList.emplace_back(*symbolDatabase, nullptr, nestedIn);
13641364
scope = &symbolDatabase->scopeList.back();
13651365
scope->function = function;
13661366
scope->classDef = nameToken; // TODO: pass into ctor
@@ -1575,7 +1575,7 @@ void clangimport::parseClangAstDump(Tokenizer &tokenizer, std::istream &f)
15751575

15761576
tokenizer.createSymbolDatabase();
15771577
auto *symbolDatabase = const_cast<SymbolDatabase *>(tokenizer.getSymbolDatabase());
1578-
symbolDatabase->scopeList.emplace_back(symbolDatabase, nullptr, nullptr);
1578+
symbolDatabase->scopeList.emplace_back(*symbolDatabase, nullptr, nullptr);
15791579
symbolDatabase->scopeList.back().type = Scope::ScopeType::eGlobal;
15801580

15811581
clangimport::Data data;

lib/symboldatabase.cpp

Lines changed: 31 additions & 34 deletions
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 {
@@ -2789,10 +2789,10 @@ static bool typesMatch(
27892789
const Token *&new_second)
27902790
{
27912791
// get first type
2792-
const Type* first_type = first_scope->symdb->findType(first_token, first_scope, /*lookOutside*/ true);
2792+
const Type* first_type = first_scope->symdb.findType(first_token, first_scope, /*lookOutside*/ true);
27932793
if (first_type) {
27942794
// get second type
2795-
const Type* second_type = second_scope->symdb->findType(second_token, second_scope, /*lookOutside*/ true);
2795+
const Type* second_type = second_scope->symdb.findType(second_token, second_scope, /*lookOutside*/ true);
27962796
// check if types match
27972797
if (first_type == second_type) {
27982798
const Token* tok1 = first_token;
@@ -3438,7 +3438,7 @@ void SymbolDatabase::addClassFunction(Scope *&scope, const Token *&tok, const To
34383438
void SymbolDatabase::addNewFunction(Scope *&scope, const Token *&tok)
34393439
{
34403440
const Token *tok1 = tok;
3441-
scopeList.emplace_back(this, tok1, scope);
3441+
scopeList.emplace_back(*this, tok1, scope);
34423442
Scope *newScope = &scopeList.back();
34433443

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

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

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

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

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

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

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

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

47174717
//---------------------------------------------------------------------------
47184718

4719-
Scope::Scope(const SymbolDatabase *symdb_, const Token *classDef_, const Scope *nestedIn_, ScopeType type_, const Token *start_) :
4719+
Scope::Scope(const SymbolDatabase &symdb_, const Token *classDef_, const Scope *nestedIn_, ScopeType type_, const Token *start_) :
47204720
symdb(symdb_),
47214721
classDef(classDef_),
47224722
nestedIn(nestedIn_),
47234723
type(type_)
47244724
{
4725-
assert(symdb_);
47264725
setBodyStartEnd(start_);
47274726
}
47284727

4729-
Scope::Scope(const SymbolDatabase *symdb_, const Token *classDef_, const Scope *nestedIn_) :
4728+
Scope::Scope(const SymbolDatabase &symdb_, const Token *classDef_, const Scope *nestedIn_) :
47304729
symdb(symdb_),
47314730
classDef(classDef_),
47324731
nestedIn(nestedIn_)
47334732
{
4734-
assert(symdb_);
4735-
47364733
const Token *nameTok = classDef;
47374734
if (!classDef) {
47384735
type = Scope::eGlobal;
@@ -4790,7 +4787,7 @@ void Scope::addVariable(const Token *token_, const Token *start_, const Token *e
47904787
// keep possible size_t -> int truncation outside emplace_back() to have a single line
47914788
// C4267 VC++ warning instead of several dozens lines
47924789
const int varIndex = varlist.size();
4793-
varlist.emplace_back(token_, start_, end_, varIndex, access_, type_, scope_, scope_->symdb->mTokenizer.getSettings());
4790+
varlist.emplace_back(token_, start_, end_, varIndex, access_, type_, scope_, scope_->symdb.mTokenizer.getSettings());
47944791
}
47954792

47964793
// Get variable list..
@@ -4803,7 +4800,7 @@ void Scope::getVariableList()
48034800

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

48084805
// forward declaration
48094806
else
@@ -4948,7 +4945,7 @@ const Token *Scope::checkVariable(const Token *tok, AccessControl varaccess)
49484945
const Token *typestart = tok;
49494946

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

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

@@ -5053,7 +5050,7 @@ bool Scope::isVariableDeclaration(const Token* const tok, const Token*& vartok,
50535050
if (isCPP && Token::Match(tok, "throw|new"))
50545051
return false;
50555052

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

50585055
if (isCPP11 && tok->str() == "using")
50595056
return false;
@@ -7249,7 +7246,7 @@ static const Token* parsedecl(const Token* type,
72497246
valuetype->container = container;
72507247
} else {
72517248
const Scope *scope = type->scope();
7252-
valuetype->typeScope = scope->symdb->findScope(typeTokens.front(), scope);
7249+
valuetype->typeScope = scope->symdb.findScope(typeTokens.front(), scope);
72537250
if (valuetype->typeScope)
72547251
valuetype->type = (scope->type == Scope::ScopeType::eClass) ? ValueType::Type::RECORD : ValueType::Type::NONSTD;
72557252
}

lib/symboldatabase.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,10 +1029,10 @@ class CPPCHECKLIB Scope {
10291029

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

1032-
Scope(const SymbolDatabase *symdb_, const Token *classDef_, const Scope *nestedIn_);
1033-
Scope(const SymbolDatabase *symdb_, const Token *classDef_, const Scope *nestedIn_, ScopeType type_, const Token *start_);
1032+
Scope(const SymbolDatabase &symdb_, const Token *classDef_, const Scope *nestedIn_);
1033+
Scope(const SymbolDatabase &symdb_, const Token *classDef_, const Scope *nestedIn_, ScopeType type_, const Token *start_);
10341034

1035-
const SymbolDatabase* symdb{};
1035+
const SymbolDatabase& symdb;
10361036
std::string className;
10371037
const Token* classDef{}; ///< class/struct/union/namespace token
10381038
const Token* bodyStart{}; ///< '{' token

0 commit comments

Comments
 (0)