diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index cbf6b1ef6600a0378086f1d53196e833b2fd56d6..28f8b0dd58f8758dc7cc17a0987f0c2d640a4537 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -274,129 +274,151 @@ void LookupContext::expand(const QList<Scope *> &scopes, QList<Scope *> *expande } } -void LookupContext::expand(Scope *scope, - const QList<Scope *> &visibleScopes, - QList<Scope *> *expandedScopes) const +void LookupContext::expandNamespace(Scope *scope, + const QList<Scope *> &visibleScopes, + QList<Scope *> *expandedScopes) const { - Overview overview; - - if (expandedScopes->contains(scope)) { - //qDebug() << "skipped:" << overview.prettyName(scope->owner()->name()); + Namespace *ns = scope->owner()->asNamespace(); + if (! ns) return; - } - expandedScopes->append(scope); + if (Name *nsName = ns->name()) { + const QList<Symbol *> namespaceList = resolveNamespace(nsName, visibleScopes); + foreach (Symbol *otherNs, namespaceList) { + if (otherNs == ns) + continue; + expand(otherNs->asNamespace()->members(), visibleScopes, expandedScopes); + } + } - if (scope->isNamespaceScope()) { - Namespace *ns = scope->owner()->asNamespace(); - Name *nsName = ns->name(); - if (nsName) { - QList<Symbol *> namespaceList = resolveNamespace(nsName, visibleScopes); - foreach (Symbol *otherNs, namespaceList) { - if (otherNs == ns) - continue; - expand(otherNs->asNamespace()->members(), visibleScopes, expandedScopes); + for (unsigned i = 0; i < scope->symbolCount(); ++i) { // ### make me fast + Symbol *symbol = scope->symbolAt(i); + if (Namespace *ns = symbol->asNamespace()) { + if (! ns->name()) { + expand(ns->members(), visibleScopes, expandedScopes); } - //qDebug() << "*** found:" << namespaceList.count() << "namespace aliases"; - } - //qDebug() << "namespace scope" << overview.prettyName(ns->name()) - //<< ns->fileName() << ns->line(); - for (unsigned i = 0; i < scope->symbolCount(); ++i) { // ### make me fast - Symbol *symbol = scope->symbolAt(i); - if (Namespace *ns = symbol->asNamespace()) { - if (! ns->name()) { - expand(ns->members(), visibleScopes, expandedScopes); - } - } else if (UsingNamespaceDirective *u = symbol->asUsingNamespaceDirective()) { - QList<Symbol *> candidates = resolveNamespace(u->name(), visibleScopes); - //qDebug() << "found:" << candidates.count() << "namespaces to import for:" - //<< overview.prettyName(u->name()); - for (int j = 0; j < candidates.size(); ++j) { - expand(candidates.at(j)->asNamespace()->members(), - visibleScopes, expandedScopes); - } - } else if (Enum *e = symbol->asEnum()) { - expand(e->members(), visibleScopes, expandedScopes); + } else if (UsingNamespaceDirective *u = symbol->asUsingNamespaceDirective()) { + const QList<Symbol *> candidates = resolveNamespace(u->name(), visibleScopes); + for (int j = 0; j < candidates.size(); ++j) { + expand(candidates.at(j)->asNamespace()->members(), + visibleScopes, expandedScopes); } + } else if (Enum *e = symbol->asEnum()) { + expand(e->members(), visibleScopes, expandedScopes); } - } else if (scope->isClassScope()) { - Class *klass = scope->owner()->asClass(); - for (unsigned i = 0; i < scope->symbolCount(); ++i) { - Symbol *symbol = scope->symbolAt(i); - if (Class *nestedClass = symbol->asClass()) { - if (! nestedClass->name()) { - expand(nestedClass->members(), visibleScopes, expandedScopes); - } - } else if (Enum *e = symbol->asEnum()) { - expand(e->members(), visibleScopes, expandedScopes); + } +} + +void LookupContext::expandClass(Scope *scope, + const QList<Scope *> &visibleScopes, + QList<Scope *> *expandedScopes) const +{ + Class *klass = scope->owner()->asClass(); + if (! klass) + return; + + for (unsigned i = 0; i < scope->symbolCount(); ++i) { + Symbol *symbol = scope->symbolAt(i); + if (Class *nestedClass = symbol->asClass()) { + if (! nestedClass->name()) { + expand(nestedClass->members(), visibleScopes, expandedScopes); } + } else if (Enum *e = symbol->asEnum()) { + expand(e->members(), visibleScopes, expandedScopes); } + } - if (klass->baseClassCount()) { - QList<Scope *> classVisibleScopes = visibleScopes; - for (Scope *scope = klass->scope(); scope; scope = scope->enclosingScope()) { - if (scope->isNamespaceScope()) { - Namespace *enclosingNamespace = scope->owner()->asNamespace(); - if (enclosingNamespace->name()) { - QList<Symbol *> nsList = resolveNamespace(enclosingNamespace->name(), - visibleScopes); - foreach (Symbol *ns, nsList) { - expand(ns->asNamespace()->members(), classVisibleScopes, &classVisibleScopes); - } + if (klass->baseClassCount()) { + QList<Scope *> classVisibleScopes = visibleScopes; + for (Scope *scope = klass->scope(); scope; scope = scope->enclosingScope()) { + if (scope->isNamespaceScope()) { + Namespace *enclosingNamespace = scope->owner()->asNamespace(); + if (enclosingNamespace->name()) { + const QList<Symbol *> nsList = resolveNamespace(enclosingNamespace->name(), + visibleScopes); + foreach (Symbol *ns, nsList) { + expand(ns->asNamespace()->members(), classVisibleScopes, + &classVisibleScopes); } } } - - for (unsigned i = 0; i < klass->baseClassCount(); ++i) { - BaseClass *baseClass = klass->baseClassAt(i); - Name *baseClassName = baseClass->name(); - QList<Symbol *> baseClassCandidates = resolveClass(baseClassName, classVisibleScopes); - if (baseClassCandidates.isEmpty()) { - Overview overview; - qDebug() << "unresolved base class:" << overview.prettyName(baseClassName); - } - for (int j = 0; j < baseClassCandidates.size(); ++j) { - Class *baseClassSymbol = baseClassCandidates.at(j)->asClass(); - expand(baseClassSymbol->members(), visibleScopes, expandedScopes); - } - } } - } else if (scope->isBlockScope()) { - //qDebug() << "block scope" << overview.prettyName(scope->owner()->name()); - for (unsigned i = 0; i < scope->symbolCount(); ++i) { - Symbol *symbol = scope->symbolAt(i); - if (UsingNamespaceDirective *u = symbol->asUsingNamespaceDirective()) { - QList<Symbol *> candidates = resolveNamespace(u->name(), visibleScopes); - //qDebug() << "found:" << candidates.count() << "namespaces to import for:" - //<< overview.prettyName(u->name()); - for (int j = 0; j < candidates.size(); ++j) { - expand(candidates.at(j)->asNamespace()->members(), - visibleScopes, expandedScopes); - } + + for (unsigned i = 0; i < klass->baseClassCount(); ++i) { + BaseClass *baseClass = klass->baseClassAt(i); + Name *baseClassName = baseClass->name(); + const QList<Symbol *> baseClassCandidates = resolveClass(baseClassName, + classVisibleScopes); + if (baseClassCandidates.isEmpty()) { + Overview overview; + qDebug() << "unresolved base class:" << overview.prettyName(baseClassName); } + for (int j = 0; j < baseClassCandidates.size(); ++j) { + Class *baseClassSymbol = baseClassCandidates.at(j)->asClass(); + expand(baseClassSymbol->members(), visibleScopes, expandedScopes); + } } - } else if (scope->isFunctionScope()) { - Function *function = scope->owner()->asFunction(); - //qDebug() << "function scope" << overview.prettyName(function->name()); - if (! expandedScopes->contains(function->arguments())) - expandedScopes->append(function->arguments()); - if (QualifiedNameId *q = function->name()->asQualifiedNameId()) { - //qDebug() << "**** here:" << overview.prettyName(function->name()); - Name *nestedNameSpec = 0; - if (q->nameCount() == 1 && q->isGlobal()) - nestedNameSpec = q->nameAt(0); - else - nestedNameSpec = control()->qualifiedNameId(q->names(), q->nameCount() - 1, - q->isGlobal()); - QList<Symbol *> candidates = resolveClassOrNamespace(nestedNameSpec, visibleScopes); - //qDebug() << "**** found:" << candidates.count() << "class or namespace for:" - //<< overview.prettyName(nestedNameSpec); + } +} + +void LookupContext::expandBlock(Scope *scope, + const QList<Scope *> &visibleScopes, + QList<Scope *> *expandedScopes) const +{ + for (unsigned i = 0; i < scope->symbolCount(); ++i) { + Symbol *symbol = scope->symbolAt(i); + if (UsingNamespaceDirective *u = symbol->asUsingNamespaceDirective()) { + const QList<Symbol *> candidates = resolveNamespace(u->name(), + visibleScopes); for (int j = 0; j < candidates.size(); ++j) { - expand(candidates.at(j)->asScopedSymbol()->members(), + expand(candidates.at(j)->asNamespace()->members(), visibleScopes, expandedScopes); } } + + } +} + +void LookupContext::expandFunction(Scope *scope, + const QList<Scope *> &visibleScopes, + QList<Scope *> *expandedScopes) const +{ + Function *function = scope->owner()->asFunction(); + if (! expandedScopes->contains(function->arguments())) + expandedScopes->append(function->arguments()); + if (QualifiedNameId *q = function->name()->asQualifiedNameId()) { + Name *nestedNameSpec = 0; + if (q->nameCount() == 1 && q->isGlobal()) + nestedNameSpec = q->nameAt(0); + else + nestedNameSpec = control()->qualifiedNameId(q->names(), q->nameCount() - 1, + q->isGlobal()); + const QList<Symbol *> candidates = resolveClassOrNamespace(nestedNameSpec, visibleScopes); + for (int j = 0; j < candidates.size(); ++j) { + expand(candidates.at(j)->asScopedSymbol()->members(), + visibleScopes, expandedScopes); + } + } +} + +void LookupContext::expand(Scope *scope, + const QList<Scope *> &visibleScopes, + QList<Scope *> *expandedScopes) const +{ + if (expandedScopes->contains(scope)) + return; + + expandedScopes->append(scope); + + if (scope->isNamespaceScope()) { + expandNamespace(scope, visibleScopes, expandedScopes); + } else if (scope->isClassScope()) { + expandClass(scope, visibleScopes, expandedScopes); + } else if (scope->isBlockScope()) { + expandBlock(scope, visibleScopes, expandedScopes); + } else if (scope->isFunctionScope()) { + expandFunction(scope, visibleScopes, expandedScopes); } else if (scope->isPrototypeScope()) { //qDebug() << "prototype scope" << overview.prettyName(scope->owner()->name()); } diff --git a/src/libs/cplusplus/LookupContext.h b/src/libs/cplusplus/LookupContext.h index e1aec69d1225837f9dbdcab01b1709735cf99393..58d5baf439d06af49a5b13f30a896fe09c09e5f6 100644 --- a/src/libs/cplusplus/LookupContext.h +++ b/src/libs/cplusplus/LookupContext.h @@ -124,9 +124,26 @@ public: void expand(Scope *scope, const QList<Scope *> &visibleScopes, QList<Scope *> *expandedScopes) const; + void expandNamespace(Scope *scope, + const QList<Scope *> &visibleScopes, + QList<Scope *> *expandedScopes) const; + + void expandClass(Scope *scope, + const QList<Scope *> &visibleScopes, + QList<Scope *> *expandedScopes) const; + + void expandBlock(Scope *scope, + const QList<Scope *> &visibleScopes, + QList<Scope *> *expandedScopes) const; + + void expandFunction(Scope *scope, + const QList<Scope *> &visibleScopes, + QList<Scope *> *expandedScopes) const; + private: QList<Scope *> buildVisibleScopes(); + private: Control *_control;