Skip to content

Commit 7cae057

Browse files
IOBYTEPKEuS
authored andcommitted
Add missing varid or variable for member variables.
Add an optional extended description…
1 parent c9eb7f4 commit 7cae057

4 files changed

Lines changed: 61 additions & 15 deletions

File tree

lib/symboldatabase.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1209,8 +1209,36 @@ void SymbolDatabase::createSymbolDatabaseSetTypePointers()
12091209
}
12101210
}
12111211

1212+
void SymbolDatabase::fixVarId(VarIdMap & varIds, const Token * vartok, Token * membertok, const Variable * membervar)
1213+
{
1214+
VarIdMap::iterator varId = varIds.find(vartok->varId());
1215+
if (varId == varIds.end()) {
1216+
MemberIdMap memberId;
1217+
if (membertok->varId() == 0) {
1218+
memberId[membervar->nameToken()->varId()] = const_cast<Tokenizer *>(_tokenizer)->newVarId();
1219+
_variableList.push_back(membervar);
1220+
} else
1221+
_variableList[membertok->varId()] = membervar;
1222+
varIds.insert(std::make_pair(vartok->varId(), memberId));
1223+
varId = varIds.find(vartok->varId());
1224+
}
1225+
MemberIdMap::iterator memberId = varId->second.find(membervar->nameToken()->varId());
1226+
if (memberId == varId->second.end()) {
1227+
if (membertok->varId() == 0) {
1228+
varId->second.insert(std::make_pair(membervar->nameToken()->varId(), const_cast<Tokenizer *>(_tokenizer)->newVarId()));
1229+
_variableList.push_back(membervar);
1230+
} else
1231+
_variableList[membertok->varId()] = membervar;
1232+
memberId = varId->second.find(membervar->nameToken()->varId());
1233+
}
1234+
if (membertok->varId() == 0)
1235+
membertok->varId(memberId->second);
1236+
}
1237+
12121238
void SymbolDatabase::createSymbolDatabaseSetVariablePointers()
12131239
{
1240+
VarIdMap varIds;
1241+
12141242
// Set variable pointers
12151243
for (const Token* tok = _tokenizer->list.front(); tok != _tokenizer->list.back(); tok = tok->next()) {
12161244
if (tok->varId())
@@ -1239,6 +1267,8 @@ void SymbolDatabase::createSymbolDatabaseSetVariablePointers()
12391267
const Variable *membervar = var->typeScope()->getVariable(membertok->str());
12401268
if (membervar) {
12411269
membertok->variable(membervar);
1270+
if (membertok->varId() == 0 || _variableList[membertok->varId()] == nullptr)
1271+
fixVarId(varIds, tok, const_cast<Token *>(membertok), membervar);
12421272
}
12431273
} else if (var && tok->valueType() && tok->valueType()->type == ValueType::CONTAINER) {
12441274
if (Token::Match(var->typeStartToken(), "std :: %type% < %type% *| *| >")) {
@@ -1247,6 +1277,8 @@ void SymbolDatabase::createSymbolDatabaseSetVariablePointers()
12471277
const Variable *membervar = type->classScope->getVariable(membertok->str());
12481278
if (membervar) {
12491279
membertok->variable(membervar);
1280+
if (membertok->varId() == 0 || _variableList[membertok->varId()] == nullptr)
1281+
fixVarId(varIds, tok, const_cast<Token *>(membertok), membervar);
12501282
}
12511283
}
12521284
}

lib/symboldatabase.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,6 +1178,11 @@ class CPPCHECKLIB SymbolDatabase {
11781178
Function *findFunctionInScope(const Token *func, const Scope *ns);
11791179
const Type *findVariableTypeInBase(const Scope *scope, const Token *typeTok) const;
11801180

1181+
typedef std::map<unsigned int, unsigned int> MemberIdMap;
1182+
typedef std::map<unsigned int, MemberIdMap> VarIdMap;
1183+
1184+
void fixVarId(VarIdMap & varIds, const Token * vartok, Token * membertok, const Variable * membervar);
1185+
11811186
/** Whether iName is a keyword as defined in http://en.cppreference.com/w/c/keyword and http://en.cppreference.com/w/cpp/keyword*/
11821187
bool isReservedName(const std::string& iName) const;
11831188

lib/tokenize.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class CPPCHECKLIB Tokenizer {
4444
friend class TestSimplifyTokens;
4545
friend class TestSimplifyTypedef;
4646
friend class TestTokenizer;
47+
friend class SymbolDatabase;
4748
public:
4849
Tokenizer();
4950
Tokenizer(const Settings * settings, ErrorLogger *errorLogger);
@@ -812,6 +813,14 @@ class CPPCHECKLIB Tokenizer {
812813

813814
Token *processFunc(Token *tok2, bool inOperator) const;
814815

816+
/**
817+
* Get new variable id.
818+
* @return new variable id
819+
*/
820+
unsigned int newVarId() {
821+
return ++_varId;
822+
}
823+
815824
/** Set pod types */
816825
void setPodTypes();
817826

test/testsymboldatabase.cpp

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -817,7 +817,7 @@ class TestSymbolDatabase: public TestFixture {
817817
tok = tok ? tok->next() : nullptr;
818818
ASSERT(db != nullptr);
819819
ASSERT(tok && tok->variable() && Token::simpleMatch(tok->variable()->typeStartToken(), "int x ;"));
820-
ASSERT(tok && tok->varId() == 0U); // It's possible to set a varId
820+
ASSERT(tok && tok->varId() == 3U); // It's possible to set a varId
821821
}
822822

823823
void arrayMemberVar2() {
@@ -833,7 +833,7 @@ class TestSymbolDatabase: public TestFixture {
833833
tok = tok ? tok->next() : nullptr;
834834
ASSERT(db != nullptr);
835835
ASSERT(tok && tok->variable() && Token::simpleMatch(tok->variable()->typeStartToken(), "int x ;"));
836-
ASSERT(tok && tok->varId() == 0U); // It's possible to set a varId
836+
ASSERT(tok && tok->varId() == 3U); // It's possible to set a varId
837837
}
838838

839839
void arrayMemberVar3() {
@@ -849,7 +849,7 @@ class TestSymbolDatabase: public TestFixture {
849849
tok = tok ? tok->next() : nullptr;
850850
ASSERT(db != nullptr);
851851
ASSERT(tok && tok->variable() && Token::simpleMatch(tok->variable()->typeStartToken(), "int x ;"));
852-
ASSERT(tok && tok->varId() == 0U); // It's possible to set a varId
852+
ASSERT(tok && tok->varId() == 3U); // It's possible to set a varId
853853
}
854854

855855
void staticMemberVar() {
@@ -4588,10 +4588,10 @@ class TestSymbolDatabase: public TestFixture {
45884588
vartok = Token::findsimplematch(tokenizer.tokens(), "return");
45894589

45904590
vartok = Token::findsimplematch(vartok, "i");
4591-
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
4591+
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
45924592

45934593
vartok = Token::findsimplematch(vartok->next(), "i");
4594-
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
4594+
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
45954595

45964596
vartok = Token::findsimplematch(vartok->next(), "i");
45974597
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
@@ -4709,31 +4709,31 @@ class TestSymbolDatabase: public TestFixture {
47094709
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
47104710

47114711
vartok = Token::findsimplematch(vartok, "i");
4712-
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
4712+
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
47134713

47144714
vartok = Token::findsimplematch(vartok->next(), "b . i");
47154715
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
47164716

47174717
vartok = Token::findsimplematch(vartok->next(), "i");
4718-
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
4718+
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
47194719

47204720
vartok = Token::findsimplematch(vartok->next(), "c . i");
47214721
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
47224722

47234723
vartok = Token::findsimplematch(vartok->next(), "i");
4724-
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
4724+
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
47254725

47264726
vartok = Token::findsimplematch(vartok->next(), "d . i");
47274727
ASSERT(db && vartok && vartok->variable() && vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
47284728

47294729
vartok = Token::findsimplematch(vartok->next(), "i");
4730-
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
4730+
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
47314731

47324732
vartok = Token::findsimplematch(vartok->next(), "e . i");
47334733
ASSERT(db && vartok && vartok->variable() && vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
47344734

47354735
vartok = Token::findsimplematch(vartok->next(), "i");
4736-
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
4736+
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
47374737

47384738
vartok = Token::findsimplematch(vartok->next(), "i");
47394739
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
@@ -4801,31 +4801,31 @@ class TestSymbolDatabase: public TestFixture {
48014801
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
48024802

48034803
vartok = Token::findsimplematch(vartok, "i");
4804-
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
4804+
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
48054805

48064806
vartok = Token::findsimplematch(vartok->next(), "b . i");
48074807
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
48084808

48094809
vartok = Token::findsimplematch(vartok->next(), "i");
4810-
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
4810+
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
48114811

48124812
vartok = Token::findsimplematch(vartok->next(), "c . i");
48134813
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
48144814

48154815
vartok = Token::findsimplematch(vartok->next(), "i");
4816-
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
4816+
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
48174817

48184818
vartok = Token::findsimplematch(vartok->next(), "d . i");
48194819
ASSERT(db && vartok && vartok->variable() && vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
48204820

48214821
vartok = Token::findsimplematch(vartok->next(), "i");
4822-
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
4822+
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
48234823

48244824
vartok = Token::findsimplematch(vartok->next(), "e . i");
48254825
ASSERT(db && vartok && vartok->variable() && vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
48264826

48274827
vartok = Token::findsimplematch(vartok->next(), "i");
4828-
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
4828+
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
48294829

48304830
vartok = Token::findsimplematch(vartok->next(), "i");
48314831
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");

0 commit comments

Comments
 (0)