diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index 956ec267e74bbc9e1b3f3229ac3ddb9599adbd79..f4b39763ce5b62358961e5f632f1ecaec3e9522c 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)