Skip to content

Commit 9adec3b

Browse files
committed
Fix range issues for blocks not at 0:0
1 parent b3e07c5 commit 9adec3b

File tree

2 files changed

+174
-77
lines changed

2 files changed

+174
-77
lines changed

pkgs/sass_language_services/lib/src/features/document_symbols/document_symbols_visitor.dart

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -174,14 +174,12 @@ class DocumentSymbolsVisitor with sass.RecursiveStatementVisitor {
174174
// node.query.span includes whitespace, so the range doesn't match node.query.asPlain
175175
var nameRange = lsp.Range(
176176
start: lsp.Position(
177-
line: node.span.start.line + node.query.span.start.line,
178-
character: node.span.start.column + node.query.span.start.column,
177+
line: node.query.span.start.line,
178+
character: node.query.span.start.column,
179179
),
180180
end: lsp.Position(
181-
line: node.span.start.line + node.query.span.end.line,
182-
character: node.span.start.column +
183-
node.query.span.start.column +
184-
node.query.asPlain!.length,
181+
line: node.query.span.end.line,
182+
character: node.query.span.start.column + node.query.asPlain!.length,
185183
),
186184
);
187185

pkgs/sass_language_services/test/features/document_symbols/docyment_symbol_ranges_test.dart

Lines changed: 170 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -61,46 +61,73 @@ void main() {
6161
.foo
6262
color: red
6363
64+
.bar
65+
color: blue
66+
6467
''', uri: 'index.sass');
6568

6669
var result = ls.findDocumentSymbols(document);
67-
var nameRange = result.first.selectionRange;
68-
var symbolRange = result.first.range;
6970

70-
expect(nameRange, StartsAtLine(0));
71-
expect(nameRange, StartsAtCharacter(0));
71+
expect(result.first.selectionRange, StartsAtLine(0));
72+
expect(result.first.selectionRange, StartsAtCharacter(0));
7273

73-
expect(nameRange, EndsAtLine(0));
74-
expect(nameRange, EndsAtCharacter(4));
74+
expect(result.first.selectionRange, EndsAtLine(0));
75+
expect(result.first.selectionRange, EndsAtCharacter(4));
7576

76-
expect(symbolRange, StartsAtLine(0));
77-
expect(symbolRange, StartsAtCharacter(0));
77+
expect(result.first.range, StartsAtLine(0));
78+
expect(result.first.range, StartsAtCharacter(0));
7879

79-
expect(symbolRange, EndsAtLine(1));
80-
expect(symbolRange, EndsAtCharacter(12));
80+
expect(result.first.range, EndsAtLine(1));
81+
expect(result.first.range, EndsAtCharacter(12));
82+
83+
expect(result.last.selectionRange, StartsAtLine(3));
84+
expect(result.last.selectionRange, StartsAtCharacter(0));
85+
86+
expect(result.last.selectionRange, EndsAtLine(3));
87+
expect(result.last.selectionRange, EndsAtCharacter(4));
88+
89+
expect(result.last.range, StartsAtLine(3));
90+
expect(result.last.range, StartsAtCharacter(0));
91+
92+
expect(result.last.range, EndsAtLine(4));
93+
expect(result.last.range, EndsAtCharacter(13));
8194
});
8295

8396
test('placeholder selector ranges are correct', () {
8497
var document = fs.createDocument('''
8598
%waitforit {
8699
color: red;
87100
}
101+
102+
%waaaaaitforit {
103+
color: blue;
104+
}
88105
''');
89106
var result = ls.findDocumentSymbols(document);
90-
var nameRange = result.first.selectionRange;
91-
var symbolRange = result.first.range;
92107

93-
expect(nameRange, StartsAtLine(0));
94-
expect(nameRange, StartsAtCharacter(0));
108+
expect(result.first.selectionRange, StartsAtLine(0));
109+
expect(result.first.selectionRange, StartsAtCharacter(0));
95110

96-
expect(nameRange, EndsAtLine(0));
97-
expect(nameRange, EndsAtCharacter(10));
111+
expect(result.first.selectionRange, EndsAtLine(0));
112+
expect(result.first.selectionRange, EndsAtCharacter(10));
98113

99-
expect(symbolRange, StartsAtLine(0));
100-
expect(symbolRange, StartsAtCharacter(0));
114+
expect(result.first.range, StartsAtLine(0));
115+
expect(result.first.range, StartsAtCharacter(0));
116+
117+
expect(result.first.range, EndsAtLine(2));
118+
expect(result.first.range, EndsAtCharacter(1));
101119

102-
expect(symbolRange, EndsAtLine(2));
103-
expect(symbolRange, EndsAtCharacter(1));
120+
expect(result.last.selectionRange, StartsAtLine(4));
121+
expect(result.last.selectionRange, StartsAtCharacter(0));
122+
123+
expect(result.last.selectionRange, EndsAtLine(4));
124+
expect(result.last.selectionRange, EndsAtCharacter(14));
125+
126+
expect(result.last.range, StartsAtLine(4));
127+
expect(result.last.range, StartsAtCharacter(0));
128+
129+
expect(result.last.range, EndsAtLine(6));
130+
expect(result.last.range, EndsAtCharacter(1));
104131
});
105132
});
106133

@@ -169,23 +196,38 @@ $world: blue;
169196
$value: $a + $b;
170197
@return $value;
171198
}
199+
200+
@function doOtherStuff($a: 1, $b: 2) {
201+
$value: $a + $b;
202+
@return $value;
203+
}
172204
''');
173205

174206
var result = ls.findDocumentSymbols(document);
175-
var nameRange = result.first.selectionRange;
176-
var symbolRange = result.first.range;
177207

178-
expect(nameRange, StartsAtLine(0));
179-
expect(nameRange, StartsAtCharacter(10));
208+
expect(result.first.selectionRange, StartsAtLine(0));
209+
expect(result.first.selectionRange, StartsAtCharacter(10));
180210

181-
expect(nameRange, EndsAtLine(0));
182-
expect(nameRange, EndsAtCharacter(17));
211+
expect(result.first.selectionRange, EndsAtLine(0));
212+
expect(result.first.selectionRange, EndsAtCharacter(17));
183213

184-
expect(symbolRange, StartsAtLine(0));
185-
expect(symbolRange, StartsAtCharacter(0));
214+
expect(result.first.range, StartsAtLine(0));
215+
expect(result.first.range, StartsAtCharacter(0));
216+
217+
expect(result.first.range, EndsAtLine(3));
218+
expect(result.first.range, EndsAtCharacter(1));
219+
220+
expect(result.last.selectionRange, StartsAtLine(5));
221+
expect(result.last.selectionRange, StartsAtCharacter(10));
186222

187-
expect(symbolRange, EndsAtLine(3));
188-
expect(symbolRange, EndsAtCharacter(1));
223+
expect(result.last.selectionRange, EndsAtLine(5));
224+
expect(result.last.selectionRange, EndsAtCharacter(22));
225+
226+
expect(result.last.range, StartsAtLine(5));
227+
expect(result.last.range, StartsAtCharacter(0));
228+
229+
expect(result.last.range, EndsAtLine(8));
230+
expect(result.last.range, EndsAtCharacter(1));
189231
});
190232

