@volar/typescript 2.3.0-alpha.10 → 2.3.0-alpha.11
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.
|
@@ -35,7 +35,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
35
35
|
const { findReferences, findRenameLocations, getCompletionEntryDetails, getCompletionsAtPosition, getDefinitionAndBoundSpan, getDefinitionAtPosition, getFileReferences, getFormattingEditsForDocument, getFormattingEditsForRange, getFormattingEditsAfterKeystroke, getImplementationAtPosition, getLinkedEditingRangeAtPosition, getQuickInfoAtPosition, getSignatureHelpItems, getReferencesAtPosition, getSemanticDiagnostics, getSyntacticDiagnostics, getSuggestionDiagnostics, getTypeDefinitionAtPosition, getEncodedSemanticClassifications, getDocumentHighlights, getApplicableRefactors, getEditsForFileRename, getEditsForRefactor, getRenameInfo, getCodeFixesAtPosition, prepareCallHierarchy, provideCallHierarchyIncomingCalls, provideCallHierarchyOutgoingCalls, provideInlayHints, organizeImports, } = languageService;
|
|
36
36
|
languageService.getFormattingEditsForDocument = (filePath, options) => {
|
|
37
37
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
38
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
38
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
39
39
|
if (targetScript?.associatedOnly) {
|
|
40
40
|
return [];
|
|
41
41
|
}
|
|
@@ -46,7 +46,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
46
46
|
}
|
|
47
47
|
const edits = getFormattingEditsForDocument(targetScript.id, options);
|
|
48
48
|
return edits
|
|
49
|
-
.map(edit => (0, transform_1.transformTextChange)(
|
|
49
|
+
.map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
|
|
50
50
|
.filter(utils_1.notEmpty);
|
|
51
51
|
}
|
|
52
52
|
else {
|
|
@@ -55,7 +55,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
55
55
|
};
|
|
56
56
|
languageService.getFormattingEditsForRange = (filePath, start, end, options) => {
|
|
57
57
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
58
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
58
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
59
59
|
if (targetScript?.associatedOnly) {
|
|
60
60
|
return [];
|
|
61
61
|
}
|
|
@@ -65,7 +65,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
65
65
|
if (generateStart !== undefined && generateEnd !== undefined) {
|
|
66
66
|
const edits = getFormattingEditsForRange(targetScript.id, generateStart, generateEnd, options);
|
|
67
67
|
return edits
|
|
68
|
-
.map(edit => (0, transform_1.transformTextChange)(
|
|
68
|
+
.map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
|
|
69
69
|
.filter(utils_1.notEmpty);
|
|
70
70
|
}
|
|
71
71
|
return [];
|
|
@@ -76,7 +76,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
76
76
|
};
|
|
77
77
|
languageService.getFormattingEditsAfterKeystroke = (filePath, position, key, options) => {
|
|
78
78
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
79
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
79
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
80
80
|
if (targetScript?.associatedOnly) {
|
|
81
81
|
return [];
|
|
82
82
|
}
|
|
@@ -85,7 +85,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
85
85
|
if (generatePosition !== undefined) {
|
|
86
86
|
const edits = getFormattingEditsAfterKeystroke(targetScript.id, generatePosition, key, options);
|
|
87
87
|
return edits
|
|
88
|
-
.map(edit => (0, transform_1.transformTextChange)(
|
|
88
|
+
.map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
|
|
89
89
|
.filter(utils_1.notEmpty);
|
|
90
90
|
}
|
|
91
91
|
return [];
|
|
@@ -100,7 +100,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
100
100
|
};
|
|
101
101
|
languageService.getLinkedEditingRangeAtPosition = (filePath, position) => {
|
|
102
102
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
103
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
103
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
104
104
|
if (targetScript?.associatedOnly) {
|
|
105
105
|
return undefined;
|
|
106
106
|
}
|
|
@@ -111,7 +111,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
111
111
|
if (info) {
|
|
112
112
|
return {
|
|
113
113
|
ranges: info.ranges
|
|
114
|
-
.map(span => (0, transform_1.transformTextSpan)(
|
|
114
|
+
.map(span => (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, span, language_core_1.isLinkedEditingEnabled)?.[1])
|
|
115
115
|
.filter(utils_1.notEmpty),
|
|
116
116
|
wordPattern: info.wordPattern,
|
|
117
117
|
};
|
|
@@ -175,7 +175,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
175
175
|
languageService.provideCallHierarchyOutgoingCalls = (filePath, position) => {
|
|
176
176
|
let calls = [];
|
|
177
177
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
178
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
178
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
179
179
|
if (targetScript?.associatedOnly) {
|
|
180
180
|
return [];
|
|
181
181
|
}
|
|
@@ -193,7 +193,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
193
193
|
const to = (0, transform_1.transformCallHierarchyItem)(language, call.to, language_core_1.isCallHierarchyEnabled);
|
|
194
194
|
const fromSpans = call.fromSpans
|
|
195
195
|
.map(span => serviceScript
|
|
196
|
-
? (0, transform_1.transformTextSpan)(
|
|
196
|
+
? (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, span, language_core_1.isCallHierarchyEnabled)?.[1]
|
|
197
197
|
: span)
|
|
198
198
|
.filter(utils_1.notEmpty);
|
|
199
199
|
return {
|
|
@@ -208,7 +208,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
208
208
|
};
|
|
209
209
|
languageService.getQuickInfoAtPosition = (filePath, position) => {
|
|
210
210
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
211
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
211
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
212
212
|
if (targetScript?.associatedOnly) {
|
|
213
213
|
return undefined;
|
|
214
214
|
}
|
|
@@ -217,7 +217,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
217
217
|
for (const [generatePosition] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, targetScript, position, language_core_1.isHoverEnabled)) {
|
|
218
218
|
const info = getQuickInfoAtPosition(targetScript.id, generatePosition);
|
|
219
219
|
if (info) {
|
|
220
|
-
const textSpan = (0, transform_1.transformTextSpan)(
|
|
220
|
+
const textSpan = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.textSpan, language_core_1.isHoverEnabled)?.[1];
|
|
221
221
|
if (textSpan) {
|
|
222
222
|
infos.push({
|
|
223
223
|
...info,
|
|
@@ -271,7 +271,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
271
271
|
};
|
|
272
272
|
languageService.getSignatureHelpItems = (filePath, position, options) => {
|
|
273
273
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
274
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
274
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
275
275
|
if (targetScript?.associatedOnly) {
|
|
276
276
|
return undefined;
|
|
277
277
|
}
|
|
@@ -280,7 +280,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
280
280
|
if (generatePosition !== undefined) {
|
|
281
281
|
const result = getSignatureHelpItems(targetScript.id, generatePosition, options);
|
|
282
282
|
if (result) {
|
|
283
|
-
const applicableSpan = (0, transform_1.transformTextSpan)(
|
|
283
|
+
const applicableSpan = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, result.applicableSpan, language_core_1.isSignatureHelpEnabled)?.[1];
|
|
284
284
|
if (applicableSpan) {
|
|
285
285
|
return {
|
|
286
286
|
...result,
|
|
@@ -378,7 +378,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
378
378
|
};
|
|
379
379
|
languageService.getRenameInfo = (filePath, position, options) => {
|
|
380
380
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
381
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
381
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
382
382
|
if (targetScript?.associatedOnly) {
|
|
383
383
|
return {
|
|
384
384
|
canRename: false,
|
|
@@ -390,7 +390,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
390
390
|
for (const [generateOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, targetScript, position, language_core_1.isRenameEnabled)) {
|
|
391
391
|
const info = getRenameInfo(targetScript.id, generateOffset, options);
|
|
392
392
|
if (info.canRename) {
|
|
393
|
-
const span = (0, transform_1.transformTextSpan)(
|
|
393
|
+
const span = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.triggerSpan, language_core_1.isRenameEnabled)?.[1];
|
|
394
394
|
if (span) {
|
|
395
395
|
info.triggerSpan = span;
|
|
396
396
|
return info;
|
|
@@ -437,7 +437,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
437
437
|
};
|
|
438
438
|
languageService.getEncodedSemanticClassifications = (filePath, span, format) => {
|
|
439
439
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
440
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
440
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
441
441
|
if (targetScript?.associatedOnly) {
|
|
442
442
|
return {
|
|
443
443
|
spans: [],
|
|
@@ -465,8 +465,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
465
465
|
const result = getEncodedSemanticClassifications(targetScript.id, { start, length: end - start }, format);
|
|
466
466
|
const spans = [];
|
|
467
467
|
for (let i = 0; i < result.spans.length; i += 3) {
|
|
468
|
-
for (const sourceStart of (0, transform_1.toSourceOffsets)(
|
|
469
|
-
for (const sourceEnd of (0, transform_1.toSourceOffsets)(
|
|
468
|
+
for (const sourceStart of (0, transform_1.toSourceOffsets)(sourceScript, language, serviceScript, result.spans[i], language_core_1.isSemanticTokensEnabled)) {
|
|
469
|
+
for (const sourceEnd of (0, transform_1.toSourceOffsets)(sourceScript, language, serviceScript, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled)) {
|
|
470
470
|
if (sourceStart[0] === sourceEnd[0] && sourceEnd[1] >= sourceStart[1]) {
|
|
471
471
|
spans.push(sourceStart[1], sourceEnd[1] - sourceStart[1], result.spans[i + 2]);
|
|
472
472
|
break;
|
|
@@ -486,32 +486,32 @@ function decorateLanguageService(language, languageService) {
|
|
|
486
486
|
};
|
|
487
487
|
languageService.getSyntacticDiagnostics = filePath => {
|
|
488
488
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
489
|
-
const [_serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
489
|
+
const [_serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
490
490
|
if (targetScript?.associatedOnly) {
|
|
491
491
|
return [];
|
|
492
492
|
}
|
|
493
493
|
return getSyntacticDiagnostics(fileName)
|
|
494
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
494
|
+
.map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
|
|
495
495
|
.filter(utils_1.notEmpty);
|
|
496
496
|
};
|
|
497
497
|
languageService.getSemanticDiagnostics = filePath => {
|
|
498
498
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
499
|
-
const [_serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
499
|
+
const [_serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
500
500
|
if (targetScript?.associatedOnly) {
|
|
501
501
|
return [];
|
|
502
502
|
}
|
|
503
503
|
return getSemanticDiagnostics(fileName)
|
|
504
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
504
|
+
.map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
|
|
505
505
|
.filter(utils_1.notEmpty);
|
|
506
506
|
};
|
|
507
507
|
languageService.getSuggestionDiagnostics = filePath => {
|
|
508
508
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
509
|
-
const [_serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
509
|
+
const [_serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
510
510
|
if (targetScript?.associatedOnly) {
|
|
511
511
|
return [];
|
|
512
512
|
}
|
|
513
513
|
return getSuggestionDiagnostics(fileName)
|
|
514
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
514
|
+
.map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, languageService.getProgram(), false))
|
|
515
515
|
.filter(utils_1.notEmpty);
|
|
516
516
|
};
|
|
517
517
|
languageService.getDefinitionAndBoundSpan = (filePath, position) => {
|
|
@@ -627,7 +627,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
627
627
|
};
|
|
628
628
|
languageService.getCompletionsAtPosition = (filePath, position, options, formattingSettings) => {
|
|
629
629
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
630
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
630
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
631
631
|
if (targetScript?.associatedOnly) {
|
|
632
632
|
return undefined;
|
|
633
633
|
}
|
|
@@ -642,10 +642,10 @@ function decorateLanguageService(language, languageService) {
|
|
|
642
642
|
result.entries = result.entries.filter(entry => !!entry.sourceDisplay);
|
|
643
643
|
}
|
|
644
644
|
for (const entry of result.entries) {
|
|
645
|
-
entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(
|
|
645
|
+
entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, entry.replacementSpan, language_core_1.isCompletionEnabled)?.[1];
|
|
646
646
|
}
|
|
647
647
|
result.optionalReplacementSpan = result.optionalReplacementSpan
|
|
648
|
-
&& (0, transform_1.transformTextSpan)(
|
|
648
|
+
&& (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.[1];
|
|
649
649
|
const isAdditional = typeof mapping.data.completion === 'object' && mapping.data.completion.isAdditional;
|
|
650
650
|
if (isAdditional) {
|
|
651
651
|
results.push(result);
|
|
@@ -692,7 +692,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
692
692
|
};
|
|
693
693
|
languageService.provideInlayHints = (filePath, span, preferences) => {
|
|
694
694
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
695
|
-
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
695
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
696
696
|
if (targetScript?.associatedOnly) {
|
|
697
697
|
return [];
|
|
698
698
|
}
|
|
@@ -718,7 +718,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
718
718
|
const result = provideInlayHints(targetScript.id, { start, length: end - start }, preferences);
|
|
719
719
|
const hints = [];
|
|
720
720
|
for (const hint of result) {
|
|
721
|
-
const sourcePosition = (0, transform_1.toSourceOffset)(
|
|
721
|
+
const sourcePosition = (0, transform_1.toSourceOffset)(sourceScript, language, serviceScript, hint.position, language_core_1.isInlayHintsEnabled);
|
|
722
722
|
if (sourcePosition !== undefined) {
|
|
723
723
|
hints.push({
|
|
724
724
|
...hint,
|
|
@@ -29,10 +29,10 @@ function decorateProgram(language, program) {
|
|
|
29
29
|
.filter(utils_1.notEmpty);
|
|
30
30
|
}
|
|
31
31
|
else {
|
|
32
|
-
const [_serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
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)(
|
|
35
|
+
.map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, program, true))
|
|
36
36
|
.filter(utils_1.notEmpty);
|
|
37
37
|
}
|
|
38
38
|
};
|
|
@@ -43,10 +43,10 @@ function decorateProgram(language, program) {
|
|
|
43
43
|
.filter(utils_1.notEmpty);
|
|
44
44
|
}
|
|
45
45
|
else {
|
|
46
|
-
const [_serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
46
|
+
const [_serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
47
47
|
const actualSourceFile = targetScript ? program.getSourceFile(targetScript.id) : sourceFile;
|
|
48
48
|
return getSemanticDiagnostics(actualSourceFile, cancellationToken)
|
|
49
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
49
|
+
.map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, program, true))
|
|
50
50
|
.filter(utils_1.notEmpty);
|
|
51
51
|
}
|
|
52
52
|
};
|
|
@@ -63,10 +63,10 @@ function decorateProgram(language, program) {
|
|
|
63
63
|
.filter(utils_1.notEmpty);
|
|
64
64
|
}
|
|
65
65
|
else {
|
|
66
|
-
const [_serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
66
|
+
const [_serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
67
67
|
const actualSourceFile = targetScript ? program.getSourceFile(targetScript.id) : sourceFile;
|
|
68
68
|
return getBindAndCheckDiagnostics(actualSourceFile, cancellationToken)
|
|
69
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
69
|
+
.map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, program, true))
|
|
70
70
|
.filter(utils_1.notEmpty);
|
|
71
71
|
}
|
|
72
72
|
};
|
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>(sourceScript: SourceScript<string> | undefined, 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;
|
|
@@ -10,10 +10,10 @@ export declare function transformSpan(language: Language<string>, fileName: stri
|
|
|
10
10
|
fileName: string;
|
|
11
11
|
textSpan: ts.TextSpan;
|
|
12
12
|
} | undefined;
|
|
13
|
-
export declare function transformTextChange(
|
|
14
|
-
export declare function transformTextSpan(
|
|
15
|
-
export declare function toSourceOffset(
|
|
16
|
-
export declare function toSourceOffsets(
|
|
13
|
+
export declare function transformTextChange(sourceScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, textChange: ts.TextChange, filter: (data: CodeInformation) => boolean): [string, ts.TextChange] | undefined;
|
|
14
|
+
export declare function transformTextSpan(sourceScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): [string, ts.TextSpan] | undefined;
|
|
15
|
+
export declare function toSourceOffset(sourceScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, position: number, filter: (data: CodeInformation) => boolean): [fileName: string, offset: number] | undefined;
|
|
16
|
+
export declare function toSourceOffsets(sourceScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, position: number, filter: (data: CodeInformation) => boolean): Generator<[fileName: string, offset: number]>;
|
|
17
17
|
export declare function toGeneratedOffset(language: Language, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
|
|
18
18
|
export declare function toGeneratedOffsets(language: Language, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, position: number, filter: (data: CodeInformation) => boolean): Generator<readonly [number, import("@volar/language-core").Mapping<CodeInformation>], void, unknown>;
|
|
19
19
|
export declare function getMappingOffset(language: Language, serviceScript: TypeScriptServiceScript): number;
|
package/lib/node/transform.js
CHANGED
|
@@ -16,7 +16,7 @@ function transformCallHierarchyItem(language, item, filter) {
|
|
|
16
16
|
};
|
|
17
17
|
}
|
|
18
18
|
exports.transformCallHierarchyItem = transformCallHierarchyItem;
|
|
19
|
-
function transformDiagnostic(
|
|
19
|
+
function transformDiagnostic(sourceScript, language, diagnostic, program, isTsc) {
|
|
20
20
|
if (!transformedDiagnostics.has(diagnostic)) {
|
|
21
21
|
transformedDiagnostics.set(diagnostic, undefined);
|
|
22
22
|
const { relatedInformation } = diagnostic;
|
|
@@ -30,7 +30,7 @@ function transformDiagnostic(targetScript, 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(sourceScript, language, serviceScript, {
|
|
34
34
|
start: diagnostic.start,
|
|
35
35
|
length: diagnostic.length
|
|
36
36
|
}, language_core_1.shouldReportDiagnostics) ?? [];
|
|
@@ -68,10 +68,11 @@ function fillSourceFileText(language, sourceFile) {
|
|
|
68
68
|
return;
|
|
69
69
|
}
|
|
70
70
|
transformedSourceFile.add(sourceFile);
|
|
71
|
-
const [serviceScript
|
|
71
|
+
const [serviceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
72
72
|
if (serviceScript && !serviceScript.preventLeadingOffset) {
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
const sourceScript = language.scripts.fromVirtualCode(serviceScript.code);
|
|
74
|
+
sourceFile.text = sourceScript.snapshot.getText(0, sourceScript.snapshot.getLength())
|
|
75
|
+
+ sourceFile.text.substring(sourceScript.snapshot.getLength());
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
exports.fillSourceFileText = fillSourceFileText;
|
|
@@ -156,8 +157,8 @@ function transformSpan(language, fileName, textSpan, filter) {
|
|
|
156
157
|
}
|
|
157
158
|
}
|
|
158
159
|
exports.transformSpan = transformSpan;
|
|
159
|
-
function transformTextChange(
|
|
160
|
-
const [sourceSpanFileName, sourceSpan] = transformTextSpan(
|
|
160
|
+
function transformTextChange(sourceScript, language, serviceScript, textChange, filter) {
|
|
161
|
+
const [sourceSpanFileName, sourceSpan] = transformTextSpan(sourceScript, language, serviceScript, textChange.span, filter) ?? [];
|
|
161
162
|
if (sourceSpan && sourceSpanFileName) {
|
|
162
163
|
return [sourceSpanFileName, {
|
|
163
164
|
newText: textChange.newText,
|
|
@@ -167,11 +168,11 @@ function transformTextChange(targetScript, language, serviceScript, textChange,
|
|
|
167
168
|
return undefined;
|
|
168
169
|
}
|
|
169
170
|
exports.transformTextChange = transformTextChange;
|
|
170
|
-
function transformTextSpan(
|
|
171
|
+
function transformTextSpan(sourceScript, language, serviceScript, textSpan, filter) {
|
|
171
172
|
const start = textSpan.start;
|
|
172
173
|
const end = textSpan.start + textSpan.length;
|
|
173
|
-
for (const sourceStart of toSourceOffsets(
|
|
174
|
-
for (const sourceEnd of toSourceOffsets(
|
|
174
|
+
for (const sourceStart of toSourceOffsets(sourceScript, language, serviceScript, start, filter)) {
|
|
175
|
+
for (const sourceEnd of toSourceOffsets(sourceScript, language, serviceScript, end, filter)) {
|
|
175
176
|
if (sourceStart[0] === sourceEnd[0]
|
|
176
177
|
&& sourceEnd[1] >= sourceStart[1]) {
|
|
177
178
|
return [sourceStart[0], {
|
|
@@ -183,18 +184,18 @@ function transformTextSpan(targetScript, language, serviceScript, textSpan, filt
|
|
|
183
184
|
}
|
|
184
185
|
}
|
|
185
186
|
exports.transformTextSpan = transformTextSpan;
|
|
186
|
-
function toSourceOffset(
|
|
187
|
-
for (const source of toSourceOffsets(
|
|
187
|
+
function toSourceOffset(sourceScript, language, serviceScript, position, filter) {
|
|
188
|
+
for (const source of toSourceOffsets(sourceScript, language, serviceScript, position, filter)) {
|
|
188
189
|
return source;
|
|
189
190
|
}
|
|
190
191
|
}
|
|
191
192
|
exports.toSourceOffset = toSourceOffset;
|
|
192
|
-
function* toSourceOffsets(
|
|
193
|
-
if (
|
|
194
|
-
const map = language.maps.get(serviceScript.code,
|
|
193
|
+
function* toSourceOffsets(sourceScript, language, serviceScript, position, filter) {
|
|
194
|
+
if (sourceScript) {
|
|
195
|
+
const map = language.maps.get(serviceScript.code, sourceScript);
|
|
195
196
|
for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(language, serviceScript))) {
|
|
196
197
|
if (filter(mapping.data)) {
|
|
197
|
-
yield [
|
|
198
|
+
yield [sourceScript.id, sourceOffset];
|
|
198
199
|
}
|
|
199
200
|
}
|
|
200
201
|
}
|
package/lib/node/utils.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { Language, SourceScript, TypeScriptServiceScript } from '@volar/language-core';
|
|
2
2
|
export declare function notEmpty<T>(value: T | null | undefined): value is T;
|
|
3
|
-
export declare function getServiceScript(language: Language<string>, fileName: string): [
|
|
3
|
+
export declare function getServiceScript(language: Language<string>, fileName: string): [serviceScript: TypeScriptServiceScript, targetScript: SourceScript<string>, sourceScript: SourceScript<string>] | [serviceScript: undefined, sourceScript: SourceScript<string>, sourceScript: SourceScript<string>] | [serviceScript: undefined, sourceScript: undefined, targetScript: undefined];
|
package/lib/node/utils.js
CHANGED
|
@@ -13,21 +13,21 @@ function getServiceScript(language, fileName) {
|
|
|
13
13
|
if (targetScript?.generated) {
|
|
14
14
|
const serviceScript = targetScript.generated.languagePlugin.typescript?.getServiceScript(targetScript.generated.root);
|
|
15
15
|
if (serviceScript) {
|
|
16
|
-
return [serviceScript, targetScript];
|
|
16
|
+
return [serviceScript, sourceScript, targetScript];
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
if (sourceScript?.associatedOnly) {
|
|
22
|
-
return [undefined, sourceScript];
|
|
22
|
+
return [undefined, sourceScript, sourceScript];
|
|
23
23
|
}
|
|
24
24
|
if (sourceScript?.generated) {
|
|
25
25
|
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
26
26
|
if (serviceScript) {
|
|
27
|
-
return [serviceScript, sourceScript];
|
|
27
|
+
return [serviceScript, sourceScript, sourceScript];
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
return [undefined, undefined];
|
|
30
|
+
return [undefined, undefined, undefined];
|
|
31
31
|
}
|
|
32
32
|
exports.getServiceScript = getServiceScript;
|
|
33
33
|
//# sourceMappingURL=utils.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volar/typescript",
|
|
3
|
-
"version": "2.3.0-alpha.
|
|
3
|
+
"version": "2.3.0-alpha.11",
|
|
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.11",
|
|
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.11"
|
|
23
23
|
},
|
|
24
|
-
"gitHead": "
|
|
24
|
+
"gitHead": "c83f835629496d3a4cc38f4b789bb676d07a2118"
|
|
25
25
|
}
|