Skip to content

Commit 9732672

Browse files
authored
fix range source mapping for semantic tokens (#784)
1 parent a9f40e3 commit 9732672

File tree

3 files changed

+24
-6
lines changed

3 files changed

+24
-6
lines changed

packages/language-server/src/plugins/typescript/features/SemanticTokensProvider.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import ts from 'typescript';
22
import { Range, SemanticTokens, SemanticTokensBuilder } from 'vscode-languageserver';
3-
import { Document } from '../../../lib/documents';
3+
import { Document, mapRangeToOriginal } from '../../../lib/documents';
44
import { SemanticTokensProvider } from '../../interfaces';
55
import { SnapshotFragment } from '../DocumentSnapshot';
66
import { LSAndTSDocResolver } from '../LSAndTSDocResolver';
@@ -81,15 +81,16 @@ export class SemanticTokensProviderImpl implements SemanticTokensProvider {
8181
generatedOffset: number,
8282
generatedLength: number
8383
): [line: number, character: number, length: number] | undefined {
84-
const startPosition = fragment.getOriginalPosition(fragment.positionAt(generatedOffset));
84+
const range = {
85+
start: fragment.positionAt(generatedOffset),
86+
end: fragment.positionAt(generatedOffset + generatedLength)
87+
};
88+
const { start: startPosition, end: endPosition } = mapRangeToOriginal(fragment, range);
8589

86-
if (startPosition.line < 0) {
90+
if (startPosition.line < 0 || endPosition.line < 0) {
8791
return;
8892
}
8993

90-
const endPosition = fragment.getOriginalPosition(
91-
fragment.positionAt(generatedOffset + generatedLength)
92-
);
9394
const startOffset = document.offsetAt(startPosition);
9495
const endOffset = document.offsetAt(endPosition);
9596

packages/language-server/test/plugins/typescript/features/SemanticTokensProvider.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,20 @@ describe('SemanticTokensProvider', () => {
140140
length: 'text'.length,
141141
type: TokenType.property,
142142
modifiers: []
143+
},
144+
{
145+
line: 13,
146+
character: 16,
147+
length: 1,
148+
type: TokenType.parameter,
149+
modifiers: [TokenModifier.declaration]
150+
},
151+
{
152+
line: 14,
153+
character: 5,
154+
length: 1,
155+
type: TokenType.parameter,
156+
modifiers: []
143157
}
144158
];
145159

packages/language-server/test/plugins/typescript/testfiles/semantic-tokens/tokens.svelte

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,6 @@
1111
{#await textPromise then text}
1212
<textarea on:blur={blurHandler} value={text.text} />
1313
{/await}
14+
{#each ['a'] as a}
15+
{a}
16+
{/each}

0 commit comments

Comments
 (0)