Skip to content
Snippets Groups Projects
Commit f98b937b authored by Roberto Raggi's avatar Roberto Raggi
Browse files

Expand enum and anonymous scoped symbols when resolving qualified name ids.

Reviewed-by: Thorbjørn Lindeijer
parent c6db3543
No related branches found
No related tags found
No related merge requests found
...@@ -136,9 +136,19 @@ QList<Symbol *> LookupContext::resolveQualifiedNameId(QualifiedNameId *q, ...@@ -136,9 +136,19 @@ QList<Symbol *> LookupContext::resolveQualifiedNameId(QualifiedNameId *q,
else else
scopes = resolveNestedNameSpecifier(q, visibleScopes); 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, QList<Symbol *> LookupContext::resolveOperatorNameId(OperatorNameId *opId,
...@@ -301,6 +311,31 @@ QList<Scope *> LookupContext::visibleScopes(const QPair<FullySpecifiedType, Symb ...@@ -301,6 +311,31 @@ QList<Scope *> LookupContext::visibleScopes(const QPair<FullySpecifiedType, Symb
return scopes; 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 *> LookupContext::expand(const QList<Scope *> &scopes) const
{ {
QList<Scope *> expanded; QList<Scope *> expanded;
......
...@@ -114,6 +114,9 @@ public: ...@@ -114,6 +114,9 @@ public:
const QList<Scope *> &visibleScopes, const QList<Scope *> &visibleScopes,
QList<Scope *> *expandedScopes) const; QList<Scope *> *expandedScopes) const;
void expandEnumOrAnonymousSymbol(ScopedSymbol *scopedSymbol,
QList<Scope *> *expandedScopes) const;
private: private:
QList<Symbol *> resolveQualifiedNameId(QualifiedNameId *q, QList<Symbol *> resolveQualifiedNameId(QualifiedNameId *q,
const QList<Scope *> &visibleScopes, const QList<Scope *> &visibleScopes,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment