[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