summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cppelementevaluator.cpp
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2020-12-22 08:29:18 +0100
committerJarek Kobus <jaroslaw.kobus@qt.io>2021-01-07 14:58:14 +0000
commit167651b537c28b6ae553904d42b22eda425802c0 (patch)
treece019da4508aa3bf8fe53e9cc1a62e7acd703a69 /src/plugins/cpptools/cppelementevaluator.cpp
parent936b63b4fcfd1c22f15fcf01d67933f8e0e9fc06 (diff)
downloadqt-creator-167651b537c28b6ae553904d42b22eda425802c0.tar.gz
Properly annotate templates with full scope in type hierarchy
Fix activation of template classes. Change-Id: I811f505c1c01fa95d74847cb91dd1cf37476534b Reviewed-by: hjk <hjk@qt.io>
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));