Skip to content

Commit a7dcd46

Browse files
committed
[SourceKit] Add an operator syntax kind
This will allow us to do semantic highlighting for operators in SourceKit-LSP.
1 parent 5494161 commit a7dcd46

17 files changed

+271
-67
lines changed

include/swift/IDE/SyntaxModel.h

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ namespace ide {
2929
enum class SyntaxNodeKind : uint8_t {
3030
Keyword,
3131
Identifier,
32+
Operator,
3233
DollarIdent,
3334
Integer,
3435
Floating,

lib/IDE/SyntaxModel.cpp

+13-2
Original file line numberDiff line numberDiff line change
@@ -231,9 +231,20 @@ SyntaxModelContext::SyntaxModelContext(SourceFile &SrcFile)
231231
break;
232232

233233
case tok::oper_prefix:
234-
if (Tok.getText() == "-")
234+
if (Tok.getText() == "-" && I != E &&
235+
(Tokens[I+1].getKind() == tok::integer_literal ||
236+
Tokens[I+1].getKind() == tok::floating_literal)) {
235237
UnaryMinusLoc = Loc;
236-
continue;
238+
continue;
239+
} else {
240+
Kind = SyntaxNodeKind::Operator;
241+
break;
242+
}
243+
case tok::oper_postfix:
244+
case tok::oper_binary_spaced:
245+
case tok::oper_binary_unspaced:
246+
Kind = SyntaxNodeKind::Operator;
247+
break;
237248

238249
case tok::comment:
239250
if (Tok.getText().startswith("///") ||

test/SourceKit/DocSupport/doc_clang_module.swift.response

+40
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,11 @@ var FooSubUnnamedEnumeratorA1: Int { get }
459459
key.offset: 189,
460460
key.length: 4
461461
},
462+
{
463+
key.kind: source.lang.swift.syntaxtype.operator,
464+
key.offset: 194,
465+
key.length: 2
466+
},
462467
{
463468
key.kind: source.lang.swift.syntaxtype.argument,
464469
key.offset: 198,
@@ -617,6 +622,11 @@ var FooSubUnnamedEnumeratorA1: Int { get }
617622
key.offset: 427,
618623
key.length: 4
619624
},
625+
{
626+
key.kind: source.lang.swift.syntaxtype.operator,
627+
key.offset: 432,
628+
key.length: 2
629+
},
620630
{
621631
key.kind: source.lang.swift.syntaxtype.argument,
622632
key.offset: 436,
@@ -797,6 +807,11 @@ var FooSubUnnamedEnumeratorA1: Int { get }
797807
key.offset: 697,
798808
key.length: 4
799809
},
810+
{
811+
key.kind: source.lang.swift.syntaxtype.operator,
812+
key.offset: 702,
813+
key.length: 2
814+
},
800815
{
801816
key.kind: source.lang.swift.syntaxtype.argument,
802817
key.offset: 706,
@@ -1018,6 +1033,11 @@ var FooSubUnnamedEnumeratorA1: Int { get }
10181033
key.offset: 1045,
10191034
key.length: 4
10201035
},
1036+
{
1037+
key.kind: source.lang.swift.syntaxtype.operator,
1038+
key.offset: 1050,
1039+
key.length: 2
1040+
},
10211041
{
10221042
key.kind: source.lang.swift.syntaxtype.argument,
10231043
key.offset: 1054,
@@ -1162,6 +1182,11 @@ var FooSubUnnamedEnumeratorA1: Int { get }
11621182
key.offset: 1316,
11631183
key.length: 4
11641184
},
1185+
{
1186+
key.kind: source.lang.swift.syntaxtype.operator,
1187+
key.offset: 1321,
1188+
key.length: 2
1189+
},
11651190
{
11661191
key.kind: source.lang.swift.syntaxtype.argument,
11671192
key.offset: 1325,
@@ -1302,6 +1327,11 @@ var FooSubUnnamedEnumeratorA1: Int { get }
13021327
key.offset: 1547,
13031328
key.length: 17
13041329
},
1330+
{
1331+
key.kind: source.lang.swift.syntaxtype.operator,
1332+
key.offset: 1565,
1333+
key.length: 2
1334+
},
13051335
{
13061336
key.kind: source.lang.swift.ref.generic_type_param,
13071337
key.name: "S",
@@ -4313,6 +4343,11 @@ var FooSubUnnamedEnumeratorA1: Int { get }
43134343
key.offset: 7269,
43144344
key.length: 4
43154345
},
4346+
{
4347+
key.kind: source.lang.swift.syntaxtype.operator,
4348+
key.offset: 7274,
4349+
key.length: 2
4350+
},
43164351
{
43174352
key.kind: source.lang.swift.syntaxtype.argument,
43184353
key.offset: 7278,
@@ -4483,6 +4518,11 @@ var FooSubUnnamedEnumeratorA1: Int { get }
44834518
key.offset: 7542,
44844519
key.length: 4
44854520
},
4521+
{
4522+
key.kind: source.lang.swift.syntaxtype.operator,
4523+
key.offset: 7547,
4524+
key.length: 2
4525+
},
44864526
{
44874527
key.kind: source.lang.swift.syntaxtype.argument,
44884528
key.offset: 7551,

test/SourceKit/DocSupport/doc_clang_module.swift.sub.response

+5
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,11 @@ var FooSubUnnamedEnumeratorA1: Int { get }
155155
key.offset: 212,
156156
key.length: 4
157157
},
158+
{
159+
key.kind: source.lang.swift.syntaxtype.operator,
160+
key.offset: 217,
161+
key.length: 2
162+
},
158163
{
159164
key.kind: source.lang.swift.syntaxtype.argument,
160165
key.offset: 221,

test/SourceKit/DocSupport/doc_source_file.swift.response

+15
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,11 @@
241241
key.offset: 288,
242242
key.length: 4
243243
},
244+
{
245+
key.kind: source.lang.swift.syntaxtype.operator,
246+
key.offset: 293,
247+
key.length: 1
248+
},
244249
{
245250
key.kind: source.lang.swift.syntaxtype.parameter,
246251
key.offset: 295,
@@ -1668,6 +1673,11 @@
16681673
key.offset: 1935,
16691674
key.length: 7
16701675
},
1676+
{
1677+
key.kind: source.lang.swift.syntaxtype.operator,
1678+
key.offset: 1943,
1679+
key.length: 2
1680+
},
16711681
{
16721682
key.kind: source.lang.swift.ref.struct,
16731683
key.name: "Int",
@@ -1695,6 +1705,11 @@
16951705
key.offset: 1980,
16961706
key.length: 4
16971707
},
1708+
{
1709+
key.kind: source.lang.swift.syntaxtype.operator,
1710+
key.offset: 1985,
1711+
key.length: 1
1712+
},
16981713
{
16991714
key.kind: source.lang.swift.syntaxtype.parameter,
17001715
key.offset: 1987,

test/SourceKit/DocSupport/doc_swift_module.swift.response

+25
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,11 @@ func shouldPrintAnyAsKeyword(x x: Any)
705705
key.offset: 750,
706706
key.length: 4
707707
},
708+
{
709+
key.kind: source.lang.swift.syntaxtype.operator,
710+
key.offset: 755,
711+
key.length: 2
712+
},
708713
{
709714
key.kind: source.lang.swift.syntaxtype.argument,
710715
key.offset: 759,
@@ -903,6 +908,11 @@ func shouldPrintAnyAsKeyword(x x: Any)
903908
key.offset: 1003,
904909
key.length: 4
905910
},
911+
{
912+
key.kind: source.lang.swift.syntaxtype.operator,
913+
key.offset: 1008,
914+
key.length: 2
915+
},
906916
{
907917
key.kind: source.lang.swift.syntaxtype.argument,
908918
key.offset: 1012,
@@ -1312,6 +1322,11 @@ func shouldPrintAnyAsKeyword(x x: Any)
13121322
key.offset: 1600,
13131323
key.length: 7
13141324
},
1325+
{
1326+
key.kind: source.lang.swift.syntaxtype.operator,
1327+
key.offset: 1608,
1328+
key.length: 2
1329+
},
13151330
{
13161331
key.kind: source.lang.swift.ref.struct,
13171332
key.name: "Int",
@@ -1445,6 +1460,11 @@ func shouldPrintAnyAsKeyword(x x: Any)
14451460
key.offset: 1813,
14461461
key.length: 4
14471462
},
1463+
{
1464+
key.kind: source.lang.swift.syntaxtype.operator,
1465+
key.offset: 1818,
1466+
key.length: 2
1467+
},
14481468
{
14491469
key.kind: source.lang.swift.syntaxtype.argument,
14501470
key.offset: 1822,
@@ -1805,6 +1825,11 @@ func shouldPrintAnyAsKeyword(x x: Any)
18051825
key.offset: 2183,
18061826
key.length: 7
18071827
},
1828+
{
1829+
key.kind: source.lang.swift.syntaxtype.operator,
1830+
key.offset: 2191,
1831+
key.length: 2
1832+
},
18081833
{
18091834
key.kind: source.lang.swift.ref.struct,
18101835
key.name: "Int",

test/SourceKit/DocSupport/doc_system_module_underscored.swift.response

+5
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,11 @@ protocol Other1 {
223223
key.offset: 227,
224224
key.length: 1
225225
},
226+
{
227+
key.kind: source.lang.swift.syntaxtype.operator,
228+
key.offset: 229,
229+
key.length: 2
230+
},
226231
{
227232
key.kind: source.lang.swift.ref.struct,
228233
key.name: "String",

test/SourceKit/InterfaceGen/gen_clang_module.swift.response

+15
Original file line numberDiff line numberDiff line change
@@ -3313,6 +3313,11 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
33133313
key.offset: 6386,
33143314
key.length: 10
33153315
},
3316+
{
3317+
key.kind: source.lang.swift.syntaxtype.operator,
3318+
key.offset: 6397,
3319+
key.length: 1
3320+
},
33163321
{
33173322
key.kind: source.lang.swift.syntaxtype.identifier,
33183323
key.offset: 6400,
@@ -3358,6 +3363,11 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
33583363
key.offset: 6480,
33593364
key.length: 4
33603365
},
3366+
{
3367+
key.kind: source.lang.swift.syntaxtype.operator,
3368+
key.offset: 6486,
3369+
key.length: 1
3370+
},
33613371
{
33623372
key.kind: source.lang.swift.syntaxtype.attribute.builtin,
33633373
key.offset: 6493,
@@ -3438,6 +3448,11 @@ public class FooOverlayClassDerived : Foo.FooOverlayClassBase {
34383448
key.offset: 6661,
34393449
key.length: 10
34403450
},
3451+
{
3452+
key.kind: source.lang.swift.syntaxtype.operator,
3453+
key.offset: 6672,
3454+
key.length: 1
3455+
},
34413456
{
34423457
key.kind: source.lang.swift.syntaxtype.identifier,
34433458
key.offset: 6675,

test/SourceKit/SyntaxMapData/Inputs/syntaxmap.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ func bar() {}
4848
// mailto:thisisnotmail
4949
// unknownprotocol://awesomeguy.com
5050

51-
_ = -123
51+
let a = -123
52+
let b = -a
5253

5354
func testArgumentLabels(in class: Int, _ case: (_ default: Int) -> Void) -> (in: Int, String) {
5455
let result: (in: Int, String) = (0, "test")

test/SourceKit/SyntaxMapData/syntaxmap-edit-chained-comment.swift

+20
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@
2424
// CHECK-NEXT: key.length: 6
2525
// CHECK-NEXT: },
2626
// CHECK-NEXT: {
27+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.operator,
28+
// CHECK-NEXT: key.offset: 14,
29+
// CHECK-NEXT: key.length: 1
30+
// CHECK-NEXT: },
31+
// CHECK-NEXT: {
2732
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.comment,
2833
// CHECK-NEXT: key.offset: 16,
2934
// CHECK-NEXT: key.length: 6
@@ -44,6 +49,16 @@
4449
// CHECK-NEXT: key.diagnostic_stage: source.diagnostic.stage.swift.parse,
4550
// CHECK-NEXT: key.syntaxmap: [
4651
// CHECK-NEXT: {
52+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.operator,
53+
// CHECK-NEXT: key.offset: 9,
54+
// CHECK-NEXT: key.length: 1
55+
// CHECK-NEXT: },
56+
// CHECK-NEXT: {
57+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.operator,
58+
// CHECK-NEXT: key.offset: 12,
59+
// CHECK-NEXT: key.length: 1
60+
// CHECK-NEXT: },
61+
// CHECK-NEXT: {
4762
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.comment,
4863
// CHECK-NEXT: key.offset: 13,
4964
// CHECK-NEXT: key.length: 6
@@ -63,6 +78,11 @@
6378
// CHECK-NEXT: key.length: 6
6479
// CHECK-NEXT: },
6580
// CHECK-NEXT: {
81+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.operator,
82+
// CHECK-NEXT: key.offset: 14,
83+
// CHECK-NEXT: key.length: 1
84+
// CHECK-NEXT: },
85+
// CHECK-NEXT: {
6686
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.comment,
6787
// CHECK-NEXT: key.offset: 16,
6888
// CHECK-NEXT: key.length: 6

test/SourceKit/SyntaxMapData/syntaxmap-multiple-edits.swift

+25
Original file line numberDiff line numberDiff line change
@@ -114,16 +114,31 @@
114114
// CHECK-NEXT: key.length: 1
115115
// CHECK-NEXT: },
116116
// CHECK-NEXT: {
117+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.operator,
118+
// CHECK-NEXT: key.offset: 135,
119+
// CHECK-NEXT: key.length: 1
120+
// CHECK-NEXT: },
121+
// CHECK-NEXT: {
117122
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.identifier,
118123
// CHECK-NEXT: key.offset: 136,
119124
// CHECK-NEXT: key.length: 1
120125
// CHECK-NEXT: },
121126
// CHECK-NEXT: {
127+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.operator,
128+
// CHECK-NEXT: key.offset: 138,
129+
// CHECK-NEXT: key.length: 1
130+
// CHECK-NEXT: },
131+
// CHECK-NEXT: {
122132
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.identifier,
123133
// CHECK-NEXT: key.offset: 140,
124134
// CHECK-NEXT: key.length: 1
125135
// CHECK-NEXT: },
126136
// CHECK-NEXT: {
137+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.operator,
138+
// CHECK-NEXT: key.offset: 141,
139+
// CHECK-NEXT: key.length: 1
140+
// CHECK-NEXT: },
141+
// CHECK-NEXT: {
127142
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.identifier,
128143
// CHECK-NEXT: key.offset: 142,
129144
// CHECK-NEXT: key.length: 1
@@ -209,11 +224,21 @@
209224
// CHECK-NEXT: key.length: 2
210225
// CHECK-NEXT: },
211226
// CHECK-NEXT: {
227+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.operator,
228+
// CHECK-NEXT: key.offset: 56,
229+
// CHECK-NEXT: key.length: 1
230+
// CHECK-NEXT: },
231+
// CHECK-NEXT: {
212232
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.number,
213233
// CHECK-NEXT: key.offset: 58,
214234
// CHECK-NEXT: key.length: 2
215235
// CHECK-NEXT: },
216236
// CHECK-NEXT: {
237+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.operator,
238+
// CHECK-NEXT: key.offset: 61,
239+
// CHECK-NEXT: key.length: 1
240+
// CHECK-NEXT: },
241+
// CHECK-NEXT: {
217242
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.number,
218243
// CHECK-NEXT: key.offset: 63,
219244
// CHECK-NEXT: key.length: 3

test/SourceKit/SyntaxMapData/syntaxmap-pound-keyword.swift.response

+5
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@
9393
key.offset: 195,
9494
key.length: 3
9595
},
96+
{
97+
key.kind: source.lang.swift.syntaxtype.operator,
98+
key.offset: 200,
99+
key.length: 1
100+
},
96101
{
97102
key.kind: source.lang.swift.syntaxtype.buildconfig.keyword,
98103
key.offset: 207,

0 commit comments

Comments
 (0)