nridge created this revision.
nridge added a reviewer: hokein.
Herald added subscribers: cfe-commits, usaxena95, kadircet, arphaman, jkorous, 
MaskRay, ilya-biryukov.
Herald added a project: clang.

Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D67901

Files:
  clang-tools-extra/clangd/SemanticHighlighting.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
@@ -175,7 +175,7 @@
       }
       template<typename $TemplateParameter[[T]]>
       struct $Class[[C]] : $Namespace[[abc]]::$Class[[A]]<$TemplateParameter[[T]]> {
-        typename $TemplateParameter[[T]]::A* $Field[[D]];
+        typename $TemplateParameter[[T]]::$Class[[A]]* $Field[[D]];
       };
       $Namespace[[abc]]::$Class[[A]]<$Primitive[[int]]> $Variable[[AA]];
       typedef $Namespace[[abc]]::$Class[[A]]<$Primitive[[int]]> $Class[[AAA]];
@@ -509,6 +509,55 @@
           $Typedef[[Pointer]], $Typedef[[LVReference]], $Typedef[[RVReference]],
           $Typedef[[Array]], $Typedef[[MemberPointer]]);
       };
+    )cpp",
+      R"cpp(
+      template <class $TemplateParameter[[T]]>
+      $Primitive[[void]] $Function[[foo]]($TemplateParameter[[T]] $Parameter[[P]]) {
+        $Function[[bar]]($Parameter[[P]]);
+      }
+    )cpp",
+      R"cpp(
+      class $Class[[A]] {
+        template <class $TemplateParameter[[T]]>
+        $Primitive[[void]] $Method[[bar]]($TemplateParameter[[T]]);
+      };
+
+      template <class $TemplateParameter[[U]]>
+      $Primitive[[void]] $Function[[foo]]($TemplateParameter[[U]] $Parameter[[P]]) {
+        $Class[[A]]().$Method[[bar]]($Parameter[[P]]);
+      }
+    )cpp",
+      R"cpp(
+      struct $Class[[A]] {
+        template <class $TemplateParameter[[T]]>
+        static $Primitive[[void]] $StaticMethod[[foo]]($TemplateParameter[[T]]);
+      };
+
+      template <class $TemplateParameter[[T]]>
+      struct $Class[[B]] {
+        $Primitive[[void]] $Method[[bar]]() {
+          $Class[[A]]::$StaticMethod[[foo]]($TemplateParameter[[T]]());
+        }
+      };
+    )cpp",
+      R"cpp(
+      template <class $TemplateParameter[[T]]>
+      $Primitive[[void]] $Function[[foo]](typename $TemplateParameter[[T]]::$Class[[Type]]
+                                            = $TemplateParameter[[T]]::$StaticField[[val]]);
+    )cpp",
+      R"cpp(
+      template <class $TemplateParameter[[T]]>
+      $Primitive[[void]] $Function[[foo]]($TemplateParameter[[T]] $Parameter[[P]]) {
+        $Parameter[[P]].$Field[[Field]];
+      }
+    )cpp",
+      R"cpp(
+      template <class $TemplateParameter[[T]]>
+      class $Class[[A]] {
+        $Primitive[[int]] $Method[[foo]]() {
+          return $TemplateParameter[[T]]::$StaticField[[Field]];
+        }
+      };
     )cpp"};
   for (const auto &TestCase : TestCases) {
     checkHighlightings(TestCase);
Index: clang-tools-extra/clangd/SemanticHighlighting.cpp
===================================================================
--- clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -152,6 +152,38 @@
     return true;
   }
 
+  bool VisitUnresolvedLookupExpr(UnresolvedLookupExpr *E) {
+    if (canHighlightName(E->getName())) {
+      addToken(E->getNameLoc(), E->getNamingClass()
+                                    ? HighlightingKind::StaticMethod
+                                    : HighlightingKind::Function);
+    }
+    return true;
+  }
+
+  bool VisitUnresolvedMemberExpr(UnresolvedMemberExpr *E) {
+    if (canHighlightName(E->getMemberName())) {
+      addToken(E->getNameLoc(), HighlightingKind::Method);
+    }
+    return true;
+  }
+
+  bool VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
+    if (canHighlightName(E->getDeclName())) {
+      addToken(E->getLocation(), HighlightingKind::StaticField);
+    }
+    return true;
+  }
+
+  bool VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E) {
+    if (canHighlightName(E->getMember())) {
+      addToken(E->getMemberLoc(), E->getQualifier()
+                                      ? HighlightingKind::StaticField
+                                      : HighlightingKind::Field);
+    }
+    return true;
+  }
+
   bool VisitNamedDecl(NamedDecl *ND) {
     if (canHighlightName(ND->getDeclName()))
       addToken(ND->getLocation(), ND);
@@ -187,6 +219,11 @@
     return true;
   }
 
+  bool VisitDependentNameTypeLoc(DependentNameTypeLoc L) {
+    addToken(L.getNameLoc(), HighlightingKind::Class);
+    return true;
+  }
+
   bool VisitTypeLoc(TypeLoc TL) {
     if (auto K = kindForType(TL.getTypePtr()))
       addToken(TL.getBeginLoc(), *K);
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to