Skip to content

Commit 38049fa

Browse files
committed
refactor: re-use source map range apis
1 parent c658617 commit 38049fa

39 files changed

+343
-617
lines changed

packages/language-core/src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export interface PositionCapabilities {
1818
definition?: boolean,
1919
rename?: boolean | {
2020
normalize?(newName: string): string,
21-
apply?(oldName: string, newName: string): string,
21+
apply?(newName: string): string,
2222
},
2323
completion?: boolean | {
2424
additional: boolean,

packages/language-service/src/documentFeatures/autoInsert.ts

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,16 @@ export function register(context: DocumentServiceRuntimeContext) {
1313
document,
1414
position,
1515
sourceMap => true,
16-
function* (position, sourceMap) {
17-
for (const mapped of sourceMap.toGeneratedPositions(position)) {
18-
if (mapped[1].data.completion) {
19-
yield mapped[0];
20-
}
21-
}
22-
},
16+
(position, sourceMap) => sourceMap.toGeneratedPositions(position, data => !!data.completion),
2317
(plugin, document, position) => plugin.doAutoInsert?.(document, position, options),
2418
(data, sourceMap) => {
2519

26-
if (!sourceMap)
27-
return data;
28-
2920
if (typeof data === 'string')
3021
return data;
3122

32-
const start = sourceMap.toSourcePosition(data.range.start)?.[0];
33-
const end = sourceMap.toSourcePosition(data.range.end)?.[0];
34-
35-
if (start && end) {
36-
data.range = { start, end };
23+
const range = sourceMap.toSourceRange(data.range);
24+
if (range) {
25+
data.range = range;
3726
return data;
3827
}
3928
},

packages/language-service/src/documentFeatures/colorPresentations.ts

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,41 +13,23 @@ export function register(context: DocumentServiceRuntimeContext) {
1313
document,
1414
range,
1515
sourceMap => !!sourceMap.embeddedFile.capabilities.documentSymbol, // TODO: add color capabilitie setting
16-
function* (range, sourceMap) {
17-
for (const start of sourceMap.toGeneratedPositions(range.start)) {
18-
for (const end of sourceMap.toGeneratedPositions(range.start)) {
19-
yield { start: start[0], end: end[0] };
20-
break;
21-
}
22-
}
23-
},
16+
(range, sourceMap) => sourceMap.toGeneratedRanges(range),
2417
(plugin, document, range) => plugin.getColorPresentations?.(document, color, range),
2518
(data, sourceMap) => data.map(cp => {
2619

27-
if (!sourceMap)
28-
return cp;
29-
3020
if (cp.textEdit) {
31-
32-
const start = sourceMap.toSourcePosition(cp.textEdit.range.start)?.[0];
33-
const end = sourceMap.toSourcePosition(cp.textEdit.range.end)?.[0];
34-
35-
if (!start || !end)
21+
const range = sourceMap.toSourceRange(cp.textEdit.range);
22+
if (!range)
3623
return undefined;
37-
38-
cp.textEdit.range = { start, end };
24+
cp.textEdit.range = range;
3925
}
4026

4127
if (cp.additionalTextEdits) {
4228
for (const textEdit of cp.additionalTextEdits) {
43-
44-
const start = sourceMap.toSourcePosition(textEdit.range.start)?.[0];
45-
const end = sourceMap.toSourcePosition(textEdit.range.end)?.[0];
46-
47-
if (!start || !end)
29+
const range = sourceMap.toSourceRange(textEdit.range);
30+
if (!range)
4831
return undefined;
49-
50-
textEdit.range = { start, end };
32+
textEdit.range = range;
5133
}
5234
}
5335
return cp;

packages/language-service/src/documentFeatures/documentColors.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,9 @@ export function register(context: DocumentServiceRuntimeContext) {
1414
sourceMap => !!sourceMap.embeddedFile.capabilities.documentSymbol, // TODO: add color capabilitie setting
1515
(plugin, document) => plugin.findDocumentColors?.(document),
1616
(data, sourceMap) => data.map(color => {
17-
18-
if (!sourceMap)
19-
return color;
20-
21-
const start = sourceMap.toSourcePosition(color.range.start)?.[0];
22-
const end = sourceMap.toSourcePosition(color.range.start)?.[0];
23-
24-
if (start && end) {
25-
return vscode.ColorInformation.create({ start, end }, color.color);
17+
const range = sourceMap.toSourceRange(color.range);
18+
if (range) {
19+
return vscode.ColorInformation.create(range, color.color);
2620
}
2721
}).filter(shared.notEmpty),
2822
arr => arr.flat(),

packages/language-service/src/documentFeatures/documentSymbols.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,9 @@ export function register(context: DocumentServiceRuntimeContext) {
1616
(data, sourceMap) => transformSymbolInformations(
1717
data,
1818
location => {
19-
20-
if (!sourceMap)
21-
return location;
22-
23-
const start = sourceMap.toSourcePosition(location.range.start)?.[0];
24-
const end = sourceMap.toSourcePosition(location.range.end)?.[0];
25-
26-
if (start && end) {
27-
return vscode.Location.create(sourceMap.sourceDocument.uri, { start, end });
19+
const range = sourceMap.toSourceRange(location.range);
20+
if (range) {
21+
return vscode.Location.create(sourceMap.sourceDocument.uri, range);
2822
}
2923
},
3024
),

packages/language-service/src/documentFeatures/foldingRanges.ts

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,7 @@ export function register(context: DocumentServiceRuntimeContext) {
1313
document,
1414
sourceMap => !!sourceMap.embeddedFile.capabilities.foldingRange,
1515
(plugin, document) => plugin.getFoldingRanges?.(document),
16-
(data, sourceMap) => transformFoldingRanges(
17-
data,
18-
range => {
19-
20-
if (!sourceMap)
21-
return range;
22-
23-
const start = sourceMap.toSourcePosition(range.start)?.[0];
24-
const end = sourceMap.toSourcePosition(range.end)?.[0];
25-
26-
if (start && end) {
27-
return { start, end };
28-
}
29-
},
30-
),
16+
(data, sourceMap) => transformFoldingRanges(data, range => sourceMap?.toSourceRange(range)),
3117
arr => arr.flat(),
3218
);
3319
};

packages/language-service/src/documentFeatures/format.ts

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export function register(context: DocumentServiceRuntimeContext) {
6767

6868
if (onTypeParams) {
6969

70-
const embeddedPosition = sourceMap.toGeneratedPosition(onTypeParams.position)?.[0];
70+
const embeddedPosition = sourceMap.toGeneratedPosition(onTypeParams.position);
7171

7272
if (embeddedPosition) {
7373
_edits = await tryFormat(
@@ -81,32 +81,31 @@ export function register(context: DocumentServiceRuntimeContext) {
8181

8282
else {
8383

84-
let start = sourceMap.toGeneratedPosition(range.start)?.[0];
85-
let end = sourceMap.toGeneratedPosition(range.end)?.[0];
84+
let genRange = sourceMap.toGeneratedRange(range);
8685

87-
if (!start) {
86+
if (!genRange) {
8887
const firstMapping = sourceMap.mappings.sort((a, b) => a.sourceRange[0] - b.sourceRange[0])[0];
89-
if (firstMapping && document.offsetAt(range.start) < firstMapping.sourceRange[0]) {
90-
start = sourceMap.mappedDocument.positionAt(firstMapping.generatedRange[0]);
91-
}
92-
}
93-
94-
if (!end) {
9588
const lastMapping = sourceMap.mappings.sort((a, b) => b.sourceRange[0] - a.sourceRange[0])[0];
96-
if (lastMapping && document.offsetAt(range.end) > lastMapping.sourceRange[1]) {
97-
end = sourceMap.mappedDocument.positionAt(lastMapping.generatedRange[1]);
89+
if (
90+
firstMapping && document.offsetAt(range.start) < firstMapping.sourceRange[0]
91+
&& lastMapping && document.offsetAt(range.end) > lastMapping.sourceRange[1]
92+
) {
93+
genRange = {
94+
start: sourceMap.mappedDocument.positionAt(firstMapping.generatedRange[0]),
95+
end: sourceMap.mappedDocument.positionAt(lastMapping.generatedRange[1]),
96+
};
9897
}
9998
}
10099

101-
if (start && end) {
100+
if (genRange) {
102101

103102
toPatchIndent = {
104103
sourceMapEmbeddedDocumentUri: sourceMap.mappedDocument.uri,
105104
};
106105

107106
_edits = await tryFormat(
108107
sourceMap.mappedDocument,
109-
{ start, end },
108+
genRange,
110109
initialIndentBracket,
111110
);
112111
}
@@ -116,12 +115,11 @@ export function register(context: DocumentServiceRuntimeContext) {
116115
continue;
117116

118117
for (const textEdit of _edits) {
119-
const start = sourceMap.toSourcePosition(textEdit.range.start)?.[0];
120-
const end = sourceMap.toSourcePosition(textEdit.range.end)?.[0];
121-
if (start && end) {
118+
const range = sourceMap.toSourceRange(textEdit.range);
119+
if (range) {
122120
edits.push({
123121
newText: textEdit.newText,
124-
range: { start, end },
122+
range,
125123
});
126124
}
127125
}

packages/language-service/src/documentFeatures/linkedEditingRanges.ts

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,11 @@ export function register(context: DocumentServiceRuntimeContext) {
1313
document,
1414
position,
1515
sourceMap => true,
16-
function* (position, sourceMap) {
17-
for (const mapped of sourceMap.toGeneratedPositions(position)) {
18-
if (mapped[1].data.completion) {
19-
yield mapped[0];
20-
}
21-
}
22-
},
16+
(position, sourceMap) => sourceMap.toGeneratedPositions(position, data => !!data.completion),
2317
(plugin, document, position) => plugin.findLinkedEditingRanges?.(document, position),
2418
(data, sourceMap) => ({
2519
wordPattern: data.wordPattern,
26-
ranges: data.ranges.map(range => {
27-
28-
if (!sourceMap)
29-
return range;
30-
31-
const start = sourceMap.toSourcePosition(range.start)?.[0];
32-
const end = sourceMap.toSourcePosition(range.end)?.[0];
33-
34-
if (start && end) {
35-
return { start, end };
36-
}
37-
}).filter(shared.notEmpty),
20+
ranges: data.ranges.map(range => sourceMap.toSourceRange(range)).filter(shared.notEmpty),
3821
}),
3922
);
4023
};

packages/language-service/src/documentFeatures/selectionRanges.ts

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,10 @@ export function register(context: DocumentServiceRuntimeContext) {
1515
positions,
1616
sourceMap => !!sourceMap.embeddedFile.capabilities.foldingRange,
1717
(positions, sourceMap) => [positions
18-
.map(position => sourceMap.toGeneratedPosition(position)?.[0])
18+
.map(position => sourceMap.toGeneratedPosition(position))
1919
.filter(shared.notEmpty)],
2020
(plugin, document, positions) => positions.length ? plugin.getSelectionRanges?.(document, positions) : undefined,
21-
(data, sourceMap) => transformSelectionRanges(
22-
data,
23-
range => {
24-
25-
if (!sourceMap)
26-
return range;
27-
28-
const start = sourceMap.toSourcePosition(range.start)?.[0];
29-
const end = sourceMap.toSourcePosition(range.end)?.[0];
30-
31-
if (start && end) {
32-
return { start, end };
33-
}
34-
},
35-
),
21+
(item, sourceMap) => transformSelectionRanges(item, range => sourceMap.toSourceRange(range)),
3622
);
3723
};
3824
}

0 commit comments

Comments
 (0)