@@ -1002,24 +1002,24 @@ void SymbolDatabase::createSymbolDatabaseVariableSymbolTable()
10021002 }
10031003
10041004 // fill in missing variables if possible
1005- const std::size_t functions = functionScopes.size ();
1006- for (std::size_t i = 0 ; i < functions; ++i) {
1007- const Scope *func = functionScopes[i];
1005+ for (const Scope *func: functionScopes) {
10081006 for (const Token *tok = func->bodyStart ->next (); tok && tok != func->bodyEnd ; tok = tok->next ()) {
10091007 // check for member variable
1010- if (tok->varId () && tok->next () &&
1011- (tok->next ()->str () == " ." ||
1012- (tok->next ()->str () == " [" && tok->linkAt (1 )->strAt (1 ) == " ." ))) {
1013- const Token *tok1 = tok->next ()->str () == " ." ? tok->tokAt (2 ) : tok->linkAt (1 )->tokAt (2 );
1014- if (tok1 && tok1->varId () && mVariableList [tok1->varId ()] == nullptr ) {
1015- const Variable *var = mVariableList [tok->varId ()];
1016- if (var && var->typeScope ()) {
1017- // find the member variable of this variable
1018- const Variable *var1 = var->typeScope ()->getVariable (tok1->str ());
1019- if (var1) {
1020- // add this variable to the look up table
1021- mVariableList [tok1->varId ()] = var1;
1022- }
1008+ if (!Token::Match (tok, " %var% .|[" ))
1009+ continue ;
1010+ const Token* tokDot = tok->next ();
1011+ while (Token::simpleMatch (tokDot, " [" ))
1012+ tokDot = tokDot->link ()->next ();
1013+ if (!Token::Match (tokDot, " . %var%" ))
1014+ continue ;
1015+ const Token *member = tokDot->next ();
1016+ if (mVariableList [member->varId ()] == nullptr ) {
1017+ const Variable *var1 = mVariableList [tok->varId ()];
1018+ if (var1 && var1->typeScope ()) {
1019+ const Variable* memberVar = var1->typeScope ()->getVariable (member->str ());
1020+ if (memberVar) {
1021+ // add this variable to the look up table
1022+ mVariableList [member->varId ()] = memberVar;
10231023 }
10241024 }
10251025 }
@@ -4442,7 +4442,6 @@ void Scope::getVariableList(const Settings* settings, const Token* start, const
44424442
44434443 // Is it a function?
44444444 else if (tok->str () == " {" ) {
4445-
44464445 tok = tok->link ();
44474446 continue ;
44484447 }
@@ -4614,13 +4613,18 @@ const Token *Scope::checkVariable(const Token *tok, AccessControl varaccess, con
46144613
46154614const Variable *Scope::getVariable (const std::string &varname) const
46164615{
4617- std::list<Variable>::const_iterator iter;
4618-
4619- for (iter = varlist.begin (); iter != varlist.end (); ++iter) {
4620- if (iter->name () == varname)
4621- return &*iter;
4616+ for (const Variable& var: varlist) {
4617+ if (var.name () == varname)
4618+ return &var;
4619+ }
4620+ if (definedType) {
4621+ for (const Type::BaseInfo& baseInfo: definedType->derivedFrom ) {
4622+ if (baseInfo.type && baseInfo.type ->classScope ) {
4623+ if (const Variable* var = baseInfo.type ->classScope ->getVariable (varname))
4624+ return var;
4625+ }
4626+ }
46224627 }
4623-
46244628 return nullptr ;
46254629}
46264630
0 commit comments