191233
test('mixin ranges are correct', () {
@@ -194,23 +236,38 @@ $world: blue;
194236
$value: 1;
195237
line-height: $value;
196238
}
239+
240+
@mixin mixin2 {
241+
$value: 1;
242+
line-height: $value;
243+
}
197244
''');
198245

199246
var result = ls.findDocumentSymbols(document);
200-
var nameRange = result.first.selectionRange;
201-
var symbolRange = result.first.range;
202247

203-
expect(nameRange, StartsAtLine(0));
204-
expect(nameRange, StartsAtCharacter(7));
248+
expect(result.first.selectionRange, StartsAtLine(0));
249+
expect(result.first.selectionRange, StartsAtCharacter(7));
205250

206-
expect(nameRange, EndsAtLine(0));
207-
expect(nameRange, EndsAtCharacter(13));
251+
expect(result.first.selectionRange, EndsAtLine(0));
252+
expect(result.first.selectionRange, EndsAtCharacter(13));
208253

209-
expect(symbolRange, StartsAtLine(0));
210-
expect(symbolRange, StartsAtCharacter(0));
254+
expect(result.first.range, StartsAtLine(0));
255+
expect(result.first.range, StartsAtCharacter(0));
256+
257+
expect(result.first.range, EndsAtLine(3));
258+
expect(result.first.range, EndsAtCharacter(1));
259+
260+
expect(result.last.selectionRange, StartsAtLine(5));
261+
expect(result.last.selectionRange, StartsAtCharacter(7));
211262

212-
expect(symbolRange, EndsAtLine(3));
213-
expect(symbolRange, EndsAtCharacter(1));
263+
expect(result.last.selectionRange, EndsAtLine(5));
264+
expect(result.last.selectionRange, EndsAtCharacter(13));
265+
266+
expect(result.last.range, StartsAtLine(5));
267+
expect(result.last.range, StartsAtCharacter(0));
268+
269+
expect(result.last.range, EndsAtLine(8));
270+
expect(result.last.range, EndsAtCharacter(1));
214271
});
215272
});
216273

@@ -221,72 +278,114 @@ $world: blue;
221278

222279
test('@media ranges are correct', () {
223280
var document = fs.createDocument(r'''
224-
@media screen, print
281+
@media screen
282+
body
283+
font-size: 16px
284+
285+
@media print
225286
body
226287
font-size: 14pt
227288
''', uri: 'index.sass');
228289

229290
var result = ls.findDocumentSymbols(document);
230-
var nameRange = result.first.selectionRange;
231-
var symbolRange = result.first.range;
232291

233-
expect(nameRange, StartsAtLine(0));
234-
expect(nameRange, StartsAtCharacter(7));
292+
expect(result.first.selectionRange, StartsAtLine(0));
293+
expect(result.first.selectionRange, StartsAtCharacter(7));
235294

236-
expect(nameRange, EndsAtLine(0));
237-
expect(nameRange, EndsAtCharacter(20));
295+
expect(result.first.selectionRange, EndsAtLine(0));
296+
expect(result.first.selectionRange, EndsAtCharacter(13));
238297

239-
expect(symbolRange, StartsAtLine(0));
240-
expect(symbolRange, StartsAtCharacter(0));
298+
expect(result.first.range, StartsAtLine(0));
299+
expect(result.first.range, StartsAtCharacter(0));
300+
301+
expect(result.first.range, EndsAtLine(2));
302+
expect(result.first.range, EndsAtCharacter(19));
303+
304+
expect(result.last.selectionRange, StartsAtLine(4));
305+
expect(result.last.selectionRange, StartsAtCharacter(7));
241306

242-
expect(symbolRange, EndsAtLine(2));
243-
expect(symbolRange, EndsAtCharacter(19));
307+
expect(result.last.selectionRange, EndsAtLine(4));
308+
expect(result.last.selectionRange, EndsAtCharacter(12));
309+
310+
expect(result.last.range, StartsAtLine(4));
311+
expect(result.last.range, StartsAtCharacter(0));
312+
313+
expect(result.last.range, EndsAtLine(6));
314+
expect(result.last.range, EndsAtCharacter(19));
244315
});
245316

246317
test('@font-face ranges are correct', () {
247318
var document = fs.createDocument(r'''
248319
@font-face {
249320
font-family: "Vulf Mono", monospace;
250321
}
322+
323+
@font-face {
324+
font-family: "Vulf", serif;
325+
}
251326
''');
252327
var result = ls.findDocumentSymbols(document);
253-
var nameRange = result.first.selectionRange;
254-
var symbolRange = result.first.range;
255328

256-
expect(nameRange, StartsAtLine(0));
257-
expect(nameRange, StartsAtCharacter(1));
329+
expect(result.first.selectionRange, StartsAtLine(0));
330+
expect(result.first.selectionRange, StartsAtCharacter(1));
258331

259-
expect(nameRange, EndsAtLine(0));
260-
expect(nameRange, EndsAtCharacter(10));
332+
expect(result.first.selectionRange, EndsAtLine(0));
333+
expect(result.first.selectionRange, EndsAtCharacter(10));
261334

262-
expect(symbolRange, StartsAtLine(0));
263-
expect(symbolRange, StartsAtCharacter(0));
335+
expect(result.first.range, StartsAtLine(0));
336+
expect(result.first.range, StartsAtCharacter(0));
264337

265-
expect(symbolRange, EndsAtLine(2));
266-
expect(symbolRange, EndsAtCharacter(1));
338+
expect(result.first.range, EndsAtLine(2));
339+
expect(result.first.range, EndsAtCharacter(1));
340+
341+
expect(result.last.selectionRange, StartsAtLine(4));
342+
expect(result.last.selectionRange, StartsAtCharacter(1));
343+
344+
expect(result.last.selectionRange, EndsAtLine(4));
345+
expect(result.last.selectionRange, EndsAtCharacter(10));
346+
347+
expect(result.last.range, StartsAtLine(4));
348+
expect(result.last.range, StartsAtCharacter(0));
349+
350+
expect(result.last.range, EndsAtLine(6));
351+
expect(result.last.range, EndsAtCharacter(1));
267352
});
268353

269354
test('@keyframes', () {
270355
var document = fs.createDocument(r'''
271356
@keyframes animation {
272357
358+
}
359+
360+
@keyframes spinner {
361+
273362
}
274363
''');
275364
var result = ls.findDocumentSymbols(document);
276-
var nameRange = result.first.selectionRange;
277-
var symbolRange = result.first.range;
278365

279-
expect(nameRange, StartsAtLine(0));
280-
expect(nameRange, StartsAtCharacter(11));
366+
expect(result.first.selectionRange, StartsAtLine(0));
367+
expect(result.first.selectionRange, StartsAtCharacter(11));
281368

282-
expect(nameRange, EndsAtLine(0));
283-
expect(nameRange, EndsAtCharacter(20));
369+
expect(result.first.selectionRange, EndsAtLine(0));
370+
expect(result.first.selectionRange, EndsAtCharacter(20));
284371

285-
expect(symbolRange, StartsAtLine(0));
286-
expect(symbolRange, StartsAtCharacter(0));
372+
expect(result.first.range, StartsAtLine(0));
373+
expect(result.first.range, StartsAtCharacter(0));
374+
375+
expect(result.first.range, EndsAtLine(2));
376+
expect(result.first.range, EndsAtCharacter(1));
377+
378+
expect(result.last.selectionRange, StartsAtLine(4));
379+
expect(result.last.selectionRange, StartsAtCharacter(11));
380+
381+
expect(result.last.selectionRange, EndsAtLine(4));
382+
expect(result.last.selectionRange, EndsAtCharacter(18));
383+
384+
expect(result.last.range, StartsAtLine(4));
385+
expect(result.last.range, StartsAtCharacter(0));
287386

288-
expect(symbolRange, EndsAtLine(2));
289-
expect(symbolRange, EndsAtCharacter(1));
387+
expect(result.last.range, EndsAtLine(6));
388+
expect(result.last.range, EndsAtCharacter(1));
290389
});
291390
});
292391
}

0 commit comments

Comments
 (0)