[PATCH] D65510: [clangd] Fix implicit template instatiations appearing as topLevelDecls.
Johan Vikström via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 31 06:48:25 PDT 2019
jvikstrom created this revision.
jvikstrom added reviewers: hokein, ilya-biryukov.
Herald added subscribers: cfe-commits, kadircet, arphaman, jkorous, MaskRay.
Herald added a project: clang.
The parser gives implicit template instantiations to the action's HandleTopLevelDecls callback. This makes semantic highlighting highlight these templated functions multiple times. Fixed by filtering on if a Decl is an implicit function/variable/class instantiation. Also added a testcase to semantic highlighting on this.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D65510
Files:
clang-tools-extra/clangd/ClangdUnit.cpp
clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
Index: clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -214,7 +214,25 @@
template<typename $TemplateParameter[[T]]>
void $Function[[foo]]($TemplateParameter[[T]] ...);
- )cpp"};
+ )cpp",
+ R"cpp(
+ class $Class[[Foo]] {
+ public:
+ template <typename $TemplateParameter[[T1]]>
+ void $Method[[ff]]($TemplateParameter[[T1]]) {}
+ };
+ template <typename $TemplateParameter[[T1]]>
+ void $Function[[ff]]($TemplateParameter[[T1]]) {}
+ enum $Enum[[E]] { $EnumConstant[[VALUE]] };
+ void $Function[[s]]() {
+ $Function[[ff]]($EnumConstant[[VALUE]]);
+ $Function[[ff]]($Class[[Foo]]());
+ $Class[[Foo]] $Variable[[s]];
+ $Variable[[s]].$Method[[ff]]($EnumConstant[[VALUE]]);
+ $Variable[[s]].$Method[[ff]]($Class[[Foo]]());
+ }
+ )cpp"
+ };
for (const auto &TestCase : TestCases) {
checkHighlightings(TestCase);
}
Index: clang-tools-extra/clangd/ClangdUnit.cpp
===================================================================
--- clang-tools-extra/clangd/ClangdUnit.cpp
+++ clang-tools-extra/clangd/ClangdUnit.cpp
@@ -19,8 +19,11 @@
#include "index/CanonicalIncludes.h"
#include "index/Index.h"
#include "clang/AST/ASTContext.h"
+#include "clang/AST/Decl.h"
+#include "clang/AST/DeclCXX.h"
#include "clang/Basic/LangOptions.h"
#include "clang/Basic/SourceManager.h"
+#include "clang/Basic/Specifiers.h"
#include "clang/Basic/TokenKinds.h"
#include "clang/Frontend/CompilerInstance.h"
#include "clang/Frontend/CompilerInvocation.h"
@@ -60,6 +63,12 @@
return Vec.capacity() * sizeof(T);
}
+template <class T> bool isImplicitTemplateInstantiation(const Decl *D) {
+ if (const auto *TD = dyn_cast<T>(D))
+ return TD->getTemplateSpecializationKind() == TSK_ImplicitInstantiation;
+ return false;
+}
+
class DeclTrackingASTConsumer : public ASTConsumer {
public:
DeclTrackingASTConsumer(std::vector<Decl *> &TopLevelDecls)
@@ -70,6 +79,10 @@
auto &SM = D->getASTContext().getSourceManager();
if (!isInsideMainFile(D->getLocation(), SM))
continue;
+ if (isImplicitTemplateInstantiation<FunctionDecl>(D) ||
+ isImplicitTemplateInstantiation<CXXRecordDecl>(D) ||
+ isImplicitTemplateInstantiation<VarDecl>(D))
+ continue;
// ObjCMethodDecl are not actually top-level decls.
if (isa<ObjCMethodDecl>(D))
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D65510.212569.patch
Type: text/x-patch
Size: 2639 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190731/50053bf5/attachment-0001.bin>
More information about the cfe-commits
mailing list