jvikstrom created this revision.
jvikstrom added reviewers: hokein, sammccall, ilya-biryukov.
Herald added subscribers: cfe-commits, kadircet, arphaman, jkorous, MaskRay.
Herald added a project: clang.
Template parameters and specializations were not being highlighted before. This
adds highlightings to those types of tokens by adding two Visit* methods.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D64855
Files:
clang-tools-extra/clangd/SemanticHighlighting.cpp
clang-tools-extra/clangd/SemanticHighlighting.h
clang-tools-extra/clangd/test/semantic-highlighting.test
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
@@ -40,7 +40,8 @@
{HighlightingKind::Namespace, "Namespace"},
{HighlightingKind::EnumConstant, "EnumConstant"},
{HighlightingKind::Field, "Field"},
- {HighlightingKind::Method, "Method"}};
+ {HighlightingKind::Method, "Method"},
+ {HighlightingKind::TemplateParameter, "TemplateParameter"}};
std::vector<HighlightingToken> ExpectedTokens;
for (const auto &KindString : KindToString) {
std::vector<HighlightingToken> Toks = makeHighlightingTokens(
@@ -80,14 +81,14 @@
)cpp",
R"cpp(
namespace $Namespace[[abc]] {
- template<typename T>
+ template<typename $TemplateParameter[[T]]>
struct $Class[[A]] {
- T $Field[[t]];
+ $TemplateParameter[[T]] $Field[[t]];
};
}
- template<typename T>
- struct $Class[[C]] : $Namespace[[abc]]::A<T> {
- typename T::A* $Field[[D]];
+ template<typename $TemplateParameter[[T]]>
+ struct $Class[[C]] : $Namespace[[abc]]::$Class[[A]]<$TemplateParameter[[T]]> {
+ typename $TemplateParameter[[T]]::A* $Field[[D]];
};
$Namespace[[abc]]::$Class[[A]]<int> $Variable[[AA]];
typedef $Namespace[[abc]]::$Class[[A]]<int> AAA;
@@ -173,6 +174,19 @@
}
int $Variable[[B]];
$Class[[AA]] $Variable[[A]]{$Variable[[B]]};
+ )cpp",
+ R"cpp(
+ template<typename $TemplateParameter[[T]], typename = void>
+ class $Class[[A]] {
+ $TemplateParameter[[T]] $Field[[AA]];
+ $TemplateParameter[[T]] $Method[[foo]]();
+ };
+ template<class $TemplateParameter[[TT]]>
+ class $Class[[B]] {
+ $Class[[A]]<$TemplateParameter[[TT]]> $Field[[AA]];
+ };
+ template<typename $TemplateParameter[[T]]>
+ void $Function[[foo]]($TemplateParameter[[T]] ...);
)cpp"};
for (const auto &TestCase : TestCases) {
checkHighlightings(TestCase);
Index: clang-tools-extra/clangd/test/semantic-highlighting.test
===================================================================
--- clang-tools-extra/clangd/test/semantic-highlighting.test
+++ clang-tools-extra/clangd/test/semantic-highlighting.test
@@ -27,6 +27,9 @@
# CHECK-NEXT: ],
# CHECK-NEXT: [
# CHECK-NEXT: "entity.name.namespace.cpp"
+# CHECK-NEXT: ],
+# CHECK-NEXT: [
+# CHECK-NEXT: "entity.name.type.template.cpp"
# CHECK-NEXT: ]
# CHECK-NEXT: ]
# CHECK-NEXT: },
Index: clang-tools-extra/clangd/SemanticHighlighting.h
===================================================================
--- clang-tools-extra/clangd/SemanticHighlighting.h
+++ clang-tools-extra/clangd/SemanticHighlighting.h
@@ -32,6 +32,7 @@
Enum,
EnumConstant,
Namespace,
+ TemplateParameter,
NumKinds,
};
Index: clang-tools-extra/clangd/SemanticHighlighting.cpp
===================================================================
--- clang-tools-extra/clangd/SemanticHighlighting.cpp
+++ clang-tools-extra/clangd/SemanticHighlighting.cpp
@@ -93,6 +93,19 @@
return true;
}
+ bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc &TL) {
+ // TemplateTypeParmTypeLoc does not have a TagDecl in its type ptr.
+ addToken(TL.getBeginLoc(), TL.getDecl());
+ return true;
+ }
+
+ bool VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc &TL) {
+ if (const TemplateDecl *TD =
+ TL.getTypePtr()->getTemplateName().getAsTemplateDecl())
+ addToken(TL.getBeginLoc(), TD);
+ return true;
+ }
+
bool VisitTypeLoc(TypeLoc &TL) {
// This check is for not getting two entries when there are anonymous
// structs. It also makes us not highlight certain namespace qualifiers
@@ -125,6 +138,10 @@
// We highlight class decls, constructor decls and destructor decls as
// `Class` type. The destructor decls are handled in `VisitTypeLoc` (we will
// visit a TypeLoc where the underlying Type is a CXXRecordDecl).
+ if(isa<ClassTemplateDecl>(D)) {
+ addToken(Loc, HighlightingKind::Class);
+ return;
+ }
if (isa<RecordDecl>(D)) {
addToken(Loc, HighlightingKind::Class);
return;
@@ -165,6 +182,10 @@
addToken(Loc, HighlightingKind::Namespace);
return;
}
+ if(isa<TemplateTypeParmDecl>(D)) {
+ addToken(Loc, HighlightingKind::TemplateParameter);
+ return;
+ }
}
void addToken(SourceLocation Loc, HighlightingKind Kind) {
@@ -287,6 +308,8 @@
return "variable.other.enummember.cpp";
case HighlightingKind::Namespace:
return "entity.name.namespace.cpp";
+ case HighlightingKind::TemplateParameter:
+ return "entity.name.type.template.cpp";
case HighlightingKind::NumKinds:
llvm_unreachable("must not pass NumKinds to the function");
}
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits