Skip to content

Commit e237520

Browse files
committedSep 9, 2019
[clangd] Add a new highlighting kind for typedefs
Summary: We still attempt to highlight them as underlying types, but fallback to the generic 'typedef' highlighting kind if the underlying type is too complicated. Reviewers: hokein Reviewed By: hokein Subscribers: nridge, MaskRay, jkorous, arphaman, kadircet, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D67290 llvm-svn: 371402
1 parent 59608c0 commit e237520

File tree

4 files changed

+48
-18
lines changed

4 files changed

+48
-18
lines changed
 

Diff for: ‎clang-tools-extra/clangd/SemanticHighlighting.cpp

+30-8
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "clang/AST/RecursiveASTVisitor.h"
1818
#include "clang/AST/Type.h"
1919
#include "clang/AST/TypeLoc.h"
20+
#include "clang/Basic/SourceLocation.h"
2021
#include <algorithm>
2122

2223
namespace clang {
@@ -125,13 +126,12 @@ class HighlightingTokenCollector
125126
}
126127

127128
bool VisitTypedefNameDecl(TypedefNameDecl *TD) {
128-
if (const auto *TSI = TD->getTypeSourceInfo())
129-
addType(TD->getLocation(), TSI->getTypeLoc().getTypePtr());
129+
addTokenForTypedef(TD->getLocation(), TD);
130130
return true;
131131
}
132132

133133
bool VisitTypedefTypeLoc(TypedefTypeLoc TL) {
134-
addType(TL.getBeginLoc(), TL.getTypePtr());
134+
addTokenForTypedef(TL.getBeginLoc(), TL.getTypedefNameDecl());
135135
return true;
136136
}
137137

@@ -182,17 +182,35 @@ class HighlightingTokenCollector
182182
}
183183

184184
private:
185-
void addType(SourceLocation Loc, const Type *TP) {
186-
if (!TP)
185+
void addTokenForTypedef(SourceLocation Loc, const TypedefNameDecl *TD) {
186+
auto *TSI = TD->getTypeSourceInfo();
187+
if (!TSI)
188+
return;
189+
// Try to highlight as underlying type.
190+
if (addType(Loc, TSI->getType().getTypePtrOrNull()))
187191
return;
188-
if (TP->isBuiltinType())
192+
// Fallback to the typedef highlighting kind.
193+
addToken(Loc, HighlightingKind::Typedef);
194+
}
195+
196+
bool addType(SourceLocation Loc, const Type *TP) {
197+
if (!TP)
198+
return false;
199+
if (TP->isBuiltinType()) {
189200
// Builtins must be special cased as they do not have a TagDecl.
190201
addToken(Loc, HighlightingKind::Primitive);
191-
if (auto *TD = dyn_cast<TemplateTypeParmType>(TP))
202+
return true;
203+
}
204+
if (auto *TD = dyn_cast<TemplateTypeParmType>(TP)) {
192205
// TemplateTypeParmType also do not have a TagDecl.
193206
addToken(Loc, TD->getDecl());
194-
if (auto *TD = TP->getAsTagDecl())
207+
return true;
208+
}
209+
if (auto *TD = TP->getAsTagDecl()) {
195210
addToken(Loc, TD);
211+
return true;
212+
}
213+
return false;
196214
}
197215

198216
void addToken(SourceLocation Loc, const NamedDecl *D) {
@@ -379,6 +397,8 @@ llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, HighlightingKind K) {
379397
return OS << "Enum";
380398
case HighlightingKind::EnumConstant:
381399
return OS << "EnumConstant";
400+
case HighlightingKind::Typedef:
401+
return OS << "Typedef";
382402
case HighlightingKind::Namespace:
383403
return OS << "Namespace";
384404
case HighlightingKind::TemplateParameter:
@@ -506,6 +526,8 @@ llvm::StringRef toTextMateScope(HighlightingKind Kind) {
506526
return "entity.name.type.enum.cpp";
507527
case HighlightingKind::EnumConstant:
508528
return "variable.other.enummember.cpp";
529+
case HighlightingKind::Typedef:
530+
return "entity.name.type.typedef.cpp";
509531
case HighlightingKind::Namespace:
510532
return "entity.name.namespace.cpp";
511533
case HighlightingKind::TemplateParameter:

Diff for: ‎clang-tools-extra/clangd/SemanticHighlighting.h

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ enum class HighlightingKind {
3636
Class,
3737
Enum,
3838
EnumConstant,
39+
Typedef,
3940
Namespace,
4041
TemplateParameter,
4142
Primitive,

Diff for: ‎clang-tools-extra/clangd/test/semantic-highlighting.test

+7-4
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838
# CHECK-NEXT: "variable.other.enummember.cpp"
3939
# CHECK-NEXT: ],
4040
# CHECK-NEXT: [
41+
# CHECK-NEXT: "entity.name.type.typedef.cpp"
42+
# CHECK-NEXT: ],
43+
# CHECK-NEXT: [
4144
# CHECK-NEXT: "entity.name.namespace.cpp"
4245
# CHECK-NEXT: ],
4346
# CHECK-NEXT: [
@@ -58,7 +61,7 @@
5861
# CHECK-NEXT: "lines": [
5962
# CHECK-NEXT: {
6063
# CHECK-NEXT: "line": 0,
61-
# CHECK-NEXT: "tokens": "AAAAAAADAA0AAAAEAAEAAA=="
64+
# CHECK-NEXT: "tokens": "AAAAAAADAA4AAAAEAAEAAA=="
6265
# CHECK-NEXT: }
6366
# CHECK-NEXT: ],
6467
# CHECK-NEXT: "textDocument": {
@@ -73,11 +76,11 @@
7376
# CHECK-NEXT: "lines": [
7477
# CHECK-NEXT: {
7578
# CHECK-NEXT: "line": 0,
76-
# CHECK-NEXT: "tokens": "AAAAAAADAA0AAAAEAAEAAA=="
79+
# CHECK-NEXT: "tokens": "AAAAAAADAA4AAAAEAAEAAA=="
7780
# CHECK-NEXT: }
7881
# CHECK-NEXT: {
7982
# CHECK-NEXT: "line": 1,
80-
# CHECK-NEXT: "tokens": "AAAAAAADAA0AAAAEAAEAAA=="
83+
# CHECK-NEXT: "tokens": "AAAAAAADAA4AAAAEAAEAAA=="
8184
# CHECK-NEXT: }
8285
# CHECK-NEXT: ],
8386
# CHECK-NEXT: "textDocument": {
@@ -92,7 +95,7 @@
9295
# CHECK-NEXT: "lines": [
9396
# CHECK-NEXT: {
9497
# CHECK-NEXT: "line": 1,
95-
# CHECK-NEXT: "tokens": "AAAAAAADAA0AAAAEAAEAAA=="
98+
# CHECK-NEXT: "tokens": "AAAAAAADAA4AAAAEAAEAAA=="
9699
# CHECK-NEXT: }
97100
# CHECK-NEXT: ],
98101
# CHECK-NEXT: "textDocument": {

Diff for: ‎clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp

+10-6
Original file line numberDiff line numberDiff line change
@@ -496,12 +496,16 @@ TEST(SemanticHighlighting, GetsCorrectTokens) {
496496
typedef $TemplateParameter[[T]] $TemplateParameter[[TemplateParam2]];
497497
using $Primitive[[IntType]] = $Primitive[[int]];
498498
499-
// These typedefs are not yet highlighted, their types are complicated.
500-
using Pointer = $TemplateParameter[[T]] *;
501-
using LVReference = $TemplateParameter[[T]] &;
502-
using RVReference = $TemplateParameter[[T]]&&;
503-
using Array = $TemplateParameter[[T]]*[3];
504-
using MemberPointer = $Primitive[[int]] (A::*)($Primitive[[int]]);
499+
using $Typedef[[Pointer]] = $TemplateParameter[[T]] *;
500+
using $Typedef[[LVReference]] = $TemplateParameter[[T]] &;
501+
using $Typedef[[RVReference]] = $TemplateParameter[[T]]&&;
502+
using $Typedef[[Array]] = $TemplateParameter[[T]]*[3];
503+
using $Typedef[[MemberPointer]] = $Primitive[[int]] (A::*)($Primitive[[int]]);
504+
505+
// Use various previously defined typedefs in a function type.
506+
$Primitive[[void]] $Method[[func]](
507+
$Typedef[[Pointer]], $Typedef[[LVReference]], $Typedef[[RVReference]],
508+
$Typedef[[Array]], $Typedef[[MemberPointer]]);
505509
};
506510
)cpp"};
507511
for (const auto &TestCase : TestCases) {

0 commit comments

Comments
 (0)
Please sign in to comment.