@volar/typescript 2.4.0-alpha.2 → 2.4.0-alpha.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volar/typescript",
3
- "version": "2.4.0-alpha.2",
3
+ "version": "2.4.0-alpha.4",
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.4.0-alpha.2",
15
+ "@volar/language-core": "2.4.0-alpha.4",
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.4.0-alpha.2"
22
+ "@volar/language-service": "2.4.0-alpha.4"
23
23
  },
24
- "gitHead": "62914047f925b79391fee6e4f697705b77641baf"
24
+ "gitHead": "8a21a352c664a57eddceb87c5ca6a087d12cba58"
25
25
  }
@@ -1,3 +0,0 @@
1
- import { Language } from '@volar/language-core';
2
- import type * as ts from 'typescript';
3
- export declare function decorateLanguageService(language: Language<string>, languageService: ts.LanguageService): void;
@@ -1,786 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.decorateLanguageService = decorateLanguageService;
4
- const language_core_1 = require("@volar/language-core");
5
- const dedupe_1 = require("./dedupe");
6
- const transform_1 = require("./transform");
7
- const utils_1 = require("./utils");
8
- const windowsPathReg = /\\/g;
9
- function decorateLanguageService(language, languageService) {
10
- // ignored methods
11
- const { getNavigationTree, getOutliningSpans, } = languageService;
12
- languageService.getNavigationTree = filePath => {
13
- const fileName = filePath.replace(windowsPathReg, '/');
14
- const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
15
- if (serviceScript || targetScript?.associatedOnly) {
16
- const tree = getNavigationTree(targetScript.id);
17
- tree.childItems = undefined;
18
- return tree;
19
- }
20
- else {
21
- return getNavigationTree(fileName);
22
- }
23
- };
24
- languageService.getOutliningSpans = filePath => {
25
- const fileName = filePath.replace(windowsPathReg, '/');
26
- const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
27
- if (serviceScript || targetScript?.associatedOnly) {
28
- return [];
29
- }
30
- else {
31
- return getOutliningSpans(fileName);
32
- }
33
- };
34
- // methods
35
- const { findReferences, findRenameLocations, getCompletionEntryDetails, getCompletionsAtPosition, getDefinitionAndBoundSpan, getDefinitionAtPosition, getFileReferences, getFormattingEditsForDocument, getFormattingEditsForRange, getFormattingEditsAfterKeystroke, getImplementationAtPosition, getLinkedEditingRangeAtPosition, getQuickInfoAtPosition, getSignatureHelpItems, getReferencesAtPosition, getSemanticDiagnostics, getSyntacticDiagnostics, getSuggestionDiagnostics, getTypeDefinitionAtPosition, getEncodedSemanticClassifications, getDocumentHighlights, getApplicableRefactors, getEditsForFileRename, getEditsForRefactor, getRenameInfo, getCodeFixesAtPosition, prepareCallHierarchy, provideCallHierarchyIncomingCalls, provideCallHierarchyOutgoingCalls, provideInlayHints, organizeImports, } = languageService;
36
- languageService.getFormattingEditsForDocument = (filePath, options) => {
37
- const fileName = filePath.replace(windowsPathReg, '/');
38
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
39
- if (targetScript?.associatedOnly) {
40
- return [];
41
- }
42
- if (serviceScript) {
43
- const map = language.maps.get(serviceScript.code, targetScript);
44
- if (!map.mappings.some(mapping => (0, language_core_1.isFormattingEnabled)(mapping.data))) {
45
- return [];
46
- }
47
- const edits = getFormattingEditsForDocument(targetScript.id, options);
48
- return edits
49
- .map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
50
- .filter(edit => !!edit);
51
- }
52
- else {
53
- return getFormattingEditsForDocument(fileName, options);
54
- }
55
- };
56
- languageService.getFormattingEditsForRange = (filePath, start, end, options) => {
57
- const fileName = filePath.replace(windowsPathReg, '/');
58
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
59
- if (targetScript?.associatedOnly) {
60
- return [];
61
- }
62
- if (serviceScript) {
63
- const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, start, language_core_1.isFormattingEnabled);
64
- const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, end, language_core_1.isFormattingEnabled);
65
- if (generateStart !== undefined && generateEnd !== undefined) {
66
- const edits = getFormattingEditsForRange(targetScript.id, generateStart, generateEnd, options);
67
- return edits
68
- .map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
69
- .filter(edit => !!edit);
70
- }
71
- return [];
72
- }
73
- else {
74
- return getFormattingEditsForRange(fileName, start, end, options);
75
- }
76
- };
77
- languageService.getFormattingEditsAfterKeystroke = (filePath, position, key, options) => {
78
- const fileName = filePath.replace(windowsPathReg, '/');
79
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
80
- if (targetScript?.associatedOnly) {
81
- return [];
82
- }
83
- if (serviceScript) {
84
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isFormattingEnabled);
85
- if (generatePosition !== undefined) {
86
- const edits = getFormattingEditsAfterKeystroke(targetScript.id, generatePosition, key, options);
87
- return edits
88
- .map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
89
- .filter(edit => !!edit);
90
- }
91
- return [];
92
- }
93
- else {
94
- return getFormattingEditsAfterKeystroke(fileName, position, key, options);
95
- }
96
- };
97
- languageService.getEditsForFileRename = (oldFilePath, newFilePath, formatOptions, preferences) => {
98
- const edits = getEditsForFileRename(oldFilePath, newFilePath, formatOptions, preferences);
99
- return (0, transform_1.transformFileTextChanges)(language, edits, language_core_1.isRenameEnabled);
100
- };
101
- languageService.getLinkedEditingRangeAtPosition = (filePath, position) => {
102
- const fileName = filePath.replace(windowsPathReg, '/');
103
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
104
- if (targetScript?.associatedOnly) {
105
- return undefined;
106
- }
107
- if (serviceScript) {
108
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isLinkedEditingEnabled);
109
- if (generatePosition !== undefined) {
110
- const info = getLinkedEditingRangeAtPosition(targetScript.id, generatePosition);
111
- if (info) {
112
- return {
113
- ranges: info.ranges
114
- .map(span => (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, span, language_core_1.isLinkedEditingEnabled)?.[1])
115
- .filter(span => !!span),
116
- wordPattern: info.wordPattern,
117
- };
118
- }
119
- }
120
- }
121
- else {
122
- return getLinkedEditingRangeAtPosition(fileName, position);
123
- }
124
- };
125
- languageService.prepareCallHierarchy = (filePath, position) => {
126
- const fileName = filePath.replace(windowsPathReg, '/');
127
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
128
- if (targetScript?.associatedOnly) {
129
- return undefined;
130
- }
131
- if (serviceScript) {
132
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
133
- if (generatePosition !== undefined) {
134
- const item = prepareCallHierarchy(targetScript.id, generatePosition);
135
- if (Array.isArray(item)) {
136
- return item.map(item => (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled));
137
- }
138
- else if (item) {
139
- return (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled);
140
- }
141
- }
142
- }
143
- else {
144
- return prepareCallHierarchy(fileName, position);
145
- }
146
- };
147
- languageService.provideCallHierarchyIncomingCalls = (filePath, position) => {
148
- let calls = [];
149
- const fileName = filePath.replace(windowsPathReg, '/');
150
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
151
- if (targetScript?.associatedOnly) {
152
- return [];
153
- }
154
- if (serviceScript) {
155
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
156
- if (generatePosition !== undefined) {
157
- calls = provideCallHierarchyIncomingCalls(targetScript.id, generatePosition);
158
- }
159
- }
160
- else {
161
- calls = provideCallHierarchyIncomingCalls(fileName, position);
162
- }
163
- return calls
164
- .map(call => {
165
- const from = (0, transform_1.transformCallHierarchyItem)(language, call.from, language_core_1.isCallHierarchyEnabled);
166
- const fromSpans = call.fromSpans
167
- .map(span => (0, transform_1.transformSpan)(language, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
168
- .filter(span => !!span);
169
- return {
170
- from,
171
- fromSpans,
172
- };
173
- });
174
- };
175
- languageService.provideCallHierarchyOutgoingCalls = (filePath, position) => {
176
- let calls = [];
177
- const fileName = filePath.replace(windowsPathReg, '/');
178
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
179
- if (targetScript?.associatedOnly) {
180
- return [];
181
- }
182
- if (serviceScript) {
183
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
184
- if (generatePosition !== undefined) {
185
- calls = provideCallHierarchyOutgoingCalls(targetScript.id, generatePosition);
186
- }
187
- }
188
- else {
189
- calls = provideCallHierarchyOutgoingCalls(fileName, position);
190
- }
191
- return calls
192
- .map(call => {
193
- const to = (0, transform_1.transformCallHierarchyItem)(language, call.to, language_core_1.isCallHierarchyEnabled);
194
- const fromSpans = call.fromSpans
195
- .map(span => serviceScript
196
- ? (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, span, language_core_1.isCallHierarchyEnabled)?.[1]
197
- : span)
198
- .filter(span => !!span);
199
- return {
200
- to,
201
- fromSpans,
202
- };
203
- });
204
- };
205
- languageService.organizeImports = (args, formatOptions, preferences) => {
206
- const unresolved = organizeImports(args, formatOptions, preferences);
207
- return (0, transform_1.transformFileTextChanges)(language, unresolved, language_core_1.isCodeActionsEnabled);
208
- };
209
- languageService.getQuickInfoAtPosition = (filePath, position) => {
210
- const fileName = filePath.replace(windowsPathReg, '/');
211
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
212
- if (targetScript?.associatedOnly) {
213
- return undefined;
214
- }
215
- if (serviceScript) {
216
- const infos = [];
217
- for (const [generatePosition] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isHoverEnabled)) {
218
- const info = getQuickInfoAtPosition(targetScript.id, generatePosition);
219
- if (info) {
220
- const textSpan = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.textSpan, language_core_1.isHoverEnabled)?.[1];
221
- if (textSpan) {
222
- infos.push({
223
- ...info,
224
- textSpan: textSpan,
225
- });
226
- }
227
- }
228
- }
229
- if (infos.length === 1) {
230
- return infos[0];
231
- }
232
- else if (infos.length >= 2) {
233
- const combine = { ...infos[0] };
234
- combine.displayParts = combine.displayParts?.slice();
235
- combine.documentation = combine.documentation?.slice();
236
- combine.tags = combine.tags?.slice();
237
- const displayPartsStrs = new Set([displayPartsToString(infos[0].displayParts)]);
238
- const documentationStrs = new Set([displayPartsToString(infos[0].documentation)]);
239
- const tagsStrs = new Set();
240
- for (const tag of infos[0].tags ?? []) {
241
- tagsStrs.add(tag.name + '__volar__' + displayPartsToString(tag.text));
242
- }
243
- for (let i = 1; i < infos.length; i++) {
244
- const { displayParts, documentation, tags } = infos[i];
245
- if (displayParts?.length && !displayPartsStrs.has(displayPartsToString(displayParts))) {
246
- displayPartsStrs.add(displayPartsToString(displayParts));
247
- combine.displayParts ??= [];
248
- combine.displayParts.push({ ...displayParts[0], text: '\n\n' + displayParts[0].text });
249
- combine.displayParts.push(...displayParts.slice(1));
250
- }
251
- if (documentation?.length && !documentationStrs.has(displayPartsToString(documentation))) {
252
- documentationStrs.add(displayPartsToString(documentation));
253
- combine.documentation ??= [];
254
- combine.documentation.push({ ...documentation[0], text: '\n\n' + documentation[0].text });
255
- combine.documentation.push(...documentation.slice(1));
256
- }
257
- for (const tag of tags ?? []) {
258
- if (!tagsStrs.has(tag.name + '__volar__' + displayPartsToString(tag.text))) {
259
- tagsStrs.add(tag.name + '__volar__' + displayPartsToString(tag.text));
260
- combine.tags ??= [];
261
- combine.tags.push(tag);
262
- }
263
- }
264
- }
265
- return combine;
266
- }
267
- }
268
- else {
269
- return getQuickInfoAtPosition(fileName, position);
270
- }
271
- };
272
- languageService.getSignatureHelpItems = (filePath, position, options) => {
273
- const fileName = filePath.replace(windowsPathReg, '/');
274
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
275
- if (targetScript?.associatedOnly) {
276
- return undefined;
277
- }
278
- if (serviceScript) {
279
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isSignatureHelpEnabled);
280
- if (generatePosition !== undefined) {
281
- const result = getSignatureHelpItems(targetScript.id, generatePosition, options);
282
- if (result) {
283
- const applicableSpan = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, result.applicableSpan, language_core_1.isSignatureHelpEnabled)?.[1];
284
- if (applicableSpan) {
285
- return {
286
- ...result,
287
- applicableSpan,
288
- };
289
- }
290
- }
291
- }
292
- }
293
- else {
294
- return getSignatureHelpItems(fileName, position, options);
295
- }
296
- };
297
- languageService.getDocumentHighlights = (filePath, position, filesToSearch) => {
298
- const fileName = filePath.replace(windowsPathReg, '/');
299
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isHighlightEnabled, (fileName, position) => getDocumentHighlights(fileName, position, filesToSearch), function* (result) {
300
- for (const ref of result) {
301
- for (const reference of ref.highlightSpans) {
302
- yield [reference.fileName ?? ref.fileName, reference.textSpan.start];
303
- }
304
- }
305
- });
306
- const resolved = unresolved
307
- .flat()
308
- .map(highlights => {
309
- return {
310
- ...highlights,
311
- highlightSpans: highlights.highlightSpans
312
- .map(span => {
313
- const { textSpan } = (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled) ?? {};
314
- if (textSpan) {
315
- return {
316
- ...span,
317
- contextSpan: (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
318
- textSpan,
319
- };
320
- }
321
- })
322
- .filter(span => !!span),
323
- };
324
- });
325
- return resolved;
326
- };
327
- languageService.getApplicableRefactors = (filePath, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
328
- const fileName = filePath.replace(windowsPathReg, '/');
329
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
330
- if (targetScript?.associatedOnly) {
331
- return [];
332
- }
333
- if (serviceScript) {
334
- if (typeof positionOrRange === 'number') {
335
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, positionOrRange, language_core_1.isCodeActionsEnabled);
336
- if (generatePosition !== undefined) {
337
- return getApplicableRefactors(targetScript.id, generatePosition, preferences, triggerReason, kind, includeInteractiveActions);
338
- }
339
- }
340
- else {
341
- for (const [generatedStart, generatedEnd] of (0, transform_1.toGeneratedRanges)(language, serviceScript, sourceScript, positionOrRange.pos, positionOrRange.end, language_core_1.isCodeActionsEnabled)) {
342
- return getApplicableRefactors(targetScript.id, { pos: generatedStart, end: generatedEnd }, preferences, triggerReason, kind, includeInteractiveActions);
343
- }
344
- }
345
- return [];
346
- }
347
- else {
348
- return getApplicableRefactors(fileName, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions);
349
- }
350
- };
351
- languageService.getEditsForRefactor = (filePath, formatOptions, positionOrRange, refactorName, actionName, preferences) => {
352
- let edits;
353
- const fileName = filePath.replace(windowsPathReg, '/');
354
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
355
- if (targetScript?.associatedOnly) {
356
- return undefined;
357
- }
358
- if (serviceScript) {
359
- if (typeof positionOrRange === 'number') {
360
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, positionOrRange, language_core_1.isCodeActionsEnabled);
361
- if (generatePosition !== undefined) {
362
- edits = getEditsForRefactor(targetScript.id, formatOptions, generatePosition, refactorName, actionName, preferences);
363
- }
364
- }
365
- else {
366
- for (const [generatedStart, generatedEnd] of (0, transform_1.toGeneratedRanges)(language, serviceScript, sourceScript, positionOrRange.pos, positionOrRange.end, language_core_1.isCodeActionsEnabled)) {
367
- edits = getEditsForRefactor(targetScript.id, formatOptions, { pos: generatedStart, end: generatedEnd }, refactorName, actionName, preferences);
368
- }
369
- }
370
- }
371
- else {
372
- edits = getEditsForRefactor(fileName, formatOptions, positionOrRange, refactorName, actionName, preferences);
373
- }
374
- if (edits) {
375
- edits.edits = (0, transform_1.transformFileTextChanges)(language, edits.edits, language_core_1.isCodeActionsEnabled);
376
- return edits;
377
- }
378
- };
379
- languageService.getRenameInfo = (filePath, position, options) => {
380
- const fileName = filePath.replace(windowsPathReg, '/');
381
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
382
- if (targetScript?.associatedOnly) {
383
- return {
384
- canRename: false,
385
- localizedErrorMessage: "Cannot rename"
386
- };
387
- }
388
- if (serviceScript) {
389
- let failed;
390
- for (const [generateOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isRenameEnabled)) {
391
- const info = getRenameInfo(targetScript.id, generateOffset, options);
392
- if (info.canRename) {
393
- const span = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.triggerSpan, language_core_1.isRenameEnabled)?.[1];
394
- if (span) {
395
- info.triggerSpan = span;
396
- return info;
397
- }
398
- }
399
- else {
400
- failed = info;
401
- }
402
- }
403
- if (failed) {
404
- return failed;
405
- }
406
- return {
407
- canRename: false,
408
- localizedErrorMessage: 'Failed to get rename locations',
409
- };
410
- }
411
- else {
412
- return getRenameInfo(fileName, position, options);
413
- }
414
- };
415
- languageService.getCodeFixesAtPosition = (filePath, start, end, errorCodes, formatOptions, preferences) => {
416
- let fixes = [];
417
- const fileName = filePath.replace(windowsPathReg, '/');
418
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
419
- if (targetScript?.associatedOnly) {
420
- return [];
421
- }
422
- if (serviceScript) {
423
- const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, start, language_core_1.isCodeActionsEnabled);
424
- const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, end, language_core_1.isCodeActionsEnabled);
425
- if (generateStart !== undefined && generateEnd !== undefined) {
426
- fixes = getCodeFixesAtPosition(targetScript.id, generateStart, generateEnd, errorCodes, formatOptions, preferences);
427
- }
428
- }
429
- else {
430
- fixes = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
431
- }
432
- fixes = fixes.map(fix => {
433
- fix.changes = (0, transform_1.transformFileTextChanges)(language, fix.changes, language_core_1.isCodeActionsEnabled);
434
- return fix;
435
- });
436
- return fixes;
437
- };
438
- languageService.getEncodedSemanticClassifications = (filePath, span, format) => {
439
- const fileName = filePath.replace(windowsPathReg, '/');
440
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
441
- if (targetScript?.associatedOnly) {
442
- return {
443
- spans: [],
444
- endOfLineState: 0
445
- };
446
- }
447
- if (serviceScript) {
448
- let start;
449
- let end;
450
- const map = language.maps.get(serviceScript.code, targetScript);
451
- for (const mapping of map.mappings) {
452
- // TODO reuse the logic from language service
453
- if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
454
- start ??= mapping.generatedOffsets[0];
455
- end ??= mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + (mapping.generatedLengths ?? mapping.lengths)[mapping.lengths.length - 1];
456
- start = Math.min(start, mapping.generatedOffsets[0]);
457
- end = Math.max(end, mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + (mapping.generatedLengths ?? mapping.lengths)[mapping.lengths.length - 1]);
458
- }
459
- }
460
- start ??= 0;
461
- end ??= targetScript.snapshot.getLength();
462
- const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
463
- start += mappingOffset;
464
- end += mappingOffset;
465
- const result = getEncodedSemanticClassifications(targetScript.id, { start, length: end - start }, format);
466
- const spans = [];
467
- for (let i = 0; i < result.spans.length; i += 3) {
468
- for (const [_, sourceStart, sourceEnd] of (0, transform_1.toSourceRanges)(sourceScript, language, serviceScript, result.spans[i], result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled)) {
469
- spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
470
- break;
471
- }
472
- }
473
- result.spans = spans;
474
- return result;
475
- }
476
- else {
477
- return getEncodedSemanticClassifications(fileName, span, format);
478
- }
479
- };
480
- languageService.getSyntacticDiagnostics = filePath => {
481
- const fileName = filePath.replace(windowsPathReg, '/');
482
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
483
- if (targetScript?.associatedOnly) {
484
- return [];
485
- }
486
- return getSyntacticDiagnostics(targetScript?.id ?? fileName)
487
- .map(d => (0, transform_1.transformDiagnostic)(language, d, languageService.getProgram(), false))
488
- .filter(d => !!d)
489
- .filter(d => !serviceScript || language.scripts.get(d.file.fileName) === sourceScript);
490
- };
491
- languageService.getSemanticDiagnostics = filePath => {
492
- const fileName = filePath.replace(windowsPathReg, '/');
493
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
494
- if (targetScript?.associatedOnly) {
495
- return [];
496
- }
497
- return getSemanticDiagnostics(targetScript?.id ?? fileName)
498
- .map(d => (0, transform_1.transformDiagnostic)(language, d, languageService.getProgram(), false))
499
- .filter(d => !!d)
500
- .filter(d => !serviceScript || !d.file || language.scripts.get(d.file.fileName) === sourceScript);
501
- };
502
- languageService.getSuggestionDiagnostics = filePath => {
503
- const fileName = filePath.replace(windowsPathReg, '/');
504
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
505
- if (targetScript?.associatedOnly) {
506
- return [];
507
- }
508
- return getSuggestionDiagnostics(targetScript?.id ?? fileName)
509
- .map(d => (0, transform_1.transformDiagnostic)(language, d, languageService.getProgram(), false))
510
- .filter(d => !!d)
511
- .filter(d => !serviceScript || !d.file || language.scripts.get(d.file.fileName) === sourceScript);
512
- };
513
- languageService.getDefinitionAndBoundSpan = (filePath, position) => {
514
- const fileName = filePath.replace(windowsPathReg, '/');
515
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, (fileName, position) => getDefinitionAndBoundSpan(fileName, position), function* (result) {
516
- for (const ref of result.definitions ?? []) {
517
- yield [ref.fileName, ref.textSpan.start];
518
- }
519
- });
520
- const textSpan = unresolved
521
- .map(s => (0, transform_1.transformSpan)(language, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
522
- .filter(s => !!s)[0];
523
- if (!textSpan) {
524
- return;
525
- }
526
- const definitions = unresolved
527
- .map(s => s.definitions
528
- ?.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
529
- .filter(s => !!s)
530
- ?? [])
531
- .flat();
532
- return {
533
- textSpan,
534
- definitions: (0, dedupe_1.dedupeDocumentSpans)(definitions),
535
- };
536
- };
537
- languageService.findReferences = (filePath, position) => {
538
- const fileName = filePath.replace(windowsPathReg, '/');
539
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, (fileName, position) => findReferences(fileName, position), function* (result) {
540
- for (const ref of result) {
541
- for (const reference of ref.references) {
542
- yield [reference.fileName, reference.textSpan.start];
543
- }
544
- }
545
- });
546
- const resolved = unresolved
547
- .flat()
548
- .map(symbol => {
549
- const definition = (0, transform_1.transformDocumentSpan)(language, symbol.definition, language_core_1.isDefinitionEnabled, true);
550
- return {
551
- definition,
552
- references: symbol.references
553
- .map(r => (0, transform_1.transformDocumentSpan)(language, r, language_core_1.isReferencesEnabled))
554
- .filter(r => !!r),
555
- };
556
- });
557
- return resolved;
558
- };
559
- languageService.getDefinitionAtPosition = (filePath, position) => {
560
- const fileName = filePath.replace(windowsPathReg, '/');
561
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isDefinitionEnabled, (fileName, position) => getDefinitionAtPosition(fileName, position), function* (result) {
562
- for (const ref of result) {
563
- yield [ref.fileName, ref.textSpan.start];
564
- }
565
- });
566
- const resolved = unresolved
567
- .flat()
568
- .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
569
- .filter(s => !!s);
570
- return (0, dedupe_1.dedupeDocumentSpans)(resolved);
571
- };
572
- languageService.getTypeDefinitionAtPosition = (filePath, position) => {
573
- const fileName = filePath.replace(windowsPathReg, '/');
574
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isTypeDefinitionEnabled, (fileName, position) => getTypeDefinitionAtPosition(fileName, position), function* (result) {
575
- for (const ref of result) {
576
- yield [ref.fileName, ref.textSpan.start];
577
- }
578
- });
579
- const resolved = unresolved
580
- .flat()
581
- .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isTypeDefinitionEnabled))
582
- .filter(s => !!s);
583
- return (0, dedupe_1.dedupeDocumentSpans)(resolved);
584
- };
585
- languageService.getImplementationAtPosition = (filePath, position) => {
586
- const fileName = filePath.replace(windowsPathReg, '/');
587
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isImplementationEnabled, (fileName, position) => getImplementationAtPosition(fileName, position), function* (result) {
588
- for (const ref of result) {
589
- yield [ref.fileName, ref.textSpan.start];
590
- }
591
- });
592
- const resolved = unresolved
593
- .flat()
594
- .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isImplementationEnabled))
595
- .filter(s => !!s);
596
- return (0, dedupe_1.dedupeDocumentSpans)(resolved);
597
- };
598
- languageService.findRenameLocations = (filePath, position, findInStrings, findInComments, preferences) => {
599
- const fileName = filePath.replace(windowsPathReg, '/');
600
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isRenameEnabled, (fileName, position) => findRenameLocations(fileName, position, findInStrings, findInComments, preferences), function* (result) {
601
- for (const ref of result) {
602
- yield [ref.fileName, ref.textSpan.start];
603
- }
604
- });
605
- const resolved = unresolved
606
- .flat()
607
- .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isRenameEnabled))
608
- .filter(s => !!s);
609
- return (0, dedupe_1.dedupeDocumentSpans)(resolved);
610
- };
611
- languageService.getReferencesAtPosition = (filePath, position) => {
612
- const fileName = filePath.replace(windowsPathReg, '/');
613
- const unresolved = linkedCodeFeatureWorker(fileName, position, language_core_1.isReferencesEnabled, (fileName, position) => getReferencesAtPosition(fileName, position), function* (result) {
614
- for (const ref of result) {
615
- yield [ref.fileName, ref.textSpan.start];
616
- }
617
- });
618
- const resolved = unresolved
619
- .flat()
620
- .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
621
- .filter(s => !!s);
622
- return (0, dedupe_1.dedupeDocumentSpans)(resolved);
623
- };
624
- languageService.getCompletionsAtPosition = (filePath, position, options, formattingSettings) => {
625
- const fileName = filePath.replace(windowsPathReg, '/');
626
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
627
- if (targetScript?.associatedOnly) {
628
- return undefined;
629
- }
630
- if (serviceScript) {
631
- const results = [];
632
- for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isCompletionEnabled)) {
633
- const result = getCompletionsAtPosition(targetScript.id, generatedOffset, options, formattingSettings);
634
- if (!result) {
635
- continue;
636
- }
637
- if (typeof mapping.data.completion === 'object' && mapping.data.completion.onlyImport) {
638
- result.entries = result.entries.filter(entry => !!entry.sourceDisplay);
639
- }
640
- for (const entry of result.entries) {
641
- entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, entry.replacementSpan, language_core_1.isCompletionEnabled)?.[1];
642
- }
643
- result.optionalReplacementSpan = result.optionalReplacementSpan
644
- && (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.[1];
645
- const isAdditional = typeof mapping.data.completion === 'object' && mapping.data.completion.isAdditional;
646
- if (isAdditional) {
647
- results.push(result);
648
- }
649
- else {
650
- results.unshift(result);
651
- }
652
- }
653
- if (results.length) {
654
- return {
655
- ...results[0],
656
- entries: results
657
- .map(additionalResult => additionalResult.entries)
658
- .flat(),
659
- };
660
- }
661
- }
662
- else {
663
- return getCompletionsAtPosition(fileName, position, options, formattingSettings);
664
- }
665
- };
666
- languageService.getCompletionEntryDetails = (filePath, position, entryName, formatOptions, source, preferences, data) => {
667
- let details;
668
- const fileName = filePath.replace(windowsPathReg, '/');
669
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
670
- if (targetScript?.associatedOnly) {
671
- return undefined;
672
- }
673
- if (serviceScript) {
674
- const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCompletionEnabled);
675
- if (generatePosition !== undefined) {
676
- details = getCompletionEntryDetails(targetScript.id, generatePosition, entryName, formatOptions, source, preferences, data);
677
- }
678
- }
679
- else {
680
- return getCompletionEntryDetails(fileName, position, entryName, formatOptions, source, preferences, data);
681
- }
682
- if (details?.codeActions) {
683
- for (const codeAction of details.codeActions) {
684
- codeAction.changes = (0, transform_1.transformFileTextChanges)(language, codeAction.changes, language_core_1.isCompletionEnabled);
685
- }
686
- }
687
- return details;
688
- };
689
- languageService.provideInlayHints = (filePath, span, preferences) => {
690
- const fileName = filePath.replace(windowsPathReg, '/');
691
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
692
- if (targetScript?.associatedOnly) {
693
- return [];
694
- }
695
- if (serviceScript) {
696
- let start;
697
- let end;
698
- const map = language.maps.get(serviceScript.code, targetScript);
699
- for (const mapping of map.mappings) {
700
- if ((0, language_core_1.isInlayHintsEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
701
- start ??= mapping.generatedOffsets[0];
702
- end ??= mapping.generatedOffsets[mapping.generatedOffsets.length - 1];
703
- start = Math.min(start, mapping.generatedOffsets[0]);
704
- end = Math.max(end, mapping.generatedOffsets[mapping.generatedOffsets.length - 1]);
705
- }
706
- }
707
- if (start === undefined || end === undefined) {
708
- start = 0;
709
- end = 0;
710
- }
711
- const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
712
- start += mappingOffset;
713
- end += mappingOffset;
714
- const result = provideInlayHints(targetScript.id, { start, length: end - start }, preferences);
715
- const hints = [];
716
- for (const hint of result) {
717
- const sourcePosition = (0, transform_1.toSourceOffset)(sourceScript, language, serviceScript, hint.position, language_core_1.isInlayHintsEnabled);
718
- if (sourcePosition !== undefined) {
719
- hints.push({
720
- ...hint,
721
- position: sourcePosition[1],
722
- });
723
- }
724
- }
725
- return hints;
726
- }
727
- else {
728
- return provideInlayHints(fileName, span, preferences);
729
- }
730
- };
731
- languageService.getFileReferences = filePath => {
732
- const fileName = filePath.replace(windowsPathReg, '/');
733
- const unresolved = getFileReferences(fileName);
734
- const resolved = unresolved
735
- .map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
736
- .filter(s => !!s);
737
- return (0, dedupe_1.dedupeDocumentSpans)(resolved);
738
- };
739
- function linkedCodeFeatureWorker(fileName, position, filter, worker, getLinkedCodes) {
740
- const results = [];
741
- const processedFilePositions = new Set();
742
- const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
743
- if (serviceScript) {
744
- for (const [generatedOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, filter)) {
745
- process(targetScript.id, generatedOffset);
746
- }
747
- }
748
- else {
749
- process(fileName, position);
750
- }
751
- return results;
752
- function process(fileName, position) {
753
- if (processedFilePositions.has(fileName + ':' + position)) {
754
- return;
755
- }
756
- processedFilePositions.add(fileName + ':' + position);
757
- const result = worker(fileName, position);
758
- if (!result) {
759
- return;
760
- }
761
- results.push(result);
762
- for (const ref of getLinkedCodes(result)) {
763
- processedFilePositions.add(ref[0] + ':' + ref[1]);
764
- const [serviceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
765
- if (!serviceScript) {
766
- continue;
767
- }
768
- const linkedCodeMap = language.linkedCodeMaps.get(serviceScript.code);
769
- if (!linkedCodeMap) {
770
- continue;
771
- }
772
- const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
773
- for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - mappingOffset)) {
774
- process(ref[0], linkedCodeOffset + mappingOffset);
775
- }
776
- }
777
- }
778
- }
779
- }
780
- function displayPartsToString(displayParts) {
781
- if (displayParts) {
782
- return displayParts.map(displayPart => displayPart.text).join('');
783
- }
784
- return '';
785
- }
786
- //# sourceMappingURL=decorateLanguageService.js.map