diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index d686e14fd91ec0ffba82bc0b451dffd25a348ec2..a00b45263b4ad60eddb7e0dd09df41f0507d2d9a 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -136,9 +136,19 @@ QList<Symbol *> LookupContext::resolveQualifiedNameId(QualifiedNameId *q, else scopes = resolveNestedNameSpecifier(q, visibleScopes); - // ### expand the scopes. + QList<Scope *> expanded; + foreach (Scope *scope, scopes) { + expanded.append(scope); + + for (unsigned i = 0; i < scope->symbolCount(); ++i) { + Symbol *member = scope->symbolAt(i); + + if (ScopedSymbol *scopedSymbol = member->asScopedSymbol()) + expandEnumOrAnonymousSymbol(scopedSymbol, &expanded); + } + } - return resolve(q->unqualifiedNameId(), scopes, mode); + return resolve(q->unqualifiedNameId(), expanded, mode); } QList<Symbol *> LookupContext::resolveOperatorNameId(OperatorNameId *opId, @@ -301,6 +311,31 @@ QList<Scope *> LookupContext::visibleScopes(const QPair<FullySpecifiedType, Symb return scopes; } +void LookupContext::expandEnumOrAnonymousSymbol(ScopedSymbol *scopedSymbol, + QList<Scope *> *expandedScopes) const +{ + if (! scopedSymbol || expandedScopes->contains(scopedSymbol->members())) + return; + + Scope *members = scopedSymbol->members(); + + if (scopedSymbol->isEnum()) + expandedScopes->append(members); + else if (! scopedSymbol->name() && (scopedSymbol->isClass() || scopedSymbol->isNamespace())) { + // anonymous class or namespace + + expandedScopes->append(members); + + for (unsigned i = 0; i < members->symbolCount(); ++i) { + Symbol *member = members->symbolAt(i); + + if (ScopedSymbol *nested = member->asScopedSymbol()) { + expandEnumOrAnonymousSymbol(nested, expandedScopes); + } + } + } +} + QList<Scope *> LookupContext::expand(const QList<Scope *> &scopes) const { QList<Scope *> expanded; diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h index 0fb7371e5eb7bb27e80638b146d594d64f934872..568725da56d52cf14453fe9aec0a4212122ba199 100644 --- a/src/libs/cplusplus/LookupContext.h +++ b/src/libs/cplusplus/LookupContext.h @@ -114,6 +114,9 @@ public: const QList<Scope *> &visibleScopes, QList<Scope *> *expandedScopes) const; + void expandEnumOrAnonymousSymbol(ScopedSymbol *scopedSymbol, + QList<Scope *> *expandedScopes) const; + private: QList<Symbol *> resolveQualifiedNameId(QualifiedNameId *q, const QList<Scope *> &visibleScopes,