Add missing varid or variable for member variables.
Add an optional extended description…
This commit is contained in:
parent
c9eb7f4556
commit
7cae057615
|
@ -1209,8 +1209,36 @@ void SymbolDatabase::createSymbolDatabaseSetTypePointers()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SymbolDatabase::fixVarId(VarIdMap & varIds, const Token * vartok, Token * membertok, const Variable * membervar)
|
||||||
|
{
|
||||||
|
VarIdMap::iterator varId = varIds.find(vartok->varId());
|
||||||
|
if (varId == varIds.end()) {
|
||||||
|
MemberIdMap memberId;
|
||||||
|
if (membertok->varId() == 0) {
|
||||||
|
memberId[membervar->nameToken()->varId()] = const_cast<Tokenizer *>(_tokenizer)->newVarId();
|
||||||
|
_variableList.push_back(membervar);
|
||||||
|
} else
|
||||||
|
_variableList[membertok->varId()] = membervar;
|
||||||
|
varIds.insert(std::make_pair(vartok->varId(), memberId));
|
||||||
|
varId = varIds.find(vartok->varId());
|
||||||
|
}
|
||||||
|
MemberIdMap::iterator memberId = varId->second.find(membervar->nameToken()->varId());
|
||||||
|
if (memberId == varId->second.end()) {
|
||||||
|
if (membertok->varId() == 0) {
|
||||||
|
varId->second.insert(std::make_pair(membervar->nameToken()->varId(), const_cast<Tokenizer *>(_tokenizer)->newVarId()));
|
||||||
|
_variableList.push_back(membervar);
|
||||||
|
} else
|
||||||
|
_variableList[membertok->varId()] = membervar;
|
||||||
|
memberId = varId->second.find(membervar->nameToken()->varId());
|
||||||
|
}
|
||||||
|
if (membertok->varId() == 0)
|
||||||
|
membertok->varId(memberId->second);
|
||||||
|
}
|
||||||
|
|
||||||
void SymbolDatabase::createSymbolDatabaseSetVariablePointers()
|
void SymbolDatabase::createSymbolDatabaseSetVariablePointers()
|
||||||
{
|
{
|
||||||
|
VarIdMap varIds;
|
||||||
|
|
||||||
// Set variable pointers
|
// Set variable pointers
|
||||||
for (const Token* tok = _tokenizer->list.front(); tok != _tokenizer->list.back(); tok = tok->next()) {
|
for (const Token* tok = _tokenizer->list.front(); tok != _tokenizer->list.back(); tok = tok->next()) {
|
||||||
if (tok->varId())
|
if (tok->varId())
|
||||||
|
@ -1239,6 +1267,8 @@ void SymbolDatabase::createSymbolDatabaseSetVariablePointers()
|
||||||
const Variable *membervar = var->typeScope()->getVariable(membertok->str());
|
const Variable *membervar = var->typeScope()->getVariable(membertok->str());
|
||||||
if (membervar) {
|
if (membervar) {
|
||||||
membertok->variable(membervar);
|
membertok->variable(membervar);
|
||||||
|
if (membertok->varId() == 0 || _variableList[membertok->varId()] == nullptr)
|
||||||
|
fixVarId(varIds, tok, const_cast<Token *>(membertok), membervar);
|
||||||
}
|
}
|
||||||
} else if (var && tok->valueType() && tok->valueType()->type == ValueType::CONTAINER) {
|
} else if (var && tok->valueType() && tok->valueType()->type == ValueType::CONTAINER) {
|
||||||
if (Token::Match(var->typeStartToken(), "std :: %type% < %type% *| *| >")) {
|
if (Token::Match(var->typeStartToken(), "std :: %type% < %type% *| *| >")) {
|
||||||
|
@ -1247,6 +1277,8 @@ void SymbolDatabase::createSymbolDatabaseSetVariablePointers()
|
||||||
const Variable *membervar = type->classScope->getVariable(membertok->str());
|
const Variable *membervar = type->classScope->getVariable(membertok->str());
|
||||||
if (membervar) {
|
if (membervar) {
|
||||||
membertok->variable(membervar);
|
membertok->variable(membervar);
|
||||||
|
if (membertok->varId() == 0 || _variableList[membertok->varId()] == nullptr)
|
||||||
|
fixVarId(varIds, tok, const_cast<Token *>(membertok), membervar);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1178,6 +1178,11 @@ private:
|
||||||
Function *findFunctionInScope(const Token *func, const Scope *ns);
|
Function *findFunctionInScope(const Token *func, const Scope *ns);
|
||||||
const Type *findVariableTypeInBase(const Scope *scope, const Token *typeTok) const;
|
const Type *findVariableTypeInBase(const Scope *scope, const Token *typeTok) const;
|
||||||
|
|
||||||
|
typedef std::map<unsigned int, unsigned int> MemberIdMap;
|
||||||
|
typedef std::map<unsigned int, MemberIdMap> VarIdMap;
|
||||||
|
|
||||||
|
void fixVarId(VarIdMap & varIds, const Token * vartok, Token * membertok, const Variable * membervar);
|
||||||
|
|
||||||
/** Whether iName is a keyword as defined in http://en.cppreference.com/w/c/keyword and http://en.cppreference.com/w/cpp/keyword*/
|
/** Whether iName is a keyword as defined in http://en.cppreference.com/w/c/keyword and http://en.cppreference.com/w/cpp/keyword*/
|
||||||
bool isReservedName(const std::string& iName) const;
|
bool isReservedName(const std::string& iName) const;
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ class CPPCHECKLIB Tokenizer {
|
||||||
friend class TestSimplifyTokens;
|
friend class TestSimplifyTokens;
|
||||||
friend class TestSimplifyTypedef;
|
friend class TestSimplifyTypedef;
|
||||||
friend class TestTokenizer;
|
friend class TestTokenizer;
|
||||||
|
friend class SymbolDatabase;
|
||||||
public:
|
public:
|
||||||
Tokenizer();
|
Tokenizer();
|
||||||
Tokenizer(const Settings * settings, ErrorLogger *errorLogger);
|
Tokenizer(const Settings * settings, ErrorLogger *errorLogger);
|
||||||
|
@ -812,6 +813,14 @@ private:
|
||||||
|
|
||||||
Token *processFunc(Token *tok2, bool inOperator) const;
|
Token *processFunc(Token *tok2, bool inOperator) const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get new variable id.
|
||||||
|
* @return new variable id
|
||||||
|
*/
|
||||||
|
unsigned int newVarId() {
|
||||||
|
return ++_varId;
|
||||||
|
}
|
||||||
|
|
||||||
/** Set pod types */
|
/** Set pod types */
|
||||||
void setPodTypes();
|
void setPodTypes();
|
||||||
|
|
||||||
|
|
|
@ -817,7 +817,7 @@ private:
|
||||||
tok = tok ? tok->next() : nullptr;
|
tok = tok ? tok->next() : nullptr;
|
||||||
ASSERT(db != nullptr);
|
ASSERT(db != nullptr);
|
||||||
ASSERT(tok && tok->variable() && Token::simpleMatch(tok->variable()->typeStartToken(), "int x ;"));
|
ASSERT(tok && tok->variable() && Token::simpleMatch(tok->variable()->typeStartToken(), "int x ;"));
|
||||||
ASSERT(tok && tok->varId() == 0U); // It's possible to set a varId
|
ASSERT(tok && tok->varId() == 3U); // It's possible to set a varId
|
||||||
}
|
}
|
||||||
|
|
||||||
void arrayMemberVar2() {
|
void arrayMemberVar2() {
|
||||||
|
@ -833,7 +833,7 @@ private:
|
||||||
tok = tok ? tok->next() : nullptr;
|
tok = tok ? tok->next() : nullptr;
|
||||||
ASSERT(db != nullptr);
|
ASSERT(db != nullptr);
|
||||||
ASSERT(tok && tok->variable() && Token::simpleMatch(tok->variable()->typeStartToken(), "int x ;"));
|
ASSERT(tok && tok->variable() && Token::simpleMatch(tok->variable()->typeStartToken(), "int x ;"));
|
||||||
ASSERT(tok && tok->varId() == 0U); // It's possible to set a varId
|
ASSERT(tok && tok->varId() == 3U); // It's possible to set a varId
|
||||||
}
|
}
|
||||||
|
|
||||||
void arrayMemberVar3() {
|
void arrayMemberVar3() {
|
||||||
|
@ -849,7 +849,7 @@ private:
|
||||||
tok = tok ? tok->next() : nullptr;
|
tok = tok ? tok->next() : nullptr;
|
||||||
ASSERT(db != nullptr);
|
ASSERT(db != nullptr);
|
||||||
ASSERT(tok && tok->variable() && Token::simpleMatch(tok->variable()->typeStartToken(), "int x ;"));
|
ASSERT(tok && tok->variable() && Token::simpleMatch(tok->variable()->typeStartToken(), "int x ;"));
|
||||||
ASSERT(tok && tok->varId() == 0U); // It's possible to set a varId
|
ASSERT(tok && tok->varId() == 3U); // It's possible to set a varId
|
||||||
}
|
}
|
||||||
|
|
||||||
void staticMemberVar() {
|
void staticMemberVar() {
|
||||||
|
@ -4588,10 +4588,10 @@ private:
|
||||||
vartok = Token::findsimplematch(tokenizer.tokens(), "return");
|
vartok = Token::findsimplematch(tokenizer.tokens(), "return");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok, "i");
|
vartok = Token::findsimplematch(vartok, "i");
|
||||||
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "i");
|
vartok = Token::findsimplematch(vartok->next(), "i");
|
||||||
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "i");
|
vartok = Token::findsimplematch(vartok->next(), "i");
|
||||||
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
||||||
|
@ -4709,31 +4709,31 @@ private:
|
||||||
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok, "i");
|
vartok = Token::findsimplematch(vartok, "i");
|
||||||
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "b . i");
|
vartok = Token::findsimplematch(vartok->next(), "b . i");
|
||||||
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "i");
|
vartok = Token::findsimplematch(vartok->next(), "i");
|
||||||
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "c . i");
|
vartok = Token::findsimplematch(vartok->next(), "c . i");
|
||||||
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "i");
|
vartok = Token::findsimplematch(vartok->next(), "i");
|
||||||
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "d . i");
|
vartok = Token::findsimplematch(vartok->next(), "d . i");
|
||||||
ASSERT(db && vartok && vartok->variable() && vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "i");
|
vartok = Token::findsimplematch(vartok->next(), "i");
|
||||||
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "e . i");
|
vartok = Token::findsimplematch(vartok->next(), "e . i");
|
||||||
ASSERT(db && vartok && vartok->variable() && vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "i");
|
vartok = Token::findsimplematch(vartok->next(), "i");
|
||||||
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "i");
|
vartok = Token::findsimplematch(vartok->next(), "i");
|
||||||
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
||||||
|
@ -4801,31 +4801,31 @@ private:
|
||||||
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok, "i");
|
vartok = Token::findsimplematch(vartok, "i");
|
||||||
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "b . i");
|
vartok = Token::findsimplematch(vartok->next(), "b . i");
|
||||||
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "i");
|
vartok = Token::findsimplematch(vartok->next(), "i");
|
||||||
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "c . i");
|
vartok = Token::findsimplematch(vartok->next(), "c . i");
|
||||||
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
ASSERT(db && vartok && vartok->variable() && !vartok->variable()->isPointer() && vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "i");
|
vartok = Token::findsimplematch(vartok->next(), "i");
|
||||||
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "d . i");
|
vartok = Token::findsimplematch(vartok->next(), "d . i");
|
||||||
ASSERT(db && vartok && vartok->variable() && vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "i");
|
vartok = Token::findsimplematch(vartok->next(), "i");
|
||||||
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "e . i");
|
vartok = Token::findsimplematch(vartok->next(), "e . i");
|
||||||
ASSERT(db && vartok && vartok->variable() && vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->isPointer() && !vartok->variable()->isReference() && vartok->variable()->type() && vartok->variable()->type()->name() == "S");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "i");
|
vartok = Token::findsimplematch(vartok->next(), "i");
|
||||||
TODO_ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
||||||
|
|
||||||
vartok = Token::findsimplematch(vartok->next(), "i");
|
vartok = Token::findsimplematch(vartok->next(), "i");
|
||||||
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
ASSERT(db && vartok && vartok->variable() && vartok->variable()->typeStartToken()->str() == "int");
|
||||||
|
|
Loading…
Reference in New Issue