@volar/typescript 2.2.0-alpha.0 → 2.2.0-alpha.1
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.
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDocumentRegistry = void 0;
|
|
4
|
+
const documentRegistries = [];
|
|
5
|
+
function getDocumentRegistry(ts, useCaseSensitiveFileNames, currentDirectory) {
|
|
6
|
+
let documentRegistry = documentRegistries.find(item => item[0] === useCaseSensitiveFileNames && item[1] === currentDirectory)?.[2];
|
|
7
|
+
if (!documentRegistry) {
|
|
8
|
+
documentRegistry = ts.createDocumentRegistry(useCaseSensitiveFileNames, currentDirectory);
|
|
9
|
+
documentRegistries.push([useCaseSensitiveFileNames, currentDirectory, documentRegistry]);
|
|
10
|
+
}
|
|
11
|
+
return documentRegistry;
|
|
12
|
+
}
|
|
13
|
+
exports.getDocumentRegistry = getDocumentRegistry;
|
|
14
|
+
//# sourceMappingURL=documentRegistry.js.map
|
|
@@ -29,19 +29,92 @@ function decorateLanguageService(language, languageService) {
|
|
|
29
29
|
}
|
|
30
30
|
};
|
|
31
31
|
// methods
|
|
32
|
-
const { findReferences, findRenameLocations, getCompletionEntryDetails, getCompletionsAtPosition, getDefinitionAndBoundSpan, getDefinitionAtPosition, getFileReferences, getImplementationAtPosition, getQuickInfoAtPosition, getReferencesAtPosition, getSemanticDiagnostics, getSyntacticDiagnostics, getSuggestionDiagnostics, getTypeDefinitionAtPosition, getEncodedSemanticClassifications, getDocumentHighlights, getApplicableRefactors, getEditsForRefactor, getRenameInfo, getCodeFixesAtPosition, prepareCallHierarchy, provideCallHierarchyIncomingCalls, provideCallHierarchyOutgoingCalls, provideInlayHints, organizeImports, } = languageService;
|
|
32
|
+
const { findReferences, findRenameLocations, getCompletionEntryDetails, getCompletionsAtPosition, getDefinitionAndBoundSpan, getDefinitionAtPosition, getFileReferences, getFormattingEditsForDocument, getFormattingEditsForRange, getFormattingEditsAfterKeystroke, getImplementationAtPosition, getLinkedEditingRangeAtPosition, getQuickInfoAtPosition, getReferencesAtPosition, getSemanticDiagnostics, getSyntacticDiagnostics, getSuggestionDiagnostics, getTypeDefinitionAtPosition, getEncodedSemanticClassifications, getDocumentHighlights, getApplicableRefactors, getEditsForFileRename, getEditsForRefactor, getRenameInfo, getCodeFixesAtPosition, prepareCallHierarchy, provideCallHierarchyIncomingCalls, provideCallHierarchyOutgoingCalls, provideInlayHints, organizeImports, } = languageService;
|
|
33
|
+
languageService.getFormattingEditsForDocument = (fileName, options) => {
|
|
34
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
35
|
+
if (serviceScript) {
|
|
36
|
+
if (!map.mappings.some(mapping => (0, language_core_1.isFormattingEnabled)(mapping.data))) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
const edits = getFormattingEditsForDocument(fileName, options);
|
|
40
|
+
return edits
|
|
41
|
+
.map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
|
|
42
|
+
.filter(utils_1.notEmpty);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
return getFormattingEditsForDocument(fileName, options);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
languageService.getFormattingEditsForRange = (fileName, start, end, options) => {
|
|
49
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
50
|
+
if (serviceScript) {
|
|
51
|
+
const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isFormattingEnabled);
|
|
52
|
+
const generateEnd = (0, transform_1.toGeneratedOffset)(sourceScript, map, end, language_core_1.isFormattingEnabled);
|
|
53
|
+
if (generateStart !== undefined && generateEnd !== undefined) {
|
|
54
|
+
const edits = getFormattingEditsForRange(fileName, generateStart, generateEnd, options);
|
|
55
|
+
return edits
|
|
56
|
+
.map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
|
|
57
|
+
.filter(utils_1.notEmpty);
|
|
58
|
+
}
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
return getFormattingEditsForRange(fileName, start, end, options);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
languageService.getFormattingEditsAfterKeystroke = (fileName, position, key, options) => {
|
|
66
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
67
|
+
if (serviceScript) {
|
|
68
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isFormattingEnabled);
|
|
69
|
+
if (generatePosition !== undefined) {
|
|
70
|
+
const edits = getFormattingEditsAfterKeystroke(fileName, generatePosition, key, options);
|
|
71
|
+
return edits
|
|
72
|
+
.map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
|
|
73
|
+
.filter(utils_1.notEmpty);
|
|
74
|
+
}
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
return getFormattingEditsAfterKeystroke(fileName, position, key, options);
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
languageService.getEditsForFileRename = (oldFilePath, newFilePath, formatOptions, preferences) => {
|
|
82
|
+
const edits = getEditsForFileRename(oldFilePath, newFilePath, formatOptions, preferences);
|
|
83
|
+
return edits
|
|
84
|
+
.map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isRenameEnabled))
|
|
85
|
+
.filter(utils_1.notEmpty);
|
|
86
|
+
};
|
|
87
|
+
languageService.getLinkedEditingRangeAtPosition = (fileName, position) => {
|
|
88
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
89
|
+
if (serviceScript) {
|
|
90
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isLinkedEditingEnabled);
|
|
91
|
+
if (generatePosition !== undefined) {
|
|
92
|
+
const info = getLinkedEditingRangeAtPosition(fileName, generatePosition);
|
|
93
|
+
if (info) {
|
|
94
|
+
return {
|
|
95
|
+
ranges: info.ranges
|
|
96
|
+
.map(span => (0, transform_1.transformTextSpan)(sourceScript, map, span, language_core_1.isLinkedEditingEnabled))
|
|
97
|
+
.filter(utils_1.notEmpty),
|
|
98
|
+
wordPattern: info.wordPattern,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
return getLinkedEditingRangeAtPosition(fileName, position);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
33
107
|
languageService.prepareCallHierarchy = (fileName, position) => {
|
|
34
108
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
35
109
|
if (serviceScript) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
}
|
|
110
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
111
|
+
if (generatePosition !== undefined) {
|
|
112
|
+
const item = prepareCallHierarchy(fileName, generatePosition);
|
|
113
|
+
if (Array.isArray(item)) {
|
|
114
|
+
return item.map(item => (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled));
|
|
115
|
+
}
|
|
116
|
+
else if (item) {
|
|
117
|
+
return (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled);
|
|
45
118
|
}
|
|
46
119
|
}
|
|
47
120
|
}
|
|
@@ -53,10 +126,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
53
126
|
let calls = [];
|
|
54
127
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
55
128
|
if (serviceScript) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
129
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
130
|
+
if (generatePosition !== undefined) {
|
|
131
|
+
calls = provideCallHierarchyIncomingCalls(fileName, generatePosition);
|
|
60
132
|
}
|
|
61
133
|
}
|
|
62
134
|
else {
|
|
@@ -78,10 +150,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
78
150
|
let calls = [];
|
|
79
151
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
80
152
|
if (serviceScript) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}
|
|
153
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
154
|
+
if (generatePosition !== undefined) {
|
|
155
|
+
calls = provideCallHierarchyOutgoingCalls(fileName, generatePosition);
|
|
85
156
|
}
|
|
86
157
|
}
|
|
87
158
|
else {
|
|
@@ -91,7 +162,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
91
162
|
.map(call => {
|
|
92
163
|
const to = (0, transform_1.transformCallHierarchyItem)(language, call.to, language_core_1.isCallHierarchyEnabled);
|
|
93
164
|
const fromSpans = call.fromSpans
|
|
94
|
-
.map(span =>
|
|
165
|
+
.map(span => sourceScript
|
|
166
|
+
? (0, transform_1.transformTextSpan)(sourceScript, map, span, language_core_1.isCallHierarchyEnabled)
|
|
167
|
+
: span)
|
|
95
168
|
.filter(utils_1.notEmpty);
|
|
96
169
|
return {
|
|
97
170
|
to,
|
|
@@ -109,17 +182,16 @@ function decorateLanguageService(language, languageService) {
|
|
|
109
182
|
languageService.getQuickInfoAtPosition = (fileName, position) => {
|
|
110
183
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
111
184
|
if (serviceScript) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
185
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isHoverEnabled);
|
|
186
|
+
if (generatePosition !== undefined) {
|
|
187
|
+
const result = getQuickInfoAtPosition(fileName, generatePosition);
|
|
188
|
+
if (result) {
|
|
189
|
+
const textSpan = (0, transform_1.transformTextSpan)(sourceScript, map, result.textSpan, language_core_1.isHoverEnabled);
|
|
190
|
+
if (textSpan) {
|
|
191
|
+
return {
|
|
192
|
+
...result,
|
|
193
|
+
textSpan,
|
|
194
|
+
};
|
|
123
195
|
}
|
|
124
196
|
}
|
|
125
197
|
}
|
|
@@ -160,16 +232,15 @@ function decorateLanguageService(language, languageService) {
|
|
|
160
232
|
languageService.getApplicableRefactors = (fileName, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
|
|
161
233
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
162
234
|
if (serviceScript) {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
}
|
|
235
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
|
|
236
|
+
if (generatePosition !== undefined) {
|
|
237
|
+
const por = typeof positionOrRange === 'number'
|
|
238
|
+
? generatePosition
|
|
239
|
+
: {
|
|
240
|
+
pos: generatePosition,
|
|
241
|
+
end: generatePosition + positionOrRange.end - positionOrRange.pos,
|
|
242
|
+
};
|
|
243
|
+
return getApplicableRefactors(fileName, por, preferences, triggerReason, kind, includeInteractiveActions);
|
|
173
244
|
}
|
|
174
245
|
return [];
|
|
175
246
|
}
|
|
@@ -181,16 +252,17 @@ function decorateLanguageService(language, languageService) {
|
|
|
181
252
|
let edits;
|
|
182
253
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
183
254
|
if (serviceScript) {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
255
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number'
|
|
256
|
+
? positionOrRange
|
|
257
|
+
: positionOrRange.pos, language_core_1.isCodeActionsEnabled);
|
|
258
|
+
if (generatePosition !== undefined) {
|
|
259
|
+
const por = typeof positionOrRange === 'number'
|
|
260
|
+
? generatePosition
|
|
261
|
+
: {
|
|
262
|
+
pos: generatePosition,
|
|
263
|
+
end: generatePosition + positionOrRange.end - positionOrRange.pos,
|
|
264
|
+
};
|
|
265
|
+
edits = getEditsForRefactor(fileName, formatOptions, por, refactorName, actionName, preferences);
|
|
194
266
|
}
|
|
195
267
|
}
|
|
196
268
|
else {
|
|
@@ -206,20 +278,19 @@ function decorateLanguageService(language, languageService) {
|
|
|
206
278
|
languageService.getRenameInfo = (fileName, position, options) => {
|
|
207
279
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
208
280
|
if (serviceScript) {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
return info;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
281
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isRenameEnabled);
|
|
282
|
+
if (generatePosition !== undefined) {
|
|
283
|
+
const info = getRenameInfo(fileName, generatePosition, options);
|
|
284
|
+
if (info.canRename) {
|
|
285
|
+
const span = (0, transform_1.transformTextSpan)(sourceScript, map, info.triggerSpan, language_core_1.isRenameEnabled);
|
|
286
|
+
if (span) {
|
|
287
|
+
info.triggerSpan = span;
|
|
220
288
|
return info;
|
|
221
289
|
}
|
|
222
290
|
}
|
|
291
|
+
else {
|
|
292
|
+
return info;
|
|
293
|
+
}
|
|
223
294
|
}
|
|
224
295
|
return {
|
|
225
296
|
canRename: false,
|
|
@@ -234,16 +305,10 @@ function decorateLanguageService(language, languageService) {
|
|
|
234
305
|
let fixes = [];
|
|
235
306
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
236
307
|
if (serviceScript) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
fixes = getCodeFixesAtPosition(fileName, generateStart + sourceScript.snapshot.getLength(), generateEnd + sourceScript.snapshot.getLength(), errorCodes, formatOptions, preferences);
|
|
242
|
-
break;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
break;
|
|
246
|
-
}
|
|
308
|
+
const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isCodeActionsEnabled);
|
|
309
|
+
const generateEnd = (0, transform_1.toGeneratedOffset)(sourceScript, map, end, language_core_1.isCodeActionsEnabled);
|
|
310
|
+
if (generateStart !== undefined && generateEnd !== undefined) {
|
|
311
|
+
fixes = getCodeFixesAtPosition(fileName, generateStart, generateEnd, errorCodes, formatOptions, preferences);
|
|
247
312
|
}
|
|
248
313
|
}
|
|
249
314
|
else {
|
|
@@ -261,32 +326,25 @@ function decorateLanguageService(language, languageService) {
|
|
|
261
326
|
let start;
|
|
262
327
|
let end;
|
|
263
328
|
for (const mapping of map.mappings) {
|
|
329
|
+
// TODO reuse the logic from language service
|
|
264
330
|
if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
|
|
265
331
|
start ??= mapping.generatedOffsets[0];
|
|
266
|
-
end ??= mapping.generatedOffsets[mapping.generatedOffsets.length - 1];
|
|
332
|
+
end ??= mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + mapping.lengths[mapping.lengths.length - 1];
|
|
267
333
|
start = Math.min(start, mapping.generatedOffsets[0]);
|
|
268
|
-
end = Math.max(end, mapping.generatedOffsets[mapping.generatedOffsets.length - 1]);
|
|
334
|
+
end = Math.max(end, mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + mapping.lengths[mapping.lengths.length - 1]);
|
|
269
335
|
}
|
|
270
336
|
}
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
end = 0;
|
|
274
|
-
}
|
|
337
|
+
start ??= 0;
|
|
338
|
+
end ??= sourceScript.snapshot.getLength();
|
|
275
339
|
start += sourceScript.snapshot.getLength();
|
|
276
340
|
end += sourceScript.snapshot.getLength();
|
|
277
341
|
const result = getEncodedSemanticClassifications(fileName, { start, length: end - start }, format);
|
|
278
342
|
const spans = [];
|
|
279
343
|
for (let i = 0; i < result.spans.length; i += 3) {
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
|
|
285
|
-
break;
|
|
286
|
-
}
|
|
287
|
-
}
|
|
288
|
-
break;
|
|
289
|
-
}
|
|
344
|
+
const sourceStart = (0, transform_1.toSourceOffset)(sourceScript, map, result.spans[i], language_core_1.isSemanticTokensEnabled);
|
|
345
|
+
const sourceEnd = (0, transform_1.toSourceOffset)(sourceScript, map, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled);
|
|
346
|
+
if (sourceStart !== undefined && sourceEnd !== undefined) {
|
|
347
|
+
spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
|
|
290
348
|
}
|
|
291
349
|
}
|
|
292
350
|
result.spans = spans;
|
|
@@ -423,24 +481,29 @@ function decorateLanguageService(language, languageService) {
|
|
|
423
481
|
if (serviceScript) {
|
|
424
482
|
let mainResult;
|
|
425
483
|
let additionalResults = [];
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
484
|
+
let isAdditional;
|
|
485
|
+
const generatedOffset = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, data => {
|
|
486
|
+
if (!(0, language_core_1.isCompletionEnabled)(data)) {
|
|
487
|
+
return false;
|
|
488
|
+
}
|
|
489
|
+
isAdditional = typeof data.completion === 'object' && data.completion.isAdditional;
|
|
490
|
+
if (!isAdditional && mainResult) {
|
|
491
|
+
return false;
|
|
492
|
+
}
|
|
493
|
+
return true;
|
|
494
|
+
});
|
|
495
|
+
if (generatedOffset !== undefined) {
|
|
496
|
+
const result = getCompletionsAtPosition(fileName, generatedOffset, options, formattingSettings);
|
|
497
|
+
if (result) {
|
|
498
|
+
for (const entry of result.entries) {
|
|
499
|
+
entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(sourceScript, map, entry.replacementSpan, language_core_1.isCompletionEnabled);
|
|
431
500
|
}
|
|
432
|
-
|
|
433
|
-
if (
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
if (isAdditional) {
|
|
439
|
-
additionalResults.push(result);
|
|
440
|
-
}
|
|
441
|
-
else {
|
|
442
|
-
mainResult = result;
|
|
443
|
-
}
|
|
501
|
+
result.optionalReplacementSpan = result.optionalReplacementSpan && (0, transform_1.transformTextSpan)(sourceScript, map, result.optionalReplacementSpan, language_core_1.isCompletionEnabled);
|
|
502
|
+
if (isAdditional) {
|
|
503
|
+
additionalResults.push(result);
|
|
504
|
+
}
|
|
505
|
+
else {
|
|
506
|
+
mainResult = result;
|
|
444
507
|
}
|
|
445
508
|
}
|
|
446
509
|
}
|
|
@@ -465,11 +528,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
465
528
|
let details;
|
|
466
529
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
467
530
|
if (serviceScript) {
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
break;
|
|
472
|
-
}
|
|
531
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCompletionEnabled);
|
|
532
|
+
if (generatePosition !== undefined) {
|
|
533
|
+
details = getCompletionEntryDetails(fileName, generatePosition, entryName, formatOptions, source, preferences, data);
|
|
473
534
|
}
|
|
474
535
|
}
|
|
475
536
|
else {
|
|
@@ -504,14 +565,12 @@ function decorateLanguageService(language, languageService) {
|
|
|
504
565
|
const result = provideInlayHints(fileName, { start, length: end - start }, preferences);
|
|
505
566
|
const hints = [];
|
|
506
567
|
for (const hint of result) {
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
break;
|
|
514
|
-
}
|
|
568
|
+
const sourcePosition = (0, transform_1.toSourceOffset)(sourceScript, map, hint.position, language_core_1.isInlayHintsEnabled);
|
|
569
|
+
if (sourcePosition !== undefined) {
|
|
570
|
+
hints.push({
|
|
571
|
+
...hint,
|
|
572
|
+
position: sourcePosition,
|
|
573
|
+
});
|
|
515
574
|
}
|
|
516
575
|
}
|
|
517
576
|
return hints;
|
|
@@ -532,9 +591,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
532
591
|
const processedFilePositions = new Set();
|
|
533
592
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
534
593
|
if (serviceScript) {
|
|
535
|
-
for (const [
|
|
594
|
+
for (const [generatedOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
536
595
|
if (filter(mapping.data)) {
|
|
537
|
-
process(fileName,
|
|
596
|
+
process(fileName, generatedOffset + sourceScript.snapshot.getLength());
|
|
538
597
|
}
|
|
539
598
|
}
|
|
540
599
|
}
|
|
@@ -554,11 +613,11 @@ function decorateLanguageService(language, languageService) {
|
|
|
554
613
|
results = results.concat(result);
|
|
555
614
|
for (const ref of getLinkedCodes(result)) {
|
|
556
615
|
processedFilePositions.add(ref[0] + ':' + ref[1]);
|
|
557
|
-
const [
|
|
558
|
-
if (!
|
|
616
|
+
const [virtualFile, sourceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
|
|
617
|
+
if (!virtualFile) {
|
|
559
618
|
continue;
|
|
560
619
|
}
|
|
561
|
-
const linkedCodeMap = language.linkedCodeMaps.get(
|
|
620
|
+
const linkedCodeMap = language.linkedCodeMaps.get(virtualFile.code);
|
|
562
621
|
if (!linkedCodeMap) {
|
|
563
622
|
continue;
|
|
564
623
|
}
|
|
@@ -57,28 +57,24 @@ function decorateLanguageServiceHost(language, languageServiceHost, ts) {
|
|
|
57
57
|
};
|
|
58
58
|
}
|
|
59
59
|
languageServiceHost.getScriptSnapshot = fileName => {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return
|
|
60
|
+
const virtualScript = updateVirtualScript(fileName);
|
|
61
|
+
if (virtualScript) {
|
|
62
|
+
return virtualScript.snapshot;
|
|
63
63
|
}
|
|
64
64
|
return getScriptSnapshot(fileName);
|
|
65
65
|
};
|
|
66
66
|
if (getScriptKind) {
|
|
67
67
|
languageServiceHost.getScriptKind = fileName => {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
if (script) {
|
|
72
|
-
return script.kind;
|
|
73
|
-
}
|
|
74
|
-
return ts.ScriptKind.Deferred;
|
|
68
|
+
const virtualScript = updateVirtualScript(fileName);
|
|
69
|
+
if (virtualScript) {
|
|
70
|
+
return virtualScript.kind;
|
|
75
71
|
}
|
|
76
72
|
return getScriptKind(fileName);
|
|
77
73
|
};
|
|
78
74
|
}
|
|
79
|
-
function
|
|
75
|
+
function updateVirtualScript(fileName) {
|
|
80
76
|
const version = languageServiceHost.getScriptVersion(fileName);
|
|
81
|
-
if (version !== scripts.get(fileName)?.
|
|
77
|
+
if (version !== scripts.get(fileName)?.[0]) {
|
|
82
78
|
let extension = '.ts';
|
|
83
79
|
let snapshotSnapshot;
|
|
84
80
|
let scriptKind = ts.ScriptKind.TS;
|
|
@@ -105,14 +101,18 @@ function decorateLanguageServiceHost(language, languageServiceHost, ts) {
|
|
|
105
101
|
extraProjectVersion++;
|
|
106
102
|
language.scripts.delete(fileName);
|
|
107
103
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
104
|
+
if (snapshotSnapshot) {
|
|
105
|
+
scripts.set(fileName, [
|
|
106
|
+
version,
|
|
107
|
+
{
|
|
108
|
+
extension,
|
|
109
|
+
snapshot: snapshotSnapshot,
|
|
110
|
+
kind: scriptKind,
|
|
111
|
+
}
|
|
112
|
+
]);
|
|
113
|
+
}
|
|
114
114
|
}
|
|
115
|
-
return scripts.get(fileName);
|
|
115
|
+
return scripts.get(fileName)?.[1];
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
118
|
exports.decorateLanguageServiceHost = decorateLanguageServiceHost;
|
package/lib/node/transform.d.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import { Language, CodeInformation } from '@volar/language-core';
|
|
1
|
+
import { Language, CodeInformation, SourceMap, SourceScript } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare function transformCallHierarchyItem(
|
|
4
|
-
export declare function transformDiagnostic<T extends ts.Diagnostic>(
|
|
5
|
-
export declare function transformFileTextChanges(
|
|
6
|
-
export declare function transformDocumentSpan<T extends ts.DocumentSpan>(
|
|
7
|
-
export declare function transformSpan(
|
|
3
|
+
export declare function transformCallHierarchyItem(language: Language, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
|
|
4
|
+
export declare function transformDiagnostic<T extends ts.Diagnostic>(language: Language, diagnostic: T): T | undefined;
|
|
5
|
+
export declare function transformFileTextChanges(language: Language, changes: ts.FileTextChanges, filter: (data: CodeInformation) => boolean): ts.FileTextChanges | undefined;
|
|
6
|
+
export declare function transformDocumentSpan<T extends ts.DocumentSpan>(language: Language, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
|
|
7
|
+
export declare function transformSpan(language: Language, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
|
|
8
8
|
fileName: string;
|
|
9
9
|
textSpan: ts.TextSpan;
|
|
10
10
|
} | undefined;
|
|
11
|
+
export declare function transformTextChange(sourceScript: SourceScript, map: SourceMap<CodeInformation>, textChange: ts.TextChange, filter: (data: CodeInformation) => boolean): ts.TextChange | undefined;
|
|
12
|
+
export declare function transformTextSpan(sourceScript: SourceScript, map: SourceMap<CodeInformation>, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): ts.TextSpan | undefined;
|
|
13
|
+
export declare function toSourceOffset(sourceScript: SourceScript, map: SourceMap, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
|
|
14
|
+
export declare function toGeneratedOffset(sourceScript: SourceScript, map: SourceMap, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
|
package/lib/node/transform.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
|
|
3
|
+
exports.toGeneratedOffset = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
5
|
const utils_1 = require("./utils");
|
|
6
6
|
const transformedDiagnostics = new WeakMap();
|
|
7
|
-
function transformCallHierarchyItem(
|
|
8
|
-
const span = transformSpan(
|
|
9
|
-
const selectionSpan = transformSpan(
|
|
7
|
+
function transformCallHierarchyItem(language, item, filter) {
|
|
8
|
+
const span = transformSpan(language, item.file, item.span, filter);
|
|
9
|
+
const selectionSpan = transformSpan(language, item.file, item.selectionSpan, filter);
|
|
10
10
|
return {
|
|
11
11
|
...item,
|
|
12
12
|
span: span?.textSpan ?? { start: 0, length: 0 },
|
|
@@ -14,26 +14,26 @@ function transformCallHierarchyItem(files, item, filter) {
|
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
16
|
exports.transformCallHierarchyItem = transformCallHierarchyItem;
|
|
17
|
-
function transformDiagnostic(
|
|
17
|
+
function transformDiagnostic(language, diagnostic) {
|
|
18
18
|
if (!transformedDiagnostics.has(diagnostic)) {
|
|
19
19
|
transformedDiagnostics.set(diagnostic, undefined);
|
|
20
20
|
const { relatedInformation } = diagnostic;
|
|
21
21
|
if (relatedInformation) {
|
|
22
22
|
diagnostic.relatedInformation = relatedInformation
|
|
23
|
-
.map(d => transformDiagnostic(
|
|
23
|
+
.map(d => transformDiagnostic(language, d))
|
|
24
24
|
.filter(utils_1.notEmpty);
|
|
25
25
|
}
|
|
26
26
|
if (diagnostic.file !== undefined
|
|
27
27
|
&& diagnostic.start !== undefined
|
|
28
28
|
&& diagnostic.length !== undefined) {
|
|
29
|
-
const [
|
|
30
|
-
if (
|
|
31
|
-
const
|
|
32
|
-
if (
|
|
29
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, diagnostic.file.fileName);
|
|
30
|
+
if (serviceScript) {
|
|
31
|
+
const sourceSpan = transformTextSpan(sourceScript, map, { start: diagnostic.start, length: diagnostic.length }, language_core_1.shouldReportDiagnostics);
|
|
32
|
+
if (sourceSpan) {
|
|
33
33
|
transformedDiagnostics.set(diagnostic, {
|
|
34
34
|
...diagnostic,
|
|
35
|
-
start:
|
|
36
|
-
length:
|
|
35
|
+
start: sourceSpan.start,
|
|
36
|
+
length: sourceSpan.length,
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
39
|
}
|
|
@@ -48,13 +48,13 @@ function transformDiagnostic(files, diagnostic) {
|
|
|
48
48
|
return transformedDiagnostics.get(diagnostic);
|
|
49
49
|
}
|
|
50
50
|
exports.transformDiagnostic = transformDiagnostic;
|
|
51
|
-
function transformFileTextChanges(
|
|
52
|
-
const [_, source] = (0, utils_1.getServiceScript)(
|
|
51
|
+
function transformFileTextChanges(language, changes, filter) {
|
|
52
|
+
const [_, source] = (0, utils_1.getServiceScript)(language, changes.fileName);
|
|
53
53
|
if (source) {
|
|
54
54
|
return {
|
|
55
55
|
...changes,
|
|
56
56
|
textChanges: changes.textChanges.map(c => {
|
|
57
|
-
const span = transformSpan(
|
|
57
|
+
const span = transformSpan(language, changes.fileName, c.span, filter);
|
|
58
58
|
if (span) {
|
|
59
59
|
return {
|
|
60
60
|
...c,
|
|
@@ -69,11 +69,11 @@ function transformFileTextChanges(files, changes, filter) {
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
exports.transformFileTextChanges = transformFileTextChanges;
|
|
72
|
-
function transformDocumentSpan(
|
|
73
|
-
let textSpan = transformSpan(
|
|
72
|
+
function transformDocumentSpan(language, documentSpan, filter, shouldFallback) {
|
|
73
|
+
let textSpan = transformSpan(language, documentSpan.fileName, documentSpan.textSpan, filter);
|
|
74
74
|
if (!textSpan && shouldFallback) {
|
|
75
|
-
const [
|
|
76
|
-
if (
|
|
75
|
+
const [serviceScript] = (0, utils_1.getServiceScript)(language, documentSpan.fileName);
|
|
76
|
+
if (serviceScript) {
|
|
77
77
|
textSpan = {
|
|
78
78
|
fileName: documentSpan.fileName,
|
|
79
79
|
textSpan: { start: 0, length: 0 },
|
|
@@ -83,9 +83,9 @@ function transformDocumentSpan(files, documentSpan, filter, shouldFallback) {
|
|
|
83
83
|
if (!textSpan) {
|
|
84
84
|
return;
|
|
85
85
|
}
|
|
86
|
-
const contextSpan = transformSpan(
|
|
87
|
-
const originalTextSpan = transformSpan(
|
|
88
|
-
const originalContextSpan = transformSpan(
|
|
86
|
+
const contextSpan = transformSpan(language, documentSpan.fileName, documentSpan.contextSpan, filter);
|
|
87
|
+
const originalTextSpan = transformSpan(language, documentSpan.originalFileName, documentSpan.originalTextSpan, filter);
|
|
88
|
+
const originalContextSpan = transformSpan(language, documentSpan.originalFileName, documentSpan.originalContextSpan, filter);
|
|
89
89
|
return {
|
|
90
90
|
...documentSpan,
|
|
91
91
|
fileName: textSpan.fileName,
|
|
@@ -97,23 +97,17 @@ function transformDocumentSpan(files, documentSpan, filter, shouldFallback) {
|
|
|
97
97
|
};
|
|
98
98
|
}
|
|
99
99
|
exports.transformDocumentSpan = transformDocumentSpan;
|
|
100
|
-
function transformSpan(
|
|
101
|
-
if (!fileName) {
|
|
100
|
+
function transformSpan(language, fileName, textSpan, filter) {
|
|
101
|
+
if (!fileName || !textSpan) {
|
|
102
102
|
return;
|
|
103
103
|
}
|
|
104
|
-
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
const [virtualFile, sourceScript, map] = (0, utils_1.getServiceScript)(files, fileName);
|
|
104
|
+
const [virtualFile, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
108
105
|
if (virtualFile) {
|
|
109
|
-
const
|
|
110
|
-
if (
|
|
106
|
+
const sourceSpan = transformTextSpan(sourceScript, map, textSpan, filter);
|
|
107
|
+
if (sourceSpan) {
|
|
111
108
|
return {
|
|
112
109
|
fileName,
|
|
113
|
-
textSpan:
|
|
114
|
-
start: sourceRange[0],
|
|
115
|
-
length: sourceRange[1] - sourceRange[0],
|
|
116
|
-
},
|
|
110
|
+
textSpan: sourceSpan,
|
|
117
111
|
};
|
|
118
112
|
}
|
|
119
113
|
}
|
|
@@ -125,15 +119,43 @@ function transformSpan(files, fileName, textSpan, filter) {
|
|
|
125
119
|
}
|
|
126
120
|
}
|
|
127
121
|
exports.transformSpan = transformSpan;
|
|
128
|
-
function
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
122
|
+
function transformTextChange(sourceScript, map, textChange, filter) {
|
|
123
|
+
const sourceSpan = transformTextSpan(sourceScript, map, textChange.span, filter);
|
|
124
|
+
if (sourceSpan) {
|
|
125
|
+
return {
|
|
126
|
+
newText: textChange.newText,
|
|
127
|
+
span: sourceSpan,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.transformTextChange = transformTextChange;
|
|
132
|
+
function transformTextSpan(sourceScript, map, textSpan, filter) {
|
|
133
|
+
const start = textSpan.start;
|
|
134
|
+
const end = textSpan.start + textSpan.length;
|
|
135
|
+
const sourceStart = toSourceOffset(sourceScript, map, start, filter);
|
|
136
|
+
const sourceEnd = toSourceOffset(sourceScript, map, end, filter);
|
|
137
|
+
if (sourceStart !== undefined && sourceEnd !== undefined && sourceEnd >= sourceStart) {
|
|
138
|
+
return {
|
|
139
|
+
start: sourceStart,
|
|
140
|
+
length: sourceEnd - sourceStart,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.transformTextSpan = transformTextSpan;
|
|
145
|
+
function toSourceOffset(sourceScript, map, position, filter) {
|
|
146
|
+
for (const [sourceOffset, mapping] of map.getSourceOffsets(position - sourceScript.snapshot.getLength())) {
|
|
147
|
+
if (filter(mapping.data)) {
|
|
148
|
+
return sourceOffset;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.toSourceOffset = toSourceOffset;
|
|
153
|
+
function toGeneratedOffset(sourceScript, map, position, filter) {
|
|
154
|
+
for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
155
|
+
if (filter(mapping.data)) {
|
|
156
|
+
return generateOffset + sourceScript.snapshot.getLength();
|
|
136
157
|
}
|
|
137
158
|
}
|
|
138
159
|
}
|
|
160
|
+
exports.toGeneratedOffset = toGeneratedOffset;
|
|
139
161
|
//# sourceMappingURL=transform.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volar/typescript",
|
|
3
|
-
"version": "2.2.0-alpha.
|
|
3
|
+
"version": "2.2.0-alpha.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"files": [
|
|
6
6
|
"**/*.js",
|
|
@@ -12,13 +12,13 @@
|
|
|
12
12
|
"directory": "packages/typescript"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@volar/language-core": "2.2.0-alpha.
|
|
15
|
+
"@volar/language-core": "2.2.0-alpha.1",
|
|
16
16
|
"path-browserify": "^1.0.1"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"@types/node": "latest",
|
|
20
20
|
"@types/path-browserify": "latest",
|
|
21
|
-
"@volar/language-service": "2.2.0-alpha.
|
|
21
|
+
"@volar/language-service": "2.2.0-alpha.1"
|
|
22
22
|
},
|
|
23
|
-
"gitHead": "
|
|
23
|
+
"gitHead": "e6dcb83ecadcfcc9e22083eea61e1ee817a9d483"
|
|
24
24
|
}
|