[clang-tools-extra] r371379 - [clangd] Highlight typedefs to template parameters as template parameters
Ilya Biryukov via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 9 02:37:18 PDT 2019
Author: ibiryukov
Date: Mon Sep 9 02:37:17 2019
New Revision: 371379
URL: http://llvm.org/viewvc/llvm-project?rev=371379&view=rev
Log:
[clangd] Highlight typedefs to template parameters as template parameters
Summary:
Template parameters were handled outside `addType`, this led to lack of highlightings for typedefs
to template types.
This was never desirable, we want to highlight our typedefs as their underlying type.
Note that typedefs to more complicated types, like pointers and references are still not highlighted.
Original patch by Johan Vikström.
Reviewers: hokein, jvikstrom
Reviewed By: hokein
Subscribers: nridge, javed.absar, kristof.beyls, MaskRay, jkorous, arphaman, kadircet, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D66516
Modified:
clang-tools-extra/trunk/clangd/SemanticHighlighting.cpp
clang-tools-extra/trunk/clangd/unittests/SemanticHighlightingTests.cpp
Modified: clang-tools-extra/trunk/clangd/SemanticHighlighting.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/SemanticHighlighting.cpp?rev=371379&r1=371378&r2=371379&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/SemanticHighlighting.cpp (original)
+++ clang-tools-extra/trunk/clangd/SemanticHighlighting.cpp Mon Sep 9 02:37:17 2019
@@ -15,6 +15,8 @@
#include "clang/AST/Decl.h"
#include "clang/AST/DeclCXX.h"
#include "clang/AST/RecursiveASTVisitor.h"
+#include "clang/AST/Type.h"
+#include "clang/AST/TypeLoc.h"
#include <algorithm>
namespace clang {
@@ -128,13 +130,12 @@ public:
return true;
}
- bool VisitTemplateTypeParmTypeLoc(TemplateTypeParmTypeLoc &TL) {
- // TemplateTypeParmTypeLoc does not have a TagDecl in its type ptr.
- addToken(TL.getBeginLoc(), TL.getDecl());
+ bool VisitTypedefTypeLoc(TypedefTypeLoc TL) {
+ addType(TL.getBeginLoc(), TL.getTypePtr());
return true;
}
- bool VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc &TL) {
+ bool VisitTemplateSpecializationTypeLoc(TemplateSpecializationTypeLoc TL) {
if (const TemplateDecl *TD =
TL.getTypePtr()->getTemplateName().getAsTemplateDecl())
addToken(TL.getBeginLoc(), TD);
@@ -187,7 +188,10 @@ private:
if (TP->isBuiltinType())
// Builtins must be special cased as they do not have a TagDecl.
addToken(Loc, HighlightingKind::Primitive);
- if (const TagDecl *TD = TP->getAsTagDecl())
+ if (auto *TD = dyn_cast<TemplateTypeParmType>(TP))
+ // TemplateTypeParmType also do not have a TagDecl.
+ addToken(Loc, TD->getDecl());
+ if (auto *TD = TP->getAsTagDecl())
addToken(Loc, TD);
}
Modified: clang-tools-extra/trunk/clangd/unittests/SemanticHighlightingTests.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/unittests/SemanticHighlightingTests.cpp?rev=371379&r1=371378&r2=371379&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/unittests/SemanticHighlightingTests.cpp (original)
+++ clang-tools-extra/trunk/clangd/unittests/SemanticHighlightingTests.cpp Mon Sep 9 02:37:17 2019
@@ -474,7 +474,7 @@ TEST(SemanticHighlighting, GetsCorrectTo
$Macro[[assert]]($Variable[[x]] != $Function[[f]]());
}
)cpp",
- R"cpp(
+ R"cpp(
struct $Class[[S]] {
$Primitive[[float]] $Field[[Value]];
$Class[[S]] *$Field[[Next]];
@@ -488,6 +488,21 @@ TEST(SemanticHighlighting, GetsCorrectTo
// Highlights references to BindingDecls.
$Variable[[B1]]++;
}
+ )cpp",
+ R"cpp(
+ template<class $TemplateParameter[[T]]>
+ class $Class[[A]] {
+ using $TemplateParameter[[TemplateParam1]] = $TemplateParameter[[T]];
+ typedef $TemplateParameter[[T]] $TemplateParameter[[TemplateParam2]];
+ using $Primitive[[IntType]] = $Primitive[[int]];
+
+ // These typedefs are not yet highlighted, their types are complicated.
+ using Pointer = $TemplateParameter[[T]] *;
+ using LVReference = $TemplateParameter[[T]] &;
+ using RVReference = $TemplateParameter[[T]]&&;
+ using Array = $TemplateParameter[[T]]*[3];
+ using MemberPointer = $Primitive[[int]] (A::*)($Primitive[[int]]);
+ };
)cpp"};
for (const auto &TestCase : TestCases) {
checkHighlightings(TestCase);
More information about the cfe-commits
mailing list