Skip to content

Commit 3791e12

Browse files
author
Nathan Hawes
committed
[syntax-coloring] Remove early exit from delta logic when there are no new highlighted tokens but are removed ones, and take account of the range of the mismatching token in the previous syntax map
We still need to adjust the affected range to the line boundaries and return all tokens on the line when there are no new tokens, as the client will clear all tokens on that line in its copy of the syntax map leaving the other tokens unhighlighted. We also need to extend the affected range to include the ranges of the mismatched tokens from the previous syntaxmap, so their highlighting will be cleared. Also add more comments to better document the new syntax map structure and behaviour.
1 parent 04674ff commit 3791e12

File tree

6 files changed

+286
-65
lines changed

6 files changed

+286
-65
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
let y = /*
2+
3+
*// /*
4+
5+
*/ 2
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1-
let
1+
let l = 2
22
l
3+
\( 56
4+
)
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
// RUN: %sourcekitd-test -req=open -print-raw-response %S/Inputs/syntaxmap-edit-chained-comment.swift == -req=edit -print-raw-response %S/Inputs/syntaxmap-edit-chained-comment.swift -pos=1:9 -replace=" " -length=1 == -req=edit -print-raw-response %S/Inputs/syntaxmap-edit-chained-comment.swift -pos=1:9 -replace="/" -length=1 | %sed_clean > %t.response
2+
// RUN: %FileCheck -input-file=%t.response %s
3+
4+
// Initial state
5+
6+
// CHECK: {{^}}{
7+
// CHECK-NEXT: key.offset: 0,
8+
// CHECK-NEXT: key.length: 25,
9+
// CHECK-NEXT: key.diagnostic_stage: source.diagnostic.stage.swift.parse,
10+
// CHECK-NEXT: key.syntaxmap: [
11+
// CHECK-NEXT: {
12+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.keyword,
13+
// CHECK-NEXT: key.offset: 0,
14+
// CHECK-NEXT: key.length: 3
15+
// CHECK-NEXT: },
16+
// CHECK-NEXT: {
17+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.identifier,
18+
// CHECK-NEXT: key.offset: 4,
19+
// CHECK-NEXT: key.length: 1
20+
// CHECK-NEXT: },
21+
// CHECK-NEXT: {
22+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.comment,
23+
// CHECK-NEXT: key.offset: 8,
24+
// CHECK-NEXT: key.length: 6
25+
// CHECK-NEXT: },
26+
// CHECK-NEXT: {
27+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.comment,
28+
// CHECK-NEXT: key.offset: 16,
29+
// CHECK-NEXT: key.length: 6
30+
// CHECK-NEXT: },
31+
// CHECK-NEXT: {
32+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.number,
33+
// CHECK-NEXT: key.offset: 23,
34+
// CHECK-NEXT: key.length: 1
35+
// CHECK-NEXT: }
36+
// CHECK-NEXT: ],
37+
38+
39+
// After replacing the '/' from the comment open with ' '
40+
41+
// CHECK: {{^}}{
42+
// CHECK-NEXT: key.offset: 0,
43+
// CHECK-NEXT: key.length: 25,
44+
// CHECK-NEXT: key.diagnostic_stage: source.diagnostic.stage.swift.parse,
45+
// CHECK-NEXT: key.syntaxmap: [
46+
// CHECK-NEXT: {
47+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.keyword,
48+
// CHECK-NEXT: key.offset: 0,
49+
// CHECK-NEXT: key.length: 3
50+
// CHECK-NEXT: },
51+
// CHECK-NEXT: {
52+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.identifier,
53+
// CHECK-NEXT: key.offset: 4,
54+
// CHECK-NEXT: key.length: 1
55+
// CHECK-NEXT: },
56+
// CHECK-NEXT: {
57+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.comment,
58+
// CHECK-NEXT: key.offset: 13,
59+
// CHECK-NEXT: key.length: 6
60+
// CHECK-NEXT: },
61+
// CHECK-NEXT: {
62+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.number,
63+
// CHECK-NEXT: key.offset: 23,
64+
// CHECK-NEXT: key.length: 1
65+
// CHECK-NEXT: }
66+
// CHECK-NEXT: ],
67+
68+
// After adding the '/' back to the comment open
69+
70+
// CHECK: {{^}}{
71+
// CHECK-NEXT: key.offset: 0,
72+
// CHECK-NEXT: key.length: 25,
73+
// CHECK-NEXT: key.diagnostic_stage: source.diagnostic.stage.swift.parse,
74+
// CHECK-NEXT: key.syntaxmap: [
75+
// CHECK-NEXT: {
76+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.keyword,
77+
// CHECK-NEXT: key.offset: 0,
78+
// CHECK-NEXT: key.length: 3
79+
// CHECK-NEXT: },
80+
// CHECK-NEXT: {
81+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.identifier,
82+
// CHECK-NEXT: key.offset: 4,
83+
// CHECK-NEXT: key.length: 1
84+
// CHECK-NEXT: },
85+
// CHECK-NEXT: {
86+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.comment,
87+
// CHECK-NEXT: key.offset: 8,
88+
// CHECK-NEXT: key.length: 6
89+
// CHECK-NEXT: },
90+
// CHECK-NEXT: {
91+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.comment,
92+
// CHECK-NEXT: key.offset: 16,
93+
// CHECK-NEXT: key.length: 6
94+
// CHECK-NEXT: },
95+
// CHECK-NEXT: {
96+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.number,
97+
// CHECK-NEXT: key.offset: 23,
98+
// CHECK-NEXT: key.length: 1
99+
// CHECK-NEXT: }
100+
// CHECK-NEXT: ],

