From 167651b537c28b6ae553904d42b22eda425802c0 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Tue, 22 Dec 2020 08:29:18 +0100 Subject: [PATCH] Properly annotate templates with full scope in type hierarchy Fix activation of template classes. Change-Id: I811f505c1c01fa95d74847cb91dd1cf37476534b Reviewed-by: hjk --- src/plugins/cpptools/cppelementevaluator.cpp | 25 +++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/plugins/cpptools/cppelementevaluator.cpp b/src/plugins/cpptools/cppelementevaluator.cpp index 5d1cca68ffc..971219915e6 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> 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> & } } + if (declaration->asTemplate() && declaration->asTemplate()->declaration() + && declaration->asTemplate()->declaration()->asClass()) + declaration = declaration->asTemplate()->declaration()->asClass(); + if (futureInterface.isCanceled()) return; QSharedPointer cppClass(new CppClass(declaration));