[clang-tools-extra] 94cd2f0 - [clangd] Add missing highlights for using decls.

Haojian Wu via cfe-commits cfe-commits at lists.llvm.org
Tue Oct 29 01:54:37 PDT 2019


Author: Haojian Wu
Date: 2019-10-29T09:49:42+01:00
New Revision: 94cd2f03032475e26767cf11eb81fefb00fc4dc0

URL: https://github.com/llvm/llvm-project/commit/94cd2f03032475e26767cf11eb81fefb00fc4dc0
DIFF: https://github.com/llvm/llvm-project/commit/94cd2f03032475e26767cf11eb81fefb00fc4dc0.diff

LOG: [clangd] Add missing highlights for using decls.

Reviewers: ilya-biryukov

Subscribers: MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D69506

Added: 
    

Modified: 
    clang-tools-extra/clangd/SemanticHighlighting.cpp
    clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp

Removed: 
    


################################################################################
diff  --git a/clang-tools-extra/clangd/SemanticHighlighting.cpp b/clang-tools-extra/clangd/SemanticHighlighting.cpp
index 464cbc4fcf85..62d3a164b5b8 100644
--- a/clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ b/clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -37,6 +37,10 @@ bool canHighlightName(DeclarationName Name) {
 
 llvm::Optional<HighlightingKind> kindForType(const Type *TP);
 llvm::Optional<HighlightingKind> kindForDecl(const NamedDecl *D) {
+  if (auto *USD = dyn_cast<UsingShadowDecl>(D)) {
+    if (auto *Target = USD->getTargetDecl())
+      D = Target;
+  }
   if (auto *TD = dyn_cast<TemplateDecl>(D)) {
     if (auto *Templated = TD->getTemplatedDecl())
       D = Templated;
@@ -99,11 +103,10 @@ llvm::Optional<HighlightingKind> kindForType(const Type *TP) {
     return kindForDecl(TD);
   return llvm::None;
 }
-// Given a set of candidate declarations for an unresolved name,
-// if the declarations all have the same highlighting kind, return
-// that highlighting kind, otherwise return None.
-llvm::Optional<HighlightingKind>
-kindForCandidateDecls(llvm::iterator_range<UnresolvedSetIterator> Decls) {
+// Given a set of candidate declarations, if the declarations all have the same
+// highlighting kind, return that highlighting kind, otherwise return None.
+template <typename IteratorRange>
+llvm::Optional<HighlightingKind> kindForCandidateDecls(IteratorRange Decls) {
   llvm::Optional<HighlightingKind> Result;
   for (NamedDecl *Decl : Decls) {
     auto Kind = kindForDecl(Decl);
@@ -196,6 +199,12 @@ class HighlightingTokenCollector
     return true;
   }
 
+  bool VisitUsingDecl(UsingDecl *UD) {
+    if (auto K = kindForCandidateDecls(UD->shadows()))
+      addToken(UD->getLocation(), *K);
+    return true;
+  }
+
   bool VisitDeclRefExpr(DeclRefExpr *Ref) {
     if (canHighlightName(Ref->getNameInfo().getName()))
       addToken(Ref->getLocation(), Ref->getDecl());

diff  --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
index 9d33b523f69b..139773b616ea 100644
--- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
+++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp
@@ -584,6 +584,11 @@ TEST(SemanticHighlighting, GetsCorrectTokens) {
           return $TemplateParameter[[T]]::$DependentName[[Field]];
         }
       };
+    )cpp",
+      // Highlighting the using decl as the underlying using shadow decl.
+      R"cpp(
+      void $Function[[foo]]();
+      using ::$Function[[foo]];
     )cpp"};
   for (const auto &TestCase : TestCases) {
     checkHighlightings(TestCase);


        


More information about the cfe-commits mailing list