@volar/typescript 2.3.0-alpha.12 → 2.3.0-alpha.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/node/decorateLanguageService.js +37 -34
- package/lib/node/decorateProgram.js +14 -11
- package/lib/node/transform.d.ts +1 -1
- package/lib/node/transform.js +3 -3
- package/lib/quickstart/createAsyncLanguageServicePlugin.d.ts +5 -2
- package/lib/quickstart/createAsyncLanguageServicePlugin.js +11 -13
- package/lib/quickstart/createLanguageServicePlugin.d.ts +9 -2
- package/lib/quickstart/createLanguageServicePlugin.js +18 -17
- package/package.json +4 -4
|
@@ -60,8 +60,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
60
60
|
return [];
|
|
61
61
|
}
|
|
62
62
|
if (serviceScript) {
|
|
63
|
-
const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript,
|
|
64
|
-
const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript,
|
|
63
|
+
const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, start, language_core_1.isFormattingEnabled);
|
|
64
|
+
const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, end, language_core_1.isFormattingEnabled);
|
|
65
65
|
if (generateStart !== undefined && generateEnd !== undefined) {
|
|
66
66
|
const edits = getFormattingEditsForRange(targetScript.id, generateStart, generateEnd, options);
|
|
67
67
|
return edits
|
|
@@ -81,7 +81,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
81
81
|
return [];
|
|
82
82
|
}
|
|
83
83
|
if (serviceScript) {
|
|
84
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript,
|
|
84
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isFormattingEnabled);
|
|
85
85
|
if (generatePosition !== undefined) {
|
|
86
86
|
const edits = getFormattingEditsAfterKeystroke(targetScript.id, generatePosition, key, options);
|
|
87
87
|
return edits
|
|
@@ -105,7 +105,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
105
105
|
return undefined;
|
|
106
106
|
}
|
|
107
107
|
if (serviceScript) {
|
|
108
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript,
|
|
108
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isLinkedEditingEnabled);
|
|
109
109
|
if (generatePosition !== undefined) {
|
|
110
110
|
const info = getLinkedEditingRangeAtPosition(targetScript.id, generatePosition);
|
|
111
111
|
if (info) {
|
|
@@ -124,12 +124,12 @@ function decorateLanguageService(language, languageService) {
|
|
|
124
124
|
};
|
|
125
125
|
languageService.prepareCallHierarchy = (filePath, position) => {
|
|
126
126
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
127
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
127
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
128
128
|
if (targetScript?.associatedOnly) {
|
|
129
129
|
return undefined;
|
|
130
130
|
}
|
|
131
131
|
if (serviceScript) {
|
|
132
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript,
|
|
132
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
|
|
133
133
|
if (generatePosition !== undefined) {
|
|
134
134
|
const item = prepareCallHierarchy(targetScript.id, generatePosition);
|
|
135
135
|
if (Array.isArray(item)) {
|
|
@@ -147,12 +147,12 @@ function decorateLanguageService(language, languageService) {
|
|
|
147
147
|
languageService.provideCallHierarchyIncomingCalls = (filePath, position) => {
|
|
148
148
|
let calls = [];
|
|
149
149
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
150
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
150
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
151
151
|
if (targetScript?.associatedOnly) {
|
|
152
152
|
return [];
|
|
153
153
|
}
|
|
154
154
|
if (serviceScript) {
|
|
155
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript,
|
|
155
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
|
|
156
156
|
if (generatePosition !== undefined) {
|
|
157
157
|
calls = provideCallHierarchyIncomingCalls(targetScript.id, generatePosition);
|
|
158
158
|
}
|
|
@@ -180,9 +180,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
180
180
|
return [];
|
|
181
181
|
}
|
|
182
182
|
if (serviceScript) {
|
|
183
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript,
|
|
183
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
|
|
184
184
|
if (generatePosition !== undefined) {
|
|
185
|
-
calls = provideCallHierarchyOutgoingCalls(
|
|
185
|
+
calls = provideCallHierarchyOutgoingCalls(targetScript.id, generatePosition);
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
188
|
else {
|
|
@@ -214,7 +214,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
214
214
|
}
|
|
215
215
|
if (serviceScript) {
|
|
216
216
|
const infos = [];
|
|
217
|
-
for (const [generatePosition] of (0, transform_1.toGeneratedOffsets)(language, serviceScript,
|
|
217
|
+
for (const [generatePosition] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isHoverEnabled)) {
|
|
218
218
|
const info = getQuickInfoAtPosition(targetScript.id, generatePosition);
|
|
219
219
|
if (info) {
|
|
220
220
|
const textSpan = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.textSpan, language_core_1.isHoverEnabled)?.[1];
|
|
@@ -276,7 +276,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
276
276
|
return undefined;
|
|
277
277
|
}
|
|
278
278
|
if (serviceScript) {
|
|
279
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript,
|
|
279
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isSignatureHelpEnabled);
|
|
280
280
|
if (generatePosition !== undefined) {
|
|
281
281
|
const result = getSignatureHelpItems(targetScript.id, generatePosition, options);
|
|
282
282
|
if (result) {
|
|
@@ -326,12 +326,12 @@ function decorateLanguageService(language, languageService) {
|
|
|
326
326
|
};
|
|
327
327
|
languageService.getApplicableRefactors = (filePath, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
|
|
328
328
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
329
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
329
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
330
330
|
if (targetScript?.associatedOnly) {
|
|
331
331
|
return [];
|
|
332
332
|
}
|
|
333
333
|
if (serviceScript) {
|
|
334
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript,
|
|
334
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
|
|
335
335
|
if (generatePosition !== undefined) {
|
|
336
336
|
const por = typeof positionOrRange === 'number'
|
|
337
337
|
? generatePosition
|
|
@@ -350,12 +350,12 @@ function decorateLanguageService(language, languageService) {
|
|
|
350
350
|
languageService.getEditsForRefactor = (filePath, formatOptions, positionOrRange, refactorName, actionName, preferences) => {
|
|
351
351
|
let edits;
|
|
352
352
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
353
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
353
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
354
354
|
if (targetScript?.associatedOnly) {
|
|
355
355
|
return undefined;
|
|
356
356
|
}
|
|
357
357
|
if (serviceScript) {
|
|
358
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript,
|
|
358
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, typeof positionOrRange === 'number'
|
|
359
359
|
? positionOrRange
|
|
360
360
|
: positionOrRange.pos, language_core_1.isCodeActionsEnabled);
|
|
361
361
|
if (generatePosition !== undefined) {
|
|
@@ -387,7 +387,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
387
387
|
}
|
|
388
388
|
if (serviceScript) {
|
|
389
389
|
let failed;
|
|
390
|
-
for (const [generateOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript,
|
|
390
|
+
for (const [generateOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isRenameEnabled)) {
|
|
391
391
|
const info = getRenameInfo(targetScript.id, generateOffset, options);
|
|
392
392
|
if (info.canRename) {
|
|
393
393
|
const span = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.triggerSpan, language_core_1.isRenameEnabled)?.[1];
|
|
@@ -415,13 +415,13 @@ function decorateLanguageService(language, languageService) {
|
|
|
415
415
|
languageService.getCodeFixesAtPosition = (filePath, start, end, errorCodes, formatOptions, preferences) => {
|
|
416
416
|
let fixes = [];
|
|
417
417
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
418
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
418
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
419
419
|
if (targetScript?.associatedOnly) {
|
|
420
420
|
return [];
|
|
421
421
|
}
|
|
422
422
|
if (serviceScript) {
|
|
423
|
-
const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript,
|
|
424
|
-
const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript,
|
|
423
|
+
const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, start, language_core_1.isCodeActionsEnabled);
|
|
424
|
+
const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, end, language_core_1.isCodeActionsEnabled);
|
|
425
425
|
if (generateStart !== undefined && generateEnd !== undefined) {
|
|
426
426
|
fixes = getCodeFixesAtPosition(targetScript.id, generateStart, generateEnd, errorCodes, formatOptions, preferences);
|
|
427
427
|
}
|
|
@@ -490,9 +490,10 @@ function decorateLanguageService(language, languageService) {
|
|
|
490
490
|
if (targetScript?.associatedOnly) {
|
|
491
491
|
return [];
|
|
492
492
|
}
|
|
493
|
-
return getSyntacticDiagnostics(fileName)
|
|
494
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
495
|
-
.filter(utils_1.notEmpty)
|
|
493
|
+
return getSyntacticDiagnostics(targetScript?.id ?? fileName)
|
|
494
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, languageService.getProgram(), false))
|
|
495
|
+
.filter(utils_1.notEmpty)
|
|
496
|
+
.filter(d => language.scripts.get(d.file.fileName) === sourceScript);
|
|
496
497
|
};
|
|
497
498
|
languageService.getSemanticDiagnostics = filePath => {
|
|
498
499
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
@@ -500,9 +501,10 @@ function decorateLanguageService(language, languageService) {
|
|
|
500
501
|
if (targetScript?.associatedOnly) {
|
|
501
502
|
return [];
|
|
502
503
|
}
|
|
503
|
-
return getSemanticDiagnostics(fileName)
|
|
504
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
505
|
-
.filter(utils_1.notEmpty)
|
|
504
|
+
return getSemanticDiagnostics(targetScript?.id ?? fileName)
|
|
505
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, languageService.getProgram(), false))
|
|
506
|
+
.filter(utils_1.notEmpty)
|
|
507
|
+
.filter(d => !d.file || language.scripts.get(d.file.fileName) === sourceScript);
|
|
506
508
|
};
|
|
507
509
|
languageService.getSuggestionDiagnostics = filePath => {
|
|
508
510
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
@@ -510,9 +512,10 @@ function decorateLanguageService(language, languageService) {
|
|
|
510
512
|
if (targetScript?.associatedOnly) {
|
|
511
513
|
return [];
|
|
512
514
|
}
|
|
513
|
-
return getSuggestionDiagnostics(fileName)
|
|
514
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
515
|
-
.filter(utils_1.notEmpty)
|
|
515
|
+
return getSuggestionDiagnostics(targetScript?.id ?? fileName)
|
|
516
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, languageService.getProgram(), false))
|
|
517
|
+
.filter(utils_1.notEmpty)
|
|
518
|
+
.filter(d => !d.file || language.scripts.get(d.file.fileName) === sourceScript);
|
|
516
519
|
};
|
|
517
520
|
languageService.getDefinitionAndBoundSpan = (filePath, position) => {
|
|
518
521
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
@@ -633,7 +636,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
633
636
|
}
|
|
634
637
|
if (serviceScript) {
|
|
635
638
|
const results = [];
|
|
636
|
-
for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(language, serviceScript,
|
|
639
|
+
for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isCompletionEnabled)) {
|
|
637
640
|
const result = getCompletionsAtPosition(targetScript.id, generatedOffset, options, formattingSettings);
|
|
638
641
|
if (!result) {
|
|
639
642
|
continue;
|
|
@@ -670,12 +673,12 @@ function decorateLanguageService(language, languageService) {
|
|
|
670
673
|
languageService.getCompletionEntryDetails = (filePath, position, entryName, formatOptions, source, preferences, data) => {
|
|
671
674
|
let details;
|
|
672
675
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
673
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
676
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
674
677
|
if (targetScript?.associatedOnly) {
|
|
675
678
|
return undefined;
|
|
676
679
|
}
|
|
677
680
|
if (serviceScript) {
|
|
678
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript,
|
|
681
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCompletionEnabled);
|
|
679
682
|
if (generatePosition !== undefined) {
|
|
680
683
|
details = getCompletionEntryDetails(targetScript.id, generatePosition, entryName, formatOptions, source, preferences, data);
|
|
681
684
|
}
|
|
@@ -743,9 +746,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
743
746
|
function linkedCodeFeatureWorker(fileName, position, filter, worker, getLinkedCodes) {
|
|
744
747
|
const results = [];
|
|
745
748
|
const processedFilePositions = new Set();
|
|
746
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
749
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
747
750
|
if (serviceScript) {
|
|
748
|
-
for (const [generatedOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript,
|
|
751
|
+
for (const [generatedOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, filter)) {
|
|
749
752
|
process(targetScript.id, generatedOffset);
|
|
750
753
|
}
|
|
751
754
|
}
|
|
@@ -18,56 +18,59 @@ function decorateProgram(language, program) {
|
|
|
18
18
|
return {
|
|
19
19
|
...result,
|
|
20
20
|
diagnostics: result.diagnostics
|
|
21
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
21
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
|
|
22
22
|
.filter(utils_1.notEmpty),
|
|
23
23
|
};
|
|
24
24
|
};
|
|
25
25
|
program.getSyntacticDiagnostics = (sourceFile, cancellationToken) => {
|
|
26
26
|
if (!sourceFile) {
|
|
27
27
|
return getSyntacticDiagnostics(undefined, cancellationToken)
|
|
28
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
28
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
|
|
29
29
|
.filter(utils_1.notEmpty);
|
|
30
30
|
}
|
|
31
31
|
else {
|
|
32
32
|
const [_serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
33
33
|
const actualSourceFile = targetScript ? program.getSourceFile(targetScript.id) : sourceFile;
|
|
34
34
|
return getSyntacticDiagnostics(actualSourceFile, cancellationToken)
|
|
35
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
36
|
-
.filter(utils_1.notEmpty)
|
|
35
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
|
|
36
|
+
.filter(utils_1.notEmpty)
|
|
37
|
+
.filter(d => !d.file || language.scripts.get(d.file.fileName) === sourceScript);
|
|
37
38
|
}
|
|
38
39
|
};
|
|
39
40
|
program.getSemanticDiagnostics = (sourceFile, cancellationToken) => {
|
|
40
41
|
if (!sourceFile) {
|
|
41
42
|
return getSemanticDiagnostics(undefined, cancellationToken)
|
|
42
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
43
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
|
|
43
44
|
.filter(utils_1.notEmpty);
|
|
44
45
|
}
|
|
45
46
|
else {
|
|
46
47
|
const [_serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
47
48
|
const actualSourceFile = targetScript ? program.getSourceFile(targetScript.id) : sourceFile;
|
|
48
49
|
return getSemanticDiagnostics(actualSourceFile, cancellationToken)
|
|
49
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
50
|
-
.filter(utils_1.notEmpty)
|
|
50
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
|
|
51
|
+
.filter(utils_1.notEmpty)
|
|
52
|
+
.filter(d => !d.file || language.scripts.get(d.file.fileName) === sourceScript);
|
|
51
53
|
}
|
|
52
54
|
};
|
|
53
55
|
program.getGlobalDiagnostics = cancellationToken => {
|
|
54
56
|
return getGlobalDiagnostics(cancellationToken)
|
|
55
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
57
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
|
|
56
58
|
.filter(utils_1.notEmpty);
|
|
57
59
|
};
|
|
58
60
|
// @ts-ignore
|
|
59
61
|
program.getBindAndCheckDiagnostics = (sourceFile, cancellationToken) => {
|
|
60
62
|
if (!sourceFile) {
|
|
61
63
|
return getBindAndCheckDiagnostics(undefined, cancellationToken)
|
|
62
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
64
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
|
|
63
65
|
.filter(utils_1.notEmpty);
|
|
64
66
|
}
|
|
65
67
|
else {
|
|
66
68
|
const [_serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
67
69
|
const actualSourceFile = targetScript ? program.getSourceFile(targetScript.id) : sourceFile;
|
|
68
70
|
return getBindAndCheckDiagnostics(actualSourceFile, cancellationToken)
|
|
69
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
70
|
-
.filter(utils_1.notEmpty)
|
|
71
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
|
|
72
|
+
.filter(utils_1.notEmpty)
|
|
73
|
+
.filter(d => language.scripts.get(d.file.fileName) === sourceScript);
|
|
71
74
|
}
|
|
72
75
|
};
|
|
73
76
|
// fix https://github.com/vuejs/language-tools/issues/4099 with `incremental`
|
package/lib/node/transform.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { CodeInformation, SourceScript, TypeScriptServiceScript } from '@vo
|
|
|
2
2
|
import { Language } from '@volar/language-core';
|
|
3
3
|
import type * as ts from 'typescript';
|
|
4
4
|
export declare function transformCallHierarchyItem(language: Language<string>, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
|
|
5
|
-
export declare function transformDiagnostic<T extends ts.Diagnostic>(
|
|
5
|
+
export declare function transformDiagnostic<T extends ts.Diagnostic>(language: Language<string>, diagnostic: T, program: ts.Program | undefined, isTsc: boolean): T | undefined;
|
|
6
6
|
export declare function fillSourceFileText(language: Language<string>, sourceFile: ts.SourceFile): void;
|
|
7
7
|
export declare function transformFileTextChanges(language: Language<string>, changes: readonly ts.FileTextChanges[], filter: (data: CodeInformation) => boolean): ts.FileTextChanges[];
|
|
8
8
|
export declare function transformDocumentSpan<T extends ts.DocumentSpan>(language: Language<string>, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
|
package/lib/node/transform.js
CHANGED
|
@@ -16,13 +16,13 @@ function transformCallHierarchyItem(language, item, filter) {
|
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
18
|
exports.transformCallHierarchyItem = transformCallHierarchyItem;
|
|
19
|
-
function transformDiagnostic(
|
|
19
|
+
function transformDiagnostic(language, diagnostic, program, isTsc) {
|
|
20
20
|
if (!transformedDiagnostics.has(diagnostic)) {
|
|
21
21
|
transformedDiagnostics.set(diagnostic, undefined);
|
|
22
22
|
const { relatedInformation } = diagnostic;
|
|
23
23
|
if (relatedInformation) {
|
|
24
24
|
diagnostic.relatedInformation = relatedInformation
|
|
25
|
-
.map(d => transformDiagnostic(
|
|
25
|
+
.map(d => transformDiagnostic(language, d, program, isTsc))
|
|
26
26
|
.filter(utils_1.notEmpty);
|
|
27
27
|
}
|
|
28
28
|
if (diagnostic.file !== undefined
|
|
@@ -30,7 +30,7 @@ function transformDiagnostic(sourceScript, language, diagnostic, program, isTsc)
|
|
|
30
30
|
&& diagnostic.length !== undefined) {
|
|
31
31
|
const [serviceScript] = (0, utils_1.getServiceScript)(language, diagnostic.file.fileName);
|
|
32
32
|
if (serviceScript) {
|
|
33
|
-
const [sourceSpanFileName, sourceSpan] = transformTextSpan(
|
|
33
|
+
const [sourceSpanFileName, sourceSpan] = transformTextSpan(undefined, language, serviceScript, {
|
|
34
34
|
start: diagnostic.start,
|
|
35
35
|
length: diagnostic.length
|
|
36
36
|
}, language_core_1.shouldReportDiagnostics) ?? [];
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
import { LanguagePlugin } from '@volar/language-core';
|
|
1
|
+
import { Language, LanguagePlugin } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare function createAsyncLanguageServicePlugin(extensions: string[], scriptKind: ts.ScriptKind,
|
|
3
|
+
export declare function createAsyncLanguageServicePlugin(extensions: string[], scriptKind: ts.ScriptKind, create: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => Promise<{
|
|
4
|
+
languagePlugins: LanguagePlugin<string>[];
|
|
5
|
+
setup?: (language: Language<string>) => void;
|
|
6
|
+
}>): ts.server.PluginModuleFactory;
|
|
@@ -6,18 +6,15 @@ const common_1 = require("../common");
|
|
|
6
6
|
const decorateLanguageService_1 = require("../node/decorateLanguageService");
|
|
7
7
|
const decorateLanguageServiceHost_1 = require("../node/decorateLanguageServiceHost");
|
|
8
8
|
const createLanguageServicePlugin_1 = require("./createLanguageServicePlugin");
|
|
9
|
-
|
|
10
|
-
const decoratedLanguageServices = new WeakSet();
|
|
11
|
-
const decoratedLanguageServiceHosts = new WeakSet();
|
|
12
|
-
function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePlugins) {
|
|
9
|
+
function createAsyncLanguageServicePlugin(extensions, scriptKind, create) {
|
|
13
10
|
return modules => {
|
|
14
11
|
const { typescript: ts } = modules;
|
|
15
12
|
const pluginModule = {
|
|
16
13
|
create(info) {
|
|
17
|
-
if (!decoratedLanguageServices.has(info.languageService)
|
|
18
|
-
&& !decoratedLanguageServiceHosts.has(info.languageServiceHost)) {
|
|
19
|
-
decoratedLanguageServices.add(info.languageService);
|
|
20
|
-
decoratedLanguageServiceHosts.add(info.languageServiceHost);
|
|
14
|
+
if (!createLanguageServicePlugin_1.decoratedLanguageServices.has(info.languageService)
|
|
15
|
+
&& !createLanguageServicePlugin_1.decoratedLanguageServiceHosts.has(info.languageServiceHost)) {
|
|
16
|
+
createLanguageServicePlugin_1.decoratedLanguageServices.add(info.languageService);
|
|
17
|
+
createLanguageServicePlugin_1.decoratedLanguageServiceHosts.add(info.languageServiceHost);
|
|
21
18
|
const emptySnapshot = ts.ScriptSnapshot.fromString('');
|
|
22
19
|
const getScriptSnapshot = info.languageServiceHost.getScriptSnapshot.bind(info.languageServiceHost);
|
|
23
20
|
const getScriptVersion = info.languageServiceHost.getScriptVersion.bind(info.languageServiceHost);
|
|
@@ -52,7 +49,7 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
|
|
|
52
49
|
return getProjectVersion();
|
|
53
50
|
};
|
|
54
51
|
}
|
|
55
|
-
|
|
52
|
+
create(ts, info).then(({ languagePlugins, setup }) => {
|
|
56
53
|
const syncedScriptVersions = new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames);
|
|
57
54
|
const language = (0, language_core_1.createLanguage)([
|
|
58
55
|
...languagePlugins,
|
|
@@ -73,6 +70,7 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
|
|
|
73
70
|
});
|
|
74
71
|
(0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
|
|
75
72
|
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost);
|
|
73
|
+
setup?.(language);
|
|
76
74
|
info.project.markAsDirty();
|
|
77
75
|
initialized = true;
|
|
78
76
|
});
|
|
@@ -81,15 +79,15 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
|
|
|
81
79
|
},
|
|
82
80
|
getExternalFiles(project, updateLevel = 0) {
|
|
83
81
|
if (updateLevel >= (1)
|
|
84
|
-
|| !externalFiles.has(project)) {
|
|
85
|
-
const oldFiles = externalFiles.get(project);
|
|
82
|
+
|| !createLanguageServicePlugin_1.externalFiles.has(project)) {
|
|
83
|
+
const oldFiles = createLanguageServicePlugin_1.externalFiles.get(project);
|
|
86
84
|
const newFiles = extensions.length ? (0, decorateLanguageServiceHost_1.searchExternalFiles)(ts, project, extensions) : [];
|
|
87
|
-
externalFiles.set(project, newFiles);
|
|
85
|
+
createLanguageServicePlugin_1.externalFiles.set(project, newFiles);
|
|
88
86
|
if (oldFiles && !(0, createLanguageServicePlugin_1.arrayItemsEqual)(oldFiles, newFiles)) {
|
|
89
87
|
project.refreshDiagnostics();
|
|
90
88
|
}
|
|
91
89
|
}
|
|
92
|
-
return externalFiles.get(project);
|
|
90
|
+
return createLanguageServicePlugin_1.externalFiles.get(project);
|
|
93
91
|
},
|
|
94
92
|
};
|
|
95
93
|
return pluginModule;
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
import { LanguagePlugin } from '@volar/language-core';
|
|
1
|
+
import { Language, LanguagePlugin } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare
|
|
3
|
+
export declare const externalFiles: WeakMap<ts.server.Project, string[]>;
|
|
4
|
+
export declare const projectExternalFileExtensions: WeakMap<ts.server.Project, string[]>;
|
|
5
|
+
export declare const decoratedLanguageServices: WeakSet<ts.LanguageService>;
|
|
6
|
+
export declare const decoratedLanguageServiceHosts: WeakSet<ts.LanguageServiceHost>;
|
|
7
|
+
export declare function createLanguageServicePlugin(create: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => {
|
|
8
|
+
languagePlugins: LanguagePlugin<string>[];
|
|
9
|
+
setup?: (language: Language<string>) => void;
|
|
10
|
+
}): ts.server.PluginModuleFactory;
|
|
4
11
|
export declare function arrayItemsEqual(a: string[], b: string[]): boolean;
|
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.arrayItemsEqual = exports.createLanguageServicePlugin = void 0;
|
|
3
|
+
exports.arrayItemsEqual = exports.createLanguageServicePlugin = exports.decoratedLanguageServiceHosts = exports.decoratedLanguageServices = exports.projectExternalFileExtensions = exports.externalFiles = void 0;
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
5
|
const common_1 = require("../common");
|
|
6
6
|
const decorateLanguageService_1 = require("../node/decorateLanguageService");
|
|
7
7
|
const decorateLanguageServiceHost_1 = require("../node/decorateLanguageServiceHost");
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
function createLanguageServicePlugin(
|
|
8
|
+
exports.externalFiles = new WeakMap();
|
|
9
|
+
exports.projectExternalFileExtensions = new WeakMap();
|
|
10
|
+
exports.decoratedLanguageServices = new WeakSet();
|
|
11
|
+
exports.decoratedLanguageServiceHosts = new WeakSet();
|
|
12
|
+
function createLanguageServicePlugin(create) {
|
|
13
13
|
return modules => {
|
|
14
14
|
const { typescript: ts } = modules;
|
|
15
15
|
const pluginModule = {
|
|
16
16
|
create(info) {
|
|
17
|
-
if (!decoratedLanguageServices.has(info.languageService)
|
|
18
|
-
&& !decoratedLanguageServiceHosts.has(info.languageServiceHost)) {
|
|
19
|
-
decoratedLanguageServices.add(info.languageService);
|
|
20
|
-
decoratedLanguageServiceHosts.add(info.languageServiceHost);
|
|
21
|
-
const languagePlugins =
|
|
17
|
+
if (!exports.decoratedLanguageServices.has(info.languageService)
|
|
18
|
+
&& !exports.decoratedLanguageServiceHosts.has(info.languageServiceHost)) {
|
|
19
|
+
exports.decoratedLanguageServices.add(info.languageService);
|
|
20
|
+
exports.decoratedLanguageServiceHosts.add(info.languageServiceHost);
|
|
21
|
+
const { languagePlugins, setup } = create(ts, info);
|
|
22
22
|
const extensions = languagePlugins
|
|
23
23
|
.map(plugin => plugin.typescript?.extraFileExtensions.map(ext => '.' + ext.extension) ?? [])
|
|
24
24
|
.flat();
|
|
25
|
-
projectExternalFileExtensions.set(info.project, extensions);
|
|
25
|
+
exports.projectExternalFileExtensions.set(info.project, extensions);
|
|
26
26
|
const getScriptSnapshot = info.languageServiceHost.getScriptSnapshot.bind(info.languageServiceHost);
|
|
27
27
|
const getScriptVersion = info.languageServiceHost.getScriptVersion.bind(info.languageServiceHost);
|
|
28
28
|
const syncedScriptVersions = new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames);
|
|
@@ -45,21 +45,22 @@ function createLanguageServicePlugin(loadLanguagePlugins) {
|
|
|
45
45
|
});
|
|
46
46
|
(0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
|
|
47
47
|
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost);
|
|
48
|
+
setup?.(language);
|
|
48
49
|
}
|
|
49
50
|
return info.languageService;
|
|
50
51
|
},
|
|
51
52
|
getExternalFiles(project, updateLevel = 0) {
|
|
52
53
|
if (updateLevel >= (1)
|
|
53
|
-
|| !externalFiles.has(project)) {
|
|
54
|
-
const oldFiles = externalFiles.get(project);
|
|
55
|
-
const extensions = projectExternalFileExtensions.get(project);
|
|
54
|
+
|| !exports.externalFiles.has(project)) {
|
|
55
|
+
const oldFiles = exports.externalFiles.get(project);
|
|
56
|
+
const extensions = exports.projectExternalFileExtensions.get(project);
|
|
56
57
|
const newFiles = extensions?.length ? (0, decorateLanguageServiceHost_1.searchExternalFiles)(ts, project, extensions) : [];
|
|
57
|
-
externalFiles.set(project, newFiles);
|
|
58
|
+
exports.externalFiles.set(project, newFiles);
|
|
58
59
|
if (oldFiles && !arrayItemsEqual(oldFiles, newFiles)) {
|
|
59
60
|
project.refreshDiagnostics();
|
|
60
61
|
}
|
|
61
62
|
}
|
|
62
|
-
return externalFiles.get(project);
|
|
63
|
+
return exports.externalFiles.get(project);
|
|
63
64
|
},
|
|
64
65
|
};
|
|
65
66
|
return pluginModule;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volar/typescript",
|
|
3
|
-
"version": "2.3.0-alpha.
|
|
3
|
+
"version": "2.3.0-alpha.14",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"files": [
|
|
6
6
|
"**/*.js",
|
|
@@ -12,14 +12,14 @@
|
|
|
12
12
|
"directory": "packages/typescript"
|
|
13
13
|
},
|
|
14
14
|
"dependencies": {
|
|
15
|
-
"@volar/language-core": "2.3.0-alpha.
|
|
15
|
+
"@volar/language-core": "2.3.0-alpha.14",
|
|
16
16
|
"path-browserify": "^1.0.1",
|
|
17
17
|
"vscode-uri": "^3.0.8"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"@types/node": "latest",
|
|
21
21
|
"@types/path-browserify": "latest",
|
|
22
|
-
"@volar/language-service": "2.3.0-alpha.
|
|
22
|
+
"@volar/language-service": "2.3.0-alpha.14"
|
|
23
23
|
},
|
|
24
|
-
"gitHead": "
|
|
24
|
+
"gitHead": "9a8179277fe224de1d13e6331115918b79b30721"
|
|
25
25
|
}
|