@volar/typescript 2.2.0-alpha.10 → 2.2.0-alpha.12
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/common.d.ts +2 -0
- package/lib/common.js +20 -0
- package/lib/node/decorateLanguageService.js +70 -35
- package/lib/node/proxyCreateProgram.d.ts +1 -1
- package/lib/node/proxyCreateProgram.js +7 -3
- package/lib/node/transform.d.ts +1 -0
- package/lib/node/transform.js +9 -1
- package/lib/protocol/createProject.js +6 -2
- package/lib/quickstart/createAsyncLanguageServicePlugin.d.ts +1 -1
- package/lib/quickstart/createAsyncLanguageServicePlugin.js +13 -3
- package/lib/quickstart/createLanguageServicePlugin.d.ts +1 -1
- package/lib/quickstart/createLanguageServicePlugin.js +14 -3
- package/lib/quickstart/runTsc.d.ts +1 -2
- package/lib/quickstart/runTsc.js +2 -6
- package/package.json +4 -4
- package/lib/documentRegistry.d.ts +0 -2
- package/lib/documentRegistry.js +0 -14
package/lib/common.d.ts
ADDED
package/lib/common.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.fileLanguageIdProviderPlugin = void 0;
|
|
4
|
+
exports.fileLanguageIdProviderPlugin = {
|
|
5
|
+
getLanguageId(scriptId) {
|
|
6
|
+
const ext = scriptId.split('.').pop();
|
|
7
|
+
switch (ext) {
|
|
8
|
+
case 'js': return 'javascript';
|
|
9
|
+
case 'cjs': return 'javascript';
|
|
10
|
+
case 'mjs': return 'javascript';
|
|
11
|
+
case 'ts': return 'typescript';
|
|
12
|
+
case 'cts': return 'typescript';
|
|
13
|
+
case 'mts': return 'typescript';
|
|
14
|
+
case 'jsx': return 'javascriptreact';
|
|
15
|
+
case 'tsx': return 'typescriptreact';
|
|
16
|
+
case 'json': return 'json';
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=common.js.map
|
|
@@ -5,10 +5,12 @@ const language_core_1 = require("@volar/language-core");
|
|
|
5
5
|
const dedupe_1 = require("./dedupe");
|
|
6
6
|
const utils_1 = require("./utils");
|
|
7
7
|
const transform_1 = require("./transform");
|
|
8
|
+
const windowsPathReg = /\\/g;
|
|
8
9
|
function decorateLanguageService(language, languageService) {
|
|
9
10
|
// ignored methods
|
|
10
11
|
const { getNavigationTree, getOutliningSpans, } = languageService;
|
|
11
|
-
languageService.getNavigationTree =
|
|
12
|
+
languageService.getNavigationTree = filePath => {
|
|
13
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
12
14
|
const [serviceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
13
15
|
if (serviceScript) {
|
|
14
16
|
const tree = getNavigationTree(fileName);
|
|
@@ -19,7 +21,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
19
21
|
return getNavigationTree(fileName);
|
|
20
22
|
}
|
|
21
23
|
};
|
|
22
|
-
languageService.getOutliningSpans =
|
|
24
|
+
languageService.getOutliningSpans = filePath => {
|
|
25
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
23
26
|
const [serviceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
24
27
|
if (serviceScript) {
|
|
25
28
|
return [];
|
|
@@ -30,7 +33,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
30
33
|
};
|
|
31
34
|
// methods
|
|
32
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;
|
|
33
|
-
languageService.getFormattingEditsForDocument = (
|
|
36
|
+
languageService.getFormattingEditsForDocument = (filePath, options) => {
|
|
37
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
34
38
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
35
39
|
if (serviceScript) {
|
|
36
40
|
if (!map.mappings.some(mapping => (0, language_core_1.isFormattingEnabled)(mapping.data))) {
|
|
@@ -45,7 +49,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
45
49
|
return getFormattingEditsForDocument(fileName, options);
|
|
46
50
|
}
|
|
47
51
|
};
|
|
48
|
-
languageService.getFormattingEditsForRange = (
|
|
52
|
+
languageService.getFormattingEditsForRange = (filePath, start, end, options) => {
|
|
53
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
49
54
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
50
55
|
if (serviceScript) {
|
|
51
56
|
const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isFormattingEnabled);
|
|
@@ -62,7 +67,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
62
67
|
return getFormattingEditsForRange(fileName, start, end, options);
|
|
63
68
|
}
|
|
64
69
|
};
|
|
65
|
-
languageService.getFormattingEditsAfterKeystroke = (
|
|
70
|
+
languageService.getFormattingEditsAfterKeystroke = (filePath, position, key, options) => {
|
|
71
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
66
72
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
67
73
|
if (serviceScript) {
|
|
68
74
|
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isFormattingEnabled);
|
|
@@ -84,7 +90,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
84
90
|
.map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isRenameEnabled))
|
|
85
91
|
.filter(utils_1.notEmpty);
|
|
86
92
|
};
|
|
87
|
-
languageService.getLinkedEditingRangeAtPosition = (
|
|
93
|
+
languageService.getLinkedEditingRangeAtPosition = (filePath, position) => {
|
|
94
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
88
95
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
89
96
|
if (serviceScript) {
|
|
90
97
|
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isLinkedEditingEnabled);
|
|
@@ -104,7 +111,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
104
111
|
return getLinkedEditingRangeAtPosition(fileName, position);
|
|
105
112
|
}
|
|
106
113
|
};
|
|
107
|
-
languageService.prepareCallHierarchy = (
|
|
114
|
+
languageService.prepareCallHierarchy = (filePath, position) => {
|
|
115
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
108
116
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
109
117
|
if (serviceScript) {
|
|
110
118
|
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
@@ -122,8 +130,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
122
130
|
return prepareCallHierarchy(fileName, position);
|
|
123
131
|
}
|
|
124
132
|
};
|
|
125
|
-
languageService.provideCallHierarchyIncomingCalls = (
|
|
133
|
+
languageService.provideCallHierarchyIncomingCalls = (filePath, position) => {
|
|
126
134
|
let calls = [];
|
|
135
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
127
136
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
128
137
|
if (serviceScript) {
|
|
129
138
|
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
@@ -146,8 +155,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
146
155
|
};
|
|
147
156
|
});
|
|
148
157
|
};
|
|
149
|
-
languageService.provideCallHierarchyOutgoingCalls = (
|
|
158
|
+
languageService.provideCallHierarchyOutgoingCalls = (filePath, position) => {
|
|
150
159
|
let calls = [];
|
|
160
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
151
161
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
152
162
|
if (serviceScript) {
|
|
153
163
|
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
@@ -179,7 +189,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
179
189
|
.filter(utils_1.notEmpty);
|
|
180
190
|
return resolved;
|
|
181
191
|
};
|
|
182
|
-
languageService.getQuickInfoAtPosition = (
|
|
192
|
+
languageService.getQuickInfoAtPosition = (filePath, position) => {
|
|
193
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
183
194
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
184
195
|
if (serviceScript) {
|
|
185
196
|
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isHoverEnabled);
|
|
@@ -200,7 +211,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
200
211
|
return getQuickInfoAtPosition(fileName, position);
|
|
201
212
|
}
|
|
202
213
|
};
|
|
203
|
-
languageService.getSignatureHelpItems = (
|
|
214
|
+
languageService.getSignatureHelpItems = (filePath, position, options) => {
|
|
215
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
204
216
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
205
217
|
if (serviceScript) {
|
|
206
218
|
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isSignatureHelpEnabled);
|
|
@@ -221,7 +233,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
221
233
|
return getSignatureHelpItems(fileName, position, options);
|
|
222
234
|
}
|
|
223
235
|
};
|
|
224
|
-
languageService.getDocumentHighlights = (
|
|
236
|
+
languageService.getDocumentHighlights = (filePath, position, filesToSearch) => {
|
|
237
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
225
238
|
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isHighlightEnabled, position => getDocumentHighlights(fileName, position, filesToSearch), function* (result) {
|
|
226
239
|
for (const ref of result) {
|
|
227
240
|
for (const reference of ref.highlightSpans) {
|
|
@@ -250,7 +263,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
250
263
|
});
|
|
251
264
|
return resolved;
|
|
252
265
|
};
|
|
253
|
-
languageService.getApplicableRefactors = (
|
|
266
|
+
languageService.getApplicableRefactors = (filePath, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
|
|
267
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
254
268
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
255
269
|
if (serviceScript) {
|
|
256
270
|
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
|
|
@@ -269,8 +283,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
269
283
|
return getApplicableRefactors(fileName, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions);
|
|
270
284
|
}
|
|
271
285
|
};
|
|
272
|
-
languageService.getEditsForRefactor = (
|
|
286
|
+
languageService.getEditsForRefactor = (filePath, formatOptions, positionOrRange, refactorName, actionName, preferences) => {
|
|
273
287
|
let edits;
|
|
288
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
274
289
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
275
290
|
if (serviceScript) {
|
|
276
291
|
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number'
|
|
@@ -296,12 +311,13 @@ function decorateLanguageService(language, languageService) {
|
|
|
296
311
|
return edits;
|
|
297
312
|
}
|
|
298
313
|
};
|
|
299
|
-
languageService.getRenameInfo = (
|
|
314
|
+
languageService.getRenameInfo = (filePath, position, options) => {
|
|
315
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
300
316
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
301
317
|
if (serviceScript) {
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
const info = getRenameInfo(fileName,
|
|
318
|
+
let failed;
|
|
319
|
+
for (const generateOffset of (0, transform_1.forEachGeneratedOffset)(sourceScript, map, position, language_core_1.isRenameEnabled)) {
|
|
320
|
+
const info = getRenameInfo(fileName, generateOffset, options);
|
|
305
321
|
if (info.canRename) {
|
|
306
322
|
const span = (0, transform_1.transformTextSpan)(sourceScript, map, info.triggerSpan, language_core_1.isRenameEnabled);
|
|
307
323
|
if (span) {
|
|
@@ -310,9 +326,12 @@ function decorateLanguageService(language, languageService) {
|
|
|
310
326
|
}
|
|
311
327
|
}
|
|
312
328
|
else {
|
|
313
|
-
|
|
329
|
+
failed = info;
|
|
314
330
|
}
|
|
315
331
|
}
|
|
332
|
+
if (failed) {
|
|
333
|
+
return failed;
|
|
334
|
+
}
|
|
316
335
|
return {
|
|
317
336
|
canRename: false,
|
|
318
337
|
localizedErrorMessage: 'Failed to get rename locations',
|
|
@@ -322,8 +341,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
322
341
|
return getRenameInfo(fileName, position, options);
|
|
323
342
|
}
|
|
324
343
|
};
|
|
325
|
-
languageService.getCodeFixesAtPosition = (
|
|
344
|
+
languageService.getCodeFixesAtPosition = (filePath, start, end, errorCodes, formatOptions, preferences) => {
|
|
326
345
|
let fixes = [];
|
|
346
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
327
347
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
328
348
|
if (serviceScript) {
|
|
329
349
|
const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isCodeActionsEnabled);
|
|
@@ -341,7 +361,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
341
361
|
});
|
|
342
362
|
return fixes;
|
|
343
363
|
};
|
|
344
|
-
languageService.getEncodedSemanticClassifications = (
|
|
364
|
+
languageService.getEncodedSemanticClassifications = (filePath, span, format) => {
|
|
365
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
345
366
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
346
367
|
if (serviceScript) {
|
|
347
368
|
let start;
|
|
@@ -375,22 +396,26 @@ function decorateLanguageService(language, languageService) {
|
|
|
375
396
|
return getEncodedSemanticClassifications(fileName, span, format);
|
|
376
397
|
}
|
|
377
398
|
};
|
|
378
|
-
languageService.getSyntacticDiagnostics =
|
|
399
|
+
languageService.getSyntacticDiagnostics = filePath => {
|
|
400
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
379
401
|
return getSyntacticDiagnostics(fileName)
|
|
380
402
|
.map(d => (0, transform_1.transformDiagnostic)(language, d, false))
|
|
381
403
|
.filter(utils_1.notEmpty);
|
|
382
404
|
};
|
|
383
|
-
languageService.getSemanticDiagnostics =
|
|
405
|
+
languageService.getSemanticDiagnostics = filePath => {
|
|
406
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
384
407
|
return getSemanticDiagnostics(fileName)
|
|
385
408
|
.map(d => (0, transform_1.transformDiagnostic)(language, d, false))
|
|
386
409
|
.filter(utils_1.notEmpty);
|
|
387
410
|
};
|
|
388
|
-
languageService.getSuggestionDiagnostics =
|
|
411
|
+
languageService.getSuggestionDiagnostics = filePath => {
|
|
412
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
389
413
|
return getSuggestionDiagnostics(fileName)
|
|
390
414
|
.map(d => (0, transform_1.transformDiagnostic)(language, d, false))
|
|
391
415
|
.filter(utils_1.notEmpty);
|
|
392
416
|
};
|
|
393
|
-
languageService.getDefinitionAndBoundSpan = (
|
|
417
|
+
languageService.getDefinitionAndBoundSpan = (filePath, position) => {
|
|
418
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
394
419
|
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, position => getDefinitionAndBoundSpan(fileName, position), function* (result) {
|
|
395
420
|
for (const ref of result.definitions ?? []) {
|
|
396
421
|
yield [ref.fileName, ref.textSpan.start];
|
|
@@ -413,7 +438,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
413
438
|
definitions: (0, dedupe_1.dedupeDocumentSpans)(definitions),
|
|
414
439
|
};
|
|
415
440
|
};
|
|
416
|
-
languageService.findReferences = (
|
|
441
|
+
languageService.findReferences = (filePath, position) => {
|
|
442
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
417
443
|
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, position => findReferences(fileName, position), function* (result) {
|
|
418
444
|
for (const ref of result) {
|
|
419
445
|
for (const reference of ref.references) {
|
|
@@ -434,7 +460,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
434
460
|
});
|
|
435
461
|
return resolved;
|
|
436
462
|
};
|
|
437
|
-
languageService.getDefinitionAtPosition = (
|
|
463
|
+
languageService.getDefinitionAtPosition = (filePath, position) => {
|
|
464
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
438
465
|
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, position => getDefinitionAtPosition(fileName, position), function* (result) {
|
|
439
466
|
for (const ref of result) {
|
|
440
467
|
yield [ref.fileName, ref.textSpan.start];
|
|
@@ -446,7 +473,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
446
473
|
.filter(utils_1.notEmpty);
|
|
447
474
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
448
475
|
};
|
|
449
|
-
languageService.getTypeDefinitionAtPosition = (
|
|
476
|
+
languageService.getTypeDefinitionAtPosition = (filePath, position) => {
|
|
477
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
450
478
|
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isTypeDefinitionEnabled, position => getTypeDefinitionAtPosition(fileName, position), function* (result) {
|
|
451
479
|
for (const ref of result) {
|
|
452
480
|
yield [ref.fileName, ref.textSpan.start];
|
|
@@ -458,7 +486,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
458
486
|
.filter(utils_1.notEmpty);
|
|
459
487
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
460
488
|
};
|
|
461
|
-
languageService.getImplementationAtPosition = (
|
|
489
|
+
languageService.getImplementationAtPosition = (filePath, position) => {
|
|
490
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
462
491
|
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isImplementationEnabled, position => getImplementationAtPosition(fileName, position), function* (result) {
|
|
463
492
|
for (const ref of result) {
|
|
464
493
|
yield [ref.fileName, ref.textSpan.start];
|
|
@@ -470,7 +499,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
470
499
|
.filter(utils_1.notEmpty);
|
|
471
500
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
472
501
|
};
|
|
473
|
-
languageService.findRenameLocations = (
|
|
502
|
+
languageService.findRenameLocations = (filePath, position, findInStrings, findInComments, preferences) => {
|
|
503
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
474
504
|
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isRenameEnabled, position => findRenameLocations(fileName, position, findInStrings, findInComments, preferences), function* (result) {
|
|
475
505
|
for (const ref of result) {
|
|
476
506
|
yield [ref.fileName, ref.textSpan.start];
|
|
@@ -482,7 +512,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
482
512
|
.filter(utils_1.notEmpty);
|
|
483
513
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
484
514
|
};
|
|
485
|
-
languageService.getReferencesAtPosition = (
|
|
515
|
+
languageService.getReferencesAtPosition = (filePath, position) => {
|
|
516
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
486
517
|
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, position => getReferencesAtPosition(fileName, position), function* (result) {
|
|
487
518
|
for (const ref of result) {
|
|
488
519
|
yield [ref.fileName, ref.textSpan.start];
|
|
@@ -494,7 +525,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
494
525
|
.filter(utils_1.notEmpty);
|
|
495
526
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
496
527
|
};
|
|
497
|
-
languageService.getCompletionsAtPosition = (
|
|
528
|
+
languageService.getCompletionsAtPosition = (filePath, position, options, formattingSettings) => {
|
|
529
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
498
530
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
499
531
|
if (serviceScript) {
|
|
500
532
|
let mainResult;
|
|
@@ -542,8 +574,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
542
574
|
return getCompletionsAtPosition(fileName, position, options, formattingSettings);
|
|
543
575
|
}
|
|
544
576
|
};
|
|
545
|
-
languageService.getCompletionEntryDetails = (
|
|
577
|
+
languageService.getCompletionEntryDetails = (filePath, position, entryName, formatOptions, source, preferences, data) => {
|
|
546
578
|
let details;
|
|
579
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
547
580
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
548
581
|
if (serviceScript) {
|
|
549
582
|
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCompletionEnabled);
|
|
@@ -561,7 +594,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
561
594
|
}
|
|
562
595
|
return details;
|
|
563
596
|
};
|
|
564
|
-
languageService.provideInlayHints = (
|
|
597
|
+
languageService.provideInlayHints = (filePath, span, preferences) => {
|
|
598
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
565
599
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
566
600
|
if (serviceScript) {
|
|
567
601
|
let start;
|
|
@@ -597,7 +631,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
597
631
|
return provideInlayHints(fileName, span, preferences);
|
|
598
632
|
}
|
|
599
633
|
};
|
|
600
|
-
languageService.getFileReferences =
|
|
634
|
+
languageService.getFileReferences = filePath => {
|
|
635
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
601
636
|
const unresolved = getFileReferences(fileName);
|
|
602
637
|
const resolved = unresolved
|
|
603
638
|
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { LanguagePlugin } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare function proxyCreateProgram(ts: typeof import('typescript'), original: typeof ts['createProgram'], getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin[]
|
|
3
|
+
export declare function proxyCreateProgram(ts: typeof import('typescript'), original: typeof ts['createProgram'], getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin[]): typeof import("typescript").createProgram;
|
|
@@ -4,6 +4,7 @@ exports.proxyCreateProgram = void 0;
|
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
5
|
const resolveModuleName_1 = require("../resolveModuleName");
|
|
6
6
|
const decorateProgram_1 = require("./decorateProgram");
|
|
7
|
+
const common_1 = require("../common");
|
|
7
8
|
const arrayEqual = (a, b) => {
|
|
8
9
|
if (a.length !== b.length) {
|
|
9
10
|
return false;
|
|
@@ -28,7 +29,7 @@ const objectEqual = (a, b) => {
|
|
|
28
29
|
}
|
|
29
30
|
return true;
|
|
30
31
|
};
|
|
31
|
-
function proxyCreateProgram(ts, original, getLanguagePlugins
|
|
32
|
+
function proxyCreateProgram(ts, original, getLanguagePlugins) {
|
|
32
33
|
const sourceFileSnapshots = new Map();
|
|
33
34
|
const parsedSourceFiles = new WeakMap();
|
|
34
35
|
let lastOptions;
|
|
@@ -47,7 +48,10 @@ function proxyCreateProgram(ts, original, getLanguagePlugins, getLanguageId) {
|
|
|
47
48
|
moduleResolutionCache = ts.createModuleResolutionCache(options.host.getCurrentDirectory(), options.host.getCanonicalFileName, options.options);
|
|
48
49
|
lastOptions = options;
|
|
49
50
|
languagePlugins = getLanguagePlugins(ts, options);
|
|
50
|
-
language = (0, language_core_1.createLanguage)(
|
|
51
|
+
language = (0, language_core_1.createLanguage)([
|
|
52
|
+
...languagePlugins,
|
|
53
|
+
common_1.fileLanguageIdProviderPlugin,
|
|
54
|
+
], ts.sys.useCaseSensitiveFileNames, fileName => {
|
|
51
55
|
if (!sourceFileSnapshots.has(fileName)) {
|
|
52
56
|
const sourceFileText = originalHost.readFile(fileName);
|
|
53
57
|
if (sourceFileText !== undefined) {
|
|
@@ -69,7 +73,7 @@ function proxyCreateProgram(ts, original, getLanguagePlugins, getLanguageId) {
|
|
|
69
73
|
}
|
|
70
74
|
const snapshot = sourceFileSnapshots.get(fileName)?.[1];
|
|
71
75
|
if (snapshot) {
|
|
72
|
-
language.scripts.set(fileName,
|
|
76
|
+
language.scripts.set(fileName, snapshot);
|
|
73
77
|
}
|
|
74
78
|
else {
|
|
75
79
|
language.scripts.delete(fileName);
|
package/lib/node/transform.d.ts
CHANGED
|
@@ -13,3 +13,4 @@ export declare function transformTextChange(sourceScript: SourceScript, map: Sou
|
|
|
13
13
|
export declare function transformTextSpan(sourceScript: SourceScript, map: SourceMap<CodeInformation>, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): ts.TextSpan | undefined;
|
|
14
14
|
export declare function toSourceOffset(sourceScript: SourceScript, map: SourceMap, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
|
|
15
15
|
export declare function toGeneratedOffset(sourceScript: SourceScript, map: SourceMap, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
|
|
16
|
+
export declare function forEachGeneratedOffset(sourceScript: SourceScript, map: SourceMap, position: number, filter: (data: CodeInformation) => boolean): Generator<number, void, unknown>;
|
package/lib/node/transform.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.toGeneratedOffset = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.fillSourceFileText = exports.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
|
|
3
|
+
exports.forEachGeneratedOffset = exports.toGeneratedOffset = 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
6
|
const transformedDiagnostics = new WeakMap();
|
|
@@ -172,4 +172,12 @@ function toGeneratedOffset(sourceScript, map, position, filter) {
|
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
exports.toGeneratedOffset = toGeneratedOffset;
|
|
175
|
+
function* forEachGeneratedOffset(sourceScript, map, position, filter) {
|
|
176
|
+
for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
177
|
+
if (filter(mapping.data)) {
|
|
178
|
+
yield generateOffset + sourceScript.snapshot.getLength();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
exports.forEachGeneratedOffset = forEachGeneratedOffset;
|
|
175
183
|
//# sourceMappingURL=transform.js.map
|
|
@@ -5,10 +5,14 @@ const language_core_1 = require("@volar/language-core");
|
|
|
5
5
|
const language_core_2 = require("@volar/language-core");
|
|
6
6
|
const path = require("path-browserify");
|
|
7
7
|
const resolveModuleName_1 = require("../resolveModuleName");
|
|
8
|
+
const common_1 = require("../common");
|
|
8
9
|
const scriptVersions = new Map();
|
|
9
10
|
const fsFileSnapshots = new Map();
|
|
10
11
|
function createTypeScriptLanguage(ts, languagePlugins, projectHost) {
|
|
11
|
-
const language = (0, language_core_1.createLanguage)(
|
|
12
|
+
const language = (0, language_core_1.createLanguage)([
|
|
13
|
+
...languagePlugins,
|
|
14
|
+
common_1.fileLanguageIdProviderPlugin,
|
|
15
|
+
], projectHost.useCaseSensitiveFileNames, scriptId => {
|
|
12
16
|
const fileName = projectHost.scriptIdToFileName(scriptId);
|
|
13
17
|
// opened files
|
|
14
18
|
let snapshot = projectHost.getScriptSnapshot(fileName);
|
|
@@ -29,7 +33,7 @@ function createTypeScriptLanguage(ts, languagePlugins, projectHost) {
|
|
|
29
33
|
snapshot = fsFileSnapshots.get(fileName)?.[1];
|
|
30
34
|
}
|
|
31
35
|
if (snapshot) {
|
|
32
|
-
language.scripts.set(scriptId,
|
|
36
|
+
language.scripts.set(scriptId, snapshot);
|
|
33
37
|
}
|
|
34
38
|
else {
|
|
35
39
|
language.scripts.delete(scriptId);
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type * as ts from 'typescript';
|
|
2
2
|
import { LanguagePlugin } from '@volar/language-core';
|
|
3
|
-
export declare function createAsyncLanguageServicePlugin(extensions: string[], scriptKind: ts.ScriptKind, loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => Promise<LanguagePlugin[]
|
|
3
|
+
export declare function createAsyncLanguageServicePlugin(extensions: string[], scriptKind: ts.ScriptKind, loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => Promise<LanguagePlugin[]>): ts.server.PluginModuleFactory;
|
|
@@ -5,10 +5,11 @@ const decorateLanguageService_1 = require("../node/decorateLanguageService");
|
|
|
5
5
|
const decorateLanguageServiceHost_1 = require("../node/decorateLanguageServiceHost");
|
|
6
6
|
const language_core_1 = require("@volar/language-core");
|
|
7
7
|
const createLanguageServicePlugin_1 = require("./createLanguageServicePlugin");
|
|
8
|
+
const common_1 = require("../common");
|
|
8
9
|
const externalFiles = new WeakMap();
|
|
9
10
|
const decoratedLanguageServices = new WeakSet();
|
|
10
11
|
const decoratedLanguageServiceHosts = new WeakSet();
|
|
11
|
-
function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePlugins
|
|
12
|
+
function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePlugins) {
|
|
12
13
|
return modules => {
|
|
13
14
|
const { typescript: ts } = modules;
|
|
14
15
|
const pluginModule = {
|
|
@@ -52,10 +53,19 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
|
|
|
52
53
|
};
|
|
53
54
|
}
|
|
54
55
|
loadLanguagePlugins(ts, info).then(languagePlugins => {
|
|
55
|
-
const
|
|
56
|
+
const syncedScriptVersions = new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames);
|
|
57
|
+
const language = (0, language_core_1.createLanguage)([
|
|
58
|
+
...languagePlugins,
|
|
59
|
+
common_1.fileLanguageIdProviderPlugin,
|
|
60
|
+
], ts.sys.useCaseSensitiveFileNames, fileName => {
|
|
61
|
+
const version = getScriptVersion(fileName);
|
|
62
|
+
if (syncedScriptVersions.get(fileName) === version) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
syncedScriptVersions.set(fileName, version);
|
|
56
66
|
const snapshot = getScriptSnapshot(fileName);
|
|
57
67
|
if (snapshot) {
|
|
58
|
-
language.scripts.set(fileName,
|
|
68
|
+
language.scripts.set(fileName, snapshot);
|
|
59
69
|
}
|
|
60
70
|
else {
|
|
61
71
|
language.scripts.delete(fileName);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type * as ts from 'typescript';
|
|
2
2
|
import { LanguagePlugin } from '@volar/language-core';
|
|
3
|
-
export declare function createLanguageServicePlugin(loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => LanguagePlugin[]
|
|
3
|
+
export declare function createLanguageServicePlugin(loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => LanguagePlugin[]): ts.server.PluginModuleFactory;
|
|
4
4
|
export declare function arrayItemsEqual(a: string[], b: string[]): boolean;
|
|
@@ -4,11 +4,12 @@ exports.arrayItemsEqual = exports.createLanguageServicePlugin = void 0;
|
|
|
4
4
|
const decorateLanguageService_1 = require("../node/decorateLanguageService");
|
|
5
5
|
const decorateLanguageServiceHost_1 = require("../node/decorateLanguageServiceHost");
|
|
6
6
|
const language_core_1 = require("@volar/language-core");
|
|
7
|
+
const common_1 = require("../common");
|
|
7
8
|
const externalFiles = new WeakMap();
|
|
8
9
|
const projectExternalFileExtensions = new WeakMap();
|
|
9
10
|
const decoratedLanguageServices = new WeakSet();
|
|
10
11
|
const decoratedLanguageServiceHosts = new WeakSet();
|
|
11
|
-
function createLanguageServicePlugin(loadLanguagePlugins
|
|
12
|
+
function createLanguageServicePlugin(loadLanguagePlugins) {
|
|
12
13
|
return modules => {
|
|
13
14
|
const { typescript: ts } = modules;
|
|
14
15
|
const pluginModule = {
|
|
@@ -23,10 +24,20 @@ function createLanguageServicePlugin(loadLanguagePlugins, getLanguageId) {
|
|
|
23
24
|
.flat();
|
|
24
25
|
projectExternalFileExtensions.set(info.project, extensions);
|
|
25
26
|
const getScriptSnapshot = info.languageServiceHost.getScriptSnapshot.bind(info.languageServiceHost);
|
|
26
|
-
const
|
|
27
|
+
const getScriptVersion = info.languageServiceHost.getScriptVersion.bind(info.languageServiceHost);
|
|
28
|
+
const syncedScriptVersions = new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames);
|
|
29
|
+
const language = (0, language_core_1.createLanguage)([
|
|
30
|
+
...languagePlugins,
|
|
31
|
+
common_1.fileLanguageIdProviderPlugin,
|
|
32
|
+
], ts.sys.useCaseSensitiveFileNames, fileName => {
|
|
33
|
+
const version = getScriptVersion(fileName);
|
|
34
|
+
if (syncedScriptVersions.get(fileName) === version) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
syncedScriptVersions.set(fileName, version);
|
|
27
38
|
const snapshot = getScriptSnapshot(fileName);
|
|
28
39
|
if (snapshot) {
|
|
29
|
-
language.scripts.set(fileName,
|
|
40
|
+
language.scripts.set(fileName, snapshot);
|
|
30
41
|
}
|
|
31
42
|
else {
|
|
32
43
|
language.scripts.delete(fileName);
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type * as ts from 'typescript';
|
|
2
2
|
import type { LanguagePlugin } from '@volar/language-core';
|
|
3
3
|
export declare let getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin[];
|
|
4
|
-
export declare
|
|
5
|
-
export declare function runTsc(tscPath: string, extensions: string[], _getLanguagePlugins: typeof getLanguagePlugins, _getLanguageId: typeof getLanguageId): void;
|
|
4
|
+
export declare function runTsc(tscPath: string, extensions: string[], _getLanguagePlugins: typeof getLanguagePlugins): void;
|
package/lib/quickstart/runTsc.js
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.runTsc = exports.
|
|
3
|
+
exports.runTsc = exports.getLanguagePlugins = void 0;
|
|
4
4
|
const fs = require("fs");
|
|
5
5
|
let getLanguagePlugins = () => [];
|
|
6
6
|
exports.getLanguagePlugins = getLanguagePlugins;
|
|
7
|
-
|
|
8
|
-
exports.getLanguageId = getLanguageId;
|
|
9
|
-
function runTsc(tscPath, extensions, _getLanguagePlugins, _getLanguageId) {
|
|
7
|
+
function runTsc(tscPath, extensions, _getLanguagePlugins) {
|
|
10
8
|
exports.getLanguagePlugins = _getLanguagePlugins;
|
|
11
|
-
exports.getLanguageId = _getLanguageId;
|
|
12
9
|
const proxyApiPath = require.resolve('../node/proxyCreateProgram');
|
|
13
10
|
const readFileSync = fs.readFileSync;
|
|
14
11
|
fs.readFileSync = (...args) => {
|
|
@@ -25,7 +22,6 @@ function runTsc(tscPath, extensions, _getLanguagePlugins, _getLanguageId) {
|
|
|
25
22
|
`new Proxy({}, { get(_target, p, _receiver) { return eval(p); } } )`,
|
|
26
23
|
`_createProgram`,
|
|
27
24
|
`require(${JSON.stringify(__filename)}).getLanguagePlugins`,
|
|
28
|
-
`require(${JSON.stringify(__filename)}).getLanguageId`,
|
|
29
25
|
].join(', ')
|
|
30
26
|
+ `);\n`
|
|
31
27
|
+ s.replace('createProgram', '_createProgram'));
|
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.12",
|
|
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.12",
|
|
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.12"
|
|
22
22
|
},
|
|
23
|
-
"gitHead": "
|
|
23
|
+
"gitHead": "bf61f7a5a4a51669621e951f32ddf102f03a333d"
|
|
24
24
|
}
|
package/lib/documentRegistry.js
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
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
|