From 2b95b46e43a765733887b80473a8c4fc37097fe6 Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Wed, 5 May 2010 16:25:16 +0200 Subject: [PATCH] Improved CreateBindings::findClassOrNamespace(Symbol *) --- src/libs/cplusplus/LookupContext.cpp | 51 +++++++++++++++++++++------- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index 956ec267e74..f4b39763ce5 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -45,6 +45,25 @@ using namespace CPlusPlus; +static void fullyQualifiedName(Symbol *symbol, QList<const Name *> *names) +{ + if (! symbol) + return; + + fullyQualifiedName(symbol->enclosingSymbol(), names); + + if (symbol->name() && (symbol->isClass() || symbol->isNamespace())) { + if (const QualifiedNameId *q = symbol->name()->asQualifiedNameId()) { + for (unsigned i = 0; i < q->nameCount(); ++i) + names->append(q->nameAt(i)); + + } else if (symbol->name()->isNameId() || symbol->name()->isTemplateNameId()) { + names->append(symbol->name()); + + } + } +} + ///////////////////////////////////////////////////////////////////// // LookupContext ///////////////////////////////////////////////////////////////////// @@ -201,6 +220,14 @@ QList<Symbol *> LookupContext::lookup(const Name *name, Scope *scope) const const QualifiedNameId *q = fun->name()->asQualifiedNameId(); QList<QByteArray> path; + QList<const Name *> enclosingNames; + fullyQualifiedName(scope->owner(), &enclosingNames); + foreach (const Name *p, enclosingNames) { + if (const Identifier *id = p->identifier()) { + path.append(QByteArray::fromRawData(id->chars(), id->size())); + } + } + for (unsigned index = 0; index < q->nameCount() - 1; ++index) { if (const Identifier *id = q->nameAt(index)->identifier()) path.append(QByteArray::fromRawData(id->chars(), id->size())); @@ -572,22 +599,20 @@ ClassOrNamespace *CreateBindings::globalNamespace() const return _globalNamespace; } -ClassOrNamespace *CreateBindings::findClassOrNamespace(Symbol *s) +ClassOrNamespace *CreateBindings::findClassOrNamespace(Symbol *symbol) { - // jump to the enclosing class or namespace. - for (; s; s = s->enclosingSymbol()) { - if (s->isClass() || s->isNamespace()) - break; - } + QList<const Name *> names; + fullyQualifiedName(symbol, &names); - QList<QByteArray> path; - for (; s; s = s->enclosingSymbol()) { - if (const Identifier *id = s->identifier()) - path.prepend(QByteArray::fromRawData(id->chars(), id->size())); - } + if (names.isEmpty()) + return _globalNamespace; - ClassOrNamespace *e = _globalNamespace->findClassOrNamespace(path); - return e; + ClassOrNamespace *b = _globalNamespace->lookupClassOrNamespace(names.at(0)); + + for (int i = 1; b && i < names.size(); ++i) + b = b->findClassOrNamespace(names.at(i)); + + return b; } ClassOrNamespace *CreateBindings::findClassOrNamespace(const QList<QByteArray> &path) -- GitLab