diff options
author | Jarek Kobus <jaroslaw.kobus@qt.io> | 2020-12-22 08:29:18 +0100 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@qt.io> | 2021-01-07 14:58:14 +0000 |
commit | 167651b537c28b6ae553904d42b22eda425802c0 (patch) | |
tree | ce019da4508aa3bf8fe53e9cc1a62e7acd703a69 /src/plugins/cpptools/cppelementevaluator.cpp | |
parent | 936b63b4fcfd1c22f15fcf01d67933f8e0e9fc06 (diff) | |
download | qt-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.cpp | 25 |
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)); |