@volar/typescript 2.3.0-alpha.4 → 2.3.0-alpha.6
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 +43 -40
- package/lib/node/decorateLanguageServiceHost.js +18 -9
- package/lib/node/proxyCreateProgram.js +3 -3
- package/lib/node/transform.d.ts +7 -6
- package/lib/node/transform.js +23 -17
- package/lib/node/utils.d.ts +1 -1
- package/lib/node/utils.js +1 -1
- package/lib/protocol/createProject.d.ts +2 -2
- package/lib/protocol/createProject.js +4 -4
- package/package.json +4 -4
- package/env.d.ts +0 -15
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.decorateLanguageService = void 0;
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
5
|
const dedupe_1 = require("./dedupe");
|
|
6
|
-
const utils_1 = require("./utils");
|
|
7
6
|
const transform_1 = require("./transform");
|
|
7
|
+
const utils_1 = require("./utils");
|
|
8
8
|
const windowsPathReg = /\\/g;
|
|
9
9
|
function decorateLanguageService(language, languageService) {
|
|
10
10
|
// ignored methods
|
|
@@ -42,7 +42,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
42
42
|
}
|
|
43
43
|
const edits = getFormattingEditsForDocument(fileName, options);
|
|
44
44
|
return edits
|
|
45
|
-
.map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
|
|
45
|
+
.map(edit => (0, transform_1.transformTextChange)(serviceScript, sourceScript, map, edit, language_core_1.isFormattingEnabled))
|
|
46
46
|
.filter(utils_1.notEmpty);
|
|
47
47
|
}
|
|
48
48
|
else {
|
|
@@ -53,12 +53,12 @@ function decorateLanguageService(language, languageService) {
|
|
|
53
53
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
54
54
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
55
55
|
if (serviceScript) {
|
|
56
|
-
const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isFormattingEnabled);
|
|
57
|
-
const generateEnd = (0, transform_1.toGeneratedOffset)(sourceScript, map, end, language_core_1.isFormattingEnabled);
|
|
56
|
+
const generateStart = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, start, language_core_1.isFormattingEnabled);
|
|
57
|
+
const generateEnd = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, end, language_core_1.isFormattingEnabled);
|
|
58
58
|
if (generateStart !== undefined && generateEnd !== undefined) {
|
|
59
59
|
const edits = getFormattingEditsForRange(fileName, generateStart, generateEnd, options);
|
|
60
60
|
return edits
|
|
61
|
-
.map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
|
|
61
|
+
.map(edit => (0, transform_1.transformTextChange)(serviceScript, sourceScript, map, edit, language_core_1.isFormattingEnabled))
|
|
62
62
|
.filter(utils_1.notEmpty);
|
|
63
63
|
}
|
|
64
64
|
return [];
|
|
@@ -71,11 +71,11 @@ function decorateLanguageService(language, languageService) {
|
|
|
71
71
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
72
72
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
73
73
|
if (serviceScript) {
|
|
74
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isFormattingEnabled);
|
|
74
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isFormattingEnabled);
|
|
75
75
|
if (generatePosition !== undefined) {
|
|
76
76
|
const edits = getFormattingEditsAfterKeystroke(fileName, generatePosition, key, options);
|
|
77
77
|
return edits
|
|
78
|
-
.map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
|
|
78
|
+
.map(edit => (0, transform_1.transformTextChange)(serviceScript, sourceScript, map, edit, language_core_1.isFormattingEnabled))
|
|
79
79
|
.filter(utils_1.notEmpty);
|
|
80
80
|
}
|
|
81
81
|
return [];
|
|
@@ -94,13 +94,13 @@ function decorateLanguageService(language, languageService) {
|
|
|
94
94
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
95
95
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
96
96
|
if (serviceScript) {
|
|
97
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isLinkedEditingEnabled);
|
|
97
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isLinkedEditingEnabled);
|
|
98
98
|
if (generatePosition !== undefined) {
|
|
99
99
|
const info = getLinkedEditingRangeAtPosition(fileName, generatePosition);
|
|
100
100
|
if (info) {
|
|
101
101
|
return {
|
|
102
102
|
ranges: info.ranges
|
|
103
|
-
.map(span => (0, transform_1.transformTextSpan)(sourceScript, map, span, language_core_1.isLinkedEditingEnabled))
|
|
103
|
+
.map(span => (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, span, language_core_1.isLinkedEditingEnabled))
|
|
104
104
|
.filter(utils_1.notEmpty),
|
|
105
105
|
wordPattern: info.wordPattern,
|
|
106
106
|
};
|
|
@@ -115,7 +115,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
115
115
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
116
116
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
117
117
|
if (serviceScript) {
|
|
118
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
118
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
119
119
|
if (generatePosition !== undefined) {
|
|
120
120
|
const item = prepareCallHierarchy(fileName, generatePosition);
|
|
121
121
|
if (Array.isArray(item)) {
|
|
@@ -135,7 +135,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
135
135
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
136
136
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
137
137
|
if (serviceScript) {
|
|
138
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
138
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
139
139
|
if (generatePosition !== undefined) {
|
|
140
140
|
calls = provideCallHierarchyIncomingCalls(fileName, generatePosition);
|
|
141
141
|
}
|
|
@@ -160,7 +160,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
160
160
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
161
161
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
162
162
|
if (serviceScript) {
|
|
163
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
163
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
164
164
|
if (generatePosition !== undefined) {
|
|
165
165
|
calls = provideCallHierarchyOutgoingCalls(fileName, generatePosition);
|
|
166
166
|
}
|
|
@@ -173,7 +173,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
173
173
|
const to = (0, transform_1.transformCallHierarchyItem)(language, call.to, language_core_1.isCallHierarchyEnabled);
|
|
174
174
|
const fromSpans = call.fromSpans
|
|
175
175
|
.map(span => sourceScript
|
|
176
|
-
? (0, transform_1.transformTextSpan)(sourceScript, map, span, language_core_1.isCallHierarchyEnabled)
|
|
176
|
+
? (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, span, language_core_1.isCallHierarchyEnabled)
|
|
177
177
|
: span)
|
|
178
178
|
.filter(utils_1.notEmpty);
|
|
179
179
|
return {
|
|
@@ -194,13 +194,13 @@ function decorateLanguageService(language, languageService) {
|
|
|
194
194
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
195
195
|
if (serviceScript) {
|
|
196
196
|
const infos = [];
|
|
197
|
-
for (const [generatePosition, mapping] of (0, transform_1.toGeneratedOffsets)(sourceScript, map, position)) {
|
|
197
|
+
for (const [generatePosition, mapping] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position)) {
|
|
198
198
|
if (!(0, language_core_1.isHoverEnabled)(mapping.data)) {
|
|
199
199
|
continue;
|
|
200
200
|
}
|
|
201
201
|
const info = getQuickInfoAtPosition(fileName, generatePosition);
|
|
202
202
|
if (info) {
|
|
203
|
-
const textSpan = (0, transform_1.transformTextSpan)(sourceScript, map, info.textSpan, language_core_1.isHoverEnabled);
|
|
203
|
+
const textSpan = (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, info.textSpan, language_core_1.isHoverEnabled);
|
|
204
204
|
if (textSpan) {
|
|
205
205
|
infos.push({
|
|
206
206
|
...info,
|
|
@@ -256,11 +256,11 @@ function decorateLanguageService(language, languageService) {
|
|
|
256
256
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
257
257
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
258
258
|
if (serviceScript) {
|
|
259
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isSignatureHelpEnabled);
|
|
259
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isSignatureHelpEnabled);
|
|
260
260
|
if (generatePosition !== undefined) {
|
|
261
261
|
const result = getSignatureHelpItems(fileName, generatePosition, options);
|
|
262
262
|
if (result) {
|
|
263
|
-
const applicableSpan = (0, transform_1.transformTextSpan)(sourceScript, map, result.applicableSpan, language_core_1.isSignatureHelpEnabled);
|
|
263
|
+
const applicableSpan = (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, result.applicableSpan, language_core_1.isSignatureHelpEnabled);
|
|
264
264
|
if (applicableSpan) {
|
|
265
265
|
return {
|
|
266
266
|
...result,
|
|
@@ -308,7 +308,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
308
308
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
309
309
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
310
310
|
if (serviceScript) {
|
|
311
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
|
|
311
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
|
|
312
312
|
if (generatePosition !== undefined) {
|
|
313
313
|
const por = typeof positionOrRange === 'number'
|
|
314
314
|
? generatePosition
|
|
@@ -329,7 +329,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
329
329
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
330
330
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
331
331
|
if (serviceScript) {
|
|
332
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number'
|
|
332
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, typeof positionOrRange === 'number'
|
|
333
333
|
? positionOrRange
|
|
334
334
|
: positionOrRange.pos, language_core_1.isCodeActionsEnabled);
|
|
335
335
|
if (generatePosition !== undefined) {
|
|
@@ -357,13 +357,13 @@ function decorateLanguageService(language, languageService) {
|
|
|
357
357
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
358
358
|
if (serviceScript) {
|
|
359
359
|
let failed;
|
|
360
|
-
for (const [generateOffset, mapping] of (0, transform_1.toGeneratedOffsets)(sourceScript, map, position)) {
|
|
360
|
+
for (const [generateOffset, mapping] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position)) {
|
|
361
361
|
if (!(0, language_core_1.isRenameEnabled)(mapping.data)) {
|
|
362
362
|
continue;
|
|
363
363
|
}
|
|
364
364
|
const info = getRenameInfo(fileName, generateOffset, options);
|
|
365
365
|
if (info.canRename) {
|
|
366
|
-
const span = (0, transform_1.transformTextSpan)(sourceScript, map, info.triggerSpan, language_core_1.isRenameEnabled);
|
|
366
|
+
const span = (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, info.triggerSpan, language_core_1.isRenameEnabled);
|
|
367
367
|
if (span) {
|
|
368
368
|
info.triggerSpan = span;
|
|
369
369
|
return info;
|
|
@@ -390,8 +390,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
390
390
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
391
391
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
392
392
|
if (serviceScript) {
|
|
393
|
-
const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isCodeActionsEnabled);
|
|
394
|
-
const generateEnd = (0, transform_1.toGeneratedOffset)(sourceScript, map, end, language_core_1.isCodeActionsEnabled);
|
|
393
|
+
const generateStart = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, start, language_core_1.isCodeActionsEnabled);
|
|
394
|
+
const generateEnd = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, end, language_core_1.isCodeActionsEnabled);
|
|
395
395
|
if (generateStart !== undefined && generateEnd !== undefined) {
|
|
396
396
|
fixes = getCodeFixesAtPosition(fileName, generateStart, generateEnd, errorCodes, formatOptions, preferences);
|
|
397
397
|
}
|
|
@@ -422,13 +422,14 @@ function decorateLanguageService(language, languageService) {
|
|
|
422
422
|
}
|
|
423
423
|
start ??= 0;
|
|
424
424
|
end ??= sourceScript.snapshot.getLength();
|
|
425
|
-
|
|
426
|
-
|
|
425
|
+
const mappingOffset = (0, transform_1.getMappingOffset)(serviceScript, sourceScript);
|
|
426
|
+
start += mappingOffset;
|
|
427
|
+
end += mappingOffset;
|
|
427
428
|
const result = getEncodedSemanticClassifications(fileName, { start, length: end - start }, format);
|
|
428
429
|
const spans = [];
|
|
429
430
|
for (let i = 0; i < result.spans.length; i += 3) {
|
|
430
|
-
const sourceStart = (0, transform_1.toSourceOffset)(sourceScript, map, result.spans[i], language_core_1.isSemanticTokensEnabled);
|
|
431
|
-
const sourceEnd = (0, transform_1.toSourceOffset)(sourceScript, map, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled);
|
|
431
|
+
const sourceStart = (0, transform_1.toSourceOffset)(serviceScript, sourceScript, map, result.spans[i], language_core_1.isSemanticTokensEnabled);
|
|
432
|
+
const sourceEnd = (0, transform_1.toSourceOffset)(serviceScript, sourceScript, map, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled);
|
|
432
433
|
if (sourceStart !== undefined && sourceEnd !== undefined) {
|
|
433
434
|
spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
|
|
434
435
|
}
|
|
@@ -574,7 +575,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
574
575
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
575
576
|
if (serviceScript) {
|
|
576
577
|
const results = [];
|
|
577
|
-
for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(sourceScript, map, position)) {
|
|
578
|
+
for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position)) {
|
|
578
579
|
if (!(0, language_core_1.isCompletionEnabled)(mapping.data)) {
|
|
579
580
|
continue;
|
|
580
581
|
}
|
|
@@ -586,10 +587,10 @@ function decorateLanguageService(language, languageService) {
|
|
|
586
587
|
result.entries = result.entries.filter(entry => !!entry.sourceDisplay);
|
|
587
588
|
}
|
|
588
589
|
for (const entry of result.entries) {
|
|
589
|
-
entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(sourceScript, map, entry.replacementSpan, language_core_1.isCompletionEnabled);
|
|
590
|
+
entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, entry.replacementSpan, language_core_1.isCompletionEnabled);
|
|
590
591
|
}
|
|
591
592
|
result.optionalReplacementSpan = result.optionalReplacementSpan
|
|
592
|
-
&& (0, transform_1.transformTextSpan)(sourceScript, map, result.optionalReplacementSpan, language_core_1.isCompletionEnabled);
|
|
593
|
+
&& (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, result.optionalReplacementSpan, language_core_1.isCompletionEnabled);
|
|
593
594
|
const isAdditional = typeof mapping.data.completion === 'object' && mapping.data.completion.isAdditional;
|
|
594
595
|
if (isAdditional) {
|
|
595
596
|
results.push(result);
|
|
@@ -616,7 +617,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
616
617
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
617
618
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
618
619
|
if (serviceScript) {
|
|
619
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCompletionEnabled);
|
|
620
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCompletionEnabled);
|
|
620
621
|
if (generatePosition !== undefined) {
|
|
621
622
|
details = getCompletionEntryDetails(fileName, generatePosition, entryName, formatOptions, source, preferences, data);
|
|
622
623
|
}
|
|
@@ -649,12 +650,13 @@ function decorateLanguageService(language, languageService) {
|
|
|
649
650
|
start = 0;
|
|
650
651
|
end = 0;
|
|
651
652
|
}
|
|
652
|
-
|
|
653
|
-
|
|
653
|
+
const mappingOffset = (0, transform_1.getMappingOffset)(serviceScript, sourceScript);
|
|
654
|
+
start += mappingOffset;
|
|
655
|
+
end += mappingOffset;
|
|
654
656
|
const result = provideInlayHints(fileName, { start, length: end - start }, preferences);
|
|
655
657
|
const hints = [];
|
|
656
658
|
for (const hint of result) {
|
|
657
|
-
const sourcePosition = (0, transform_1.toSourceOffset)(sourceScript, map, hint.position, language_core_1.isInlayHintsEnabled);
|
|
659
|
+
const sourcePosition = (0, transform_1.toSourceOffset)(serviceScript, sourceScript, map, hint.position, language_core_1.isInlayHintsEnabled);
|
|
658
660
|
if (sourcePosition !== undefined) {
|
|
659
661
|
hints.push({
|
|
660
662
|
...hint,
|
|
@@ -683,7 +685,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
683
685
|
if (serviceScript) {
|
|
684
686
|
for (const [generatedOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
685
687
|
if (filter(mapping.data)) {
|
|
686
|
-
process(fileName, generatedOffset +
|
|
688
|
+
process(fileName, generatedOffset + (0, transform_1.getMappingOffset)(serviceScript, sourceScript));
|
|
687
689
|
}
|
|
688
690
|
}
|
|
689
691
|
}
|
|
@@ -703,16 +705,17 @@ function decorateLanguageService(language, languageService) {
|
|
|
703
705
|
results.push(result);
|
|
704
706
|
for (const ref of getLinkedCodes(result)) {
|
|
705
707
|
processedFilePositions.add(ref[0] + ':' + ref[1]);
|
|
706
|
-
const [
|
|
707
|
-
if (!
|
|
708
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
|
|
709
|
+
if (!serviceScript) {
|
|
708
710
|
continue;
|
|
709
711
|
}
|
|
710
|
-
const linkedCodeMap = language.linkedCodeMaps.get(
|
|
712
|
+
const linkedCodeMap = language.linkedCodeMaps.get(serviceScript.code);
|
|
711
713
|
if (!linkedCodeMap) {
|
|
712
714
|
continue;
|
|
713
715
|
}
|
|
714
|
-
|
|
715
|
-
|
|
716
|
+
const mappingOffset = (0, transform_1.getMappingOffset)(serviceScript, sourceScript);
|
|
717
|
+
for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - mappingOffset)) {
|
|
718
|
+
process(ref[0], linkedCodeOffset + mappingOffset);
|
|
716
719
|
}
|
|
717
720
|
}
|
|
718
721
|
}
|
|
@@ -64,7 +64,7 @@ function decorateLanguageServiceHost(ts, language, languageServiceHost) {
|
|
|
64
64
|
languageServiceHost.getScriptKind = fileName => {
|
|
65
65
|
const virtualScript = updateVirtualScript(fileName);
|
|
66
66
|
if (virtualScript) {
|
|
67
|
-
return virtualScript.
|
|
67
|
+
return virtualScript.scriptKind;
|
|
68
68
|
}
|
|
69
69
|
return getScriptKind(fileName);
|
|
70
70
|
};
|
|
@@ -92,14 +92,23 @@ function decorateLanguageServiceHost(ts, language, languageServiceHost) {
|
|
|
92
92
|
if (sourceScript?.generated) {
|
|
93
93
|
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
94
94
|
if (serviceScript) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
95
|
+
if (serviceScript.preventLeadingOffset) {
|
|
96
|
+
script[1] = {
|
|
97
|
+
extension: serviceScript.extension,
|
|
98
|
+
scriptKind: serviceScript.scriptKind,
|
|
99
|
+
snapshot: serviceScript.code.snapshot,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
const sourceContents = sourceScript.snapshot.getText(0, sourceScript.snapshot.getLength());
|
|
104
|
+
const virtualContents = sourceContents.split('\n').map(line => ' '.repeat(line.length)).join('\n')
|
|
105
|
+
+ serviceScript.code.snapshot.getText(0, serviceScript.code.snapshot.getLength());
|
|
106
|
+
script[1] = {
|
|
107
|
+
extension: serviceScript.extension,
|
|
108
|
+
scriptKind: serviceScript.scriptKind,
|
|
109
|
+
snapshot: ts.ScriptSnapshot.fromString(virtualContents),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
103
112
|
}
|
|
104
113
|
if (sourceScript.generated.languagePlugin.typescript?.getExtraServiceScripts) {
|
|
105
114
|
console.warn('getExtraServiceScripts() is not available in TS plugin.');
|
|
@@ -112,11 +112,11 @@ function proxyCreateProgram(ts, original, getLanguagePlugins) {
|
|
|
112
112
|
if (!parsedSourceFiles.has(originalSourceFile)) {
|
|
113
113
|
const sourceScript = language.scripts.get(fileName);
|
|
114
114
|
assert(!!sourceScript, '!!sourceScript');
|
|
115
|
-
parsedSourceFiles.set(originalSourceFile,
|
|
115
|
+
parsedSourceFiles.set(originalSourceFile, undefined);
|
|
116
116
|
if (sourceScript.generated?.languagePlugin.typescript) {
|
|
117
117
|
const { getServiceScript, getExtraServiceScripts } = sourceScript.generated.languagePlugin.typescript;
|
|
118
118
|
const serviceScript = getServiceScript(sourceScript.generated.root);
|
|
119
|
-
if (serviceScript) {
|
|
119
|
+
if (serviceScript && !serviceScript.preventLeadingOffset) {
|
|
120
120
|
let patchedText = originalSourceFile.text.split('\n').map(line => ' '.repeat(line.length)).join('\n');
|
|
121
121
|
let scriptKind = ts.ScriptKind.TS;
|
|
122
122
|
scriptKind = serviceScript.scriptKind;
|
|
@@ -131,7 +131,7 @@ function proxyCreateProgram(ts, original, getLanguagePlugins) {
|
|
|
131
131
|
}
|
|
132
132
|
}
|
|
133
133
|
}
|
|
134
|
-
return parsedSourceFiles.get(originalSourceFile);
|
|
134
|
+
return parsedSourceFiles.get(originalSourceFile) ?? originalSourceFile;
|
|
135
135
|
};
|
|
136
136
|
if (extensions.length) {
|
|
137
137
|
options.options.allowArbitraryExtensions = true;
|
package/lib/node/transform.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { CodeInformation, SourceMap, SourceScript } from '@volar/language-core';
|
|
1
|
+
import type { CodeInformation, SourceMap, SourceScript, TypeScriptServiceScript } from '@volar/language-core';
|
|
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;
|
|
@@ -10,8 +10,9 @@ 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(sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, textChange: ts.TextChange, filter: (data: CodeInformation) => boolean): ts.TextChange | undefined;
|
|
14
|
-
export declare function transformTextSpan(sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): ts.TextSpan | undefined;
|
|
15
|
-
export declare function toSourceOffset(sourceScript: SourceScript<string>, map: SourceMap
|
|
16
|
-
export declare function toGeneratedOffset(sourceScript: SourceScript<string>, map: SourceMap
|
|
17
|
-
export declare function toGeneratedOffsets(sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, position: number): Generator<readonly [number, import("@volar/language-core").Mapping<CodeInformation>], void, unknown>;
|
|
13
|
+
export declare function transformTextChange(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, textChange: ts.TextChange, filter: (data: CodeInformation) => boolean): ts.TextChange | undefined;
|
|
14
|
+
export declare function transformTextSpan(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): ts.TextSpan | undefined;
|
|
15
|
+
export declare function toSourceOffset(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
|
|
16
|
+
export declare function toGeneratedOffset(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
|
|
17
|
+
export declare function toGeneratedOffsets(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, position: number): Generator<readonly [number, import("@volar/language-core").Mapping<CodeInformation>], void, unknown>;
|
|
18
|
+
export declare function getMappingOffset(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>): number;
|
package/lib/node/transform.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.toGeneratedOffsets = exports.toGeneratedOffset = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.fillSourceFileText = exports.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
|
|
3
|
+
exports.getMappingOffset = exports.toGeneratedOffsets = 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();
|
|
@@ -29,7 +29,7 @@ function transformDiagnostic(language, diagnostic, isTsc) {
|
|
|
29
29
|
&& diagnostic.length !== undefined) {
|
|
30
30
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, diagnostic.file.fileName);
|
|
31
31
|
if (serviceScript) {
|
|
32
|
-
const sourceSpan = transformTextSpan(sourceScript, map, { start: diagnostic.start, length: diagnostic.length }, language_core_1.shouldReportDiagnostics);
|
|
32
|
+
const sourceSpan = transformTextSpan(serviceScript, sourceScript, map, { start: diagnostic.start, length: diagnostic.length }, language_core_1.shouldReportDiagnostics);
|
|
33
33
|
if (sourceSpan) {
|
|
34
34
|
if (isTsc) {
|
|
35
35
|
fillSourceFileText(language, diagnostic.file);
|
|
@@ -59,7 +59,7 @@ function fillSourceFileText(language, sourceFile) {
|
|
|
59
59
|
}
|
|
60
60
|
transformedSourceFile.add(sourceFile);
|
|
61
61
|
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
62
|
-
if (serviceScript) {
|
|
62
|
+
if (serviceScript && !serviceScript.preventLeadingOffset) {
|
|
63
63
|
sourceFile.text = sourceScript.snapshot.getText(0, sourceScript.snapshot.getLength())
|
|
64
64
|
+ sourceFile.text.substring(sourceScript.snapshot.getLength());
|
|
65
65
|
}
|
|
@@ -115,9 +115,9 @@ function transformSpan(language, fileName, textSpan, filter) {
|
|
|
115
115
|
if (!fileName || !textSpan) {
|
|
116
116
|
return;
|
|
117
117
|
}
|
|
118
|
-
const [
|
|
119
|
-
if (
|
|
120
|
-
const sourceSpan = transformTextSpan(sourceScript, map, textSpan, filter);
|
|
118
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
119
|
+
if (serviceScript) {
|
|
120
|
+
const sourceSpan = transformTextSpan(serviceScript, sourceScript, map, textSpan, filter);
|
|
121
121
|
if (sourceSpan) {
|
|
122
122
|
return {
|
|
123
123
|
fileName,
|
|
@@ -133,8 +133,8 @@ function transformSpan(language, fileName, textSpan, filter) {
|
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
135
|
exports.transformSpan = transformSpan;
|
|
136
|
-
function transformTextChange(sourceScript, map, textChange, filter) {
|
|
137
|
-
const sourceSpan = transformTextSpan(sourceScript, map, textChange.span, filter);
|
|
136
|
+
function transformTextChange(serviceScript, sourceScript, map, textChange, filter) {
|
|
137
|
+
const sourceSpan = transformTextSpan(serviceScript, sourceScript, map, textChange.span, filter);
|
|
138
138
|
if (sourceSpan) {
|
|
139
139
|
return {
|
|
140
140
|
newText: textChange.newText,
|
|
@@ -143,11 +143,11 @@ function transformTextChange(sourceScript, map, textChange, filter) {
|
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
145
|
exports.transformTextChange = transformTextChange;
|
|
146
|
-
function transformTextSpan(sourceScript, map, textSpan, filter) {
|
|
146
|
+
function transformTextSpan(serviceScript, sourceScript, map, textSpan, filter) {
|
|
147
147
|
const start = textSpan.start;
|
|
148
148
|
const end = textSpan.start + textSpan.length;
|
|
149
|
-
const sourceStart = toSourceOffset(sourceScript, map, start, filter);
|
|
150
|
-
const sourceEnd = toSourceOffset(sourceScript, map, end, filter);
|
|
149
|
+
const sourceStart = toSourceOffset(serviceScript, sourceScript, map, start, filter);
|
|
150
|
+
const sourceEnd = toSourceOffset(serviceScript, sourceScript, map, end, filter);
|
|
151
151
|
if (sourceStart !== undefined && sourceEnd !== undefined && sourceEnd >= sourceStart) {
|
|
152
152
|
return {
|
|
153
153
|
start: sourceStart,
|
|
@@ -156,26 +156,32 @@ function transformTextSpan(sourceScript, map, textSpan, filter) {
|
|
|
156
156
|
}
|
|
157
157
|
}
|
|
158
158
|
exports.transformTextSpan = transformTextSpan;
|
|
159
|
-
function toSourceOffset(sourceScript, map, position, filter) {
|
|
160
|
-
for (const [sourceOffset, mapping] of map.getSourceOffsets(position - sourceScript
|
|
159
|
+
function toSourceOffset(serviceScript, sourceScript, map, position, filter) {
|
|
160
|
+
for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(serviceScript, sourceScript))) {
|
|
161
161
|
if (filter(mapping.data)) {
|
|
162
162
|
return sourceOffset;
|
|
163
163
|
}
|
|
164
164
|
}
|
|
165
165
|
}
|
|
166
166
|
exports.toSourceOffset = toSourceOffset;
|
|
167
|
-
function toGeneratedOffset(sourceScript, map, position, filter) {
|
|
167
|
+
function toGeneratedOffset(serviceScript, sourceScript, map, position, filter) {
|
|
168
168
|
for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
169
169
|
if (filter(mapping.data)) {
|
|
170
|
-
return generateOffset + sourceScript
|
|
170
|
+
return generateOffset + getMappingOffset(serviceScript, sourceScript);
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
174
|
exports.toGeneratedOffset = toGeneratedOffset;
|
|
175
|
-
function* toGeneratedOffsets(sourceScript, map, position) {
|
|
175
|
+
function* toGeneratedOffsets(serviceScript, sourceScript, map, position) {
|
|
176
176
|
for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
177
|
-
yield [generateOffset + sourceScript
|
|
177
|
+
yield [generateOffset + getMappingOffset(serviceScript, sourceScript), mapping];
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
180
|
exports.toGeneratedOffsets = toGeneratedOffsets;
|
|
181
|
+
function getMappingOffset(serviceScript, sourceScript) {
|
|
182
|
+
return !serviceScript.preventLeadingOffset
|
|
183
|
+
? sourceScript.snapshot.getLength()
|
|
184
|
+
: 0;
|
|
185
|
+
}
|
|
186
|
+
exports.getMappingOffset = getMappingOffset;
|
|
181
187
|
//# sourceMappingURL=transform.js.map
|
package/lib/node/utils.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import type { Language } 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): readonly [import("@volar/language-core").TypeScriptServiceScript
|
|
3
|
+
export declare function getServiceScript(language: Language<string>, fileName: string): readonly [import("@volar/language-core").TypeScriptServiceScript<string>, import("@volar/language-core").SourceScript<string>, import("@volar/language-core").SourceMap<import("@volar/language-core").CodeInformation>] | readonly [undefined, undefined, undefined];
|
package/lib/node/utils.js
CHANGED
|
@@ -10,7 +10,7 @@ function getServiceScript(language, fileName) {
|
|
|
10
10
|
if (sourceScript?.generated) {
|
|
11
11
|
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
12
12
|
if (serviceScript) {
|
|
13
|
-
const map = language.maps.get(serviceScript.code
|
|
13
|
+
const map = language.maps.get(serviceScript.code);
|
|
14
14
|
if (map) {
|
|
15
15
|
return [serviceScript, sourceScript, map];
|
|
16
16
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { Language,
|
|
1
|
+
import { Language, TypeScriptExtraServiceScript } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
3
|
import type { createSys } from './createSys';
|
|
4
4
|
export interface TypeScriptProjectHost extends Pick<ts.LanguageServiceHost, 'getLocalizedDiagnosticMessages' | 'getCurrentDirectory' | 'getCompilationSettings' | 'getProjectReferences' | 'getScriptFileNames' | 'getProjectVersion' | 'getScriptSnapshot'> {
|
|
5
5
|
}
|
|
6
6
|
export declare function createLanguageServiceHost<T>(ts: typeof import('typescript'), sys: ReturnType<typeof createSys> | ts.System, language: Language<T>, asScrpitId: (fileName: string) => T, projectHost: TypeScriptProjectHost): {
|
|
7
7
|
languageServiceHost: ts.LanguageServiceHost;
|
|
8
|
-
getExtraServiceScript: (fileName: string) =>
|
|
8
|
+
getExtraServiceScript: (fileName: string) => TypeScriptExtraServiceScript<T> | undefined;
|
|
9
9
|
};
|
|
@@ -80,7 +80,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
|
|
|
80
80
|
getScriptKind(fileName) {
|
|
81
81
|
sync();
|
|
82
82
|
if (extraScriptRegistry.has(fileName)) {
|
|
83
|
-
return extraScriptRegistry.get(fileName)
|
|
83
|
+
return extraScriptRegistry.get(fileName).scriptKind;
|
|
84
84
|
}
|
|
85
85
|
const sourceScript = language.scripts.get(asScrpitId(fileName));
|
|
86
86
|
if (sourceScript?.generated) {
|
|
@@ -170,7 +170,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
|
|
|
170
170
|
for (const extraServiceScript of sourceScript.generated.languagePlugin.typescript?.getExtraServiceScripts?.(fileName, sourceScript.generated.root) ?? []) {
|
|
171
171
|
newTsVirtualFileSnapshots.add(extraServiceScript.code.snapshot);
|
|
172
172
|
tsFileNamesSet.add(extraServiceScript.fileName);
|
|
173
|
-
extraScriptRegistry.set(extraServiceScript.fileName,
|
|
173
|
+
extraScriptRegistry.set(extraServiceScript.fileName, extraServiceScript);
|
|
174
174
|
}
|
|
175
175
|
for (const code of (0, language_core_1.forEachEmbeddedCode)(sourceScript.generated.root)) {
|
|
176
176
|
newOtherVirtualFileSnapshots.add(code.snapshot);
|
|
@@ -197,7 +197,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
|
|
|
197
197
|
function getScriptSnapshot(fileName) {
|
|
198
198
|
sync();
|
|
199
199
|
if (extraScriptRegistry.has(fileName)) {
|
|
200
|
-
return extraScriptRegistry.get(fileName)
|
|
200
|
+
return extraScriptRegistry.get(fileName).code.snapshot;
|
|
201
201
|
}
|
|
202
202
|
const sourceScript = language.scripts.get(asScrpitId(fileName));
|
|
203
203
|
if (sourceScript?.generated) {
|
|
@@ -217,7 +217,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
|
|
|
217
217
|
}
|
|
218
218
|
const version = scriptVersions.get(fileName);
|
|
219
219
|
if (extraScriptRegistry.has(fileName)) {
|
|
220
|
-
const snapshot = extraScriptRegistry.get(fileName)
|
|
220
|
+
const snapshot = extraScriptRegistry.get(fileName).code.snapshot;
|
|
221
221
|
if (!version.map.has(snapshot)) {
|
|
222
222
|
version.map.set(snapshot, version.lastVersion++);
|
|
223
223
|
}
|
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.6",
|
|
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.6",
|
|
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.6"
|
|
23
23
|
},
|
|
24
|
-
"gitHead": "
|
|
24
|
+
"gitHead": "f3103e86be8d80cb36f66be4c054ef9a255c29b1"
|
|
25
25
|
}
|
package/env.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
declare module '@volar/langauge-core' {
|
|
2
|
-
interface Language<T> {
|
|
3
|
-
typescript?: {
|
|
4
|
-
configFileName: string | undefined;
|
|
5
|
-
sys: ts.System & {
|
|
6
|
-
version?: number;
|
|
7
|
-
sync?(): Promise<number>;
|
|
8
|
-
};
|
|
9
|
-
languageServiceHost: ts.LanguageServiceHost;
|
|
10
|
-
getExtraServiceScript(fileName: string): [SourceScript<T>, TypeScriptExtraServiceScript] | undefined;
|
|
11
|
-
asScriptId(fileName: string): T;
|
|
12
|
-
asFileName(scriptId: T): string;
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
}
|