summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cppelementevaluator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/cpptools/cppelementevaluator.cpp')
-rw-r--r--src/plugins/cpptools/cppelementevaluator.cpp25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/plugins/cpptools/cppelementevaluator.cpp b/src/plugins/cpptools/cppelementevaluator.cpp
index 5d1cca68ff..971219915e 100644
--- a/src/plugins/cpptools/cppelementevaluator.cpp
+++ b/src/plugins/cpptools/cppelementevaluator.cpp
@@ -133,7 +133,8 @@ CppDeclarableElement::CppDeclarableElement(Symbol *declaration)
name = overview.prettyName(declaration->name());
if (declaration->enclosingScope()->isClass() ||
declaration->enclosingScope()->isNamespace() ||
- declaration->enclosingScope()->isEnum()) {
+ declaration->enclosingScope()->isEnum() ||
+ declaration->enclosingScope()->isTemplate()) {
qualifiedName = overview.prettyName(LookupContext::fullyQualifiedName(declaration));
helpIdCandidates = stripName(qualifiedName);
} else {
@@ -462,9 +463,23 @@ QFuture<QSharedPointer<CppElement>> CppElementEvaluator::execute(SourceFunction
if (lookupItems.isEmpty())
return createFinishedFuture();
- const LookupItem &lookupItem = lookupItems.first(); // ### TODO: select best candidate.
- if (shouldOmitElement(lookupItem, scope))
+ LookupItem lookupItem;
+
+ for (const LookupItem &item : lookupItems) {
+ if (shouldOmitElement(item, scope))
+ continue;
+ Symbol *symbol = item.declaration();
+ if (!symbol)
+ continue;
+ if (!symbol->isClass() && !symbol->isTemplate() && !symbol->isForwardClassDeclaration())
+ continue;
+ lookupItem = item;
+ break;
+ }
+
+ if (!lookupItem.declaration())
return createFinishedFuture();
+
return std::invoke(execFuntion, this, snapshot, lookupItem, typeOfExpression.context());
}
@@ -566,6 +581,10 @@ static void handleLookupItemMatch(QFutureInterface<QSharedPointer<CppElement>> &
}
}
+ if (declaration->asTemplate() && declaration->asTemplate()->declaration()
+ && declaration->asTemplate()->declaration()->asClass())
+ declaration = declaration->asTemplate()->declaration()->asClass();
+
if (futureInterface.isCanceled())
return;
QSharedPointer<CppClass> cppClass(new CppClass(declaration));