test/SourceKit/SyntaxMapData/syntaxmap-edit-remove.swift

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
// RUN: %sourcekitd-test -req=open -print-raw-response %S/Inputs/syntaxmap-edit-remove.swift == -req=edit -print-raw-response %S/Inputs/syntaxmap-edit-remove.swift -pos=2:1 -replace='' -length=1 | %sed_clean > %t.response
1+
// RUN: %sourcekitd-test -req=open -print-raw-response %S/Inputs/syntaxmap-edit-remove.swift == -req=edit -print-raw-response %S/Inputs/syntaxmap-edit-remove.swift -pos=3:3 -length=1 -replace='' == -req=edit -print-raw-response %S/Inputs/syntaxmap-edit-remove.swift -pos=2:1 -replace='' -length=1 == -req=edit -print-raw-response %S/Inputs/syntaxmap-edit-remove.swift -pos=1:9 -length=1 -replace='' | %sed_clean > %t.response
22
// RUN: %FileCheck -input-file=%t.response %s
33

44
// Initial state
55

66
// CHECK: {{^}}{
77
// CHECK-NEXT: key.offset: 0,
8-
// CHECK-NEXT: key.length: 6,
8+
// CHECK-NEXT: key.length: 20,
99
// CHECK-NEXT: key.diagnostic_stage: source.diagnostic.stage.swift.parse,
1010
// CHECK-NEXT: key.syntaxmap: [
1111
// CHECK-NEXT: {
@@ -17,14 +17,62 @@
1717
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.identifier,
1818
// CHECK-NEXT: key.offset: 4,
1919
// CHECK-NEXT: key.length: 1
20+
// CHECK-NEXT: },
21+
// CHECK-NEXT: {
22+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.number,
23+
// CHECK-NEXT: key.offset: 8,
24+
// CHECK-NEXT: key.length: 1
25+
// CHECK-NEXT: },
26+
// CHECK-NEXT: {
27+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.identifier,
28+
// CHECK-NEXT: key.offset: 10,
29+
// CHECK-NEXT: key.length: 1
30+
// CHECK-NEXT: },
31+
// CHECK-NEXT: {
32+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.number,
33+
// CHECK-NEXT: key.offset: 15,
34+
// CHECK-NEXT: key.length: 2
35+
// CHECK-NEXT: }
36+
// CHECK-NEXT: ],
37+
38+
// After removing the space before the '56'
39+
40+
// CHECK: {{^}}{
41+
// CHECK-NEXT: key.offset: 12,
42+
// CHECK-NEXT: key.length: 5,
43+
// CHECK-NEXT: key.diagnostic_stage: source.diagnostic.stage.swift.parse,
44+
// CHECK-NEXT: key.syntaxmap: [
45+
// CHECK-NEXT: {
46+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.number,
47+
// CHECK-NEXT: key.offset: 14,
48+
// CHECK-NEXT: key.length: 2
2049
// CHECK-NEXT: }
2150
// CHECK-NEXT: ],
2251

2352
// After deleting the identifier 'l'
2453

2554
// CHECK: {{^}}{
26-
// CHECK-NEXT: key.offset: 4,
55+
// CHECK-NEXT: key.offset: 10,
2756
// CHECK-NEXT: key.length: 1,
2857
// CHECK-NEXT: key.diagnostic_stage: source.diagnostic.stage.swift.parse,
2958
// CHECK-NEXT: key.syntaxmap: [
3059
// CHECK-NEXT: ],
60+
61+
// After deleting the last token on the first line
62+
63+
// CHECK: {{^}}{
64+
// CHECK-NEXT: key.offset: 0,
65+
// CHECK-NEXT: key.length: 9,
66+
// CHECK-NEXT: key.diagnostic_stage: source.diagnostic.stage.swift.parse,
67+
// CHECK-NEXT: key.syntaxmap: [
68+
// CHECK-NEXT: {
69+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.keyword,
70+
// CHECK-NEXT: key.offset: 0,
71+
// CHECK-NEXT: key.length: 3
72+
// CHECK-NEXT: },
73+
// CHECK-NEXT: {
74+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.identifier,
75+
// CHECK-NEXT: key.offset: 4,
76+
// CHECK-NEXT: key.length: 1
77+
// CHECK-NEXT: }
78+
// CHECK-NEXT: ],

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,20 @@
133133
// After replacing a space with a space
134134

135135
// CHECK: {{^}}{
136-
// CHECK-NEXT: key.diagnostic_stage: source.diagnostic.stage.swift.parse
136+
// CHECK-NEXT: key.offset: 57,
137+
// CHECK-NEXT: key.length: 15,
138+
// CHECK-NEXT: key.diagnostic_stage: source.diagnostic.stage.swift.parse,
137139
// CHECK-NEXT: key.syntaxmap: [
140+
// CHECK-NEXT: {
141+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.keyword,
142+
// CHECK-NEXT: key.offset: 57,
143+
// CHECK-NEXT: key.length: 6
144+
// CHECK-NEXT: },
145+
// CHECK-NEXT: {
146+
// CHECK-NEXT: key.kind: source.lang.swift.syntaxtype.identifier,
147+
// CHECK-NEXT: key.offset: 64,
148+
// CHECK-NEXT: key.length: 5
149+
// CHECK-NEXT: }
138150
// CHECK-NEXT: ],
139151

140152
// After adding code at the end of the file

0 commit comments

Comments
 (0)