Fixed lookup of qualified name ids.

This commit is contained in:
Roberto Raggi
2009-10-12 14:07:01 +02:00
parent b0e58aa834
commit f7263f2333

View File

@@ -132,63 +132,65 @@ QList<Symbol *> LookupContext::resolveQualifiedNameId(QualifiedNameId *q,
{ {
QList<Symbol *> candidates; QList<Symbol *> candidates;
for (int i = 0; i < visibleScopes.size(); ++i) { if (true || mode & ResolveClass) {
Scope *scope = visibleScopes.at(i); for (int i = 0; i < visibleScopes.size(); ++i) {
Scope *scope = visibleScopes.at(i);
for (Symbol *symbol = scope->lookat(q); symbol; symbol = symbol->next()) { for (Symbol *symbol = scope->lookat(q); symbol; symbol = symbol->next()) {
if (! symbol->name()) if (! symbol->name())
continue; continue;
else if (! symbol->isClass())
continue;
QualifiedNameId *qq = symbol->name()->asQualifiedNameId(); QualifiedNameId *qq = symbol->name()->asQualifiedNameId();
if (! qq) if (! qq)
continue; continue;
else if (! maybeValidSymbol(symbol, mode, candidates)) else if (! maybeValidSymbol(symbol, mode, candidates))
continue; continue;
if (! q->unqualifiedNameId()->isEqualTo(qq->unqualifiedNameId())) if (! q->unqualifiedNameId()->isEqualTo(qq->unqualifiedNameId()))
continue; continue;
else if (qq->nameCount() == q->nameCount()) { else if (qq->nameCount() == q->nameCount()) {
unsigned j = 0; unsigned j = 0;
for (; j < q->nameCount(); ++j) { for (; j < q->nameCount(); ++j) {
Name *classOrNamespaceName1 = q->nameAt(j); Name *classOrNamespaceName1 = q->nameAt(j);
Name *classOrNamespaceName2 = qq->nameAt(j); Name *classOrNamespaceName2 = qq->nameAt(j);
if (! classOrNamespaceName1->isEqualTo(classOrNamespaceName2)) if (! classOrNamespaceName1->isEqualTo(classOrNamespaceName2))
break; break;
}
if (j == q->nameCount())
candidates.append(symbol);
} }
if (j == q->nameCount())
candidates.append(symbol);
} }
} }
} }
if (candidates.isEmpty()) { QList<Scope *> scopes;
QList<Scope *> scopes;
if (q->nameCount() == 1) if (q->nameCount() == 1)
scopes = visibleScopes; // ### handle global scope lookup scopes = visibleScopes; // ### handle global scope lookup
else else
scopes = resolveNestedNameSpecifier(q, visibleScopes); scopes = resolveNestedNameSpecifier(q, visibleScopes);
QList<Scope *> expanded; QList<Scope *> expanded;
foreach (Scope *scope, scopes) { foreach (Scope *scope, scopes) {
expanded.append(scope); expanded.append(scope);
for (unsigned i = 0; i < scope->symbolCount(); ++i) { for (unsigned i = 0; i < scope->symbolCount(); ++i) {
Symbol *member = scope->symbolAt(i); Symbol *member = scope->symbolAt(i);
if (ScopedSymbol *scopedSymbol = member->asScopedSymbol()) if (ScopedSymbol *scopedSymbol = member->asScopedSymbol())
expandEnumOrAnonymousSymbol(scopedSymbol, &expanded); expandEnumOrAnonymousSymbol(scopedSymbol, &expanded);
}
} }
candidates += resolve(q->unqualifiedNameId(), expanded, mode);
} }
candidates += resolve(q->unqualifiedNameId(), expanded, mode);
return candidates; return candidates;
} }