forked from qt-creator/qt-creator
Fixed lookup of qualified name ids.
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user