@volar/typescript 2.2.0-alpha.0 → 2.2.0-alpha.10
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/documentRegistry.d.ts +2 -0
- package/lib/documentRegistry.js +14 -0
- package/lib/node/decorateLanguageService.js +216 -139
- package/lib/node/decorateLanguageServiceHost.d.ts +2 -2
- package/lib/node/decorateLanguageServiceHost.js +55 -60
- package/lib/node/decorateProgram.js +14 -5
- package/lib/node/dedupe.d.ts +0 -1
- package/lib/node/dedupe.js +1 -9
- package/lib/node/proxyCreateProgram.d.ts +2 -2
- package/lib/node/proxyCreateProgram.js +138 -94
- package/lib/node/transform.d.ts +11 -6
- package/lib/node/transform.js +83 -47
- package/lib/protocol/createProject.js +1 -1
- package/lib/quickstart/createAsyncLanguageServicePlugin.d.ts +1 -1
- package/lib/quickstart/createAsyncLanguageServicePlugin.js +3 -3
- package/lib/quickstart/createLanguageServicePlugin.d.ts +1 -1
- package/lib/quickstart/createLanguageServicePlugin.js +3 -3
- package/lib/quickstart/runTsc.d.ts +2 -1
- package/lib/quickstart/runTsc.js +11 -6
- package/lib/resolveModuleName.d.ts +1 -1
- package/lib/resolveModuleName.js +41 -24
- package/package.json +4 -4
|
@@ -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, getSignatureHelpItems, 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
|
}
|
|
@@ -128,6 +200,27 @@ function decorateLanguageService(language, languageService) {
|
|
|
128
200
|
return getQuickInfoAtPosition(fileName, position);
|
|
129
201
|
}
|
|
130
202
|
};
|
|
203
|
+
languageService.getSignatureHelpItems = (fileName, position, options) => {
|
|
204
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
205
|
+
if (serviceScript) {
|
|
206
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isSignatureHelpEnabled);
|
|
207
|
+
if (generatePosition !== undefined) {
|
|
208
|
+
const result = getSignatureHelpItems(fileName, generatePosition, options);
|
|
209
|
+
if (result) {
|
|
210
|
+
const applicableSpan = (0, transform_1.transformTextSpan)(sourceScript, map, result.applicableSpan, language_core_1.isSignatureHelpEnabled);
|
|
211
|
+
if (applicableSpan) {
|
|
212
|
+
return {
|
|
213
|
+
...result,
|
|
214
|
+
applicableSpan,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
return getSignatureHelpItems(fileName, position, options);
|
|
222
|
+
}
|
|
223
|
+
};
|
|
131
224
|
languageService.getDocumentHighlights = (fileName, position, filesToSearch) => {
|
|
132
225
|
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isHighlightEnabled, position => getDocumentHighlights(fileName, position, filesToSearch), function* (result) {
|
|
133
226
|
for (const ref of result) {
|
|
@@ -160,16 +253,15 @@ function decorateLanguageService(language, languageService) {
|
|
|
160
253
|
languageService.getApplicableRefactors = (fileName, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
|
|
161
254
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
162
255
|
if (serviceScript) {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
}
|
|
256
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
|
|
257
|
+
if (generatePosition !== undefined) {
|
|
258
|
+
const por = typeof positionOrRange === 'number'
|
|
259
|
+
? generatePosition
|
|
260
|
+
: {
|
|
261
|
+
pos: generatePosition,
|
|
262
|
+
end: generatePosition + positionOrRange.end - positionOrRange.pos,
|
|
263
|
+
};
|
|
264
|
+
return getApplicableRefactors(fileName, por, preferences, triggerReason, kind, includeInteractiveActions);
|
|
173
265
|
}
|
|
174
266
|
return [];
|
|
175
267
|
}
|
|
@@ -181,16 +273,17 @@ function decorateLanguageService(language, languageService) {
|
|
|
181
273
|
let edits;
|
|
182
274
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
183
275
|
if (serviceScript) {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
276
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number'
|
|
277
|
+
? positionOrRange
|
|
278
|
+
: positionOrRange.pos, language_core_1.isCodeActionsEnabled);
|
|
279
|
+
if (generatePosition !== undefined) {
|
|
280
|
+
const por = typeof positionOrRange === 'number'
|
|
281
|
+
? generatePosition
|
|
282
|
+
: {
|
|
283
|
+
pos: generatePosition,
|
|
284
|
+
end: generatePosition + positionOrRange.end - positionOrRange.pos,
|
|
285
|
+
};
|
|
286
|
+
edits = getEditsForRefactor(fileName, formatOptions, por, refactorName, actionName, preferences);
|
|
194
287
|
}
|
|
195
288
|
}
|
|
196
289
|
else {
|
|
@@ -206,20 +299,19 @@ function decorateLanguageService(language, languageService) {
|
|
|
206
299
|
languageService.getRenameInfo = (fileName, position, options) => {
|
|
207
300
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
208
301
|
if (serviceScript) {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
return info;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
302
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isRenameEnabled);
|
|
303
|
+
if (generatePosition !== undefined) {
|
|
304
|
+
const info = getRenameInfo(fileName, generatePosition, options);
|
|
305
|
+
if (info.canRename) {
|
|
306
|
+
const span = (0, transform_1.transformTextSpan)(sourceScript, map, info.triggerSpan, language_core_1.isRenameEnabled);
|
|
307
|
+
if (span) {
|
|
308
|
+
info.triggerSpan = span;
|
|
220
309
|
return info;
|
|
221
310
|
}
|
|
222
311
|
}
|
|
312
|
+
else {
|
|
313
|
+
return info;
|
|
314
|
+
}
|
|
223
315
|
}
|
|
224
316
|
return {
|
|
225
317
|
canRename: false,
|
|
@@ -234,16 +326,10 @@ function decorateLanguageService(language, languageService) {
|
|
|
234
326
|
let fixes = [];
|
|
235
327
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
236
328
|
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
|
-
}
|
|
329
|
+
const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isCodeActionsEnabled);
|
|
330
|
+
const generateEnd = (0, transform_1.toGeneratedOffset)(sourceScript, map, end, language_core_1.isCodeActionsEnabled);
|
|
331
|
+
if (generateStart !== undefined && generateEnd !== undefined) {
|
|
332
|
+
fixes = getCodeFixesAtPosition(fileName, generateStart, generateEnd, errorCodes, formatOptions, preferences);
|
|
247
333
|
}
|
|
248
334
|
}
|
|
249
335
|
else {
|
|
@@ -261,32 +347,25 @@ function decorateLanguageService(language, languageService) {
|
|
|
261
347
|
let start;
|
|
262
348
|
let end;
|
|
263
349
|
for (const mapping of map.mappings) {
|
|
350
|
+
// TODO reuse the logic from language service
|
|
264
351
|
if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
|
|
265
352
|
start ??= mapping.generatedOffsets[0];
|
|
266
|
-
end ??= mapping.generatedOffsets[mapping.generatedOffsets.length - 1];
|
|
353
|
+
end ??= mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + mapping.lengths[mapping.lengths.length - 1];
|
|
267
354
|
start = Math.min(start, mapping.generatedOffsets[0]);
|
|
268
|
-
end = Math.max(end, mapping.generatedOffsets[mapping.generatedOffsets.length - 1]);
|
|
355
|
+
end = Math.max(end, mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + mapping.lengths[mapping.lengths.length - 1]);
|
|
269
356
|
}
|
|
270
357
|
}
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
end = 0;
|
|
274
|
-
}
|
|
358
|
+
start ??= 0;
|
|
359
|
+
end ??= sourceScript.snapshot.getLength();
|
|
275
360
|
start += sourceScript.snapshot.getLength();
|
|
276
361
|
end += sourceScript.snapshot.getLength();
|
|
277
362
|
const result = getEncodedSemanticClassifications(fileName, { start, length: end - start }, format);
|
|
278
363
|
const spans = [];
|
|
279
364
|
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
|
-
}
|
|
365
|
+
const sourceStart = (0, transform_1.toSourceOffset)(sourceScript, map, result.spans[i], language_core_1.isSemanticTokensEnabled);
|
|
366
|
+
const sourceEnd = (0, transform_1.toSourceOffset)(sourceScript, map, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled);
|
|
367
|
+
if (sourceStart !== undefined && sourceEnd !== undefined) {
|
|
368
|
+
spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
|
|
290
369
|
}
|
|
291
370
|
}
|
|
292
371
|
result.spans = spans;
|
|
@@ -298,17 +377,17 @@ function decorateLanguageService(language, languageService) {
|
|
|
298
377
|
};
|
|
299
378
|
languageService.getSyntacticDiagnostics = fileName => {
|
|
300
379
|
return getSyntacticDiagnostics(fileName)
|
|
301
|
-
.map(d => (0, transform_1.transformDiagnostic)(language, d))
|
|
380
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, false))
|
|
302
381
|
.filter(utils_1.notEmpty);
|
|
303
382
|
};
|
|
304
383
|
languageService.getSemanticDiagnostics = fileName => {
|
|
305
384
|
return getSemanticDiagnostics(fileName)
|
|
306
|
-
.map(d => (0, transform_1.transformDiagnostic)(language, d))
|
|
385
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, false))
|
|
307
386
|
.filter(utils_1.notEmpty);
|
|
308
387
|
};
|
|
309
388
|
languageService.getSuggestionDiagnostics = fileName => {
|
|
310
389
|
return getSuggestionDiagnostics(fileName)
|
|
311
|
-
.map(d => (0, transform_1.transformDiagnostic)(language, d))
|
|
390
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, false))
|
|
312
391
|
.filter(utils_1.notEmpty);
|
|
313
392
|
};
|
|
314
393
|
languageService.getDefinitionAndBoundSpan = (fileName, position) => {
|
|
@@ -345,18 +424,15 @@ function decorateLanguageService(language, languageService) {
|
|
|
345
424
|
const resolved = unresolved
|
|
346
425
|
.flat()
|
|
347
426
|
.map(symbol => {
|
|
348
|
-
const definition = (0, transform_1.transformDocumentSpan)(language, symbol.definition, language_core_1.isDefinitionEnabled);
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
})
|
|
358
|
-
.filter(utils_1.notEmpty);
|
|
359
|
-
return (0, dedupe_1.dedupeReferencedSymbols)(resolved);
|
|
427
|
+
const definition = (0, transform_1.transformDocumentSpan)(language, symbol.definition, language_core_1.isDefinitionEnabled, true);
|
|
428
|
+
return {
|
|
429
|
+
definition,
|
|
430
|
+
references: symbol.references
|
|
431
|
+
.map(r => (0, transform_1.transformDocumentSpan)(language, r, language_core_1.isReferencesEnabled))
|
|
432
|
+
.filter(utils_1.notEmpty),
|
|
433
|
+
};
|
|
434
|
+
});
|
|
435
|
+
return resolved;
|
|
360
436
|
};
|
|
361
437
|
languageService.getDefinitionAtPosition = (fileName, position) => {
|
|
362
438
|
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, position => getDefinitionAtPosition(fileName, position), function* (result) {
|
|
@@ -423,24 +499,29 @@ function decorateLanguageService(language, languageService) {
|
|
|
423
499
|
if (serviceScript) {
|
|
424
500
|
let mainResult;
|
|
425
501
|
let additionalResults = [];
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
502
|
+
let isAdditional;
|
|
503
|
+
const generatedOffset = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, data => {
|
|
504
|
+
if (!(0, language_core_1.isCompletionEnabled)(data)) {
|
|
505
|
+
return false;
|
|
506
|
+
}
|
|
507
|
+
isAdditional = typeof data.completion === 'object' && data.completion.isAdditional;
|
|
508
|
+
if (!isAdditional && mainResult) {
|
|
509
|
+
return false;
|
|
510
|
+
}
|
|
511
|
+
return true;
|
|
512
|
+
});
|
|
513
|
+
if (generatedOffset !== undefined) {
|
|
514
|
+
const result = getCompletionsAtPosition(fileName, generatedOffset, options, formattingSettings);
|
|
515
|
+
if (result) {
|
|
516
|
+
for (const entry of result.entries) {
|
|
517
|
+
entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(sourceScript, map, entry.replacementSpan, language_core_1.isCompletionEnabled);
|
|
518
|
+
}
|
|
519
|
+
result.optionalReplacementSpan = result.optionalReplacementSpan && (0, transform_1.transformTextSpan)(sourceScript, map, result.optionalReplacementSpan, language_core_1.isCompletionEnabled);
|
|
520
|
+
if (isAdditional) {
|
|
521
|
+
additionalResults.push(result);
|
|
431
522
|
}
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
for (const entry of result.entries) {
|
|
435
|
-
entry.replacementSpan = (0, transform_1.transformSpan)(language, fileName, entry.replacementSpan, language_core_1.isCompletionEnabled)?.textSpan;
|
|
436
|
-
}
|
|
437
|
-
result.optionalReplacementSpan = (0, transform_1.transformSpan)(language, fileName, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.textSpan;
|
|
438
|
-
if (isAdditional) {
|
|
439
|
-
additionalResults.push(result);
|
|
440
|
-
}
|
|
441
|
-
else {
|
|
442
|
-
mainResult = result;
|
|
443
|
-
}
|
|
523
|
+
else {
|
|
524
|
+
mainResult = result;
|
|
444
525
|
}
|
|
445
526
|
}
|
|
446
527
|
}
|
|
@@ -465,11 +546,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
465
546
|
let details;
|
|
466
547
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
467
548
|
if (serviceScript) {
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
break;
|
|
472
|
-
}
|
|
549
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCompletionEnabled);
|
|
550
|
+
if (generatePosition !== undefined) {
|
|
551
|
+
details = getCompletionEntryDetails(fileName, generatePosition, entryName, formatOptions, source, preferences, data);
|
|
473
552
|
}
|
|
474
553
|
}
|
|
475
554
|
else {
|
|
@@ -504,14 +583,12 @@ function decorateLanguageService(language, languageService) {
|
|
|
504
583
|
const result = provideInlayHints(fileName, { start, length: end - start }, preferences);
|
|
505
584
|
const hints = [];
|
|
506
585
|
for (const hint of result) {
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
break;
|
|
514
|
-
}
|
|
586
|
+
const sourcePosition = (0, transform_1.toSourceOffset)(sourceScript, map, hint.position, language_core_1.isInlayHintsEnabled);
|
|
587
|
+
if (sourcePosition !== undefined) {
|
|
588
|
+
hints.push({
|
|
589
|
+
...hint,
|
|
590
|
+
position: sourcePosition,
|
|
591
|
+
});
|
|
515
592
|
}
|
|
516
593
|
}
|
|
517
594
|
return hints;
|
|
@@ -528,13 +605,13 @@ function decorateLanguageService(language, languageService) {
|
|
|
528
605
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
529
606
|
};
|
|
530
607
|
function linkedCodeFeatureWorker(fileName, position, filter, worker, getLinkedCodes) {
|
|
531
|
-
|
|
608
|
+
const results = [];
|
|
532
609
|
const processedFilePositions = new Set();
|
|
533
610
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
534
611
|
if (serviceScript) {
|
|
535
|
-
for (const [
|
|
612
|
+
for (const [generatedOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
536
613
|
if (filter(mapping.data)) {
|
|
537
|
-
process(fileName,
|
|
614
|
+
process(fileName, generatedOffset + sourceScript.snapshot.getLength());
|
|
538
615
|
}
|
|
539
616
|
}
|
|
540
617
|
}
|
|
@@ -551,14 +628,14 @@ function decorateLanguageService(language, languageService) {
|
|
|
551
628
|
if (!result) {
|
|
552
629
|
return;
|
|
553
630
|
}
|
|
554
|
-
results
|
|
631
|
+
results.push(result);
|
|
555
632
|
for (const ref of getLinkedCodes(result)) {
|
|
556
633
|
processedFilePositions.add(ref[0] + ':' + ref[1]);
|
|
557
|
-
const [
|
|
558
|
-
if (!
|
|
634
|
+
const [virtualFile, sourceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
|
|
635
|
+
if (!virtualFile) {
|
|
559
636
|
continue;
|
|
560
637
|
}
|
|
561
|
-
const linkedCodeMap = language.linkedCodeMaps.get(
|
|
638
|
+
const linkedCodeMap = language.linkedCodeMaps.get(virtualFile.code);
|
|
562
639
|
if (!linkedCodeMap) {
|
|
563
640
|
continue;
|
|
564
641
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Language } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare function decorateLanguageServiceHost(language: Language, languageServiceHost: ts.LanguageServiceHost
|
|
3
|
+
export declare function decorateLanguageServiceHost(ts: typeof import('typescript'), language: Language, languageServiceHost: ts.LanguageServiceHost): void;
|
|
4
4
|
export declare function searchExternalFiles(ts: typeof import('typescript'), project: ts.server.Project, exts: string[]): string[];
|