@volar/typescript 2.3.0-alpha.8 → 2.3.0-alpha.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/node/decorateLanguageService.js +81 -80
- package/lib/node/decorateProgram.js +5 -5
- package/lib/node/transform.d.ts +13 -17
- package/lib/node/transform.js +40 -42
- package/lib/node/utils.d.ts +2 -2
- package/lib/node/utils.js +9 -18
- package/package.json +4 -4
|
@@ -35,17 +35,18 @@ function decorateLanguageService(language, languageService) {
|
|
|
35
35
|
const { findReferences, findRenameLocations, getCompletionEntryDetails, getCompletionsAtPosition, getDefinitionAndBoundSpan, getDefinitionAtPosition, getFileReferences, getFormattingEditsForDocument, getFormattingEditsForRange, getFormattingEditsAfterKeystroke, getImplementationAtPosition, getLinkedEditingRangeAtPosition, getQuickInfoAtPosition, getSignatureHelpItems, getReferencesAtPosition, getSemanticDiagnostics, getSyntacticDiagnostics, getSuggestionDiagnostics, getTypeDefinitionAtPosition, getEncodedSemanticClassifications, getDocumentHighlights, getApplicableRefactors, getEditsForFileRename, getEditsForRefactor, getRenameInfo, getCodeFixesAtPosition, prepareCallHierarchy, provideCallHierarchyIncomingCalls, provideCallHierarchyOutgoingCalls, provideInlayHints, organizeImports, } = languageService;
|
|
36
36
|
languageService.getFormattingEditsForDocument = (filePath, options) => {
|
|
37
37
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
38
|
-
const [serviceScript, sourceScript
|
|
38
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
39
39
|
if (sourceScript?.associatedOnly) {
|
|
40
40
|
return [];
|
|
41
41
|
}
|
|
42
42
|
if (serviceScript) {
|
|
43
|
+
const map = language.maps.get(serviceScript.code, sourceScript);
|
|
43
44
|
if (!map.mappings.some(mapping => (0, language_core_1.isFormattingEnabled)(mapping.data))) {
|
|
44
45
|
return [];
|
|
45
46
|
}
|
|
46
47
|
const edits = getFormattingEditsForDocument(sourceScript.id, options);
|
|
47
48
|
return edits
|
|
48
|
-
.map(edit => (0, transform_1.transformTextChange)(
|
|
49
|
+
.map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
|
|
49
50
|
.filter(utils_1.notEmpty);
|
|
50
51
|
}
|
|
51
52
|
else {
|
|
@@ -54,17 +55,17 @@ function decorateLanguageService(language, languageService) {
|
|
|
54
55
|
};
|
|
55
56
|
languageService.getFormattingEditsForRange = (filePath, start, end, options) => {
|
|
56
57
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
57
|
-
const [serviceScript, sourceScript
|
|
58
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
58
59
|
if (sourceScript?.associatedOnly) {
|
|
59
60
|
return [];
|
|
60
61
|
}
|
|
61
62
|
if (serviceScript) {
|
|
62
|
-
const generateStart = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript,
|
|
63
|
-
const generateEnd = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript,
|
|
63
|
+
const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, start, language_core_1.isFormattingEnabled);
|
|
64
|
+
const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, end, language_core_1.isFormattingEnabled);
|
|
64
65
|
if (generateStart !== undefined && generateEnd !== undefined) {
|
|
65
66
|
const edits = getFormattingEditsForRange(sourceScript.id, generateStart, generateEnd, options);
|
|
66
67
|
return edits
|
|
67
|
-
.map(edit => (0, transform_1.transformTextChange)(
|
|
68
|
+
.map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
|
|
68
69
|
.filter(utils_1.notEmpty);
|
|
69
70
|
}
|
|
70
71
|
return [];
|
|
@@ -75,16 +76,16 @@ function decorateLanguageService(language, languageService) {
|
|
|
75
76
|
};
|
|
76
77
|
languageService.getFormattingEditsAfterKeystroke = (filePath, position, key, options) => {
|
|
77
78
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
78
|
-
const [serviceScript, sourceScript
|
|
79
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
79
80
|
if (sourceScript?.associatedOnly) {
|
|
80
81
|
return [];
|
|
81
82
|
}
|
|
82
83
|
if (serviceScript) {
|
|
83
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript,
|
|
84
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isFormattingEnabled);
|
|
84
85
|
if (generatePosition !== undefined) {
|
|
85
86
|
const edits = getFormattingEditsAfterKeystroke(sourceScript.id, generatePosition, key, options);
|
|
86
87
|
return edits
|
|
87
|
-
.map(edit => (0, transform_1.transformTextChange)(
|
|
88
|
+
.map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
|
|
88
89
|
.filter(utils_1.notEmpty);
|
|
89
90
|
}
|
|
90
91
|
return [];
|
|
@@ -95,22 +96,22 @@ function decorateLanguageService(language, languageService) {
|
|
|
95
96
|
};
|
|
96
97
|
languageService.getEditsForFileRename = (oldFilePath, newFilePath, formatOptions, preferences) => {
|
|
97
98
|
const edits = getEditsForFileRename(oldFilePath, newFilePath, formatOptions, preferences);
|
|
98
|
-
return (0, transform_1.transformFileTextChanges)(
|
|
99
|
+
return (0, transform_1.transformFileTextChanges)(undefined, language, edits, language_core_1.isRenameEnabled);
|
|
99
100
|
};
|
|
100
101
|
languageService.getLinkedEditingRangeAtPosition = (filePath, position) => {
|
|
101
102
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
102
|
-
const [serviceScript, sourceScript
|
|
103
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
103
104
|
if (sourceScript?.associatedOnly) {
|
|
104
105
|
return undefined;
|
|
105
106
|
}
|
|
106
107
|
if (serviceScript) {
|
|
107
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript,
|
|
108
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isLinkedEditingEnabled);
|
|
108
109
|
if (generatePosition !== undefined) {
|
|
109
110
|
const info = getLinkedEditingRangeAtPosition(sourceScript.id, generatePosition);
|
|
110
111
|
if (info) {
|
|
111
112
|
return {
|
|
112
113
|
ranges: info.ranges
|
|
113
|
-
.map(span => (0, transform_1.transformTextSpan)(
|
|
114
|
+
.map(span => (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, span, language_core_1.isLinkedEditingEnabled)?.[1])
|
|
114
115
|
.filter(utils_1.notEmpty),
|
|
115
116
|
wordPattern: info.wordPattern,
|
|
116
117
|
};
|
|
@@ -123,19 +124,19 @@ function decorateLanguageService(language, languageService) {
|
|
|
123
124
|
};
|
|
124
125
|
languageService.prepareCallHierarchy = (filePath, position) => {
|
|
125
126
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
126
|
-
const [serviceScript, sourceScript
|
|
127
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
127
128
|
if (sourceScript?.associatedOnly) {
|
|
128
129
|
return undefined;
|
|
129
130
|
}
|
|
130
131
|
if (serviceScript) {
|
|
131
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript,
|
|
132
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
|
|
132
133
|
if (generatePosition !== undefined) {
|
|
133
134
|
const item = prepareCallHierarchy(sourceScript.id, generatePosition);
|
|
134
135
|
if (Array.isArray(item)) {
|
|
135
|
-
return item.map(item => (0, transform_1.transformCallHierarchyItem)(
|
|
136
|
+
return item.map(item => (0, transform_1.transformCallHierarchyItem)(undefined, language, item, language_core_1.isCallHierarchyEnabled));
|
|
136
137
|
}
|
|
137
138
|
else if (item) {
|
|
138
|
-
return (0, transform_1.transformCallHierarchyItem)(
|
|
139
|
+
return (0, transform_1.transformCallHierarchyItem)(undefined, language, item, language_core_1.isCallHierarchyEnabled);
|
|
139
140
|
}
|
|
140
141
|
}
|
|
141
142
|
}
|
|
@@ -146,12 +147,12 @@ function decorateLanguageService(language, languageService) {
|
|
|
146
147
|
languageService.provideCallHierarchyIncomingCalls = (filePath, position) => {
|
|
147
148
|
let calls = [];
|
|
148
149
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
149
|
-
const [serviceScript, sourceScript
|
|
150
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
150
151
|
if (sourceScript?.associatedOnly) {
|
|
151
152
|
return [];
|
|
152
153
|
}
|
|
153
154
|
if (serviceScript) {
|
|
154
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript,
|
|
155
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
|
|
155
156
|
if (generatePosition !== undefined) {
|
|
156
157
|
calls = provideCallHierarchyIncomingCalls(sourceScript.id, generatePosition);
|
|
157
158
|
}
|
|
@@ -161,9 +162,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
161
162
|
}
|
|
162
163
|
return calls
|
|
163
164
|
.map(call => {
|
|
164
|
-
const from = (0, transform_1.transformCallHierarchyItem)(
|
|
165
|
+
const from = (0, transform_1.transformCallHierarchyItem)(undefined, language, call.from, language_core_1.isCallHierarchyEnabled);
|
|
165
166
|
const fromSpans = call.fromSpans
|
|
166
|
-
.map(span => (0, transform_1.transformSpan)(
|
|
167
|
+
.map(span => (0, transform_1.transformSpan)(undefined, language, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
|
|
167
168
|
.filter(utils_1.notEmpty);
|
|
168
169
|
return {
|
|
169
170
|
from,
|
|
@@ -174,12 +175,12 @@ function decorateLanguageService(language, languageService) {
|
|
|
174
175
|
languageService.provideCallHierarchyOutgoingCalls = (filePath, position) => {
|
|
175
176
|
let calls = [];
|
|
176
177
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
177
|
-
const [serviceScript, sourceScript
|
|
178
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
178
179
|
if (sourceScript?.associatedOnly) {
|
|
179
180
|
return [];
|
|
180
181
|
}
|
|
181
182
|
if (serviceScript) {
|
|
182
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript,
|
|
183
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
|
|
183
184
|
if (generatePosition !== undefined) {
|
|
184
185
|
calls = provideCallHierarchyOutgoingCalls(fileName, generatePosition);
|
|
185
186
|
}
|
|
@@ -189,10 +190,10 @@ function decorateLanguageService(language, languageService) {
|
|
|
189
190
|
}
|
|
190
191
|
return calls
|
|
191
192
|
.map(call => {
|
|
192
|
-
const to = (0, transform_1.transformCallHierarchyItem)(
|
|
193
|
+
const to = (0, transform_1.transformCallHierarchyItem)(undefined, language, call.to, language_core_1.isCallHierarchyEnabled);
|
|
193
194
|
const fromSpans = call.fromSpans
|
|
194
195
|
.map(span => serviceScript
|
|
195
|
-
? (0, transform_1.transformTextSpan)(
|
|
196
|
+
? (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, span, language_core_1.isCallHierarchyEnabled)?.[1]
|
|
196
197
|
: span)
|
|
197
198
|
.filter(utils_1.notEmpty);
|
|
198
199
|
return {
|
|
@@ -203,20 +204,20 @@ function decorateLanguageService(language, languageService) {
|
|
|
203
204
|
};
|
|
204
205
|
languageService.organizeImports = (args, formatOptions, preferences) => {
|
|
205
206
|
const unresolved = organizeImports(args, formatOptions, preferences);
|
|
206
|
-
return (0, transform_1.transformFileTextChanges)(
|
|
207
|
+
return (0, transform_1.transformFileTextChanges)(undefined, language, unresolved, language_core_1.isCodeActionsEnabled);
|
|
207
208
|
};
|
|
208
209
|
languageService.getQuickInfoAtPosition = (filePath, position) => {
|
|
209
210
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
210
|
-
const [serviceScript, sourceScript
|
|
211
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
211
212
|
if (sourceScript?.associatedOnly) {
|
|
212
213
|
return undefined;
|
|
213
214
|
}
|
|
214
215
|
if (serviceScript) {
|
|
215
216
|
const infos = [];
|
|
216
|
-
for (const [generatePosition] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript,
|
|
217
|
+
for (const [generatePosition] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isHoverEnabled)) {
|
|
217
218
|
const info = getQuickInfoAtPosition(sourceScript.id, generatePosition);
|
|
218
219
|
if (info) {
|
|
219
|
-
const textSpan = (0, transform_1.transformTextSpan)(
|
|
220
|
+
const textSpan = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.textSpan, language_core_1.isHoverEnabled)?.[1];
|
|
220
221
|
if (textSpan) {
|
|
221
222
|
infos.push({
|
|
222
223
|
...info,
|
|
@@ -270,16 +271,16 @@ function decorateLanguageService(language, languageService) {
|
|
|
270
271
|
};
|
|
271
272
|
languageService.getSignatureHelpItems = (filePath, position, options) => {
|
|
272
273
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
273
|
-
const [serviceScript, sourceScript
|
|
274
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
274
275
|
if (sourceScript?.associatedOnly) {
|
|
275
276
|
return undefined;
|
|
276
277
|
}
|
|
277
278
|
if (serviceScript) {
|
|
278
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript,
|
|
279
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isSignatureHelpEnabled);
|
|
279
280
|
if (generatePosition !== undefined) {
|
|
280
281
|
const result = getSignatureHelpItems(sourceScript.id, generatePosition, options);
|
|
281
282
|
if (result) {
|
|
282
|
-
const applicableSpan = (0, transform_1.transformTextSpan)(
|
|
283
|
+
const applicableSpan = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, result.applicableSpan, language_core_1.isSignatureHelpEnabled)?.[1];
|
|
283
284
|
if (applicableSpan) {
|
|
284
285
|
return {
|
|
285
286
|
...result,
|
|
@@ -309,11 +310,11 @@ function decorateLanguageService(language, languageService) {
|
|
|
309
310
|
...highlights,
|
|
310
311
|
highlightSpans: highlights.highlightSpans
|
|
311
312
|
.map(span => {
|
|
312
|
-
const { textSpan } = (0, transform_1.transformSpan)(
|
|
313
|
+
const { textSpan } = (0, transform_1.transformSpan)(undefined, language, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled) ?? {};
|
|
313
314
|
if (textSpan) {
|
|
314
315
|
return {
|
|
315
316
|
...span,
|
|
316
|
-
contextSpan: (0, transform_1.transformSpan)(
|
|
317
|
+
contextSpan: (0, transform_1.transformSpan)(undefined, language, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
|
|
317
318
|
textSpan,
|
|
318
319
|
};
|
|
319
320
|
}
|
|
@@ -325,12 +326,12 @@ function decorateLanguageService(language, languageService) {
|
|
|
325
326
|
};
|
|
326
327
|
languageService.getApplicableRefactors = (filePath, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
|
|
327
328
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
328
|
-
const [serviceScript, sourceScript
|
|
329
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
329
330
|
if (sourceScript?.associatedOnly) {
|
|
330
331
|
return [];
|
|
331
332
|
}
|
|
332
333
|
if (serviceScript) {
|
|
333
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript,
|
|
334
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
|
|
334
335
|
if (generatePosition !== undefined) {
|
|
335
336
|
const por = typeof positionOrRange === 'number'
|
|
336
337
|
? generatePosition
|
|
@@ -349,12 +350,12 @@ function decorateLanguageService(language, languageService) {
|
|
|
349
350
|
languageService.getEditsForRefactor = (filePath, formatOptions, positionOrRange, refactorName, actionName, preferences) => {
|
|
350
351
|
let edits;
|
|
351
352
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
352
|
-
const [serviceScript, sourceScript
|
|
353
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
353
354
|
if (sourceScript?.associatedOnly) {
|
|
354
355
|
return undefined;
|
|
355
356
|
}
|
|
356
357
|
if (serviceScript) {
|
|
357
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript,
|
|
358
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, typeof positionOrRange === 'number'
|
|
358
359
|
? positionOrRange
|
|
359
360
|
: positionOrRange.pos, language_core_1.isCodeActionsEnabled);
|
|
360
361
|
if (generatePosition !== undefined) {
|
|
@@ -371,13 +372,13 @@ function decorateLanguageService(language, languageService) {
|
|
|
371
372
|
edits = getEditsForRefactor(fileName, formatOptions, positionOrRange, refactorName, actionName, preferences);
|
|
372
373
|
}
|
|
373
374
|
if (edits) {
|
|
374
|
-
edits.edits = (0, transform_1.transformFileTextChanges)(
|
|
375
|
+
edits.edits = (0, transform_1.transformFileTextChanges)(undefined, language, edits.edits, language_core_1.isCodeActionsEnabled);
|
|
375
376
|
return edits;
|
|
376
377
|
}
|
|
377
378
|
};
|
|
378
379
|
languageService.getRenameInfo = (filePath, position, options) => {
|
|
379
380
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
380
|
-
const [serviceScript, sourceScript
|
|
381
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
381
382
|
if (sourceScript?.associatedOnly) {
|
|
382
383
|
return {
|
|
383
384
|
canRename: false,
|
|
@@ -386,10 +387,10 @@ function decorateLanguageService(language, languageService) {
|
|
|
386
387
|
}
|
|
387
388
|
if (serviceScript) {
|
|
388
389
|
let failed;
|
|
389
|
-
for (const [generateOffset] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript,
|
|
390
|
+
for (const [generateOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isRenameEnabled)) {
|
|
390
391
|
const info = getRenameInfo(sourceScript.id, generateOffset, options);
|
|
391
392
|
if (info.canRename) {
|
|
392
|
-
const span = (0, transform_1.transformTextSpan)(
|
|
393
|
+
const span = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.triggerSpan, language_core_1.isRenameEnabled)?.[1];
|
|
393
394
|
if (span) {
|
|
394
395
|
info.triggerSpan = span;
|
|
395
396
|
return info;
|
|
@@ -414,13 +415,13 @@ function decorateLanguageService(language, languageService) {
|
|
|
414
415
|
languageService.getCodeFixesAtPosition = (filePath, start, end, errorCodes, formatOptions, preferences) => {
|
|
415
416
|
let fixes = [];
|
|
416
417
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
417
|
-
const [serviceScript, sourceScript
|
|
418
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
418
419
|
if (sourceScript?.associatedOnly) {
|
|
419
420
|
return [];
|
|
420
421
|
}
|
|
421
422
|
if (serviceScript) {
|
|
422
|
-
const generateStart = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript,
|
|
423
|
-
const generateEnd = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript,
|
|
423
|
+
const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, start, language_core_1.isCodeActionsEnabled);
|
|
424
|
+
const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, end, language_core_1.isCodeActionsEnabled);
|
|
424
425
|
if (generateStart !== undefined && generateEnd !== undefined) {
|
|
425
426
|
fixes = getCodeFixesAtPosition(sourceScript.id, generateStart, generateEnd, errorCodes, formatOptions, preferences);
|
|
426
427
|
}
|
|
@@ -429,14 +430,14 @@ function decorateLanguageService(language, languageService) {
|
|
|
429
430
|
fixes = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
|
|
430
431
|
}
|
|
431
432
|
fixes = fixes.map(fix => {
|
|
432
|
-
fix.changes = (0, transform_1.transformFileTextChanges)(
|
|
433
|
+
fix.changes = (0, transform_1.transformFileTextChanges)(undefined, language, fix.changes, language_core_1.isCodeActionsEnabled);
|
|
433
434
|
return fix;
|
|
434
435
|
});
|
|
435
436
|
return fixes;
|
|
436
437
|
};
|
|
437
438
|
languageService.getEncodedSemanticClassifications = (filePath, span, format) => {
|
|
438
439
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
439
|
-
const [serviceScript, sourceScript
|
|
440
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
440
441
|
if (sourceScript?.associatedOnly) {
|
|
441
442
|
return {
|
|
442
443
|
spans: [],
|
|
@@ -446,6 +447,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
446
447
|
if (serviceScript) {
|
|
447
448
|
let start;
|
|
448
449
|
let end;
|
|
450
|
+
const map = language.maps.get(serviceScript.code, sourceScript);
|
|
449
451
|
for (const mapping of map.mappings) {
|
|
450
452
|
// TODO reuse the logic from language service
|
|
451
453
|
if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
|
|
@@ -457,14 +459,14 @@ function decorateLanguageService(language, languageService) {
|
|
|
457
459
|
}
|
|
458
460
|
start ??= 0;
|
|
459
461
|
end ??= sourceScript.snapshot.getLength();
|
|
460
|
-
const mappingOffset = (0, transform_1.getMappingOffset)(
|
|
462
|
+
const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
|
|
461
463
|
start += mappingOffset;
|
|
462
464
|
end += mappingOffset;
|
|
463
465
|
const result = getEncodedSemanticClassifications(sourceScript.id, { start, length: end - start }, format);
|
|
464
466
|
const spans = [];
|
|
465
467
|
for (let i = 0; i < result.spans.length; i += 3) {
|
|
466
|
-
for (const sourceStart of (0, transform_1.toSourceOffsets)(
|
|
467
|
-
for (const sourceEnd of (0, transform_1.toSourceOffsets)(
|
|
468
|
+
for (const sourceStart of (0, transform_1.toSourceOffsets)(sourceScript, language, serviceScript, result.spans[i], language_core_1.isSemanticTokensEnabled)) {
|
|
469
|
+
for (const sourceEnd of (0, transform_1.toSourceOffsets)(sourceScript, language, serviceScript, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled)) {
|
|
468
470
|
if (sourceStart[0] === sourceEnd[0] && sourceEnd[1] >= sourceStart[1]) {
|
|
469
471
|
spans.push(sourceStart[1], sourceEnd[1] - sourceStart[1], result.spans[i + 2]);
|
|
470
472
|
break;
|
|
@@ -489,7 +491,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
489
491
|
return [];
|
|
490
492
|
}
|
|
491
493
|
return getSyntacticDiagnostics(fileName)
|
|
492
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
494
|
+
.map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
|
|
493
495
|
.filter(utils_1.notEmpty);
|
|
494
496
|
};
|
|
495
497
|
languageService.getSemanticDiagnostics = filePath => {
|
|
@@ -499,7 +501,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
499
501
|
return [];
|
|
500
502
|
}
|
|
501
503
|
return getSemanticDiagnostics(fileName)
|
|
502
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
504
|
+
.map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
|
|
503
505
|
.filter(utils_1.notEmpty);
|
|
504
506
|
};
|
|
505
507
|
languageService.getSuggestionDiagnostics = filePath => {
|
|
@@ -509,7 +511,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
509
511
|
return [];
|
|
510
512
|
}
|
|
511
513
|
return getSuggestionDiagnostics(fileName)
|
|
512
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
514
|
+
.map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
|
|
513
515
|
.filter(utils_1.notEmpty);
|
|
514
516
|
};
|
|
515
517
|
languageService.getDefinitionAndBoundSpan = (filePath, position) => {
|
|
@@ -520,14 +522,14 @@ function decorateLanguageService(language, languageService) {
|
|
|
520
522
|
}
|
|
521
523
|
});
|
|
522
524
|
const textSpan = unresolved
|
|
523
|
-
.map(s => (0, transform_1.transformSpan)(
|
|
525
|
+
.map(s => (0, transform_1.transformSpan)(undefined, language, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
|
|
524
526
|
.filter(utils_1.notEmpty)[0];
|
|
525
527
|
if (!textSpan) {
|
|
526
528
|
return;
|
|
527
529
|
}
|
|
528
530
|
const definitions = unresolved
|
|
529
531
|
.map(s => s.definitions
|
|
530
|
-
?.map(s => (0, transform_1.transformDocumentSpan)(
|
|
532
|
+
?.map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
|
|
531
533
|
.filter(utils_1.notEmpty))
|
|
532
534
|
.filter(utils_1.notEmpty)
|
|
533
535
|
.flat();
|
|
@@ -548,11 +550,11 @@ function decorateLanguageService(language, languageService) {
|
|
|
548
550
|
const resolved = unresolved
|
|
549
551
|
.flat()
|
|
550
552
|
.map(symbol => {
|
|
551
|
-
const definition = (0, transform_1.transformDocumentSpan)(
|
|
553
|
+
const definition = (0, transform_1.transformDocumentSpan)(undefined, language, symbol.definition, language_core_1.isDefinitionEnabled, true);
|
|
552
554
|
return {
|
|
553
555
|
definition,
|
|
554
556
|
references: symbol.references
|
|
555
|
-
.map(r => (0, transform_1.transformDocumentSpan)(
|
|
557
|
+
.map(r => (0, transform_1.transformDocumentSpan)(undefined, language, r, language_core_1.isReferencesEnabled))
|
|
556
558
|
.filter(utils_1.notEmpty),
|
|
557
559
|
};
|
|
558
560
|
});
|
|
@@ -567,7 +569,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
567
569
|
});
|
|
568
570
|
const resolved = unresolved
|
|
569
571
|
.flat()
|
|
570
|
-
.map(s => (0, transform_1.transformDocumentSpan)(
|
|
572
|
+
.map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
|
|
571
573
|
.filter(utils_1.notEmpty);
|
|
572
574
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
573
575
|
};
|
|
@@ -580,7 +582,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
580
582
|
});
|
|
581
583
|
const resolved = unresolved
|
|
582
584
|
.flat()
|
|
583
|
-
.map(s => (0, transform_1.transformDocumentSpan)(
|
|
585
|
+
.map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isTypeDefinitionEnabled))
|
|
584
586
|
.filter(utils_1.notEmpty);
|
|
585
587
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
586
588
|
};
|
|
@@ -593,7 +595,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
593
595
|
});
|
|
594
596
|
const resolved = unresolved
|
|
595
597
|
.flat()
|
|
596
|
-
.map(s => (0, transform_1.transformDocumentSpan)(
|
|
598
|
+
.map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isImplementationEnabled))
|
|
597
599
|
.filter(utils_1.notEmpty);
|
|
598
600
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
599
601
|
};
|
|
@@ -606,7 +608,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
606
608
|
});
|
|
607
609
|
const resolved = unresolved
|
|
608
610
|
.flat()
|
|
609
|
-
.map(s => (0, transform_1.transformDocumentSpan)(
|
|
611
|
+
.map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isRenameEnabled))
|
|
610
612
|
.filter(utils_1.notEmpty);
|
|
611
613
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
612
614
|
};
|
|
@@ -619,19 +621,19 @@ function decorateLanguageService(language, languageService) {
|
|
|
619
621
|
});
|
|
620
622
|
const resolved = unresolved
|
|
621
623
|
.flat()
|
|
622
|
-
.map(s => (0, transform_1.transformDocumentSpan)(
|
|
624
|
+
.map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isReferencesEnabled))
|
|
623
625
|
.filter(utils_1.notEmpty);
|
|
624
626
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
625
627
|
};
|
|
626
628
|
languageService.getCompletionsAtPosition = (filePath, position, options, formattingSettings) => {
|
|
627
629
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
628
|
-
const [serviceScript, sourceScript
|
|
630
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
629
631
|
if (sourceScript?.associatedOnly) {
|
|
630
632
|
return undefined;
|
|
631
633
|
}
|
|
632
634
|
if (serviceScript) {
|
|
633
635
|
const results = [];
|
|
634
|
-
for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript,
|
|
636
|
+
for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isCompletionEnabled)) {
|
|
635
637
|
const result = getCompletionsAtPosition(sourceScript.id, generatedOffset, options, formattingSettings);
|
|
636
638
|
if (!result) {
|
|
637
639
|
continue;
|
|
@@ -640,10 +642,10 @@ function decorateLanguageService(language, languageService) {
|
|
|
640
642
|
result.entries = result.entries.filter(entry => !!entry.sourceDisplay);
|
|
641
643
|
}
|
|
642
644
|
for (const entry of result.entries) {
|
|
643
|
-
entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(
|
|
645
|
+
entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, entry.replacementSpan, language_core_1.isCompletionEnabled)?.[1];
|
|
644
646
|
}
|
|
645
647
|
result.optionalReplacementSpan = result.optionalReplacementSpan
|
|
646
|
-
&& (0, transform_1.transformTextSpan)(
|
|
648
|
+
&& (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.[1];
|
|
647
649
|
const isAdditional = typeof mapping.data.completion === 'object' && mapping.data.completion.isAdditional;
|
|
648
650
|
if (isAdditional) {
|
|
649
651
|
results.push(result);
|
|
@@ -668,12 +670,12 @@ function decorateLanguageService(language, languageService) {
|
|
|
668
670
|
languageService.getCompletionEntryDetails = (filePath, position, entryName, formatOptions, source, preferences, data) => {
|
|
669
671
|
let details;
|
|
670
672
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
671
|
-
const [serviceScript, sourceScript
|
|
673
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
672
674
|
if (sourceScript?.associatedOnly) {
|
|
673
675
|
return undefined;
|
|
674
676
|
}
|
|
675
677
|
if (serviceScript) {
|
|
676
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript,
|
|
678
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCompletionEnabled);
|
|
677
679
|
if (generatePosition !== undefined) {
|
|
678
680
|
details = getCompletionEntryDetails(sourceScript.id, generatePosition, entryName, formatOptions, source, preferences, data);
|
|
679
681
|
}
|
|
@@ -683,20 +685,21 @@ function decorateLanguageService(language, languageService) {
|
|
|
683
685
|
}
|
|
684
686
|
if (details?.codeActions) {
|
|
685
687
|
for (const codeAction of details.codeActions) {
|
|
686
|
-
codeAction.changes = (0, transform_1.transformFileTextChanges)(
|
|
688
|
+
codeAction.changes = (0, transform_1.transformFileTextChanges)(undefined, language, codeAction.changes, language_core_1.isCompletionEnabled);
|
|
687
689
|
}
|
|
688
690
|
}
|
|
689
691
|
return details;
|
|
690
692
|
};
|
|
691
693
|
languageService.provideInlayHints = (filePath, span, preferences) => {
|
|
692
694
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
693
|
-
const [serviceScript, sourceScript
|
|
695
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
694
696
|
if (sourceScript?.associatedOnly) {
|
|
695
697
|
return [];
|
|
696
698
|
}
|
|
697
699
|
if (serviceScript) {
|
|
698
700
|
let start;
|
|
699
701
|
let end;
|
|
702
|
+
const map = language.maps.get(serviceScript.code, sourceScript);
|
|
700
703
|
for (const mapping of map.mappings) {
|
|
701
704
|
if ((0, language_core_1.isInlayHintsEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
|
|
702
705
|
start ??= mapping.generatedOffsets[0];
|
|
@@ -709,13 +712,13 @@ function decorateLanguageService(language, languageService) {
|
|
|
709
712
|
start = 0;
|
|
710
713
|
end = 0;
|
|
711
714
|
}
|
|
712
|
-
const mappingOffset = (0, transform_1.getMappingOffset)(
|
|
715
|
+
const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
|
|
713
716
|
start += mappingOffset;
|
|
714
717
|
end += mappingOffset;
|
|
715
718
|
const result = provideInlayHints(sourceScript.id, { start, length: end - start }, preferences);
|
|
716
719
|
const hints = [];
|
|
717
720
|
for (const hint of result) {
|
|
718
|
-
const sourcePosition = (0, transform_1.toSourceOffset)(
|
|
721
|
+
const sourcePosition = (0, transform_1.toSourceOffset)(sourceScript, language, serviceScript, hint.position, language_core_1.isInlayHintsEnabled);
|
|
719
722
|
if (sourcePosition !== undefined) {
|
|
720
723
|
hints.push({
|
|
721
724
|
...hint,
|
|
@@ -733,19 +736,17 @@ function decorateLanguageService(language, languageService) {
|
|
|
733
736
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
734
737
|
const unresolved = getFileReferences(fileName);
|
|
735
738
|
const resolved = unresolved
|
|
736
|
-
.map(s => (0, transform_1.transformDocumentSpan)(
|
|
739
|
+
.map(s => (0, transform_1.transformDocumentSpan)(undefined, language, s, language_core_1.isReferencesEnabled))
|
|
737
740
|
.filter(utils_1.notEmpty);
|
|
738
741
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
739
742
|
};
|
|
740
743
|
function linkedCodeFeatureWorker(fileName, position, filter, worker, getLinkedCodes) {
|
|
741
744
|
const results = [];
|
|
742
745
|
const processedFilePositions = new Set();
|
|
743
|
-
const [serviceScript, sourceScript
|
|
746
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
744
747
|
if (serviceScript) {
|
|
745
|
-
for (const [generatedOffset
|
|
746
|
-
|
|
747
|
-
process(sourceScript.id, generatedOffset + (0, transform_1.getMappingOffset)(serviceScript, sourceScript));
|
|
748
|
-
}
|
|
748
|
+
for (const [generatedOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, filter)) {
|
|
749
|
+
process(sourceScript.id, generatedOffset);
|
|
749
750
|
}
|
|
750
751
|
}
|
|
751
752
|
else {
|
|
@@ -764,7 +765,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
764
765
|
results.push(result);
|
|
765
766
|
for (const ref of getLinkedCodes(result)) {
|
|
766
767
|
processedFilePositions.add(ref[0] + ':' + ref[1]);
|
|
767
|
-
const [serviceScript
|
|
768
|
+
const [serviceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
|
|
768
769
|
if (!serviceScript) {
|
|
769
770
|
continue;
|
|
770
771
|
}
|
|
@@ -772,7 +773,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
772
773
|
if (!linkedCodeMap) {
|
|
773
774
|
continue;
|
|
774
775
|
}
|
|
775
|
-
const mappingOffset = (0, transform_1.getMappingOffset)(
|
|
776
|
+
const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
|
|
776
777
|
for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - mappingOffset)) {
|
|
777
778
|
process(ref[0], linkedCodeOffset + mappingOffset);
|
|
778
779
|
}
|
|
@@ -18,7 +18,7 @@ function decorateProgram(language, program) {
|
|
|
18
18
|
return {
|
|
19
19
|
...result,
|
|
20
20
|
diagnostics: result.diagnostics
|
|
21
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
21
|
+
.map(d => (0, transform_1.transformDiagnostic)(undefined, language, d, program, true))
|
|
22
22
|
.filter(utils_1.notEmpty),
|
|
23
23
|
};
|
|
24
24
|
};
|
|
@@ -29,7 +29,7 @@ function decorateProgram(language, program) {
|
|
|
29
29
|
const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
30
30
|
const actualSourceFile = sourceScript ? program.getSourceFile(sourceScript.id) : sourceFile;
|
|
31
31
|
return getSyntacticDiagnostics(actualSourceFile, cancellationToken)
|
|
32
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
32
|
+
.map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, program, true))
|
|
33
33
|
.filter(utils_1.notEmpty);
|
|
34
34
|
};
|
|
35
35
|
program.getSemanticDiagnostics = (sourceFile, cancellationToken) => {
|
|
@@ -39,12 +39,12 @@ function decorateProgram(language, program) {
|
|
|
39
39
|
const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
40
40
|
const actualSourceFile = sourceScript ? program.getSourceFile(sourceScript.id) : sourceFile;
|
|
41
41
|
return getSemanticDiagnostics(actualSourceFile, cancellationToken)
|
|
42
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
42
|
+
.map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, program, true))
|
|
43
43
|
.filter(utils_1.notEmpty);
|
|
44
44
|
};
|
|
45
45
|
program.getGlobalDiagnostics = cancellationToken => {
|
|
46
46
|
return getGlobalDiagnostics(cancellationToken)
|
|
47
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
47
|
+
.map(d => (0, transform_1.transformDiagnostic)(undefined, language, d, program, true))
|
|
48
48
|
.filter(utils_1.notEmpty);
|
|
49
49
|
};
|
|
50
50
|
// @ts-ignore
|
|
@@ -55,7 +55,7 @@ function decorateProgram(language, program) {
|
|
|
55
55
|
const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
56
56
|
const actualSourceFile = sourceScript ? program.getSourceFile(sourceScript.id) : sourceFile;
|
|
57
57
|
return getBindAndCheckDiagnostics(actualSourceFile, cancellationToken)
|
|
58
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
58
|
+
.map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, program, true))
|
|
59
59
|
.filter(utils_1.notEmpty);
|
|
60
60
|
};
|
|
61
61
|
// fix https://github.com/vuejs/language-tools/issues/4099 with `incremental`
|
package/lib/node/transform.d.ts
CHANGED
|
@@ -1,23 +1,19 @@
|
|
|
1
|
-
import type { CodeInformation,
|
|
1
|
+
import type { CodeInformation, SourceScript, TypeScriptServiceScript } from '@volar/language-core';
|
|
2
2
|
import { Language } from '@volar/language-core';
|
|
3
3
|
import type * as ts from 'typescript';
|
|
4
|
-
export declare
|
|
5
|
-
|
|
6
|
-
SkipAssciated = 1
|
|
7
|
-
}
|
|
8
|
-
export declare function transformCallHierarchyItem(mode: ToSourceMode, language: Language<string>, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
|
|
9
|
-
export declare function transformDiagnostic<T extends ts.Diagnostic>(mode: ToSourceMode, language: Language<string>, diagnostic: T, program: ts.Program | undefined, isTsc: boolean): T | undefined;
|
|
4
|
+
export declare function transformCallHierarchyItem(targetScript: SourceScript<string> | undefined, language: Language<string>, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
|
|
5
|
+
export declare function transformDiagnostic<T extends ts.Diagnostic>(targetScript: SourceScript<string> | undefined, language: Language<string>, diagnostic: T, program: ts.Program | undefined, isTsc: boolean): T | undefined;
|
|
10
6
|
export declare function fillSourceFileText(language: Language<string>, sourceFile: ts.SourceFile): void;
|
|
11
|
-
export declare function transformFileTextChanges(
|
|
12
|
-
export declare function transformDocumentSpan<T extends ts.DocumentSpan>(
|
|
13
|
-
export declare function transformSpan(
|
|
7
|
+
export declare function transformFileTextChanges(targetScript: SourceScript<string> | undefined, language: Language<string>, changes: readonly ts.FileTextChanges[], filter: (data: CodeInformation) => boolean): ts.FileTextChanges[];
|
|
8
|
+
export declare function transformDocumentSpan<T extends ts.DocumentSpan>(targetScript: SourceScript<string> | undefined, language: Language<string>, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
|
|
9
|
+
export declare function transformSpan(targetScript: SourceScript<string> | undefined, language: Language<string>, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
|
|
14
10
|
fileName: string;
|
|
15
11
|
textSpan: ts.TextSpan;
|
|
16
12
|
} | undefined;
|
|
17
|
-
export declare function transformTextChange(
|
|
18
|
-
export declare function transformTextSpan(
|
|
19
|
-
export declare function toSourceOffset(
|
|
20
|
-
export declare function toSourceOffsets(
|
|
21
|
-
export declare function toGeneratedOffset(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>,
|
|
22
|
-
export declare function toGeneratedOffsets(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>,
|
|
23
|
-
export declare function getMappingOffset(
|
|
13
|
+
export declare function transformTextChange(targetScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, textChange: ts.TextChange, filter: (data: CodeInformation) => boolean): [string, ts.TextChange] | undefined;
|
|
14
|
+
export declare function transformTextSpan(targetScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): [string, ts.TextSpan] | undefined;
|
|
15
|
+
export declare function toSourceOffset(targetScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, position: number, filter: (data: CodeInformation) => boolean): [fileName: string, offset: number] | undefined;
|
|
16
|
+
export declare function toSourceOffsets(targetScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, position: number, filter: (data: CodeInformation) => boolean): Generator<[fileName: string, offset: number]>;
|
|
17
|
+
export declare function toGeneratedOffset(language: Language, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
|
|
18
|
+
export declare function toGeneratedOffsets(language: Language, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, position: number, filter: (data: CodeInformation) => boolean): Generator<readonly [number, import("@volar/language-core").Mapping<CodeInformation>], void, unknown>;
|
|
19
|
+
export declare function getMappingOffset(language: Language, serviceScript: TypeScriptServiceScript): number;
|
package/lib/node/transform.js
CHANGED
|
@@ -1,18 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getMappingOffset = exports.toGeneratedOffsets = exports.toGeneratedOffset = exports.toSourceOffsets = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.fillSourceFileText = exports.transformDiagnostic = exports.transformCallHierarchyItem =
|
|
3
|
+
exports.getMappingOffset = exports.toGeneratedOffsets = exports.toGeneratedOffset = exports.toSourceOffsets = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.fillSourceFileText = exports.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
5
|
const utils_1 = require("./utils");
|
|
6
|
-
var ToSourceMode;
|
|
7
|
-
(function (ToSourceMode) {
|
|
8
|
-
ToSourceMode[ToSourceMode["IncludeAssciated"] = 0] = "IncludeAssciated";
|
|
9
|
-
ToSourceMode[ToSourceMode["SkipAssciated"] = 1] = "SkipAssciated";
|
|
10
|
-
})(ToSourceMode || (exports.ToSourceMode = ToSourceMode = {}));
|
|
11
6
|
const transformedDiagnostics = new WeakMap();
|
|
12
7
|
const transformedSourceFile = new WeakSet();
|
|
13
|
-
function transformCallHierarchyItem(
|
|
14
|
-
const span = transformSpan(
|
|
15
|
-
const selectionSpan = transformSpan(
|
|
8
|
+
function transformCallHierarchyItem(targetScript, language, item, filter) {
|
|
9
|
+
const span = transformSpan(targetScript, language, item.file, item.span, filter);
|
|
10
|
+
const selectionSpan = transformSpan(targetScript, language, item.file, item.selectionSpan, filter);
|
|
16
11
|
return {
|
|
17
12
|
...item,
|
|
18
13
|
file: span?.fileName ?? item.file,
|
|
@@ -21,13 +16,13 @@ function transformCallHierarchyItem(mode, language, item, filter) {
|
|
|
21
16
|
};
|
|
22
17
|
}
|
|
23
18
|
exports.transformCallHierarchyItem = transformCallHierarchyItem;
|
|
24
|
-
function transformDiagnostic(
|
|
19
|
+
function transformDiagnostic(targetScript, language, diagnostic, program, isTsc) {
|
|
25
20
|
if (!transformedDiagnostics.has(diagnostic)) {
|
|
26
21
|
transformedDiagnostics.set(diagnostic, undefined);
|
|
27
22
|
const { relatedInformation } = diagnostic;
|
|
28
23
|
if (relatedInformation) {
|
|
29
24
|
diagnostic.relatedInformation = relatedInformation
|
|
30
|
-
.map(d => transformDiagnostic(
|
|
25
|
+
.map(d => transformDiagnostic(targetScript, language, d, program, isTsc))
|
|
31
26
|
.filter(utils_1.notEmpty);
|
|
32
27
|
}
|
|
33
28
|
if (diagnostic.file !== undefined
|
|
@@ -35,7 +30,7 @@ function transformDiagnostic(mode, language, diagnostic, program, isTsc) {
|
|
|
35
30
|
&& diagnostic.length !== undefined) {
|
|
36
31
|
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, diagnostic.file.fileName);
|
|
37
32
|
if (serviceScript) {
|
|
38
|
-
const [sourceSpanFileName, sourceSpan] = transformTextSpan(
|
|
33
|
+
const [sourceSpanFileName, sourceSpan] = transformTextSpan(sourceScript, language, serviceScript, {
|
|
39
34
|
start: diagnostic.start,
|
|
40
35
|
length: diagnostic.length
|
|
41
36
|
}, language_core_1.shouldReportDiagnostics) ?? [];
|
|
@@ -80,14 +75,14 @@ function fillSourceFileText(language, sourceFile) {
|
|
|
80
75
|
}
|
|
81
76
|
}
|
|
82
77
|
exports.fillSourceFileText = fillSourceFileText;
|
|
83
|
-
function transformFileTextChanges(
|
|
78
|
+
function transformFileTextChanges(targetScript, language, changes, filter) {
|
|
84
79
|
const changesPerFile = {};
|
|
85
80
|
const newFiles = new Set();
|
|
86
81
|
for (const fileChanges of changes) {
|
|
87
82
|
const [_, source] = (0, utils_1.getServiceScript)(language, fileChanges.fileName);
|
|
88
83
|
if (source) {
|
|
89
84
|
fileChanges.textChanges.forEach(c => {
|
|
90
|
-
const { fileName, textSpan } = transformSpan(
|
|
85
|
+
const { fileName, textSpan } = transformSpan(targetScript, language, fileChanges.fileName, c.span, filter) ?? {};
|
|
91
86
|
if (fileName && textSpan) {
|
|
92
87
|
(changesPerFile[fileName] ?? (changesPerFile[fileName] = [])).push({ ...c, span: textSpan });
|
|
93
88
|
}
|
|
@@ -114,8 +109,8 @@ function transformFileTextChanges(mode, language, changes, filter) {
|
|
|
114
109
|
return result;
|
|
115
110
|
}
|
|
116
111
|
exports.transformFileTextChanges = transformFileTextChanges;
|
|
117
|
-
function transformDocumentSpan(
|
|
118
|
-
let textSpan = transformSpan(
|
|
112
|
+
function transformDocumentSpan(targetScript, language, documentSpan, filter, shouldFallback) {
|
|
113
|
+
let textSpan = transformSpan(targetScript, language, documentSpan.fileName, documentSpan.textSpan, filter);
|
|
119
114
|
if (!textSpan && shouldFallback) {
|
|
120
115
|
textSpan = {
|
|
121
116
|
fileName: documentSpan.fileName,
|
|
@@ -125,9 +120,9 @@ function transformDocumentSpan(mode, language, documentSpan, filter, shouldFallb
|
|
|
125
120
|
if (!textSpan) {
|
|
126
121
|
return;
|
|
127
122
|
}
|
|
128
|
-
const contextSpan = transformSpan(
|
|
129
|
-
const originalTextSpan = transformSpan(
|
|
130
|
-
const originalContextSpan = transformSpan(
|
|
123
|
+
const contextSpan = transformSpan(targetScript, language, documentSpan.fileName, documentSpan.contextSpan, filter);
|
|
124
|
+
const originalTextSpan = transformSpan(targetScript, language, documentSpan.originalFileName, documentSpan.originalTextSpan, filter);
|
|
125
|
+
const originalContextSpan = transformSpan(targetScript, language, documentSpan.originalFileName, documentSpan.originalContextSpan, filter);
|
|
131
126
|
return {
|
|
132
127
|
...documentSpan,
|
|
133
128
|
fileName: textSpan.fileName,
|
|
@@ -139,7 +134,7 @@ function transformDocumentSpan(mode, language, documentSpan, filter, shouldFallb
|
|
|
139
134
|
};
|
|
140
135
|
}
|
|
141
136
|
exports.transformDocumentSpan = transformDocumentSpan;
|
|
142
|
-
function transformSpan(
|
|
137
|
+
function transformSpan(targetScript, language, fileName, textSpan, filter) {
|
|
143
138
|
if (!fileName || !textSpan) {
|
|
144
139
|
return;
|
|
145
140
|
}
|
|
@@ -148,7 +143,7 @@ function transformSpan(mode, language, fileName, textSpan, filter) {
|
|
|
148
143
|
return;
|
|
149
144
|
}
|
|
150
145
|
else if (serviceScript) {
|
|
151
|
-
const [sourceSpanFileName, sourceSpan] = transformTextSpan(
|
|
146
|
+
const [sourceSpanFileName, sourceSpan] = transformTextSpan(targetScript, language, serviceScript, textSpan, filter) ?? [];
|
|
152
147
|
if (sourceSpan && sourceSpanFileName) {
|
|
153
148
|
return {
|
|
154
149
|
fileName: sourceSpanFileName,
|
|
@@ -164,8 +159,8 @@ function transformSpan(mode, language, fileName, textSpan, filter) {
|
|
|
164
159
|
}
|
|
165
160
|
}
|
|
166
161
|
exports.transformSpan = transformSpan;
|
|
167
|
-
function transformTextChange(
|
|
168
|
-
const [sourceSpanFileName, sourceSpan] = transformTextSpan(
|
|
162
|
+
function transformTextChange(targetScript, language, serviceScript, textChange, filter) {
|
|
163
|
+
const [sourceSpanFileName, sourceSpan] = transformTextSpan(targetScript, language, serviceScript, textChange.span, filter) ?? [];
|
|
169
164
|
if (sourceSpan && sourceSpanFileName) {
|
|
170
165
|
return [sourceSpanFileName, {
|
|
171
166
|
newText: textChange.newText,
|
|
@@ -175,11 +170,11 @@ function transformTextChange(mode, language, serviceScript, sourceScript, textCh
|
|
|
175
170
|
return undefined;
|
|
176
171
|
}
|
|
177
172
|
exports.transformTextChange = transformTextChange;
|
|
178
|
-
function transformTextSpan(
|
|
173
|
+
function transformTextSpan(targetScript, language, serviceScript, textSpan, filter) {
|
|
179
174
|
const start = textSpan.start;
|
|
180
175
|
const end = textSpan.start + textSpan.length;
|
|
181
|
-
for (const sourceStart of toSourceOffsets(
|
|
182
|
-
for (const sourceEnd of toSourceOffsets(
|
|
176
|
+
for (const sourceStart of toSourceOffsets(targetScript, language, serviceScript, start, filter)) {
|
|
177
|
+
for (const sourceEnd of toSourceOffsets(targetScript, language, serviceScript, end, filter)) {
|
|
183
178
|
if (sourceStart[0] === sourceEnd[0]
|
|
184
179
|
&& sourceEnd[1] >= sourceStart[1]) {
|
|
185
180
|
return [sourceStart[0], {
|
|
@@ -191,24 +186,24 @@ function transformTextSpan(mode, language, serviceScript, sourceScript, textSpan
|
|
|
191
186
|
}
|
|
192
187
|
}
|
|
193
188
|
exports.transformTextSpan = transformTextSpan;
|
|
194
|
-
function toSourceOffset(
|
|
195
|
-
for (const source of toSourceOffsets(
|
|
189
|
+
function toSourceOffset(targetScript, language, serviceScript, position, filter) {
|
|
190
|
+
for (const source of toSourceOffsets(targetScript, language, serviceScript, position, filter)) {
|
|
196
191
|
return source;
|
|
197
192
|
}
|
|
198
193
|
}
|
|
199
194
|
exports.toSourceOffset = toSourceOffset;
|
|
200
|
-
function* toSourceOffsets(
|
|
201
|
-
if (
|
|
202
|
-
const map = language.maps.get(serviceScript.code);
|
|
203
|
-
for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(
|
|
195
|
+
function* toSourceOffsets(targetScript, language, serviceScript, position, filter) {
|
|
196
|
+
if (targetScript) {
|
|
197
|
+
const map = language.maps.get(serviceScript.code, targetScript);
|
|
198
|
+
for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(language, serviceScript))) {
|
|
204
199
|
if (filter(mapping.data)) {
|
|
205
|
-
yield [
|
|
200
|
+
yield [targetScript.id, sourceOffset];
|
|
206
201
|
}
|
|
207
202
|
}
|
|
208
203
|
}
|
|
209
204
|
else {
|
|
210
205
|
for (const [fileName, _snapshot, map] of language.maps.forEach(serviceScript.code)) {
|
|
211
|
-
for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(
|
|
206
|
+
for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(language, serviceScript))) {
|
|
212
207
|
if (filter(mapping.data)) {
|
|
213
208
|
yield [fileName, sourceOffset];
|
|
214
209
|
}
|
|
@@ -217,24 +212,27 @@ function* toSourceOffsets(mode, language, serviceScript, sourceScript, position,
|
|
|
217
212
|
}
|
|
218
213
|
}
|
|
219
214
|
exports.toSourceOffsets = toSourceOffsets;
|
|
220
|
-
function toGeneratedOffset(serviceScript, sourceScript,
|
|
221
|
-
for (const [generateOffset] of toGeneratedOffsets(serviceScript, sourceScript,
|
|
215
|
+
function toGeneratedOffset(language, serviceScript, sourceScript, position, filter) {
|
|
216
|
+
for (const [generateOffset] of toGeneratedOffsets(language, serviceScript, sourceScript, position, filter)) {
|
|
222
217
|
return generateOffset;
|
|
223
218
|
}
|
|
224
219
|
}
|
|
225
220
|
exports.toGeneratedOffset = toGeneratedOffset;
|
|
226
|
-
function* toGeneratedOffsets(serviceScript, sourceScript,
|
|
221
|
+
function* toGeneratedOffsets(language, serviceScript, sourceScript, position, filter) {
|
|
222
|
+
const map = language.maps.get(serviceScript.code, sourceScript);
|
|
227
223
|
for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
228
224
|
if (filter(mapping.data)) {
|
|
229
|
-
yield [generateOffset + getMappingOffset(
|
|
225
|
+
yield [generateOffset + getMappingOffset(language, serviceScript), mapping];
|
|
230
226
|
}
|
|
231
227
|
}
|
|
232
228
|
}
|
|
233
229
|
exports.toGeneratedOffsets = toGeneratedOffsets;
|
|
234
|
-
function getMappingOffset(
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
230
|
+
function getMappingOffset(language, serviceScript) {
|
|
231
|
+
if (serviceScript.preventLeadingOffset) {
|
|
232
|
+
return 0;
|
|
233
|
+
}
|
|
234
|
+
const sourceScript = language.scripts.fromVirtualCode(serviceScript.code);
|
|
235
|
+
return sourceScript.snapshot.getLength();
|
|
238
236
|
}
|
|
239
237
|
exports.getMappingOffset = getMappingOffset;
|
|
240
238
|
//# sourceMappingURL=transform.js.map
|
package/lib/node/utils.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Language, SourceScript, TypeScriptServiceScript } from '@volar/language-core';
|
|
2
2
|
export declare function notEmpty<T>(value: T | null | undefined): value is T;
|
|
3
|
-
export declare function getServiceScript(language: Language<string>, fileName: string): [TypeScriptServiceScript, SourceScript<string
|
|
3
|
+
export declare function getServiceScript(language: Language<string>, fileName: string): [TypeScriptServiceScript, SourceScript<string>] | [undefined, SourceScript<string>] | [undefined, undefined];
|
package/lib/node/utils.js
CHANGED
|
@@ -6,37 +6,28 @@ function notEmpty(value) {
|
|
|
6
6
|
}
|
|
7
7
|
exports.notEmpty = notEmpty;
|
|
8
8
|
function getServiceScript(language, fileName) {
|
|
9
|
-
|
|
10
|
-
if (sourceScript?.targetIds
|
|
11
|
-
const sourceId = sourceScript.id;
|
|
9
|
+
const sourceScript = language.scripts.get(fileName);
|
|
10
|
+
if (sourceScript?.targetIds.size) {
|
|
12
11
|
for (const targetId of sourceScript.targetIds) {
|
|
13
|
-
|
|
14
|
-
if (
|
|
15
|
-
const serviceScript =
|
|
12
|
+
const targetScript = language.scripts.get(targetId);
|
|
13
|
+
if (targetScript?.generated) {
|
|
14
|
+
const serviceScript = targetScript.generated.languagePlugin.typescript?.getServiceScript(targetScript.generated.root);
|
|
16
15
|
if (serviceScript) {
|
|
17
|
-
|
|
18
|
-
if (id === sourceId) {
|
|
19
|
-
return [serviceScript, sourceScript, map];
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
break;
|
|
16
|
+
return [serviceScript, targetScript];
|
|
23
17
|
}
|
|
24
18
|
}
|
|
25
19
|
}
|
|
26
20
|
}
|
|
27
21
|
if (sourceScript?.associatedOnly) {
|
|
28
|
-
return [undefined, sourceScript
|
|
22
|
+
return [undefined, sourceScript];
|
|
29
23
|
}
|
|
30
24
|
if (sourceScript?.generated) {
|
|
31
25
|
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
32
26
|
if (serviceScript) {
|
|
33
|
-
|
|
34
|
-
if (map) {
|
|
35
|
-
return [serviceScript, sourceScript, map];
|
|
36
|
-
}
|
|
27
|
+
return [serviceScript, sourceScript];
|
|
37
28
|
}
|
|
38
29
|
}
|
|
39
|
-
return [undefined, undefined
|
|
30
|
+
return [undefined, undefined];
|
|
40
31
|
}
|
|
41
32
|
exports.getServiceScript = getServiceScript;
|
|
42
33
|
//# sourceMappingURL=utils.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volar/typescript",
|
|
3
|
-
"version": "2.3.0-alpha.
|
|
3
|
+
"version": "2.3.0-alpha.9",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"files": [
|
|
6
6
|
"**/*.js",
|
|
@@ -12,14 +12,14 @@
|
|
|
12
12
|
"directory": "packages/typescript"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@volar/language-core": "2.3.0-alpha.
|
|
15
|
+
"@volar/language-core": "2.3.0-alpha.9",
|
|
16
16
|
"path-browserify": "^1.0.1",
|
|
17
17
|
"vscode-uri": "^3.0.8"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"@types/node": "latest",
|
|
21
21
|
"@types/path-browserify": "latest",
|
|
22
|
-
"@volar/language-service": "2.3.0-alpha.
|
|
22
|
+
"@volar/language-service": "2.3.0-alpha.9"
|
|
23
23
|
},
|
|
24
|
-
"gitHead": "
|
|
24
|
+
"gitHead": "3f741930343896dfc464a893ebe5f3619bb1a1aa"
|
|
25
25
|
}
|