@volar/typescript 2.3.0-alpha.6 → 2.3.0-alpha.8
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 +152 -93
- package/lib/node/decorateProgram.js +24 -9
- package/lib/node/transform.d.ts +14 -9
- package/lib/node/transform.js +115 -62
- package/lib/node/utils.d.ts +2 -2
- package/lib/node/utils.js +21 -1
- package/lib/protocol/createProject.d.ts +1 -1
- package/lib/quickstart/createAsyncLanguageServicePlugin.js +1 -1
- package/lib/quickstart/createLanguageServicePlugin.js +2 -1
- package/package.json +4 -4
|
@@ -11,9 +11,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
11
11
|
const { getNavigationTree, getOutliningSpans, } = languageService;
|
|
12
12
|
languageService.getNavigationTree = filePath => {
|
|
13
13
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
14
|
-
const [serviceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
15
|
-
if (serviceScript) {
|
|
16
|
-
const tree = getNavigationTree(
|
|
14
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
15
|
+
if (serviceScript || sourceScript?.associatedOnly) {
|
|
16
|
+
const tree = getNavigationTree(sourceScript.id);
|
|
17
17
|
tree.childItems = undefined;
|
|
18
18
|
return tree;
|
|
19
19
|
}
|
|
@@ -23,8 +23,8 @@ function decorateLanguageService(language, languageService) {
|
|
|
23
23
|
};
|
|
24
24
|
languageService.getOutliningSpans = filePath => {
|
|
25
25
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
26
|
-
const [serviceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
27
|
-
if (serviceScript) {
|
|
26
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
27
|
+
if (serviceScript || sourceScript?.associatedOnly) {
|
|
28
28
|
return [];
|
|
29
29
|
}
|
|
30
30
|
else {
|
|
@@ -36,13 +36,16 @@ function decorateLanguageService(language, languageService) {
|
|
|
36
36
|
languageService.getFormattingEditsForDocument = (filePath, options) => {
|
|
37
37
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
38
38
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
39
|
+
if (sourceScript?.associatedOnly) {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
39
42
|
if (serviceScript) {
|
|
40
43
|
if (!map.mappings.some(mapping => (0, language_core_1.isFormattingEnabled)(mapping.data))) {
|
|
41
44
|
return [];
|
|
42
45
|
}
|
|
43
|
-
const edits = getFormattingEditsForDocument(
|
|
46
|
+
const edits = getFormattingEditsForDocument(sourceScript.id, options);
|
|
44
47
|
return edits
|
|
45
|
-
.map(edit => (0, transform_1.transformTextChange)(serviceScript, sourceScript,
|
|
48
|
+
.map(edit => (0, transform_1.transformTextChange)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, edit, language_core_1.isFormattingEnabled)?.[1])
|
|
46
49
|
.filter(utils_1.notEmpty);
|
|
47
50
|
}
|
|
48
51
|
else {
|
|
@@ -52,13 +55,16 @@ function decorateLanguageService(language, languageService) {
|
|
|
52
55
|
languageService.getFormattingEditsForRange = (filePath, start, end, options) => {
|
|
53
56
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
54
57
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
58
|
+
if (sourceScript?.associatedOnly) {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
55
61
|
if (serviceScript) {
|
|
56
62
|
const generateStart = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, start, language_core_1.isFormattingEnabled);
|
|
57
63
|
const generateEnd = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, end, language_core_1.isFormattingEnabled);
|
|
58
64
|
if (generateStart !== undefined && generateEnd !== undefined) {
|
|
59
|
-
const edits = getFormattingEditsForRange(
|
|
65
|
+
const edits = getFormattingEditsForRange(sourceScript.id, generateStart, generateEnd, options);
|
|
60
66
|
return edits
|
|
61
|
-
.map(edit => (0, transform_1.transformTextChange)(serviceScript, sourceScript,
|
|
67
|
+
.map(edit => (0, transform_1.transformTextChange)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, edit, language_core_1.isFormattingEnabled)?.[1])
|
|
62
68
|
.filter(utils_1.notEmpty);
|
|
63
69
|
}
|
|
64
70
|
return [];
|
|
@@ -70,12 +76,15 @@ function decorateLanguageService(language, languageService) {
|
|
|
70
76
|
languageService.getFormattingEditsAfterKeystroke = (filePath, position, key, options) => {
|
|
71
77
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
72
78
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
79
|
+
if (sourceScript?.associatedOnly) {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
73
82
|
if (serviceScript) {
|
|
74
83
|
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isFormattingEnabled);
|
|
75
84
|
if (generatePosition !== undefined) {
|
|
76
|
-
const edits = getFormattingEditsAfterKeystroke(
|
|
85
|
+
const edits = getFormattingEditsAfterKeystroke(sourceScript.id, generatePosition, key, options);
|
|
77
86
|
return edits
|
|
78
|
-
.map(edit => (0, transform_1.transformTextChange)(serviceScript, sourceScript,
|
|
87
|
+
.map(edit => (0, transform_1.transformTextChange)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, edit, language_core_1.isFormattingEnabled)?.[1])
|
|
79
88
|
.filter(utils_1.notEmpty);
|
|
80
89
|
}
|
|
81
90
|
return [];
|
|
@@ -86,21 +95,22 @@ function decorateLanguageService(language, languageService) {
|
|
|
86
95
|
};
|
|
87
96
|
languageService.getEditsForFileRename = (oldFilePath, newFilePath, formatOptions, preferences) => {
|
|
88
97
|
const edits = getEditsForFileRename(oldFilePath, newFilePath, formatOptions, preferences);
|
|
89
|
-
return edits
|
|
90
|
-
.map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isRenameEnabled))
|
|
91
|
-
.filter(utils_1.notEmpty);
|
|
98
|
+
return (0, transform_1.transformFileTextChanges)(transform_1.ToSourceMode.IncludeAssciated, language, edits, language_core_1.isRenameEnabled);
|
|
92
99
|
};
|
|
93
100
|
languageService.getLinkedEditingRangeAtPosition = (filePath, position) => {
|
|
94
101
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
95
102
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
103
|
+
if (sourceScript?.associatedOnly) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
96
106
|
if (serviceScript) {
|
|
97
107
|
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isLinkedEditingEnabled);
|
|
98
108
|
if (generatePosition !== undefined) {
|
|
99
|
-
const info = getLinkedEditingRangeAtPosition(
|
|
109
|
+
const info = getLinkedEditingRangeAtPosition(sourceScript.id, generatePosition);
|
|
100
110
|
if (info) {
|
|
101
111
|
return {
|
|
102
112
|
ranges: info.ranges
|
|
103
|
-
.map(span => (0, transform_1.transformTextSpan)(serviceScript, sourceScript,
|
|
113
|
+
.map(span => (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, span, language_core_1.isLinkedEditingEnabled)?.[1])
|
|
104
114
|
.filter(utils_1.notEmpty),
|
|
105
115
|
wordPattern: info.wordPattern,
|
|
106
116
|
};
|
|
@@ -114,15 +124,18 @@ function decorateLanguageService(language, languageService) {
|
|
|
114
124
|
languageService.prepareCallHierarchy = (filePath, position) => {
|
|
115
125
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
116
126
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
127
|
+
if (sourceScript?.associatedOnly) {
|
|
128
|
+
return undefined;
|
|
129
|
+
}
|
|
117
130
|
if (serviceScript) {
|
|
118
131
|
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
119
132
|
if (generatePosition !== undefined) {
|
|
120
|
-
const item = prepareCallHierarchy(
|
|
133
|
+
const item = prepareCallHierarchy(sourceScript.id, generatePosition);
|
|
121
134
|
if (Array.isArray(item)) {
|
|
122
|
-
return item.map(item => (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled));
|
|
135
|
+
return item.map(item => (0, transform_1.transformCallHierarchyItem)(transform_1.ToSourceMode.IncludeAssciated, language, item, language_core_1.isCallHierarchyEnabled));
|
|
123
136
|
}
|
|
124
137
|
else if (item) {
|
|
125
|
-
return (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled);
|
|
138
|
+
return (0, transform_1.transformCallHierarchyItem)(transform_1.ToSourceMode.IncludeAssciated, language, item, language_core_1.isCallHierarchyEnabled);
|
|
126
139
|
}
|
|
127
140
|
}
|
|
128
141
|
}
|
|
@@ -134,10 +147,13 @@ function decorateLanguageService(language, languageService) {
|
|
|
134
147
|
let calls = [];
|
|
135
148
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
136
149
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
150
|
+
if (sourceScript?.associatedOnly) {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
137
153
|
if (serviceScript) {
|
|
138
154
|
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
139
155
|
if (generatePosition !== undefined) {
|
|
140
|
-
calls = provideCallHierarchyIncomingCalls(
|
|
156
|
+
calls = provideCallHierarchyIncomingCalls(sourceScript.id, generatePosition);
|
|
141
157
|
}
|
|
142
158
|
}
|
|
143
159
|
else {
|
|
@@ -145,9 +161,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
145
161
|
}
|
|
146
162
|
return calls
|
|
147
163
|
.map(call => {
|
|
148
|
-
const from = (0, transform_1.transformCallHierarchyItem)(language, call.from, language_core_1.isCallHierarchyEnabled);
|
|
164
|
+
const from = (0, transform_1.transformCallHierarchyItem)(transform_1.ToSourceMode.IncludeAssciated, language, call.from, language_core_1.isCallHierarchyEnabled);
|
|
149
165
|
const fromSpans = call.fromSpans
|
|
150
|
-
.map(span => (0, transform_1.transformSpan)(language, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
|
|
166
|
+
.map(span => (0, transform_1.transformSpan)(transform_1.ToSourceMode.IncludeAssciated, language, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
|
|
151
167
|
.filter(utils_1.notEmpty);
|
|
152
168
|
return {
|
|
153
169
|
from,
|
|
@@ -159,6 +175,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
159
175
|
let calls = [];
|
|
160
176
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
161
177
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
178
|
+
if (sourceScript?.associatedOnly) {
|
|
179
|
+
return [];
|
|
180
|
+
}
|
|
162
181
|
if (serviceScript) {
|
|
163
182
|
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
164
183
|
if (generatePosition !== undefined) {
|
|
@@ -170,10 +189,10 @@ function decorateLanguageService(language, languageService) {
|
|
|
170
189
|
}
|
|
171
190
|
return calls
|
|
172
191
|
.map(call => {
|
|
173
|
-
const to = (0, transform_1.transformCallHierarchyItem)(language, call.to, language_core_1.isCallHierarchyEnabled);
|
|
192
|
+
const to = (0, transform_1.transformCallHierarchyItem)(transform_1.ToSourceMode.IncludeAssciated, language, call.to, language_core_1.isCallHierarchyEnabled);
|
|
174
193
|
const fromSpans = call.fromSpans
|
|
175
|
-
.map(span =>
|
|
176
|
-
? (0, transform_1.transformTextSpan)(serviceScript, sourceScript,
|
|
194
|
+
.map(span => serviceScript
|
|
195
|
+
? (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, span, language_core_1.isCallHierarchyEnabled)?.[1]
|
|
177
196
|
: span)
|
|
178
197
|
.filter(utils_1.notEmpty);
|
|
179
198
|
return {
|
|
@@ -184,27 +203,24 @@ function decorateLanguageService(language, languageService) {
|
|
|
184
203
|
};
|
|
185
204
|
languageService.organizeImports = (args, formatOptions, preferences) => {
|
|
186
205
|
const unresolved = organizeImports(args, formatOptions, preferences);
|
|
187
|
-
|
|
188
|
-
.map(changes => (0, transform_1.transformFileTextChanges)(language, changes, language_core_1.isCodeActionsEnabled))
|
|
189
|
-
.filter(utils_1.notEmpty);
|
|
190
|
-
return resolved;
|
|
206
|
+
return (0, transform_1.transformFileTextChanges)(transform_1.ToSourceMode.IncludeAssciated, language, unresolved, language_core_1.isCodeActionsEnabled);
|
|
191
207
|
};
|
|
192
208
|
languageService.getQuickInfoAtPosition = (filePath, position) => {
|
|
193
209
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
194
210
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
211
|
+
if (sourceScript?.associatedOnly) {
|
|
212
|
+
return undefined;
|
|
213
|
+
}
|
|
195
214
|
if (serviceScript) {
|
|
196
215
|
const infos = [];
|
|
197
|
-
for (const [generatePosition
|
|
198
|
-
|
|
199
|
-
continue;
|
|
200
|
-
}
|
|
201
|
-
const info = getQuickInfoAtPosition(fileName, generatePosition);
|
|
216
|
+
for (const [generatePosition] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position, language_core_1.isHoverEnabled)) {
|
|
217
|
+
const info = getQuickInfoAtPosition(sourceScript.id, generatePosition);
|
|
202
218
|
if (info) {
|
|
203
|
-
const textSpan = (0, transform_1.transformTextSpan)(serviceScript, sourceScript,
|
|
219
|
+
const textSpan = (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, info.textSpan, language_core_1.isHoverEnabled)?.[1];
|
|
204
220
|
if (textSpan) {
|
|
205
221
|
infos.push({
|
|
206
222
|
...info,
|
|
207
|
-
textSpan,
|
|
223
|
+
textSpan: textSpan,
|
|
208
224
|
});
|
|
209
225
|
}
|
|
210
226
|
}
|
|
@@ -255,12 +271,15 @@ function decorateLanguageService(language, languageService) {
|
|
|
255
271
|
languageService.getSignatureHelpItems = (filePath, position, options) => {
|
|
256
272
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
257
273
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
274
|
+
if (sourceScript?.associatedOnly) {
|
|
275
|
+
return undefined;
|
|
276
|
+
}
|
|
258
277
|
if (serviceScript) {
|
|
259
278
|
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isSignatureHelpEnabled);
|
|
260
279
|
if (generatePosition !== undefined) {
|
|
261
|
-
const result = getSignatureHelpItems(
|
|
280
|
+
const result = getSignatureHelpItems(sourceScript.id, generatePosition, options);
|
|
262
281
|
if (result) {
|
|
263
|
-
const applicableSpan = (0, transform_1.transformTextSpan)(serviceScript, sourceScript,
|
|
282
|
+
const applicableSpan = (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, result.applicableSpan, language_core_1.isSignatureHelpEnabled)?.[1];
|
|
264
283
|
if (applicableSpan) {
|
|
265
284
|
return {
|
|
266
285
|
...result,
|
|
@@ -276,7 +295,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
276
295
|
};
|
|
277
296
|
languageService.getDocumentHighlights = (filePath, position, filesToSearch) => {
|
|
278
297
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
279
|
-
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isHighlightEnabled, position => getDocumentHighlights(fileName, position, filesToSearch), function* (result) {
|
|
298
|
+
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isHighlightEnabled, (fileName, position) => getDocumentHighlights(fileName, position, filesToSearch), function* (result) {
|
|
280
299
|
for (const ref of result) {
|
|
281
300
|
for (const reference of ref.highlightSpans) {
|
|
282
301
|
yield [reference.fileName ?? ref.fileName, reference.textSpan.start];
|
|
@@ -290,11 +309,11 @@ function decorateLanguageService(language, languageService) {
|
|
|
290
309
|
...highlights,
|
|
291
310
|
highlightSpans: highlights.highlightSpans
|
|
292
311
|
.map(span => {
|
|
293
|
-
const textSpan = (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled)
|
|
312
|
+
const { textSpan } = (0, transform_1.transformSpan)(transform_1.ToSourceMode.IncludeAssciated, language, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled) ?? {};
|
|
294
313
|
if (textSpan) {
|
|
295
314
|
return {
|
|
296
315
|
...span,
|
|
297
|
-
contextSpan: (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
|
|
316
|
+
contextSpan: (0, transform_1.transformSpan)(transform_1.ToSourceMode.IncludeAssciated, language, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
|
|
298
317
|
textSpan,
|
|
299
318
|
};
|
|
300
319
|
}
|
|
@@ -307,6 +326,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
307
326
|
languageService.getApplicableRefactors = (filePath, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
|
|
308
327
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
309
328
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
329
|
+
if (sourceScript?.associatedOnly) {
|
|
330
|
+
return [];
|
|
331
|
+
}
|
|
310
332
|
if (serviceScript) {
|
|
311
333
|
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
|
|
312
334
|
if (generatePosition !== undefined) {
|
|
@@ -316,7 +338,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
316
338
|
pos: generatePosition,
|
|
317
339
|
end: generatePosition + positionOrRange.end - positionOrRange.pos,
|
|
318
340
|
};
|
|
319
|
-
return getApplicableRefactors(
|
|
341
|
+
return getApplicableRefactors(sourceScript.id, por, preferences, triggerReason, kind, includeInteractiveActions);
|
|
320
342
|
}
|
|
321
343
|
return [];
|
|
322
344
|
}
|
|
@@ -328,6 +350,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
328
350
|
let edits;
|
|
329
351
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
330
352
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
353
|
+
if (sourceScript?.associatedOnly) {
|
|
354
|
+
return undefined;
|
|
355
|
+
}
|
|
331
356
|
if (serviceScript) {
|
|
332
357
|
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, typeof positionOrRange === 'number'
|
|
333
358
|
? positionOrRange
|
|
@@ -339,31 +364,32 @@ function decorateLanguageService(language, languageService) {
|
|
|
339
364
|
pos: generatePosition,
|
|
340
365
|
end: generatePosition + positionOrRange.end - positionOrRange.pos,
|
|
341
366
|
};
|
|
342
|
-
edits = getEditsForRefactor(
|
|
367
|
+
edits = getEditsForRefactor(sourceScript.id, formatOptions, por, refactorName, actionName, preferences);
|
|
343
368
|
}
|
|
344
369
|
}
|
|
345
370
|
else {
|
|
346
371
|
edits = getEditsForRefactor(fileName, formatOptions, positionOrRange, refactorName, actionName, preferences);
|
|
347
372
|
}
|
|
348
373
|
if (edits) {
|
|
349
|
-
edits.edits = edits.edits
|
|
350
|
-
.map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isCodeActionsEnabled))
|
|
351
|
-
.filter(utils_1.notEmpty);
|
|
374
|
+
edits.edits = (0, transform_1.transformFileTextChanges)(transform_1.ToSourceMode.IncludeAssciated, language, edits.edits, language_core_1.isCodeActionsEnabled);
|
|
352
375
|
return edits;
|
|
353
376
|
}
|
|
354
377
|
};
|
|
355
378
|
languageService.getRenameInfo = (filePath, position, options) => {
|
|
356
379
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
357
380
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
381
|
+
if (sourceScript?.associatedOnly) {
|
|
382
|
+
return {
|
|
383
|
+
canRename: false,
|
|
384
|
+
localizedErrorMessage: "Cannot rename"
|
|
385
|
+
};
|
|
386
|
+
}
|
|
358
387
|
if (serviceScript) {
|
|
359
388
|
let failed;
|
|
360
|
-
for (const [generateOffset
|
|
361
|
-
|
|
362
|
-
continue;
|
|
363
|
-
}
|
|
364
|
-
const info = getRenameInfo(fileName, generateOffset, options);
|
|
389
|
+
for (const [generateOffset] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position, language_core_1.isRenameEnabled)) {
|
|
390
|
+
const info = getRenameInfo(sourceScript.id, generateOffset, options);
|
|
365
391
|
if (info.canRename) {
|
|
366
|
-
const span = (0, transform_1.transformTextSpan)(serviceScript, sourceScript,
|
|
392
|
+
const span = (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, info.triggerSpan, language_core_1.isRenameEnabled)?.[1];
|
|
367
393
|
if (span) {
|
|
368
394
|
info.triggerSpan = span;
|
|
369
395
|
return info;
|
|
@@ -389,18 +415,21 @@ function decorateLanguageService(language, languageService) {
|
|
|
389
415
|
let fixes = [];
|
|
390
416
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
391
417
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
418
|
+
if (sourceScript?.associatedOnly) {
|
|
419
|
+
return [];
|
|
420
|
+
}
|
|
392
421
|
if (serviceScript) {
|
|
393
422
|
const generateStart = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, start, language_core_1.isCodeActionsEnabled);
|
|
394
423
|
const generateEnd = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, end, language_core_1.isCodeActionsEnabled);
|
|
395
424
|
if (generateStart !== undefined && generateEnd !== undefined) {
|
|
396
|
-
fixes = getCodeFixesAtPosition(
|
|
425
|
+
fixes = getCodeFixesAtPosition(sourceScript.id, generateStart, generateEnd, errorCodes, formatOptions, preferences);
|
|
397
426
|
}
|
|
398
427
|
}
|
|
399
428
|
else {
|
|
400
429
|
fixes = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
|
|
401
430
|
}
|
|
402
431
|
fixes = fixes.map(fix => {
|
|
403
|
-
fix.changes =
|
|
432
|
+
fix.changes = (0, transform_1.transformFileTextChanges)(transform_1.ToSourceMode.IncludeAssciated, language, fix.changes, language_core_1.isCodeActionsEnabled);
|
|
404
433
|
return fix;
|
|
405
434
|
});
|
|
406
435
|
return fixes;
|
|
@@ -408,6 +437,12 @@ function decorateLanguageService(language, languageService) {
|
|
|
408
437
|
languageService.getEncodedSemanticClassifications = (filePath, span, format) => {
|
|
409
438
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
410
439
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
440
|
+
if (sourceScript?.associatedOnly) {
|
|
441
|
+
return {
|
|
442
|
+
spans: [],
|
|
443
|
+
endOfLineState: 0
|
|
444
|
+
};
|
|
445
|
+
}
|
|
411
446
|
if (serviceScript) {
|
|
412
447
|
let start;
|
|
413
448
|
let end;
|
|
@@ -425,13 +460,19 @@ function decorateLanguageService(language, languageService) {
|
|
|
425
460
|
const mappingOffset = (0, transform_1.getMappingOffset)(serviceScript, sourceScript);
|
|
426
461
|
start += mappingOffset;
|
|
427
462
|
end += mappingOffset;
|
|
428
|
-
const result = getEncodedSemanticClassifications(
|
|
463
|
+
const result = getEncodedSemanticClassifications(sourceScript.id, { start, length: end - start }, format);
|
|
429
464
|
const spans = [];
|
|
430
465
|
for (let i = 0; i < result.spans.length; i += 3) {
|
|
431
|
-
const sourceStart
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
466
|
+
for (const sourceStart of (0, transform_1.toSourceOffsets)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, result.spans[i], language_core_1.isSemanticTokensEnabled)) {
|
|
467
|
+
for (const sourceEnd of (0, transform_1.toSourceOffsets)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled)) {
|
|
468
|
+
if (sourceStart[0] === sourceEnd[0] && sourceEnd[1] >= sourceStart[1]) {
|
|
469
|
+
spans.push(sourceStart[1], sourceEnd[1] - sourceStart[1], result.spans[i + 2]);
|
|
470
|
+
break;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
if (spans.length) {
|
|
474
|
+
break;
|
|
475
|
+
}
|
|
435
476
|
}
|
|
436
477
|
}
|
|
437
478
|
result.spans = spans;
|
|
@@ -443,38 +484,50 @@ function decorateLanguageService(language, languageService) {
|
|
|
443
484
|
};
|
|
444
485
|
languageService.getSyntacticDiagnostics = filePath => {
|
|
445
486
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
487
|
+
const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
488
|
+
if (sourceScript?.associatedOnly) {
|
|
489
|
+
return [];
|
|
490
|
+
}
|
|
446
491
|
return getSyntacticDiagnostics(fileName)
|
|
447
|
-
.map(d => (0, transform_1.transformDiagnostic)(language, d, false))
|
|
492
|
+
.map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, languageService.getProgram(), false))
|
|
448
493
|
.filter(utils_1.notEmpty);
|
|
449
494
|
};
|
|
450
495
|
languageService.getSemanticDiagnostics = filePath => {
|
|
451
496
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
497
|
+
const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
498
|
+
if (sourceScript?.associatedOnly) {
|
|
499
|
+
return [];
|
|
500
|
+
}
|
|
452
501
|
return getSemanticDiagnostics(fileName)
|
|
453
|
-
.map(d => (0, transform_1.transformDiagnostic)(language, d, false))
|
|
502
|
+
.map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, languageService.getProgram(), false))
|
|
454
503
|
.filter(utils_1.notEmpty);
|
|
455
504
|
};
|
|
456
505
|
languageService.getSuggestionDiagnostics = filePath => {
|
|
457
506
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
507
|
+
const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
508
|
+
if (sourceScript?.associatedOnly) {
|
|
509
|
+
return [];
|
|
510
|
+
}
|
|
458
511
|
return getSuggestionDiagnostics(fileName)
|
|
459
|
-
.map(d => (0, transform_1.transformDiagnostic)(language, d, false))
|
|
512
|
+
.map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, languageService.getProgram(), false))
|
|
460
513
|
.filter(utils_1.notEmpty);
|
|
461
514
|
};
|
|
462
515
|
languageService.getDefinitionAndBoundSpan = (filePath, position) => {
|
|
463
516
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
464
|
-
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, position => getDefinitionAndBoundSpan(fileName, position), function* (result) {
|
|
517
|
+
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, (fileName, position) => getDefinitionAndBoundSpan(fileName, position), function* (result) {
|
|
465
518
|
for (const ref of result.definitions ?? []) {
|
|
466
519
|
yield [ref.fileName, ref.textSpan.start];
|
|
467
520
|
}
|
|
468
521
|
});
|
|
469
522
|
const textSpan = unresolved
|
|
470
|
-
.map(s => (0, transform_1.transformSpan)(language, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
|
|
523
|
+
.map(s => (0, transform_1.transformSpan)(transform_1.ToSourceMode.IncludeAssciated, language, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
|
|
471
524
|
.filter(utils_1.notEmpty)[0];
|
|
472
525
|
if (!textSpan) {
|
|
473
526
|
return;
|
|
474
527
|
}
|
|
475
528
|
const definitions = unresolved
|
|
476
529
|
.map(s => s.definitions
|
|
477
|
-
?.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
|
|
530
|
+
?.map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
|
|
478
531
|
.filter(utils_1.notEmpty))
|
|
479
532
|
.filter(utils_1.notEmpty)
|
|
480
533
|
.flat();
|
|
@@ -485,7 +538,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
485
538
|
};
|
|
486
539
|
languageService.findReferences = (filePath, position) => {
|
|
487
540
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
488
|
-
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, position => findReferences(fileName, position), function* (result) {
|
|
541
|
+
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, (fileName, position) => findReferences(fileName, position), function* (result) {
|
|
489
542
|
for (const ref of result) {
|
|
490
543
|
for (const reference of ref.references) {
|
|
491
544
|
yield [reference.fileName, reference.textSpan.start];
|
|
@@ -495,11 +548,11 @@ function decorateLanguageService(language, languageService) {
|
|
|
495
548
|
const resolved = unresolved
|
|
496
549
|
.flat()
|
|
497
550
|
.map(symbol => {
|
|
498
|
-
const definition = (0, transform_1.transformDocumentSpan)(language, symbol.definition, language_core_1.isDefinitionEnabled, true);
|
|
551
|
+
const definition = (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, symbol.definition, language_core_1.isDefinitionEnabled, true);
|
|
499
552
|
return {
|
|
500
553
|
definition,
|
|
501
554
|
references: symbol.references
|
|
502
|
-
.map(r => (0, transform_1.transformDocumentSpan)(language, r, language_core_1.isReferencesEnabled))
|
|
555
|
+
.map(r => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, r, language_core_1.isReferencesEnabled))
|
|
503
556
|
.filter(utils_1.notEmpty),
|
|
504
557
|
};
|
|
505
558
|
});
|
|
@@ -507,79 +560,79 @@ function decorateLanguageService(language, languageService) {
|
|
|
507
560
|
};
|
|
508
561
|
languageService.getDefinitionAtPosition = (filePath, position) => {
|
|
509
562
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
510
|
-
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, position => getDefinitionAtPosition(fileName, position), function* (result) {
|
|
563
|
+
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, (fileName, position) => getDefinitionAtPosition(fileName, position), function* (result) {
|
|
511
564
|
for (const ref of result) {
|
|
512
565
|
yield [ref.fileName, ref.textSpan.start];
|
|
513
566
|
}
|
|
514
567
|
});
|
|
515
568
|
const resolved = unresolved
|
|
516
569
|
.flat()
|
|
517
|
-
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
|
|
570
|
+
.map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
|
|
518
571
|
.filter(utils_1.notEmpty);
|
|
519
572
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
520
573
|
};
|
|
521
574
|
languageService.getTypeDefinitionAtPosition = (filePath, position) => {
|
|
522
575
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
523
|
-
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isTypeDefinitionEnabled, position => getTypeDefinitionAtPosition(fileName, position), function* (result) {
|
|
576
|
+
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isTypeDefinitionEnabled, (fileName, position) => getTypeDefinitionAtPosition(fileName, position), function* (result) {
|
|
524
577
|
for (const ref of result) {
|
|
525
578
|
yield [ref.fileName, ref.textSpan.start];
|
|
526
579
|
}
|
|
527
580
|
});
|
|
528
581
|
const resolved = unresolved
|
|
529
582
|
.flat()
|
|
530
|
-
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isTypeDefinitionEnabled))
|
|
583
|
+
.map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isTypeDefinitionEnabled))
|
|
531
584
|
.filter(utils_1.notEmpty);
|
|
532
585
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
533
586
|
};
|
|
534
587
|
languageService.getImplementationAtPosition = (filePath, position) => {
|
|
535
588
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
536
|
-
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isImplementationEnabled, position => getImplementationAtPosition(fileName, position), function* (result) {
|
|
589
|
+
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isImplementationEnabled, (fileName, position) => getImplementationAtPosition(fileName, position), function* (result) {
|
|
537
590
|
for (const ref of result) {
|
|
538
591
|
yield [ref.fileName, ref.textSpan.start];
|
|
539
592
|
}
|
|
540
593
|
});
|
|
541
594
|
const resolved = unresolved
|
|
542
595
|
.flat()
|
|
543
|
-
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isImplementationEnabled))
|
|
596
|
+
.map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isImplementationEnabled))
|
|
544
597
|
.filter(utils_1.notEmpty);
|
|
545
598
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
546
599
|
};
|
|
547
600
|
languageService.findRenameLocations = (filePath, position, findInStrings, findInComments, preferences) => {
|
|
548
601
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
549
|
-
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isRenameEnabled, position => findRenameLocations(fileName, position, findInStrings, findInComments, preferences), function* (result) {
|
|
602
|
+
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isRenameEnabled, (fileName, position) => findRenameLocations(fileName, position, findInStrings, findInComments, preferences), function* (result) {
|
|
550
603
|
for (const ref of result) {
|
|
551
604
|
yield [ref.fileName, ref.textSpan.start];
|
|
552
605
|
}
|
|
553
606
|
});
|
|
554
607
|
const resolved = unresolved
|
|
555
608
|
.flat()
|
|
556
|
-
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isRenameEnabled))
|
|
609
|
+
.map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isRenameEnabled))
|
|
557
610
|
.filter(utils_1.notEmpty);
|
|
558
611
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
559
612
|
};
|
|
560
613
|
languageService.getReferencesAtPosition = (filePath, position) => {
|
|
561
614
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
562
|
-
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, position => getReferencesAtPosition(fileName, position), function* (result) {
|
|
615
|
+
const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, (fileName, position) => getReferencesAtPosition(fileName, position), function* (result) {
|
|
563
616
|
for (const ref of result) {
|
|
564
617
|
yield [ref.fileName, ref.textSpan.start];
|
|
565
618
|
}
|
|
566
619
|
});
|
|
567
620
|
const resolved = unresolved
|
|
568
621
|
.flat()
|
|
569
|
-
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
|
|
622
|
+
.map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isReferencesEnabled))
|
|
570
623
|
.filter(utils_1.notEmpty);
|
|
571
624
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
572
625
|
};
|
|
573
626
|
languageService.getCompletionsAtPosition = (filePath, position, options, formattingSettings) => {
|
|
574
627
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
575
628
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
629
|
+
if (sourceScript?.associatedOnly) {
|
|
630
|
+
return undefined;
|
|
631
|
+
}
|
|
576
632
|
if (serviceScript) {
|
|
577
633
|
const results = [];
|
|
578
|
-
for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position)) {
|
|
579
|
-
|
|
580
|
-
continue;
|
|
581
|
-
}
|
|
582
|
-
const result = getCompletionsAtPosition(fileName, generatedOffset, options, formattingSettings);
|
|
634
|
+
for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position, language_core_1.isCompletionEnabled)) {
|
|
635
|
+
const result = getCompletionsAtPosition(sourceScript.id, generatedOffset, options, formattingSettings);
|
|
583
636
|
if (!result) {
|
|
584
637
|
continue;
|
|
585
638
|
}
|
|
@@ -587,10 +640,10 @@ function decorateLanguageService(language, languageService) {
|
|
|
587
640
|
result.entries = result.entries.filter(entry => !!entry.sourceDisplay);
|
|
588
641
|
}
|
|
589
642
|
for (const entry of result.entries) {
|
|
590
|
-
entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(serviceScript, sourceScript,
|
|
643
|
+
entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, entry.replacementSpan, language_core_1.isCompletionEnabled)?.[1];
|
|
591
644
|
}
|
|
592
645
|
result.optionalReplacementSpan = result.optionalReplacementSpan
|
|
593
|
-
&& (0, transform_1.transformTextSpan)(serviceScript, sourceScript,
|
|
646
|
+
&& (0, transform_1.transformTextSpan)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.[1];
|
|
594
647
|
const isAdditional = typeof mapping.data.completion === 'object' && mapping.data.completion.isAdditional;
|
|
595
648
|
if (isAdditional) {
|
|
596
649
|
results.push(result);
|
|
@@ -616,10 +669,13 @@ function decorateLanguageService(language, languageService) {
|
|
|
616
669
|
let details;
|
|
617
670
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
618
671
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
672
|
+
if (sourceScript?.associatedOnly) {
|
|
673
|
+
return undefined;
|
|
674
|
+
}
|
|
619
675
|
if (serviceScript) {
|
|
620
676
|
const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCompletionEnabled);
|
|
621
677
|
if (generatePosition !== undefined) {
|
|
622
|
-
details = getCompletionEntryDetails(
|
|
678
|
+
details = getCompletionEntryDetails(sourceScript.id, generatePosition, entryName, formatOptions, source, preferences, data);
|
|
623
679
|
}
|
|
624
680
|
}
|
|
625
681
|
else {
|
|
@@ -627,7 +683,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
627
683
|
}
|
|
628
684
|
if (details?.codeActions) {
|
|
629
685
|
for (const codeAction of details.codeActions) {
|
|
630
|
-
codeAction.changes =
|
|
686
|
+
codeAction.changes = (0, transform_1.transformFileTextChanges)(transform_1.ToSourceMode.IncludeAssciated, language, codeAction.changes, language_core_1.isCompletionEnabled);
|
|
631
687
|
}
|
|
632
688
|
}
|
|
633
689
|
return details;
|
|
@@ -635,6 +691,9 @@ function decorateLanguageService(language, languageService) {
|
|
|
635
691
|
languageService.provideInlayHints = (filePath, span, preferences) => {
|
|
636
692
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
637
693
|
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
694
|
+
if (sourceScript?.associatedOnly) {
|
|
695
|
+
return [];
|
|
696
|
+
}
|
|
638
697
|
if (serviceScript) {
|
|
639
698
|
let start;
|
|
640
699
|
let end;
|
|
@@ -653,14 +712,14 @@ function decorateLanguageService(language, languageService) {
|
|
|
653
712
|
const mappingOffset = (0, transform_1.getMappingOffset)(serviceScript, sourceScript);
|
|
654
713
|
start += mappingOffset;
|
|
655
714
|
end += mappingOffset;
|
|
656
|
-
const result = provideInlayHints(
|
|
715
|
+
const result = provideInlayHints(sourceScript.id, { start, length: end - start }, preferences);
|
|
657
716
|
const hints = [];
|
|
658
717
|
for (const hint of result) {
|
|
659
|
-
const sourcePosition = (0, transform_1.toSourceOffset)(serviceScript, sourceScript,
|
|
718
|
+
const sourcePosition = (0, transform_1.toSourceOffset)(transform_1.ToSourceMode.SkipAssciated, language, serviceScript, sourceScript, hint.position, language_core_1.isInlayHintsEnabled);
|
|
660
719
|
if (sourcePosition !== undefined) {
|
|
661
720
|
hints.push({
|
|
662
721
|
...hint,
|
|
663
|
-
position: sourcePosition,
|
|
722
|
+
position: sourcePosition[1],
|
|
664
723
|
});
|
|
665
724
|
}
|
|
666
725
|
}
|
|
@@ -674,7 +733,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
674
733
|
const fileName = filePath.replace(windowsPathReg, '/');
|
|
675
734
|
const unresolved = getFileReferences(fileName);
|
|
676
735
|
const resolved = unresolved
|
|
677
|
-
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
|
|
736
|
+
.map(s => (0, transform_1.transformDocumentSpan)(transform_1.ToSourceMode.IncludeAssciated, language, s, language_core_1.isReferencesEnabled))
|
|
678
737
|
.filter(utils_1.notEmpty);
|
|
679
738
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
680
739
|
};
|
|
@@ -685,7 +744,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
685
744
|
if (serviceScript) {
|
|
686
745
|
for (const [generatedOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
687
746
|
if (filter(mapping.data)) {
|
|
688
|
-
process(
|
|
747
|
+
process(sourceScript.id, generatedOffset + (0, transform_1.getMappingOffset)(serviceScript, sourceScript));
|
|
689
748
|
}
|
|
690
749
|
}
|
|
691
750
|
}
|
|
@@ -698,7 +757,7 @@ function decorateLanguageService(language, languageService) {
|
|
|
698
757
|
return;
|
|
699
758
|
}
|
|
700
759
|
processedFilePositions.add(fileName + ':' + position);
|
|
701
|
-
const result = worker(position);
|
|
760
|
+
const result = worker(fileName, position);
|
|
702
761
|
if (!result) {
|
|
703
762
|
return;
|
|
704
763
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.decorateProgram = void 0;
|
|
4
|
-
const utils_1 = require("./utils");
|
|
5
4
|
const transform_1 = require("./transform");
|
|
5
|
+
const utils_1 = require("./utils");
|
|
6
6
|
function decorateProgram(language, program) {
|
|
7
7
|
const emit = program.emit;
|
|
8
8
|
// for tsc --noEmit
|
|
@@ -18,29 +18,44 @@ function decorateProgram(language, program) {
|
|
|
18
18
|
return {
|
|
19
19
|
...result,
|
|
20
20
|
diagnostics: result.diagnostics
|
|
21
|
-
.map(d => (0, transform_1.transformDiagnostic)(language, d, true))
|
|
21
|
+
.map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.IncludeAssciated, language, d, program, true))
|
|
22
22
|
.filter(utils_1.notEmpty),
|
|
23
23
|
};
|
|
24
24
|
};
|
|
25
25
|
program.getSyntacticDiagnostics = (sourceFile, cancellationToken) => {
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
if (!sourceFile) {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
30
|
+
const actualSourceFile = sourceScript ? program.getSourceFile(sourceScript.id) : sourceFile;
|
|
31
|
+
return getSyntacticDiagnostics(actualSourceFile, cancellationToken)
|
|
32
|
+
.map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, program, true))
|
|
28
33
|
.filter(utils_1.notEmpty);
|
|
29
34
|
};
|
|
30
35
|
program.getSemanticDiagnostics = (sourceFile, cancellationToken) => {
|
|
31
|
-
|
|
32
|
-
|
|
36
|
+
if (!sourceFile) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
40
|
+
const actualSourceFile = sourceScript ? program.getSourceFile(sourceScript.id) : sourceFile;
|
|
41
|
+
return getSemanticDiagnostics(actualSourceFile, cancellationToken)
|
|
42
|
+
.map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, program, true))
|
|
33
43
|
.filter(utils_1.notEmpty);
|
|
34
44
|
};
|
|
35
45
|
program.getGlobalDiagnostics = cancellationToken => {
|
|
36
46
|
return getGlobalDiagnostics(cancellationToken)
|
|
37
|
-
.map(d => (0, transform_1.transformDiagnostic)(language, d, true))
|
|
47
|
+
.map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.IncludeAssciated, language, d, program, true))
|
|
38
48
|
.filter(utils_1.notEmpty);
|
|
39
49
|
};
|
|
40
50
|
// @ts-ignore
|
|
41
51
|
program.getBindAndCheckDiagnostics = (sourceFile, cancellationToken) => {
|
|
42
|
-
|
|
43
|
-
|
|
52
|
+
if (!sourceFile) {
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
56
|
+
const actualSourceFile = sourceScript ? program.getSourceFile(sourceScript.id) : sourceFile;
|
|
57
|
+
return getBindAndCheckDiagnostics(actualSourceFile, cancellationToken)
|
|
58
|
+
.map(d => (0, transform_1.transformDiagnostic)(transform_1.ToSourceMode.SkipAssciated, language, d, program, true))
|
|
44
59
|
.filter(utils_1.notEmpty);
|
|
45
60
|
};
|
|
46
61
|
// fix https://github.com/vuejs/language-tools/issues/4099 with `incremental`
|
package/lib/node/transform.d.ts
CHANGED
|
@@ -1,18 +1,23 @@
|
|
|
1
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
|
-
export declare
|
|
5
|
-
|
|
4
|
+
export declare enum ToSourceMode {
|
|
5
|
+
IncludeAssciated = 0,
|
|
6
|
+
SkipAssciated = 1
|
|
7
|
+
}
|
|
8
|
+
export declare function transformCallHierarchyItem(mode: ToSourceMode, language: Language<string>, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
|
|
9
|
+
export declare function transformDiagnostic<T extends ts.Diagnostic>(mode: ToSourceMode, language: Language<string>, diagnostic: T, program: ts.Program | undefined, isTsc: boolean): T | undefined;
|
|
6
10
|
export declare function fillSourceFileText(language: Language<string>, sourceFile: ts.SourceFile): void;
|
|
7
|
-
export declare function transformFileTextChanges(language: Language<string>, changes: ts.FileTextChanges, filter: (data: CodeInformation) => boolean): ts.FileTextChanges
|
|
8
|
-
export declare function transformDocumentSpan<T extends ts.DocumentSpan>(language: Language<string>, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
|
|
9
|
-
export declare function transformSpan(language: Language<string>, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
|
|
11
|
+
export declare function transformFileTextChanges(mode: ToSourceMode, language: Language<string>, changes: readonly ts.FileTextChanges[], filter: (data: CodeInformation) => boolean): ts.FileTextChanges[];
|
|
12
|
+
export declare function transformDocumentSpan<T extends ts.DocumentSpan>(mode: ToSourceMode, language: Language<string>, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
|
|
13
|
+
export declare function transformSpan(mode: ToSourceMode, language: Language<string>, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
|
|
10
14
|
fileName: string;
|
|
11
15
|
textSpan: ts.TextSpan;
|
|
12
16
|
} | undefined;
|
|
13
|
-
export declare function transformTextChange(
|
|
14
|
-
export declare function transformTextSpan(
|
|
15
|
-
export declare function toSourceOffset(
|
|
17
|
+
export declare function transformTextChange(mode: ToSourceMode, language: Language<string>, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, textChange: ts.TextChange, filter: (data: CodeInformation) => boolean): [string, ts.TextChange] | undefined;
|
|
18
|
+
export declare function transformTextSpan(mode: ToSourceMode, language: Language<string>, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): [string, ts.TextSpan] | undefined;
|
|
19
|
+
export declare function toSourceOffset(mode: ToSourceMode, language: Language<string>, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, position: number, filter: (data: CodeInformation) => boolean): [fileName: string, offset: number] | undefined;
|
|
20
|
+
export declare function toSourceOffsets(mode: ToSourceMode, language: Language<string>, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, position: number, filter: (data: CodeInformation) => boolean): Generator<[fileName: string, offset: number]>;
|
|
16
21
|
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>;
|
|
22
|
+
export declare function toGeneratedOffsets(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, position: number, filter: (data: CodeInformation) => boolean): Generator<readonly [number, import("@volar/language-core").Mapping<CodeInformation>], void, unknown>;
|
|
18
23
|
export declare function getMappingOffset(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>): number;
|
package/lib/node/transform.js
CHANGED
|
@@ -1,41 +1,56 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
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;
|
|
3
|
+
exports.getMappingOffset = exports.toGeneratedOffsets = exports.toGeneratedOffset = exports.toSourceOffsets = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.fillSourceFileText = exports.transformDiagnostic = exports.transformCallHierarchyItem = exports.ToSourceMode = void 0;
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
5
|
const utils_1 = require("./utils");
|
|
6
|
+
var ToSourceMode;
|
|
7
|
+
(function (ToSourceMode) {
|
|
8
|
+
ToSourceMode[ToSourceMode["IncludeAssciated"] = 0] = "IncludeAssciated";
|
|
9
|
+
ToSourceMode[ToSourceMode["SkipAssciated"] = 1] = "SkipAssciated";
|
|
10
|
+
})(ToSourceMode || (exports.ToSourceMode = ToSourceMode = {}));
|
|
6
11
|
const transformedDiagnostics = new WeakMap();
|
|
7
12
|
const transformedSourceFile = new WeakSet();
|
|
8
|
-
function transformCallHierarchyItem(language, item, filter) {
|
|
9
|
-
const span = transformSpan(language, item.file, item.span, filter);
|
|
10
|
-
const selectionSpan = transformSpan(language, item.file, item.selectionSpan, filter);
|
|
13
|
+
function transformCallHierarchyItem(mode, language, item, filter) {
|
|
14
|
+
const span = transformSpan(mode, language, item.file, item.span, filter);
|
|
15
|
+
const selectionSpan = transformSpan(mode, language, item.file, item.selectionSpan, filter);
|
|
11
16
|
return {
|
|
12
17
|
...item,
|
|
18
|
+
file: span?.fileName ?? item.file,
|
|
13
19
|
span: span?.textSpan ?? { start: 0, length: 0 },
|
|
14
20
|
selectionSpan: selectionSpan?.textSpan ?? { start: 0, length: 0 },
|
|
15
21
|
};
|
|
16
22
|
}
|
|
17
23
|
exports.transformCallHierarchyItem = transformCallHierarchyItem;
|
|
18
|
-
function transformDiagnostic(language, diagnostic, isTsc) {
|
|
24
|
+
function transformDiagnostic(mode, language, diagnostic, program, isTsc) {
|
|
19
25
|
if (!transformedDiagnostics.has(diagnostic)) {
|
|
20
26
|
transformedDiagnostics.set(diagnostic, undefined);
|
|
21
27
|
const { relatedInformation } = diagnostic;
|
|
22
28
|
if (relatedInformation) {
|
|
23
29
|
diagnostic.relatedInformation = relatedInformation
|
|
24
|
-
.map(d => transformDiagnostic(language, d, isTsc))
|
|
30
|
+
.map(d => transformDiagnostic(mode, language, d, program, isTsc))
|
|
25
31
|
.filter(utils_1.notEmpty);
|
|
26
32
|
}
|
|
27
33
|
if (diagnostic.file !== undefined
|
|
28
34
|
&& diagnostic.start !== undefined
|
|
29
35
|
&& diagnostic.length !== undefined) {
|
|
30
|
-
const [serviceScript, sourceScript
|
|
36
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, diagnostic.file.fileName);
|
|
31
37
|
if (serviceScript) {
|
|
32
|
-
const sourceSpan = transformTextSpan(
|
|
33
|
-
|
|
38
|
+
const [sourceSpanFileName, sourceSpan] = transformTextSpan(mode, language, serviceScript, sourceScript, {
|
|
39
|
+
start: diagnostic.start,
|
|
40
|
+
length: diagnostic.length
|
|
41
|
+
}, language_core_1.shouldReportDiagnostics) ?? [];
|
|
42
|
+
const actualDiagnosticFile = sourceSpanFileName
|
|
43
|
+
? diagnostic.file.fileName === sourceSpanFileName
|
|
44
|
+
? diagnostic.file
|
|
45
|
+
: program?.getSourceFile(sourceSpanFileName)
|
|
46
|
+
: undefined;
|
|
47
|
+
if (sourceSpan && actualDiagnosticFile) {
|
|
34
48
|
if (isTsc) {
|
|
35
49
|
fillSourceFileText(language, diagnostic.file);
|
|
36
50
|
}
|
|
37
51
|
transformedDiagnostics.set(diagnostic, {
|
|
38
52
|
...diagnostic,
|
|
53
|
+
file: actualDiagnosticFile,
|
|
39
54
|
start: sourceSpan.start,
|
|
40
55
|
length: sourceSpan.length,
|
|
41
56
|
});
|
|
@@ -65,29 +80,42 @@ function fillSourceFileText(language, sourceFile) {
|
|
|
65
80
|
}
|
|
66
81
|
}
|
|
67
82
|
exports.fillSourceFileText = fillSourceFileText;
|
|
68
|
-
function transformFileTextChanges(language, changes, filter) {
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
span: span.textSpan,
|
|
79
|
-
};
|
|
83
|
+
function transformFileTextChanges(mode, language, changes, filter) {
|
|
84
|
+
const changesPerFile = {};
|
|
85
|
+
const newFiles = new Set();
|
|
86
|
+
for (const fileChanges of changes) {
|
|
87
|
+
const [_, source] = (0, utils_1.getServiceScript)(language, fileChanges.fileName);
|
|
88
|
+
if (source) {
|
|
89
|
+
fileChanges.textChanges.forEach(c => {
|
|
90
|
+
const { fileName, textSpan } = transformSpan(mode, language, fileChanges.fileName, c.span, filter) ?? {};
|
|
91
|
+
if (fileName && textSpan) {
|
|
92
|
+
(changesPerFile[fileName] ?? (changesPerFile[fileName] = [])).push({ ...c, span: textSpan });
|
|
80
93
|
}
|
|
81
|
-
})
|
|
82
|
-
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const list = (changesPerFile[fileChanges.fileName] ?? (changesPerFile[fileChanges.fileName] = []));
|
|
98
|
+
fileChanges.textChanges.forEach(c => {
|
|
99
|
+
list.push(c);
|
|
100
|
+
});
|
|
101
|
+
if (fileChanges.isNewFile) {
|
|
102
|
+
newFiles.add(fileChanges.fileName);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
83
105
|
}
|
|
84
|
-
|
|
85
|
-
|
|
106
|
+
const result = [];
|
|
107
|
+
for (const fileName in changesPerFile) {
|
|
108
|
+
result.push({
|
|
109
|
+
fileName,
|
|
110
|
+
isNewFile: newFiles.has(fileName),
|
|
111
|
+
textChanges: changesPerFile[fileName]
|
|
112
|
+
});
|
|
86
113
|
}
|
|
114
|
+
return result;
|
|
87
115
|
}
|
|
88
116
|
exports.transformFileTextChanges = transformFileTextChanges;
|
|
89
|
-
function transformDocumentSpan(language, documentSpan, filter, shouldFallback) {
|
|
90
|
-
let textSpan = transformSpan(language, documentSpan.fileName, documentSpan.textSpan, filter);
|
|
117
|
+
function transformDocumentSpan(mode, language, documentSpan, filter, shouldFallback) {
|
|
118
|
+
let textSpan = transformSpan(mode, language, documentSpan.fileName, documentSpan.textSpan, filter);
|
|
91
119
|
if (!textSpan && shouldFallback) {
|
|
92
120
|
textSpan = {
|
|
93
121
|
fileName: documentSpan.fileName,
|
|
@@ -97,9 +125,9 @@ function transformDocumentSpan(language, documentSpan, filter, shouldFallback) {
|
|
|
97
125
|
if (!textSpan) {
|
|
98
126
|
return;
|
|
99
127
|
}
|
|
100
|
-
const contextSpan = transformSpan(language, documentSpan.fileName, documentSpan.contextSpan, filter);
|
|
101
|
-
const originalTextSpan = transformSpan(language, documentSpan.originalFileName, documentSpan.originalTextSpan, filter);
|
|
102
|
-
const originalContextSpan = transformSpan(language, documentSpan.originalFileName, documentSpan.originalContextSpan, filter);
|
|
128
|
+
const contextSpan = transformSpan(mode, language, documentSpan.fileName, documentSpan.contextSpan, filter);
|
|
129
|
+
const originalTextSpan = transformSpan(mode, language, documentSpan.originalFileName, documentSpan.originalTextSpan, filter);
|
|
130
|
+
const originalContextSpan = transformSpan(mode, language, documentSpan.originalFileName, documentSpan.originalContextSpan, filter);
|
|
103
131
|
return {
|
|
104
132
|
...documentSpan,
|
|
105
133
|
fileName: textSpan.fileName,
|
|
@@ -111,16 +139,19 @@ function transformDocumentSpan(language, documentSpan, filter, shouldFallback) {
|
|
|
111
139
|
};
|
|
112
140
|
}
|
|
113
141
|
exports.transformDocumentSpan = transformDocumentSpan;
|
|
114
|
-
function transformSpan(language, fileName, textSpan, filter) {
|
|
142
|
+
function transformSpan(mode, language, fileName, textSpan, filter) {
|
|
115
143
|
if (!fileName || !textSpan) {
|
|
116
144
|
return;
|
|
117
145
|
}
|
|
118
|
-
const [serviceScript, sourceScript
|
|
119
|
-
if (
|
|
120
|
-
|
|
121
|
-
|
|
146
|
+
const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
147
|
+
if (sourceScript?.associatedOnly) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
else if (serviceScript) {
|
|
151
|
+
const [sourceSpanFileName, sourceSpan] = transformTextSpan(mode, language, serviceScript, sourceScript, textSpan, filter) ?? [];
|
|
152
|
+
if (sourceSpan && sourceSpanFileName) {
|
|
122
153
|
return {
|
|
123
|
-
fileName,
|
|
154
|
+
fileName: sourceSpanFileName,
|
|
124
155
|
textSpan: sourceSpan,
|
|
125
156
|
};
|
|
126
157
|
}
|
|
@@ -133,48 +164,70 @@ function transformSpan(language, fileName, textSpan, filter) {
|
|
|
133
164
|
}
|
|
134
165
|
}
|
|
135
166
|
exports.transformSpan = transformSpan;
|
|
136
|
-
function transformTextChange(serviceScript, sourceScript,
|
|
137
|
-
const sourceSpan = transformTextSpan(serviceScript, sourceScript,
|
|
138
|
-
if (sourceSpan) {
|
|
139
|
-
return {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
167
|
+
function transformTextChange(mode, language, serviceScript, sourceScript, textChange, filter) {
|
|
168
|
+
const [sourceSpanFileName, sourceSpan] = transformTextSpan(mode, language, serviceScript, sourceScript, textChange.span, filter) ?? [];
|
|
169
|
+
if (sourceSpan && sourceSpanFileName) {
|
|
170
|
+
return [sourceSpanFileName, {
|
|
171
|
+
newText: textChange.newText,
|
|
172
|
+
span: sourceSpan,
|
|
173
|
+
}];
|
|
143
174
|
}
|
|
175
|
+
return undefined;
|
|
144
176
|
}
|
|
145
177
|
exports.transformTextChange = transformTextChange;
|
|
146
|
-
function transformTextSpan(serviceScript, sourceScript,
|
|
178
|
+
function transformTextSpan(mode, language, serviceScript, sourceScript, textSpan, filter) {
|
|
147
179
|
const start = textSpan.start;
|
|
148
180
|
const end = textSpan.start + textSpan.length;
|
|
149
|
-
const sourceStart
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
181
|
+
for (const sourceStart of toSourceOffsets(mode, language, serviceScript, sourceScript, start, filter)) {
|
|
182
|
+
for (const sourceEnd of toSourceOffsets(mode, language, serviceScript, sourceScript, end, filter)) {
|
|
183
|
+
if (sourceStart[0] === sourceEnd[0]
|
|
184
|
+
&& sourceEnd[1] >= sourceStart[1]) {
|
|
185
|
+
return [sourceStart[0], {
|
|
186
|
+
start: sourceStart[1],
|
|
187
|
+
length: sourceEnd[1] - sourceStart[1],
|
|
188
|
+
}];
|
|
189
|
+
}
|
|
190
|
+
}
|
|
156
191
|
}
|
|
157
192
|
}
|
|
158
193
|
exports.transformTextSpan = transformTextSpan;
|
|
159
|
-
function toSourceOffset(serviceScript, sourceScript,
|
|
160
|
-
for (const
|
|
161
|
-
|
|
162
|
-
return sourceOffset;
|
|
163
|
-
}
|
|
194
|
+
function toSourceOffset(mode, language, serviceScript, sourceScript, position, filter) {
|
|
195
|
+
for (const source of toSourceOffsets(mode, language, serviceScript, sourceScript, position, filter)) {
|
|
196
|
+
return source;
|
|
164
197
|
}
|
|
165
198
|
}
|
|
166
199
|
exports.toSourceOffset = toSourceOffset;
|
|
167
|
-
function
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
200
|
+
function* toSourceOffsets(mode, language, serviceScript, sourceScript, position, filter) {
|
|
201
|
+
if (mode === ToSourceMode.SkipAssciated) {
|
|
202
|
+
const map = language.maps.get(serviceScript.code);
|
|
203
|
+
for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(serviceScript, sourceScript))) {
|
|
204
|
+
if (filter(mapping.data)) {
|
|
205
|
+
yield [sourceScript.id, sourceOffset];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
for (const [fileName, _snapshot, map] of language.maps.forEach(serviceScript.code)) {
|
|
211
|
+
for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(serviceScript, sourceScript))) {
|
|
212
|
+
if (filter(mapping.data)) {
|
|
213
|
+
yield [fileName, sourceOffset];
|
|
214
|
+
}
|
|
215
|
+
}
|
|
171
216
|
}
|
|
172
217
|
}
|
|
173
218
|
}
|
|
219
|
+
exports.toSourceOffsets = toSourceOffsets;
|
|
220
|
+
function toGeneratedOffset(serviceScript, sourceScript, map, position, filter) {
|
|
221
|
+
for (const [generateOffset] of toGeneratedOffsets(serviceScript, sourceScript, map, position, filter)) {
|
|
222
|
+
return generateOffset;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
174
225
|
exports.toGeneratedOffset = toGeneratedOffset;
|
|
175
|
-
function* toGeneratedOffsets(serviceScript, sourceScript, map, position) {
|
|
226
|
+
function* toGeneratedOffsets(serviceScript, sourceScript, map, position, filter) {
|
|
176
227
|
for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
177
|
-
|
|
228
|
+
if (filter(mapping.data)) {
|
|
229
|
+
yield [generateOffset + getMappingOffset(serviceScript, sourceScript), mapping];
|
|
230
|
+
}
|
|
178
231
|
}
|
|
179
232
|
}
|
|
180
233
|
exports.toGeneratedOffsets = toGeneratedOffsets;
|
package/lib/node/utils.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { Language } from '@volar/language-core';
|
|
1
|
+
import type { CodeInformation, Language, SourceMap, 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): [TypeScriptServiceScript, SourceScript<string>, SourceMap<CodeInformation>] | [undefined, SourceScript<string>, undefined] | [undefined, undefined, undefined];
|
package/lib/node/utils.js
CHANGED
|
@@ -6,7 +6,27 @@ function notEmpty(value) {
|
|
|
6
6
|
}
|
|
7
7
|
exports.notEmpty = notEmpty;
|
|
8
8
|
function getServiceScript(language, fileName) {
|
|
9
|
-
|
|
9
|
+
let sourceScript = language.scripts.get(fileName);
|
|
10
|
+
if (sourceScript?.targetIds && sourceScript?.targetIds.size > 0) {
|
|
11
|
+
const sourceId = sourceScript.id;
|
|
12
|
+
for (const targetId of sourceScript.targetIds) {
|
|
13
|
+
sourceScript = language.scripts.get(targetId);
|
|
14
|
+
if (sourceScript?.generated) {
|
|
15
|
+
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
16
|
+
if (serviceScript) {
|
|
17
|
+
for (const [id, _snapshot, map] of language.maps.forEach(serviceScript.code)) {
|
|
18
|
+
if (id === sourceId) {
|
|
19
|
+
return [serviceScript, sourceScript, map];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
break;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (sourceScript?.associatedOnly) {
|
|
28
|
+
return [undefined, sourceScript, undefined];
|
|
29
|
+
}
|
|
10
30
|
if (sourceScript?.generated) {
|
|
11
31
|
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
12
32
|
if (serviceScript) {
|
|
@@ -5,5 +5,5 @@ export interface TypeScriptProjectHost extends Pick<ts.LanguageServiceHost, 'get
|
|
|
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) => TypeScriptExtraServiceScript
|
|
8
|
+
getExtraServiceScript: (fileName: string) => TypeScriptExtraServiceScript | undefined;
|
|
9
9
|
};
|
|
@@ -83,7 +83,7 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
|
|
|
83
83
|
if (updateLevel >= (1)
|
|
84
84
|
|| !externalFiles.has(project)) {
|
|
85
85
|
const oldFiles = externalFiles.get(project);
|
|
86
|
-
const newFiles = (0, decorateLanguageServiceHost_1.searchExternalFiles)(ts, project, extensions);
|
|
86
|
+
const newFiles = extensions.length ? (0, decorateLanguageServiceHost_1.searchExternalFiles)(ts, project, extensions) : [];
|
|
87
87
|
externalFiles.set(project, newFiles);
|
|
88
88
|
if (oldFiles && !(0, createLanguageServicePlugin_1.arrayItemsEqual)(oldFiles, newFiles)) {
|
|
89
89
|
project.refreshDiagnostics();
|
|
@@ -52,7 +52,8 @@ function createLanguageServicePlugin(loadLanguagePlugins) {
|
|
|
52
52
|
if (updateLevel >= (1)
|
|
53
53
|
|| !externalFiles.has(project)) {
|
|
54
54
|
const oldFiles = externalFiles.get(project);
|
|
55
|
-
const
|
|
55
|
+
const extensions = projectExternalFileExtensions.get(project);
|
|
56
|
+
const newFiles = extensions?.length ? (0, decorateLanguageServiceHost_1.searchExternalFiles)(ts, project, extensions) : [];
|
|
56
57
|
externalFiles.set(project, newFiles);
|
|
57
58
|
if (oldFiles && !arrayItemsEqual(oldFiles, newFiles)) {
|
|
58
59
|
project.refreshDiagnostics();
|
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.8",
|
|
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.8",
|
|
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.8"
|
|
23
23
|
},
|
|
24
|
-
"gitHead": "
|
|
24
|
+
"gitHead": "377a0083ac697a476509805a6777a2339391dcaf"
|
|
25
25
|
}
|