From 6a3382d8de632380b0ffdd7e199844fcf977830f Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Thu, 28 May 2009 12:39:18 +0200 Subject: [PATCH] Say hello to LookupContext::resolveNestedNameSpecifier() --- src/libs/cplusplus/LookupContext.cpp | 63 ++++++++++++---------------- src/libs/cplusplus/LookupContext.h | 3 ++ 2 files changed, 29 insertions(+), 37 deletions(-) diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index 5723433aca0..ed2afed6edd 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -126,59 +126,48 @@ bool LookupContext::maybeValidSymbol(Symbol *symbol, return false; } -QList<Symbol *> LookupContext::resolveQualifiedNameId(QualifiedNameId *q, - const QList<Scope *> &visibleScopes, - ResolveMode mode) const +QList<Scope *> LookupContext::resolveNestedNameSpecifier(QualifiedNameId *q, + const QList<Scope *> &visibleScopes) const { - QList<Scope *> scopes = visibleScopes; QList<Symbol *> candidates; + QList<Scope *> scopes = visibleScopes; - for (unsigned i = 0; i < q->nameCount(); ++i) { + for (unsigned i = 0; i < q->nameCount() - 1; ++i) { Name *name = q->nameAt(i); - if (i + 1 == q->nameCount()) - candidates = resolve(name, scopes, mode); - else - candidates = resolveClassOrNamespace(name, scopes); + candidates = resolveClassOrNamespace(name, scopes); - if (candidates.isEmpty() || i + 1 == q->nameCount()) + if (candidates.isEmpty()) break; scopes.clear(); + foreach (Symbol *candidate, candidates) { - if (ScopedSymbol *scoped = candidate->asScopedSymbol()) { - scopes.append(scoped->members()); - } + ScopedSymbol *scoped = candidate->asScopedSymbol(); + Scope *members = scoped->members(); + + if (! scopes.contains(members)) + scopes.append(members); } } - Identifier *id = q->identifier(); - foreach (Scope *scope, visibleScopes) { - Symbol *symbol = scope->lookat(id); - for (; symbol; symbol = symbol->next()) { - if (! symbol->name()) - continue; - else if (! maybeValidSymbol(symbol, mode, candidates)) - continue; - QualifiedNameId *qq = symbol->name()->asQualifiedNameId(); - if (! qq) - continue; - if (q->nameCount() > qq->nameCount()) - continue; + return scopes; +} + +QList<Symbol *> LookupContext::resolveQualifiedNameId(QualifiedNameId *q, + const QList<Scope *> &visibleScopes, + ResolveMode mode) const +{ + QList<Scope *> scopes; - for (int i = q->nameCount() - 1; i != -1; --i) { - Name *a = q->nameAt(i); - Name *b = qq->nameAt(i); + if (q->nameCount() == 1) + scopes = visibleScopes; // ### handle global scope lookup + else + scopes = resolveNestedNameSpecifier(q, visibleScopes); - if (! a->isEqualTo(b)) - break; - else if (i == 0) - candidates.append(symbol); - } - } - } + // ### expand the scopes. - return candidates; + return resolve(q->unqualifiedNameId(), scopes, mode); } QList<Symbol *> LookupContext::resolveOperatorNameId(OperatorNameId *opId, diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h index 4985e11f741..fcfac578262 100644 --- a/src/libs/cplusplus/LookupContext.h +++ b/src/libs/cplusplus/LookupContext.h @@ -123,6 +123,9 @@ private: const QList<Scope *> &visibleScopes, ResolveMode mode) const; + QList<Scope *> resolveNestedNameSpecifier(QualifiedNameId *q, + const QList<Scope *> &visibleScopes) const; + Identifier *identifier(const Name *name) const; QList<Scope *> buildVisibleScopes(); -- GitLab