@volar/typescript 2.0.0-alpha.0 → 2.0.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +2 -1
- package/index.js +2 -1
- package/lib/node/decorateLanguageService.d.ts +1 -1
- package/lib/node/decorateLanguageService.js +127 -242
- package/lib/node/decorateLanguageServiceHost.js +2 -2
- package/lib/node/decorateProgram.d.ts +3 -0
- package/lib/node/decorateProgram.js +48 -0
- package/lib/node/proxyCreateProgram.d.ts +3 -0
- package/lib/node/proxyCreateProgram.js +122 -0
- package/lib/node/transform.d.ts +10 -0
- package/lib/node/transform.js +137 -0
- package/lib/node/utils.d.ts +3 -0
- package/lib/node/utils.js +26 -0
- package/lib/protocol/createProject.js +14 -18
- package/lib/protocol/getProgram.d.ts +1 -4
- package/lib/protocol/getProgram.js +6 -10
- package/lib/starters/createAsyncTSServerPlugin.d.ts +3 -0
- package/lib/starters/createAsyncTSServerPlugin.js +82 -0
- package/lib/starters/createTSServerPlugin.d.ts +7 -0
- package/lib/starters/createTSServerPlugin.js +60 -0
- package/lib/starters/runTsc.d.ts +4 -0
- package/lib/starters/runTsc.js +49 -0
- package/package.json +5 -4
|
@@ -3,20 +3,44 @@ 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
|
-
|
|
7
|
-
|
|
6
|
+
const utils_1 = require("./utils");
|
|
7
|
+
const transform_1 = require("./transform");
|
|
8
|
+
function decorateLanguageService(files, languageService) {
|
|
9
|
+
// ignored methods
|
|
10
|
+
const { getNavigationTree, getOutliningSpans, } = languageService;
|
|
11
|
+
languageService.getNavigationTree = (fileName) => {
|
|
12
|
+
const [virtualFile] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
|
|
13
|
+
if (virtualFile) {
|
|
14
|
+
const tree = getNavigationTree(fileName);
|
|
15
|
+
tree.childItems = undefined;
|
|
16
|
+
return tree;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
return getNavigationTree(fileName);
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
languageService.getOutliningSpans = (fileName) => {
|
|
23
|
+
const [virtualFile] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
|
|
24
|
+
if (virtualFile) {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
return getOutliningSpans(fileName);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
// methods
|
|
8
32
|
const { findReferences, findRenameLocations, getCompletionEntryDetails, getCompletionsAtPosition, getDefinitionAndBoundSpan, getDefinitionAtPosition, getFileReferences, getImplementationAtPosition, getQuickInfoAtPosition, getReferencesAtPosition, getSemanticDiagnostics, getSyntacticDiagnostics, getSuggestionDiagnostics, getTypeDefinitionAtPosition, getEncodedSemanticClassifications, getDocumentHighlights, getApplicableRefactors, getEditsForRefactor, getRenameInfo, getCodeFixesAtPosition, prepareCallHierarchy, provideCallHierarchyIncomingCalls, provideCallHierarchyOutgoingCalls, provideInlayHints, organizeImports, } = languageService;
|
|
9
33
|
languageService.prepareCallHierarchy = (fileName, position) => {
|
|
10
|
-
const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
|
|
34
|
+
const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
|
|
11
35
|
if (virtualFile) {
|
|
12
36
|
for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
13
37
|
if ((0, language_core_1.isCallHierarchyEnabled)(mapping.data)) {
|
|
14
|
-
const item = prepareCallHierarchy(fileName, generateOffset +
|
|
38
|
+
const item = prepareCallHierarchy(fileName, generateOffset + sourceFile.snapshot.getLength());
|
|
15
39
|
if (Array.isArray(item)) {
|
|
16
|
-
return item.map(item => transformCallHierarchyItem(item, language_core_1.isCallHierarchyEnabled));
|
|
40
|
+
return item.map(item => (0, transform_1.transformCallHierarchyItem)(files, item, language_core_1.isCallHierarchyEnabled));
|
|
17
41
|
}
|
|
18
42
|
else if (item) {
|
|
19
|
-
return transformCallHierarchyItem(item, language_core_1.isCallHierarchyEnabled);
|
|
43
|
+
return (0, transform_1.transformCallHierarchyItem)(files, item, language_core_1.isCallHierarchyEnabled);
|
|
20
44
|
}
|
|
21
45
|
}
|
|
22
46
|
}
|
|
@@ -27,11 +51,11 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
27
51
|
};
|
|
28
52
|
languageService.provideCallHierarchyIncomingCalls = (fileName, position) => {
|
|
29
53
|
let calls = [];
|
|
30
|
-
const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
|
|
54
|
+
const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
|
|
31
55
|
if (virtualFile) {
|
|
32
56
|
for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
33
57
|
if ((0, language_core_1.isCallHierarchyEnabled)(mapping.data)) {
|
|
34
|
-
calls = provideCallHierarchyIncomingCalls(fileName, generateOffset +
|
|
58
|
+
calls = provideCallHierarchyIncomingCalls(fileName, generateOffset + sourceFile.snapshot.getLength());
|
|
35
59
|
}
|
|
36
60
|
}
|
|
37
61
|
}
|
|
@@ -40,10 +64,10 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
40
64
|
}
|
|
41
65
|
return calls
|
|
42
66
|
.map(call => {
|
|
43
|
-
const from = transformCallHierarchyItem(call.from, language_core_1.isCallHierarchyEnabled);
|
|
67
|
+
const from = (0, transform_1.transformCallHierarchyItem)(files, call.from, language_core_1.isCallHierarchyEnabled);
|
|
44
68
|
const fromSpans = call.fromSpans
|
|
45
|
-
.map(span => transformSpan(call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
|
|
46
|
-
.filter(notEmpty);
|
|
69
|
+
.map(span => (0, transform_1.transformSpan)(files, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
|
|
70
|
+
.filter(utils_1.notEmpty);
|
|
47
71
|
return {
|
|
48
72
|
from,
|
|
49
73
|
fromSpans,
|
|
@@ -52,11 +76,11 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
52
76
|
};
|
|
53
77
|
languageService.provideCallHierarchyOutgoingCalls = (fileName, position) => {
|
|
54
78
|
let calls = [];
|
|
55
|
-
const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
|
|
79
|
+
const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
|
|
56
80
|
if (virtualFile) {
|
|
57
81
|
for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
58
82
|
if ((0, language_core_1.isCallHierarchyEnabled)(mapping.data)) {
|
|
59
|
-
calls = provideCallHierarchyOutgoingCalls(fileName, generateOffset +
|
|
83
|
+
calls = provideCallHierarchyOutgoingCalls(fileName, generateOffset + sourceFile.snapshot.getLength());
|
|
60
84
|
}
|
|
61
85
|
}
|
|
62
86
|
}
|
|
@@ -65,10 +89,10 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
65
89
|
}
|
|
66
90
|
return calls
|
|
67
91
|
.map(call => {
|
|
68
|
-
const to = transformCallHierarchyItem(call.to, language_core_1.isCallHierarchyEnabled);
|
|
92
|
+
const to = (0, transform_1.transformCallHierarchyItem)(files, call.to, language_core_1.isCallHierarchyEnabled);
|
|
69
93
|
const fromSpans = call.fromSpans
|
|
70
|
-
.map(span => transformSpan(fileName, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
|
|
71
|
-
.filter(notEmpty);
|
|
94
|
+
.map(span => (0, transform_1.transformSpan)(files, fileName, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
|
|
95
|
+
.filter(utils_1.notEmpty);
|
|
72
96
|
return {
|
|
73
97
|
to,
|
|
74
98
|
fromSpans,
|
|
@@ -78,18 +102,18 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
78
102
|
languageService.organizeImports = (args, formatOptions, preferences) => {
|
|
79
103
|
const unresolved = organizeImports(args, formatOptions, preferences);
|
|
80
104
|
const resolved = unresolved
|
|
81
|
-
.map(changes => transformFileTextChanges(changes, language_core_1.isCodeActionsEnabled))
|
|
82
|
-
.filter(notEmpty);
|
|
105
|
+
.map(changes => (0, transform_1.transformFileTextChanges)(files, changes, language_core_1.isCodeActionsEnabled))
|
|
106
|
+
.filter(utils_1.notEmpty);
|
|
83
107
|
return resolved;
|
|
84
108
|
};
|
|
85
109
|
languageService.getQuickInfoAtPosition = (fileName, position) => {
|
|
86
|
-
const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
|
|
110
|
+
const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
|
|
87
111
|
if (virtualFile) {
|
|
88
112
|
for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
89
113
|
if ((0, language_core_1.isHoverEnabled)(mapping.data)) {
|
|
90
|
-
const result = getQuickInfoAtPosition(fileName, generateOffset +
|
|
114
|
+
const result = getQuickInfoAtPosition(fileName, generateOffset + sourceFile.snapshot.getLength());
|
|
91
115
|
if (result) {
|
|
92
|
-
const textSpan = transformSpan(fileName, result.textSpan, language_core_1.isHoverEnabled)?.textSpan;
|
|
116
|
+
const textSpan = (0, transform_1.transformSpan)(files, fileName, result.textSpan, language_core_1.isHoverEnabled)?.textSpan;
|
|
93
117
|
if (textSpan) {
|
|
94
118
|
return {
|
|
95
119
|
...result,
|
|
@@ -119,30 +143,30 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
119
143
|
...highlights,
|
|
120
144
|
highlightSpans: highlights.highlightSpans
|
|
121
145
|
.map(span => {
|
|
122
|
-
const textSpan = transformSpan(span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled)?.textSpan;
|
|
146
|
+
const textSpan = (0, transform_1.transformSpan)(files, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled)?.textSpan;
|
|
123
147
|
if (textSpan) {
|
|
124
148
|
return {
|
|
125
149
|
...span,
|
|
126
|
-
contextSpan: transformSpan(span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
|
|
150
|
+
contextSpan: (0, transform_1.transformSpan)(files, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
|
|
127
151
|
textSpan,
|
|
128
152
|
};
|
|
129
153
|
}
|
|
130
154
|
})
|
|
131
|
-
.filter(notEmpty),
|
|
155
|
+
.filter(utils_1.notEmpty),
|
|
132
156
|
};
|
|
133
157
|
});
|
|
134
158
|
return resolved;
|
|
135
159
|
};
|
|
136
160
|
languageService.getApplicableRefactors = (fileName, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
|
|
137
|
-
const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
|
|
161
|
+
const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
|
|
138
162
|
if (virtualFile) {
|
|
139
163
|
for (const [generateOffset, mapping] of map.getGeneratedOffsets(typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos)) {
|
|
140
164
|
if ((0, language_core_1.isCodeActionsEnabled)(mapping.data)) {
|
|
141
165
|
const por = typeof positionOrRange === 'number'
|
|
142
|
-
? generateOffset +
|
|
166
|
+
? generateOffset + sourceFile.snapshot.getLength()
|
|
143
167
|
: {
|
|
144
|
-
pos: generateOffset +
|
|
145
|
-
end: generateOffset + positionOrRange.end - positionOrRange.pos +
|
|
168
|
+
pos: generateOffset + sourceFile.snapshot.getLength(),
|
|
169
|
+
end: generateOffset + positionOrRange.end - positionOrRange.pos + sourceFile.snapshot.getLength(),
|
|
146
170
|
};
|
|
147
171
|
return getApplicableRefactors(fileName, por, preferences, triggerReason, kind, includeInteractiveActions);
|
|
148
172
|
}
|
|
@@ -155,15 +179,15 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
155
179
|
};
|
|
156
180
|
languageService.getEditsForRefactor = (fileName, formatOptions, positionOrRange, refactorName, actionName, preferences) => {
|
|
157
181
|
let edits;
|
|
158
|
-
const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
|
|
182
|
+
const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
|
|
159
183
|
if (virtualFile) {
|
|
160
184
|
for (const [generateOffset, mapping] of map.getGeneratedOffsets(typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos)) {
|
|
161
185
|
if ((0, language_core_1.isCodeActionsEnabled)(mapping.data)) {
|
|
162
186
|
const por = typeof positionOrRange === 'number'
|
|
163
|
-
? generateOffset +
|
|
187
|
+
? generateOffset + sourceFile.snapshot.getLength()
|
|
164
188
|
: {
|
|
165
|
-
pos: generateOffset +
|
|
166
|
-
end: generateOffset + positionOrRange.end - positionOrRange.pos +
|
|
189
|
+
pos: generateOffset + sourceFile.snapshot.getLength(),
|
|
190
|
+
end: generateOffset + positionOrRange.end - positionOrRange.pos + sourceFile.snapshot.getLength(),
|
|
167
191
|
};
|
|
168
192
|
edits = getEditsForRefactor(fileName, formatOptions, por, refactorName, actionName, preferences);
|
|
169
193
|
}
|
|
@@ -174,19 +198,19 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
174
198
|
}
|
|
175
199
|
if (edits) {
|
|
176
200
|
edits.edits = edits.edits
|
|
177
|
-
.map(edit => transformFileTextChanges(edit, language_core_1.isCodeActionsEnabled))
|
|
178
|
-
.filter(notEmpty);
|
|
201
|
+
.map(edit => (0, transform_1.transformFileTextChanges)(files, edit, language_core_1.isCodeActionsEnabled))
|
|
202
|
+
.filter(utils_1.notEmpty);
|
|
179
203
|
return edits;
|
|
180
204
|
}
|
|
181
205
|
};
|
|
182
206
|
languageService.getRenameInfo = (fileName, position, options) => {
|
|
183
|
-
const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
|
|
207
|
+
const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
|
|
184
208
|
if (virtualFile) {
|
|
185
209
|
for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
186
210
|
if ((0, language_core_1.isRenameEnabled)(mapping.data)) {
|
|
187
|
-
const info = getRenameInfo(fileName, generateOffset +
|
|
211
|
+
const info = getRenameInfo(fileName, generateOffset + sourceFile.snapshot.getLength(), options);
|
|
188
212
|
if (info.canRename) {
|
|
189
|
-
const span = transformSpan(fileName, info.triggerSpan, language_core_1.isRenameEnabled);
|
|
213
|
+
const span = (0, transform_1.transformSpan)(files, fileName, info.triggerSpan, language_core_1.isRenameEnabled);
|
|
190
214
|
if (span) {
|
|
191
215
|
info.triggerSpan = span.textSpan;
|
|
192
216
|
return info;
|
|
@@ -208,15 +232,17 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
208
232
|
};
|
|
209
233
|
languageService.getCodeFixesAtPosition = (fileName, start, end, errorCodes, formatOptions, preferences) => {
|
|
210
234
|
let fixes = [];
|
|
211
|
-
const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
|
|
235
|
+
const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
|
|
212
236
|
if (virtualFile) {
|
|
213
237
|
for (const [generateStart, mapping] of map.getGeneratedOffsets(start)) {
|
|
214
238
|
if ((0, language_core_1.isCodeActionsEnabled)(mapping.data)) {
|
|
215
239
|
for (const [generateEnd, mapping] of map.getGeneratedOffsets(end)) {
|
|
216
240
|
if ((0, language_core_1.isCodeActionsEnabled)(mapping.data)) {
|
|
217
|
-
fixes = getCodeFixesAtPosition(fileName, generateStart +
|
|
241
|
+
fixes = getCodeFixesAtPosition(fileName, generateStart + sourceFile.snapshot.getLength(), generateEnd + sourceFile.snapshot.getLength(), errorCodes, formatOptions, preferences);
|
|
242
|
+
break;
|
|
218
243
|
}
|
|
219
244
|
}
|
|
245
|
+
break;
|
|
220
246
|
}
|
|
221
247
|
}
|
|
222
248
|
}
|
|
@@ -224,13 +250,13 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
224
250
|
fixes = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
|
|
225
251
|
}
|
|
226
252
|
fixes = fixes.map(fix => {
|
|
227
|
-
fix.changes = fix.changes.map(edit => transformFileTextChanges(edit, language_core_1.isCodeActionsEnabled)).filter(notEmpty);
|
|
253
|
+
fix.changes = fix.changes.map(edit => (0, transform_1.transformFileTextChanges)(files, edit, language_core_1.isCodeActionsEnabled)).filter(utils_1.notEmpty);
|
|
228
254
|
return fix;
|
|
229
255
|
});
|
|
230
256
|
return fixes;
|
|
231
257
|
};
|
|
232
258
|
languageService.getEncodedSemanticClassifications = (fileName, span, format) => {
|
|
233
|
-
const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
|
|
259
|
+
const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
|
|
234
260
|
if (virtualFile) {
|
|
235
261
|
let start;
|
|
236
262
|
let end;
|
|
@@ -246,16 +272,14 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
246
272
|
start = 0;
|
|
247
273
|
end = 0;
|
|
248
274
|
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
end += sourceFile.snapshot.getLength();
|
|
252
|
-
}
|
|
275
|
+
start += sourceFile.snapshot.getLength();
|
|
276
|
+
end += sourceFile.snapshot.getLength();
|
|
253
277
|
const result = getEncodedSemanticClassifications(fileName, { start, length: end - start }, format);
|
|
254
278
|
const spans = [];
|
|
255
279
|
for (let i = 0; i < result.spans.length; i += 3) {
|
|
256
|
-
for (const [sourceStart, mapping] of map.getSourceOffsets(result.spans[i] -
|
|
280
|
+
for (const [sourceStart, mapping] of map.getSourceOffsets(result.spans[i] - sourceFile.snapshot.getLength())) {
|
|
257
281
|
if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data)) {
|
|
258
|
-
for (const [sourceEnd, mapping] of map.getSourceOffsets(result.spans[i] + result.spans[i + 1] -
|
|
282
|
+
for (const [sourceEnd, mapping] of map.getSourceOffsets(result.spans[i] + result.spans[i + 1] - sourceFile.snapshot.getLength())) {
|
|
259
283
|
if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data)) {
|
|
260
284
|
spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
|
|
261
285
|
break;
|
|
@@ -274,18 +298,18 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
274
298
|
};
|
|
275
299
|
languageService.getSyntacticDiagnostics = (fileName) => {
|
|
276
300
|
return getSyntacticDiagnostics(fileName)
|
|
277
|
-
.map(
|
|
278
|
-
.filter(notEmpty);
|
|
301
|
+
.map(d => (0, transform_1.transformDiagnostic)(files, d))
|
|
302
|
+
.filter(utils_1.notEmpty);
|
|
279
303
|
};
|
|
280
304
|
languageService.getSemanticDiagnostics = (fileName) => {
|
|
281
305
|
return getSemanticDiagnostics(fileName)
|
|
282
|
-
.map(
|
|
283
|
-
.filter(notEmpty);
|
|
306
|
+
.map(d => (0, transform_1.transformDiagnostic)(files, d))
|
|
307
|
+
.filter(utils_1.notEmpty);
|
|
284
308
|
};
|
|
285
309
|
languageService.getSuggestionDiagnostics = (fileName) => {
|
|
286
310
|
return getSuggestionDiagnostics(fileName)
|
|
287
|
-
.map(
|
|
288
|
-
.filter(notEmpty);
|
|
311
|
+
.map(d => (0, transform_1.transformDiagnostic)(files, d))
|
|
312
|
+
.filter(utils_1.notEmpty);
|
|
289
313
|
};
|
|
290
314
|
languageService.getDefinitionAndBoundSpan = (fileName, position) => {
|
|
291
315
|
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, position => getDefinitionAndBoundSpan(fileName, position), function* (result) {
|
|
@@ -294,15 +318,15 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
294
318
|
}
|
|
295
319
|
});
|
|
296
320
|
const textSpan = unresolved
|
|
297
|
-
.map(s => transformSpan(fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
|
|
298
|
-
.filter(notEmpty)[0];
|
|
321
|
+
.map(s => (0, transform_1.transformSpan)(files, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
|
|
322
|
+
.filter(utils_1.notEmpty)[0];
|
|
299
323
|
if (!textSpan)
|
|
300
324
|
return;
|
|
301
325
|
const definitions = unresolved
|
|
302
326
|
.map(s => s.definitions
|
|
303
|
-
?.map(s => transformDocumentSpan(s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
|
|
304
|
-
.filter(notEmpty))
|
|
305
|
-
.filter(notEmpty)
|
|
327
|
+
?.map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
|
|
328
|
+
.filter(utils_1.notEmpty))
|
|
329
|
+
.filter(utils_1.notEmpty)
|
|
306
330
|
.flat();
|
|
307
331
|
return {
|
|
308
332
|
textSpan,
|
|
@@ -320,17 +344,17 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
320
344
|
const resolved = unresolved
|
|
321
345
|
.flat()
|
|
322
346
|
.map(symbol => {
|
|
323
|
-
const definition = transformDocumentSpan(symbol.definition, language_core_1.isDefinitionEnabled);
|
|
347
|
+
const definition = (0, transform_1.transformDocumentSpan)(files, symbol.definition, language_core_1.isDefinitionEnabled);
|
|
324
348
|
if (definition) {
|
|
325
349
|
return {
|
|
326
350
|
definition,
|
|
327
351
|
references: symbol.references
|
|
328
|
-
.map(r => transformDocumentSpan(r, language_core_1.isReferencesEnabled))
|
|
329
|
-
.filter(notEmpty),
|
|
352
|
+
.map(r => (0, transform_1.transformDocumentSpan)(files, r, language_core_1.isReferencesEnabled))
|
|
353
|
+
.filter(utils_1.notEmpty),
|
|
330
354
|
};
|
|
331
355
|
}
|
|
332
356
|
})
|
|
333
|
-
.filter(notEmpty);
|
|
357
|
+
.filter(utils_1.notEmpty);
|
|
334
358
|
return (0, dedupe_1.dedupeReferencedSymbols)(resolved);
|
|
335
359
|
};
|
|
336
360
|
languageService.getDefinitionAtPosition = (fileName, position) => {
|
|
@@ -341,8 +365,8 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
341
365
|
});
|
|
342
366
|
const resolved = unresolved
|
|
343
367
|
.flat()
|
|
344
|
-
.map(s => transformDocumentSpan(s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
|
|
345
|
-
.filter(notEmpty);
|
|
368
|
+
.map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
|
|
369
|
+
.filter(utils_1.notEmpty);
|
|
346
370
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
347
371
|
};
|
|
348
372
|
languageService.getTypeDefinitionAtPosition = (fileName, position) => {
|
|
@@ -353,8 +377,8 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
353
377
|
});
|
|
354
378
|
const resolved = unresolved
|
|
355
379
|
.flat()
|
|
356
|
-
.map(s => transformDocumentSpan(s, language_core_1.isTypeDefinitionEnabled))
|
|
357
|
-
.filter(notEmpty);
|
|
380
|
+
.map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isTypeDefinitionEnabled))
|
|
381
|
+
.filter(utils_1.notEmpty);
|
|
358
382
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
359
383
|
};
|
|
360
384
|
languageService.getImplementationAtPosition = (fileName, position) => {
|
|
@@ -365,8 +389,8 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
365
389
|
});
|
|
366
390
|
const resolved = unresolved
|
|
367
391
|
.flat()
|
|
368
|
-
.map(s => transformDocumentSpan(s, language_core_1.isImplementationEnabled))
|
|
369
|
-
.filter(notEmpty);
|
|
392
|
+
.map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isImplementationEnabled))
|
|
393
|
+
.filter(utils_1.notEmpty);
|
|
370
394
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
371
395
|
};
|
|
372
396
|
languageService.findRenameLocations = (fileName, position, findInStrings, findInComments, preferences) => {
|
|
@@ -377,8 +401,8 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
377
401
|
});
|
|
378
402
|
const resolved = unresolved
|
|
379
403
|
.flat()
|
|
380
|
-
.map(s => transformDocumentSpan(s, language_core_1.isRenameEnabled))
|
|
381
|
-
.filter(notEmpty);
|
|
404
|
+
.map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isRenameEnabled))
|
|
405
|
+
.filter(utils_1.notEmpty);
|
|
382
406
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
383
407
|
};
|
|
384
408
|
languageService.getReferencesAtPosition = (fileName, position) => {
|
|
@@ -389,23 +413,23 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
389
413
|
});
|
|
390
414
|
const resolved = unresolved
|
|
391
415
|
.flat()
|
|
392
|
-
.map(s => transformDocumentSpan(s, language_core_1.isReferencesEnabled))
|
|
393
|
-
.filter(notEmpty);
|
|
416
|
+
.map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isReferencesEnabled))
|
|
417
|
+
.filter(utils_1.notEmpty);
|
|
394
418
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
395
419
|
};
|
|
396
|
-
// need client patch
|
|
397
420
|
languageService.getCompletionsAtPosition = (fileName, position, options, formattingSettings) => {
|
|
398
|
-
const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
|
|
421
|
+
const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
|
|
399
422
|
if (virtualFile) {
|
|
400
423
|
for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
401
424
|
if ((0, language_core_1.isCompletionEnabled)(mapping.data)) {
|
|
402
|
-
const result = getCompletionsAtPosition(fileName, generateOffset +
|
|
425
|
+
const result = getCompletionsAtPosition(fileName, generateOffset + sourceFile.snapshot.getLength(), options, formattingSettings);
|
|
403
426
|
if (result) {
|
|
404
427
|
for (const entry of result.entries) {
|
|
405
|
-
entry.replacementSpan = transformSpan(fileName, entry.replacementSpan, language_core_1.isCompletionEnabled)?.textSpan;
|
|
428
|
+
entry.replacementSpan = (0, transform_1.transformSpan)(files, fileName, entry.replacementSpan, language_core_1.isCompletionEnabled)?.textSpan;
|
|
406
429
|
}
|
|
407
|
-
result.optionalReplacementSpan = transformSpan(fileName, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.textSpan;
|
|
430
|
+
result.optionalReplacementSpan = (0, transform_1.transformSpan)(files, fileName, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.textSpan;
|
|
408
431
|
}
|
|
432
|
+
return result;
|
|
409
433
|
}
|
|
410
434
|
}
|
|
411
435
|
}
|
|
@@ -414,16 +438,28 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
414
438
|
}
|
|
415
439
|
};
|
|
416
440
|
languageService.getCompletionEntryDetails = (fileName, position, entryName, formatOptions, source, preferences, data) => {
|
|
417
|
-
|
|
441
|
+
let details;
|
|
442
|
+
const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
|
|
443
|
+
if (virtualFile) {
|
|
444
|
+
for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
445
|
+
if ((0, language_core_1.isCompletionEnabled)(mapping.data)) {
|
|
446
|
+
details = getCompletionEntryDetails(fileName, generateOffset + sourceFile.snapshot.getLength(), entryName, formatOptions, source, preferences, data);
|
|
447
|
+
break;
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
return getCompletionEntryDetails(fileName, position, entryName, formatOptions, source, preferences, data);
|
|
453
|
+
}
|
|
418
454
|
if (details?.codeActions) {
|
|
419
455
|
for (const codeAction of details.codeActions) {
|
|
420
|
-
codeAction.changes = codeAction.changes.map(edit => transformFileTextChanges(edit, language_core_1.
|
|
456
|
+
codeAction.changes = codeAction.changes.map(edit => (0, transform_1.transformFileTextChanges)(files, edit, language_core_1.isCompletionEnabled)).filter(utils_1.notEmpty);
|
|
421
457
|
}
|
|
422
458
|
}
|
|
423
459
|
return details;
|
|
424
460
|
};
|
|
425
461
|
languageService.provideInlayHints = (fileName, span, preferences) => {
|
|
426
|
-
const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
|
|
462
|
+
const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
|
|
427
463
|
if (virtualFile) {
|
|
428
464
|
let start;
|
|
429
465
|
let end;
|
|
@@ -439,14 +475,12 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
439
475
|
start = 0;
|
|
440
476
|
end = 0;
|
|
441
477
|
}
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
end += sourceFile.snapshot.getLength();
|
|
445
|
-
}
|
|
478
|
+
start += sourceFile.snapshot.getLength();
|
|
479
|
+
end += sourceFile.snapshot.getLength();
|
|
446
480
|
const result = provideInlayHints(fileName, { start, length: end - start }, preferences);
|
|
447
481
|
const hints = [];
|
|
448
482
|
for (const hint of result) {
|
|
449
|
-
for (const [sourcePosition, mapping] of map.getSourceOffsets(hint.position -
|
|
483
|
+
for (const [sourcePosition, mapping] of map.getSourceOffsets(hint.position - sourceFile.snapshot.getLength())) {
|
|
450
484
|
if ((0, language_core_1.isInlayHintsEnabled)(mapping.data)) {
|
|
451
485
|
hints.push({
|
|
452
486
|
...hint,
|
|
@@ -465,18 +499,18 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
465
499
|
languageService.getFileReferences = (fileName) => {
|
|
466
500
|
const unresolved = getFileReferences(fileName);
|
|
467
501
|
const resolved = unresolved
|
|
468
|
-
.map(s => transformDocumentSpan(s, language_core_1.isReferencesEnabled))
|
|
469
|
-
.filter(notEmpty);
|
|
502
|
+
.map(s => (0, transform_1.transformDocumentSpan)(files, s, language_core_1.isReferencesEnabled))
|
|
503
|
+
.filter(utils_1.notEmpty);
|
|
470
504
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
471
505
|
};
|
|
472
506
|
function linkedCodeFeatureWorker(fileName, position, filter, worker, getLinkedCodes) {
|
|
473
507
|
let results = [];
|
|
474
508
|
const processedFilePositions = new Set();
|
|
475
|
-
const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
|
|
509
|
+
const [virtualFile, sourceFile, map] = (0, utils_1.getVirtualFileAndMap)(files, fileName);
|
|
476
510
|
if (virtualFile) {
|
|
477
511
|
for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
478
512
|
if (filter(mapping.data)) {
|
|
479
|
-
process(fileName, generateOffset +
|
|
513
|
+
process(fileName, generateOffset + sourceFile.snapshot.getLength());
|
|
480
514
|
}
|
|
481
515
|
}
|
|
482
516
|
}
|
|
@@ -494,167 +528,18 @@ function decorateLanguageService(virtualFiles, languageService, isTsPlugin) {
|
|
|
494
528
|
results = results.concat(result);
|
|
495
529
|
for (const ref of getLinkedCodes(result)) {
|
|
496
530
|
processedFilePositions.add(ref[0] + ':' + ref[1]);
|
|
497
|
-
const [virtualFile, sourceFile] = getVirtualFileAndMap(ref[0]);
|
|
531
|
+
const [virtualFile, sourceFile] = (0, utils_1.getVirtualFileAndMap)(files, ref[0]);
|
|
498
532
|
if (!virtualFile)
|
|
499
533
|
continue;
|
|
500
|
-
const linkedCodeMap =
|
|
534
|
+
const linkedCodeMap = files.getLinkedCodeMap(virtualFile);
|
|
501
535
|
if (!linkedCodeMap)
|
|
502
536
|
continue;
|
|
503
|
-
for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] -
|
|
504
|
-
process(ref[0], linkedCodeOffset +
|
|
505
|
-
}
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
// transforms
|
|
510
|
-
function transformCallHierarchyItem(item, filter) {
|
|
511
|
-
const span = transformSpan(item.file, item.span, filter);
|
|
512
|
-
const selectionSpan = transformSpan(item.file, item.selectionSpan, filter);
|
|
513
|
-
return {
|
|
514
|
-
...item,
|
|
515
|
-
span: span?.textSpan ?? { start: 0, length: 0 },
|
|
516
|
-
selectionSpan: selectionSpan?.textSpan ?? { start: 0, length: 0 },
|
|
517
|
-
};
|
|
518
|
-
}
|
|
519
|
-
function transformDiagnostic(diagnostic) {
|
|
520
|
-
if (!transformedDiagnostics.has(diagnostic)) {
|
|
521
|
-
if (diagnostic.start !== undefined && diagnostic.file) {
|
|
522
|
-
transformedDiagnostics.set(diagnostic, undefined);
|
|
523
|
-
const [virtualFile, sourceFile, map] = getVirtualFileAndMap(diagnostic.file?.fileName);
|
|
524
|
-
if (virtualFile) {
|
|
525
|
-
for (const [sourceOffset, mapping] of map.getSourceOffsets(diagnostic.start - (isTsPlugin ? sourceFile.snapshot.getLength() : 0))) {
|
|
526
|
-
if ((0, language_core_1.shouldReportDiagnostics)(mapping.data)) {
|
|
527
|
-
transformedDiagnostics.set(diagnostic, {
|
|
528
|
-
...diagnostic,
|
|
529
|
-
start: sourceOffset,
|
|
530
|
-
});
|
|
531
|
-
break;
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
}
|
|
535
|
-
else {
|
|
536
|
-
transformedDiagnostics.set(diagnostic, diagnostic);
|
|
537
|
+
for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - sourceFile.snapshot.getLength())) {
|
|
538
|
+
process(ref[0], linkedCodeOffset + sourceFile.snapshot.getLength());
|
|
537
539
|
}
|
|
538
540
|
}
|
|
539
|
-
else {
|
|
540
|
-
transformedDiagnostics.set(diagnostic, diagnostic);
|
|
541
|
-
}
|
|
542
|
-
if (diagnostic.relatedInformation) {
|
|
543
|
-
diagnostic.relatedInformation = diagnostic.relatedInformation
|
|
544
|
-
.map(transformDiagnostic)
|
|
545
|
-
.filter(notEmpty);
|
|
546
|
-
}
|
|
547
541
|
}
|
|
548
|
-
return transformedDiagnostics.get(diagnostic);
|
|
549
|
-
}
|
|
550
|
-
function transformFileTextChanges(changes, filter) {
|
|
551
|
-
const [_, source] = getVirtualFileAndMap(changes.fileName);
|
|
552
|
-
if (source) {
|
|
553
|
-
return {
|
|
554
|
-
...changes,
|
|
555
|
-
fileName: source.id,
|
|
556
|
-
textChanges: changes.textChanges.map(c => {
|
|
557
|
-
const span = transformSpan(changes.fileName, c.span, filter);
|
|
558
|
-
if (span) {
|
|
559
|
-
return {
|
|
560
|
-
...c,
|
|
561
|
-
span: span.textSpan,
|
|
562
|
-
};
|
|
563
|
-
}
|
|
564
|
-
}).filter(notEmpty),
|
|
565
|
-
};
|
|
566
|
-
}
|
|
567
|
-
else {
|
|
568
|
-
return changes;
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
function transformDocumentSpan(documentSpan, filter, shouldFallback) {
|
|
572
|
-
let textSpan = transformSpan(documentSpan.fileName, documentSpan.textSpan, filter);
|
|
573
|
-
if (!textSpan && shouldFallback) {
|
|
574
|
-
const [virtualFile, source] = getVirtualFileAndMap(documentSpan.fileName);
|
|
575
|
-
if (virtualFile) {
|
|
576
|
-
textSpan = {
|
|
577
|
-
fileName: source.id,
|
|
578
|
-
textSpan: { start: 0, length: 0 },
|
|
579
|
-
};
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
if (!textSpan)
|
|
583
|
-
return;
|
|
584
|
-
const contextSpan = transformSpan(documentSpan.fileName, documentSpan.contextSpan, filter);
|
|
585
|
-
const originalTextSpan = transformSpan(documentSpan.originalFileName, documentSpan.originalTextSpan, filter);
|
|
586
|
-
const originalContextSpan = transformSpan(documentSpan.originalFileName, documentSpan.originalContextSpan, filter);
|
|
587
|
-
return {
|
|
588
|
-
...documentSpan,
|
|
589
|
-
fileName: textSpan.fileName,
|
|
590
|
-
textSpan: textSpan.textSpan,
|
|
591
|
-
contextSpan: contextSpan?.textSpan,
|
|
592
|
-
originalFileName: originalTextSpan?.fileName,
|
|
593
|
-
originalTextSpan: originalTextSpan?.textSpan,
|
|
594
|
-
originalContextSpan: originalContextSpan?.textSpan,
|
|
595
|
-
};
|
|
596
|
-
}
|
|
597
|
-
function transformSpan(fileName, textSpan, filter) {
|
|
598
|
-
if (!fileName)
|
|
599
|
-
return;
|
|
600
|
-
if (!textSpan)
|
|
601
|
-
return;
|
|
602
|
-
const [virtualFile, sourceFile, map] = getVirtualFileAndMap(fileName);
|
|
603
|
-
if (virtualFile) {
|
|
604
|
-
for (const sourceStart of map.getSourceOffsets(textSpan.start - (isTsPlugin ? sourceFile.snapshot.getLength() : 0))) {
|
|
605
|
-
if (filter(sourceStart[1].data)) {
|
|
606
|
-
for (const sourceEnd of map.getSourceOffsets(textSpan.start + textSpan.length - (isTsPlugin ? sourceFile.snapshot.getLength() : 0))) {
|
|
607
|
-
if (filter(sourceEnd[1].data)) {
|
|
608
|
-
return {
|
|
609
|
-
fileName: sourceFile.id,
|
|
610
|
-
textSpan: {
|
|
611
|
-
start: sourceStart[0],
|
|
612
|
-
length: sourceEnd[0] - sourceStart[0],
|
|
613
|
-
},
|
|
614
|
-
};
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
}
|
|
619
|
-
}
|
|
620
|
-
else {
|
|
621
|
-
return {
|
|
622
|
-
fileName,
|
|
623
|
-
textSpan,
|
|
624
|
-
};
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
function getVirtualFileAndMap(fileName) {
|
|
628
|
-
if (isTsPlugin) {
|
|
629
|
-
const sourceFile = virtualFiles.getSourceFile(fileName);
|
|
630
|
-
if (sourceFile?.virtualFile) {
|
|
631
|
-
for (const virtualFile of (0, language_core_1.forEachEmbeddedFile)(sourceFile.virtualFile[0])) {
|
|
632
|
-
const ext = virtualFile.id.substring(fileName.length);
|
|
633
|
-
if (virtualFile.typescript && (ext === '.d.ts' || ext.match(/^\.(js|ts)x?$/))) {
|
|
634
|
-
for (const map of virtualFiles.getMaps(virtualFile)) {
|
|
635
|
-
if (map[1][0] === sourceFile.snapshot) {
|
|
636
|
-
return [virtualFile, sourceFile, map[1][1]];
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
}
|
|
642
|
-
}
|
|
643
|
-
else {
|
|
644
|
-
const [virtualFile, sourceFile] = virtualFiles.getVirtualFile(fileName);
|
|
645
|
-
if (virtualFile) {
|
|
646
|
-
for (const map of virtualFiles.getMaps(virtualFile)) {
|
|
647
|
-
if (map[1][0] === sourceFile.snapshot) {
|
|
648
|
-
return [virtualFile, sourceFile, map[1][1]];
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
}
|
|
652
|
-
}
|
|
653
|
-
return [undefined, undefined, undefined];
|
|
654
542
|
}
|
|
655
543
|
}
|
|
656
544
|
exports.decorateLanguageService = decorateLanguageService;
|
|
657
|
-
function notEmpty(value) {
|
|
658
|
-
return value !== null && value !== undefined;
|
|
659
|
-
}
|
|
660
545
|
//# sourceMappingURL=decorateLanguageService.js.map
|