@volar/typescript 2.1.6 → 2.2.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +0 -1
- package/index.js +0 -1
- package/lib/node/decorateLanguageService.d.ts +2 -2
- package/lib/node/decorateLanguageService.js +102 -102
- package/lib/node/decorateLanguageServiceHost.d.ts +2 -2
- package/lib/node/decorateLanguageServiceHost.js +14 -15
- package/lib/node/decorateProgram.d.ts +2 -2
- package/lib/node/decorateProgram.js +6 -6
- package/lib/node/proxyCreateProgram.js +14 -13
- package/lib/node/transform.d.ts +10 -10
- package/lib/node/transform.js +30 -30
- package/lib/node/utils.d.ts +2 -2
- package/lib/node/utils.js +10 -11
- package/lib/protocol/createProject.d.ts +2 -7
- package/lib/protocol/createProject.js +66 -70
- package/lib/quickstart/createAsyncLanguageServicePlugin.js +5 -5
- package/lib/quickstart/createLanguageServicePlugin.js +5 -5
- package/lib/resolveModuleName.d.ts +2 -2
- package/lib/resolveModuleName.js +6 -6
- package/package.json +4 -4
package/index.d.ts
CHANGED
package/index.js
CHANGED
|
@@ -14,7 +14,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./lib/documentRegistry"), exports);
|
|
18
17
|
__exportStar(require("./lib/node/decorateLanguageService"), exports);
|
|
19
18
|
__exportStar(require("./lib/node/decorateLanguageServiceHost"), exports);
|
|
20
19
|
__exportStar(require("./lib/node/decorateProgram"), exports);
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Language } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare function decorateLanguageService(
|
|
3
|
+
export declare function decorateLanguageService(language: Language, languageService: ts.LanguageService): void;
|
|
@@ -5,12 +5,12 @@ const language_core_1 = require("@volar/language-core");
|
|
|
5
5
|
const dedupe_1 = require("./dedupe");
|
|
6
6
|
const utils_1 = require("./utils");
|
|
7
7
|
const transform_1 = require("./transform");
|
|
8
|
-
function decorateLanguageService(
|
|
8
|
+
function decorateLanguageService(language, languageService) {
|
|
9
9
|
// ignored methods
|
|
10
10
|
const { getNavigationTree, getOutliningSpans, } = languageService;
|
|
11
11
|
languageService.getNavigationTree = fileName => {
|
|
12
|
-
const [
|
|
13
|
-
if (
|
|
12
|
+
const [serviceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
13
|
+
if (serviceScript) {
|
|
14
14
|
const tree = getNavigationTree(fileName);
|
|
15
15
|
tree.childItems = undefined;
|
|
16
16
|
return tree;
|
|
@@ -20,8 +20,8 @@ function decorateLanguageService(files, languageService) {
|
|
|
20
20
|
}
|
|
21
21
|
};
|
|
22
22
|
languageService.getOutliningSpans = fileName => {
|
|
23
|
-
const [
|
|
24
|
-
if (
|
|
23
|
+
const [serviceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
24
|
+
if (serviceScript) {
|
|
25
25
|
return [];
|
|
26
26
|
}
|
|
27
27
|
else {
|
|
@@ -31,14 +31,14 @@ function decorateLanguageService(files, languageService) {
|
|
|
31
31
|
// methods
|
|
32
32
|
const { findReferences, findRenameLocations, getCompletionEntryDetails, getCompletionsAtPosition, getDefinitionAndBoundSpan, getDefinitionAtPosition, getFileReferences, getFormattingEditsForDocument, getFormattingEditsForRange, getFormattingEditsAfterKeystroke, getImplementationAtPosition, getLinkedEditingRangeAtPosition, getQuickInfoAtPosition, getReferencesAtPosition, getSemanticDiagnostics, getSyntacticDiagnostics, getSuggestionDiagnostics, getTypeDefinitionAtPosition, getEncodedSemanticClassifications, getDocumentHighlights, getApplicableRefactors, getEditsForFileRename, getEditsForRefactor, getRenameInfo, getCodeFixesAtPosition, prepareCallHierarchy, provideCallHierarchyIncomingCalls, provideCallHierarchyOutgoingCalls, provideInlayHints, organizeImports, } = languageService;
|
|
33
33
|
languageService.getFormattingEditsForDocument = (fileName, options) => {
|
|
34
|
-
const [
|
|
35
|
-
if (
|
|
34
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
35
|
+
if (serviceScript) {
|
|
36
36
|
if (!map.mappings.some(mapping => (0, language_core_1.isFormattingEnabled)(mapping.data))) {
|
|
37
37
|
return [];
|
|
38
38
|
}
|
|
39
39
|
const edits = getFormattingEditsForDocument(fileName, options);
|
|
40
40
|
return edits
|
|
41
|
-
.map(edit => (0, transform_1.transformTextChange)(
|
|
41
|
+
.map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
|
|
42
42
|
.filter(utils_1.notEmpty);
|
|
43
43
|
}
|
|
44
44
|
else {
|
|
@@ -46,14 +46,14 @@ function decorateLanguageService(files, languageService) {
|
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
48
|
languageService.getFormattingEditsForRange = (fileName, start, end, options) => {
|
|
49
|
-
const [
|
|
50
|
-
if (
|
|
51
|
-
const generateStart = (0, transform_1.toGeneratedOffset)(
|
|
52
|
-
const generateEnd = (0, transform_1.toGeneratedOffset)(
|
|
49
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
50
|
+
if (serviceScript) {
|
|
51
|
+
const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isFormattingEnabled);
|
|
52
|
+
const generateEnd = (0, transform_1.toGeneratedOffset)(sourceScript, map, end, language_core_1.isFormattingEnabled);
|
|
53
53
|
if (generateStart !== undefined && generateEnd !== undefined) {
|
|
54
54
|
const edits = getFormattingEditsForRange(fileName, generateStart, generateEnd, options);
|
|
55
55
|
return edits
|
|
56
|
-
.map(edit => (0, transform_1.transformTextChange)(
|
|
56
|
+
.map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
|
|
57
57
|
.filter(utils_1.notEmpty);
|
|
58
58
|
}
|
|
59
59
|
return [];
|
|
@@ -63,13 +63,13 @@ function decorateLanguageService(files, languageService) {
|
|
|
63
63
|
}
|
|
64
64
|
};
|
|
65
65
|
languageService.getFormattingEditsAfterKeystroke = (fileName, position, key, options) => {
|
|
66
|
-
const [
|
|
67
|
-
if (
|
|
68
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(
|
|
66
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
67
|
+
if (serviceScript) {
|
|
68
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isFormattingEnabled);
|
|
69
69
|
if (generatePosition !== undefined) {
|
|
70
70
|
const edits = getFormattingEditsAfterKeystroke(fileName, generatePosition, key, options);
|
|
71
71
|
return edits
|
|
72
|
-
.map(edit => (0, transform_1.transformTextChange)(
|
|
72
|
+
.map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
|
|
73
73
|
.filter(utils_1.notEmpty);
|
|
74
74
|
}
|
|
75
75
|
return [];
|
|
@@ -81,19 +81,19 @@ function decorateLanguageService(files, languageService) {
|
|
|
81
81
|
languageService.getEditsForFileRename = (oldFilePath, newFilePath, formatOptions, preferences) => {
|
|
82
82
|
const edits = getEditsForFileRename(oldFilePath, newFilePath, formatOptions, preferences);
|
|
83
83
|
return edits
|
|
84
|
-
.map(edit => (0, transform_1.transformFileTextChanges)(
|
|
84
|
+
.map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isRenameEnabled))
|
|
85
85
|
.filter(utils_1.notEmpty);
|
|
86
86
|
};
|
|
87
87
|
languageService.getLinkedEditingRangeAtPosition = (fileName, position) => {
|
|
88
|
-
const [
|
|
89
|
-
if (
|
|
90
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(
|
|
88
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
89
|
+
if (serviceScript) {
|
|
90
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isLinkedEditingEnabled);
|
|
91
91
|
if (generatePosition !== undefined) {
|
|
92
92
|
const info = getLinkedEditingRangeAtPosition(fileName, generatePosition);
|
|
93
93
|
if (info) {
|
|
94
94
|
return {
|
|
95
95
|
ranges: info.ranges
|
|
96
|
-
.map(span => (0, transform_1.transformTextSpan)(
|
|
96
|
+
.map(span => (0, transform_1.transformTextSpan)(sourceScript, map, span, language_core_1.isLinkedEditingEnabled))
|
|
97
97
|
.filter(utils_1.notEmpty),
|
|
98
98
|
wordPattern: info.wordPattern,
|
|
99
99
|
};
|
|
@@ -105,16 +105,16 @@ function decorateLanguageService(files, languageService) {
|
|
|
105
105
|
}
|
|
106
106
|
};
|
|
107
107
|
languageService.prepareCallHierarchy = (fileName, position) => {
|
|
108
|
-
const [
|
|
109
|
-
if (
|
|
110
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(
|
|
108
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
109
|
+
if (serviceScript) {
|
|
110
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
111
111
|
if (generatePosition !== undefined) {
|
|
112
112
|
const item = prepareCallHierarchy(fileName, generatePosition);
|
|
113
113
|
if (Array.isArray(item)) {
|
|
114
|
-
return item.map(item => (0, transform_1.transformCallHierarchyItem)(
|
|
114
|
+
return item.map(item => (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled));
|
|
115
115
|
}
|
|
116
116
|
else if (item) {
|
|
117
|
-
return (0, transform_1.transformCallHierarchyItem)(
|
|
117
|
+
return (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled);
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
120
|
}
|
|
@@ -124,9 +124,9 @@ function decorateLanguageService(files, languageService) {
|
|
|
124
124
|
};
|
|
125
125
|
languageService.provideCallHierarchyIncomingCalls = (fileName, position) => {
|
|
126
126
|
let calls = [];
|
|
127
|
-
const [
|
|
128
|
-
if (
|
|
129
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(
|
|
127
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
128
|
+
if (serviceScript) {
|
|
129
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
130
130
|
if (generatePosition !== undefined) {
|
|
131
131
|
calls = provideCallHierarchyIncomingCalls(fileName, generatePosition);
|
|
132
132
|
}
|
|
@@ -136,9 +136,9 @@ function decorateLanguageService(files, languageService) {
|
|
|
136
136
|
}
|
|
137
137
|
return calls
|
|
138
138
|
.map(call => {
|
|
139
|
-
const from = (0, transform_1.transformCallHierarchyItem)(
|
|
139
|
+
const from = (0, transform_1.transformCallHierarchyItem)(language, call.from, language_core_1.isCallHierarchyEnabled);
|
|
140
140
|
const fromSpans = call.fromSpans
|
|
141
|
-
.map(span => (0, transform_1.transformSpan)(
|
|
141
|
+
.map(span => (0, transform_1.transformSpan)(language, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
|
|
142
142
|
.filter(utils_1.notEmpty);
|
|
143
143
|
return {
|
|
144
144
|
from,
|
|
@@ -148,9 +148,9 @@ function decorateLanguageService(files, languageService) {
|
|
|
148
148
|
};
|
|
149
149
|
languageService.provideCallHierarchyOutgoingCalls = (fileName, position) => {
|
|
150
150
|
let calls = [];
|
|
151
|
-
const [
|
|
152
|
-
if (
|
|
153
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(
|
|
151
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
152
|
+
if (serviceScript) {
|
|
153
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
|
|
154
154
|
if (generatePosition !== undefined) {
|
|
155
155
|
calls = provideCallHierarchyOutgoingCalls(fileName, generatePosition);
|
|
156
156
|
}
|
|
@@ -160,10 +160,10 @@ function decorateLanguageService(files, languageService) {
|
|
|
160
160
|
}
|
|
161
161
|
return calls
|
|
162
162
|
.map(call => {
|
|
163
|
-
const to = (0, transform_1.transformCallHierarchyItem)(
|
|
163
|
+
const to = (0, transform_1.transformCallHierarchyItem)(language, call.to, language_core_1.isCallHierarchyEnabled);
|
|
164
164
|
const fromSpans = call.fromSpans
|
|
165
|
-
.map(span =>
|
|
166
|
-
? (0, transform_1.transformTextSpan)(
|
|
165
|
+
.map(span => sourceScript
|
|
166
|
+
? (0, transform_1.transformTextSpan)(sourceScript, map, span, language_core_1.isCallHierarchyEnabled)
|
|
167
167
|
: span)
|
|
168
168
|
.filter(utils_1.notEmpty);
|
|
169
169
|
return {
|
|
@@ -175,18 +175,18 @@ function decorateLanguageService(files, languageService) {
|
|
|
175
175
|
languageService.organizeImports = (args, formatOptions, preferences) => {
|
|
176
176
|
const unresolved = organizeImports(args, formatOptions, preferences);
|
|
177
177
|
const resolved = unresolved
|
|
178
|
-
.map(changes => (0, transform_1.transformFileTextChanges)(
|
|
178
|
+
.map(changes => (0, transform_1.transformFileTextChanges)(language, changes, language_core_1.isCodeActionsEnabled))
|
|
179
179
|
.filter(utils_1.notEmpty);
|
|
180
180
|
return resolved;
|
|
181
181
|
};
|
|
182
182
|
languageService.getQuickInfoAtPosition = (fileName, position) => {
|
|
183
|
-
const [
|
|
184
|
-
if (
|
|
185
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(
|
|
183
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
184
|
+
if (serviceScript) {
|
|
185
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isHoverEnabled);
|
|
186
186
|
if (generatePosition !== undefined) {
|
|
187
187
|
const result = getQuickInfoAtPosition(fileName, generatePosition);
|
|
188
188
|
if (result) {
|
|
189
|
-
const textSpan = (0, transform_1.transformTextSpan)(
|
|
189
|
+
const textSpan = (0, transform_1.transformTextSpan)(sourceScript, map, result.textSpan, language_core_1.isHoverEnabled);
|
|
190
190
|
if (textSpan) {
|
|
191
191
|
return {
|
|
192
192
|
...result,
|
|
@@ -215,11 +215,11 @@ function decorateLanguageService(files, languageService) {
|
|
|
215
215
|
...highlights,
|
|
216
216
|
highlightSpans: highlights.highlightSpans
|
|
217
217
|
.map(span => {
|
|
218
|
-
const textSpan = (0, transform_1.transformSpan)(
|
|
218
|
+
const textSpan = (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled)?.textSpan;
|
|
219
219
|
if (textSpan) {
|
|
220
220
|
return {
|
|
221
221
|
...span,
|
|
222
|
-
contextSpan: (0, transform_1.transformSpan)(
|
|
222
|
+
contextSpan: (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
|
|
223
223
|
textSpan,
|
|
224
224
|
};
|
|
225
225
|
}
|
|
@@ -230,9 +230,9 @@ function decorateLanguageService(files, languageService) {
|
|
|
230
230
|
return resolved;
|
|
231
231
|
};
|
|
232
232
|
languageService.getApplicableRefactors = (fileName, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
|
|
233
|
-
const [
|
|
234
|
-
if (
|
|
235
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(
|
|
233
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
234
|
+
if (serviceScript) {
|
|
235
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
|
|
236
236
|
if (generatePosition !== undefined) {
|
|
237
237
|
const por = typeof positionOrRange === 'number'
|
|
238
238
|
? generatePosition
|
|
@@ -250,9 +250,9 @@ function decorateLanguageService(files, languageService) {
|
|
|
250
250
|
};
|
|
251
251
|
languageService.getEditsForRefactor = (fileName, formatOptions, positionOrRange, refactorName, actionName, preferences) => {
|
|
252
252
|
let edits;
|
|
253
|
-
const [
|
|
254
|
-
if (
|
|
255
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(
|
|
253
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
254
|
+
if (serviceScript) {
|
|
255
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number'
|
|
256
256
|
? positionOrRange
|
|
257
257
|
: positionOrRange.pos, language_core_1.isCodeActionsEnabled);
|
|
258
258
|
if (generatePosition !== undefined) {
|
|
@@ -270,19 +270,19 @@ function decorateLanguageService(files, languageService) {
|
|
|
270
270
|
}
|
|
271
271
|
if (edits) {
|
|
272
272
|
edits.edits = edits.edits
|
|
273
|
-
.map(edit => (0, transform_1.transformFileTextChanges)(
|
|
273
|
+
.map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isCodeActionsEnabled))
|
|
274
274
|
.filter(utils_1.notEmpty);
|
|
275
275
|
return edits;
|
|
276
276
|
}
|
|
277
277
|
};
|
|
278
278
|
languageService.getRenameInfo = (fileName, position, options) => {
|
|
279
|
-
const [
|
|
280
|
-
if (
|
|
281
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(
|
|
279
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
280
|
+
if (serviceScript) {
|
|
281
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isRenameEnabled);
|
|
282
282
|
if (generatePosition !== undefined) {
|
|
283
283
|
const info = getRenameInfo(fileName, generatePosition, options);
|
|
284
284
|
if (info.canRename) {
|
|
285
|
-
const span = (0, transform_1.transformTextSpan)(
|
|
285
|
+
const span = (0, transform_1.transformTextSpan)(sourceScript, map, info.triggerSpan, language_core_1.isRenameEnabled);
|
|
286
286
|
if (span) {
|
|
287
287
|
info.triggerSpan = span;
|
|
288
288
|
return info;
|
|
@@ -303,10 +303,10 @@ function decorateLanguageService(files, languageService) {
|
|
|
303
303
|
};
|
|
304
304
|
languageService.getCodeFixesAtPosition = (fileName, start, end, errorCodes, formatOptions, preferences) => {
|
|
305
305
|
let fixes = [];
|
|
306
|
-
const [
|
|
307
|
-
if (
|
|
308
|
-
const generateStart = (0, transform_1.toGeneratedOffset)(
|
|
309
|
-
const generateEnd = (0, transform_1.toGeneratedOffset)(
|
|
306
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
307
|
+
if (serviceScript) {
|
|
308
|
+
const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isCodeActionsEnabled);
|
|
309
|
+
const generateEnd = (0, transform_1.toGeneratedOffset)(sourceScript, map, end, language_core_1.isCodeActionsEnabled);
|
|
310
310
|
if (generateStart !== undefined && generateEnd !== undefined) {
|
|
311
311
|
fixes = getCodeFixesAtPosition(fileName, generateStart, generateEnd, errorCodes, formatOptions, preferences);
|
|
312
312
|
}
|
|
@@ -315,14 +315,14 @@ function decorateLanguageService(files, languageService) {
|
|
|
315
315
|
fixes = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
|
|
316
316
|
}
|
|
317
317
|
fixes = fixes.map(fix => {
|
|
318
|
-
fix.changes = fix.changes.map(edit => (0, transform_1.transformFileTextChanges)(
|
|
318
|
+
fix.changes = fix.changes.map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isCodeActionsEnabled)).filter(utils_1.notEmpty);
|
|
319
319
|
return fix;
|
|
320
320
|
});
|
|
321
321
|
return fixes;
|
|
322
322
|
};
|
|
323
323
|
languageService.getEncodedSemanticClassifications = (fileName, span, format) => {
|
|
324
|
-
const [
|
|
325
|
-
if (
|
|
324
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
325
|
+
if (serviceScript) {
|
|
326
326
|
let start;
|
|
327
327
|
let end;
|
|
328
328
|
for (const mapping of map.mappings) {
|
|
@@ -335,14 +335,14 @@ function decorateLanguageService(files, languageService) {
|
|
|
335
335
|
}
|
|
336
336
|
}
|
|
337
337
|
start ??= 0;
|
|
338
|
-
end ??=
|
|
339
|
-
start +=
|
|
340
|
-
end +=
|
|
338
|
+
end ??= sourceScript.snapshot.getLength();
|
|
339
|
+
start += sourceScript.snapshot.getLength();
|
|
340
|
+
end += sourceScript.snapshot.getLength();
|
|
341
341
|
const result = getEncodedSemanticClassifications(fileName, { start, length: end - start }, format);
|
|
342
342
|
const spans = [];
|
|
343
343
|
for (let i = 0; i < result.spans.length; i += 3) {
|
|
344
|
-
const sourceStart = (0, transform_1.toSourceOffset)(
|
|
345
|
-
const sourceEnd = (0, transform_1.toSourceOffset)(
|
|
344
|
+
const sourceStart = (0, transform_1.toSourceOffset)(sourceScript, map, result.spans[i], language_core_1.isSemanticTokensEnabled);
|
|
345
|
+
const sourceEnd = (0, transform_1.toSourceOffset)(sourceScript, map, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled);
|
|
346
346
|
if (sourceStart !== undefined && sourceEnd !== undefined) {
|
|
347
347
|
spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
|
|
348
348
|
}
|
|
@@ -356,17 +356,17 @@ function decorateLanguageService(files, languageService) {
|
|
|
356
356
|
};
|
|
357
357
|
languageService.getSyntacticDiagnostics = fileName => {
|
|
358
358
|
return getSyntacticDiagnostics(fileName)
|
|
359
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
359
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d))
|
|
360
360
|
.filter(utils_1.notEmpty);
|
|
361
361
|
};
|
|
362
362
|
languageService.getSemanticDiagnostics = fileName => {
|
|
363
363
|
return getSemanticDiagnostics(fileName)
|
|
364
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
364
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d))
|
|
365
365
|
.filter(utils_1.notEmpty);
|
|
366
366
|
};
|
|
367
367
|
languageService.getSuggestionDiagnostics = fileName => {
|
|
368
368
|
return getSuggestionDiagnostics(fileName)
|
|
369
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
369
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d))
|
|
370
370
|
.filter(utils_1.notEmpty);
|
|
371
371
|
};
|
|
372
372
|
languageService.getDefinitionAndBoundSpan = (fileName, position) => {
|
|
@@ -376,14 +376,14 @@ function decorateLanguageService(files, languageService) {
|
|
|
376
376
|
}
|
|
377
377
|
});
|
|
378
378
|
const textSpan = unresolved
|
|
379
|
-
.map(s => (0, transform_1.transformSpan)(
|
|
379
|
+
.map(s => (0, transform_1.transformSpan)(language, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
|
|
380
380
|
.filter(utils_1.notEmpty)[0];
|
|
381
381
|
if (!textSpan) {
|
|
382
382
|
return;
|
|
383
383
|
}
|
|
384
384
|
const definitions = unresolved
|
|
385
385
|
.map(s => s.definitions
|
|
386
|
-
?.map(s => (0, transform_1.transformDocumentSpan)(
|
|
386
|
+
?.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
|
|
387
387
|
.filter(utils_1.notEmpty))
|
|
388
388
|
.filter(utils_1.notEmpty)
|
|
389
389
|
.flat();
|
|
@@ -403,12 +403,12 @@ function decorateLanguageService(files, languageService) {
|
|
|
403
403
|
const resolved = unresolved
|
|
404
404
|
.flat()
|
|
405
405
|
.map(symbol => {
|
|
406
|
-
const definition = (0, transform_1.transformDocumentSpan)(
|
|
406
|
+
const definition = (0, transform_1.transformDocumentSpan)(language, symbol.definition, language_core_1.isDefinitionEnabled);
|
|
407
407
|
if (definition) {
|
|
408
408
|
return {
|
|
409
409
|
definition,
|
|
410
410
|
references: symbol.references
|
|
411
|
-
.map(r => (0, transform_1.transformDocumentSpan)(
|
|
411
|
+
.map(r => (0, transform_1.transformDocumentSpan)(language, r, language_core_1.isReferencesEnabled))
|
|
412
412
|
.filter(utils_1.notEmpty),
|
|
413
413
|
};
|
|
414
414
|
}
|
|
@@ -424,7 +424,7 @@ function decorateLanguageService(files, languageService) {
|
|
|
424
424
|
});
|
|
425
425
|
const resolved = unresolved
|
|
426
426
|
.flat()
|
|
427
|
-
.map(s => (0, transform_1.transformDocumentSpan)(
|
|
427
|
+
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
|
|
428
428
|
.filter(utils_1.notEmpty);
|
|
429
429
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
430
430
|
};
|
|
@@ -436,7 +436,7 @@ function decorateLanguageService(files, languageService) {
|
|
|
436
436
|
});
|
|
437
437
|
const resolved = unresolved
|
|
438
438
|
.flat()
|
|
439
|
-
.map(s => (0, transform_1.transformDocumentSpan)(
|
|
439
|
+
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isTypeDefinitionEnabled))
|
|
440
440
|
.filter(utils_1.notEmpty);
|
|
441
441
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
442
442
|
};
|
|
@@ -448,7 +448,7 @@ function decorateLanguageService(files, languageService) {
|
|
|
448
448
|
});
|
|
449
449
|
const resolved = unresolved
|
|
450
450
|
.flat()
|
|
451
|
-
.map(s => (0, transform_1.transformDocumentSpan)(
|
|
451
|
+
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isImplementationEnabled))
|
|
452
452
|
.filter(utils_1.notEmpty);
|
|
453
453
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
454
454
|
};
|
|
@@ -460,7 +460,7 @@ function decorateLanguageService(files, languageService) {
|
|
|
460
460
|
});
|
|
461
461
|
const resolved = unresolved
|
|
462
462
|
.flat()
|
|
463
|
-
.map(s => (0, transform_1.transformDocumentSpan)(
|
|
463
|
+
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isRenameEnabled))
|
|
464
464
|
.filter(utils_1.notEmpty);
|
|
465
465
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
466
466
|
};
|
|
@@ -472,17 +472,17 @@ function decorateLanguageService(files, languageService) {
|
|
|
472
472
|
});
|
|
473
473
|
const resolved = unresolved
|
|
474
474
|
.flat()
|
|
475
|
-
.map(s => (0, transform_1.transformDocumentSpan)(
|
|
475
|
+
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
|
|
476
476
|
.filter(utils_1.notEmpty);
|
|
477
477
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
478
478
|
};
|
|
479
479
|
languageService.getCompletionsAtPosition = (fileName, position, options, formattingSettings) => {
|
|
480
|
-
const [
|
|
481
|
-
if (
|
|
480
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
481
|
+
if (serviceScript) {
|
|
482
482
|
let mainResult;
|
|
483
483
|
let additionalResults = [];
|
|
484
484
|
let isAdditional;
|
|
485
|
-
const generatedOffset = (0, transform_1.toGeneratedOffset)(
|
|
485
|
+
const generatedOffset = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, data => {
|
|
486
486
|
if (!(0, language_core_1.isCompletionEnabled)(data)) {
|
|
487
487
|
return false;
|
|
488
488
|
}
|
|
@@ -496,9 +496,9 @@ function decorateLanguageService(files, languageService) {
|
|
|
496
496
|
const result = getCompletionsAtPosition(fileName, generatedOffset, options, formattingSettings);
|
|
497
497
|
if (result) {
|
|
498
498
|
for (const entry of result.entries) {
|
|
499
|
-
entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(
|
|
499
|
+
entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(sourceScript, map, entry.replacementSpan, language_core_1.isCompletionEnabled);
|
|
500
500
|
}
|
|
501
|
-
result.optionalReplacementSpan = result.optionalReplacementSpan && (0, transform_1.transformTextSpan)(
|
|
501
|
+
result.optionalReplacementSpan = result.optionalReplacementSpan && (0, transform_1.transformTextSpan)(sourceScript, map, result.optionalReplacementSpan, language_core_1.isCompletionEnabled);
|
|
502
502
|
if (isAdditional) {
|
|
503
503
|
additionalResults.push(result);
|
|
504
504
|
}
|
|
@@ -526,9 +526,9 @@ function decorateLanguageService(files, languageService) {
|
|
|
526
526
|
};
|
|
527
527
|
languageService.getCompletionEntryDetails = (fileName, position, entryName, formatOptions, source, preferences, data) => {
|
|
528
528
|
let details;
|
|
529
|
-
const [
|
|
530
|
-
if (
|
|
531
|
-
const generatePosition = (0, transform_1.toGeneratedOffset)(
|
|
529
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
530
|
+
if (serviceScript) {
|
|
531
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCompletionEnabled);
|
|
532
532
|
if (generatePosition !== undefined) {
|
|
533
533
|
details = getCompletionEntryDetails(fileName, generatePosition, entryName, formatOptions, source, preferences, data);
|
|
534
534
|
}
|
|
@@ -538,14 +538,14 @@ function decorateLanguageService(files, languageService) {
|
|
|
538
538
|
}
|
|
539
539
|
if (details?.codeActions) {
|
|
540
540
|
for (const codeAction of details.codeActions) {
|
|
541
|
-
codeAction.changes = codeAction.changes.map(edit => (0, transform_1.transformFileTextChanges)(
|
|
541
|
+
codeAction.changes = codeAction.changes.map(edit => (0, transform_1.transformFileTextChanges)(language, edit, language_core_1.isCompletionEnabled)).filter(utils_1.notEmpty);
|
|
542
542
|
}
|
|
543
543
|
}
|
|
544
544
|
return details;
|
|
545
545
|
};
|
|
546
546
|
languageService.provideInlayHints = (fileName, span, preferences) => {
|
|
547
|
-
const [
|
|
548
|
-
if (
|
|
547
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
548
|
+
if (serviceScript) {
|
|
549
549
|
let start;
|
|
550
550
|
let end;
|
|
551
551
|
for (const mapping of map.mappings) {
|
|
@@ -560,12 +560,12 @@ function decorateLanguageService(files, languageService) {
|
|
|
560
560
|
start = 0;
|
|
561
561
|
end = 0;
|
|
562
562
|
}
|
|
563
|
-
start +=
|
|
564
|
-
end +=
|
|
563
|
+
start += sourceScript.snapshot.getLength();
|
|
564
|
+
end += sourceScript.snapshot.getLength();
|
|
565
565
|
const result = provideInlayHints(fileName, { start, length: end - start }, preferences);
|
|
566
566
|
const hints = [];
|
|
567
567
|
for (const hint of result) {
|
|
568
|
-
const sourcePosition = (0, transform_1.toSourceOffset)(
|
|
568
|
+
const sourcePosition = (0, transform_1.toSourceOffset)(sourceScript, map, hint.position, language_core_1.isInlayHintsEnabled);
|
|
569
569
|
if (sourcePosition !== undefined) {
|
|
570
570
|
hints.push({
|
|
571
571
|
...hint,
|
|
@@ -582,18 +582,18 @@ function decorateLanguageService(files, languageService) {
|
|
|
582
582
|
languageService.getFileReferences = fileName => {
|
|
583
583
|
const unresolved = getFileReferences(fileName);
|
|
584
584
|
const resolved = unresolved
|
|
585
|
-
.map(s => (0, transform_1.transformDocumentSpan)(
|
|
585
|
+
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
|
|
586
586
|
.filter(utils_1.notEmpty);
|
|
587
587
|
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
588
588
|
};
|
|
589
589
|
function linkedCodeFeatureWorker(fileName, position, filter, worker, getLinkedCodes) {
|
|
590
590
|
let results = [];
|
|
591
591
|
const processedFilePositions = new Set();
|
|
592
|
-
const [
|
|
593
|
-
if (
|
|
592
|
+
const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
|
|
593
|
+
if (serviceScript) {
|
|
594
594
|
for (const [generatedOffset, mapping] of map.getGeneratedOffsets(position)) {
|
|
595
595
|
if (filter(mapping.data)) {
|
|
596
|
-
process(fileName, generatedOffset +
|
|
596
|
+
process(fileName, generatedOffset + sourceScript.snapshot.getLength());
|
|
597
597
|
}
|
|
598
598
|
}
|
|
599
599
|
}
|
|
@@ -613,16 +613,16 @@ function decorateLanguageService(files, languageService) {
|
|
|
613
613
|
results = results.concat(result);
|
|
614
614
|
for (const ref of getLinkedCodes(result)) {
|
|
615
615
|
processedFilePositions.add(ref[0] + ':' + ref[1]);
|
|
616
|
-
const [virtualFile,
|
|
616
|
+
const [virtualFile, sourceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
|
|
617
617
|
if (!virtualFile) {
|
|
618
618
|
continue;
|
|
619
619
|
}
|
|
620
|
-
const linkedCodeMap =
|
|
620
|
+
const linkedCodeMap = language.linkedCodeMaps.get(virtualFile.code);
|
|
621
621
|
if (!linkedCodeMap) {
|
|
622
622
|
continue;
|
|
623
623
|
}
|
|
624
|
-
for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] -
|
|
625
|
-
process(ref[0], linkedCodeOffset +
|
|
624
|
+
for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - sourceScript.snapshot.getLength())) {
|
|
625
|
+
process(ref[0], linkedCodeOffset + sourceScript.snapshot.getLength());
|
|
626
626
|
}
|
|
627
627
|
}
|
|
628
628
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type Language } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare function decorateLanguageServiceHost(
|
|
3
|
+
export declare function decorateLanguageServiceHost(language: Language, languageServiceHost: ts.LanguageServiceHost, ts: typeof import('typescript')): void;
|
|
4
4
|
export declare function searchExternalFiles(ts: typeof import('typescript'), project: ts.server.Project, exts: string[]): string[];
|
|
@@ -3,10 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.searchExternalFiles = exports.decorateLanguageServiceHost = void 0;
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
5
|
const resolveModuleName_1 = require("../resolveModuleName");
|
|
6
|
-
function decorateLanguageServiceHost(
|
|
6
|
+
function decorateLanguageServiceHost(language, languageServiceHost, ts) {
|
|
7
7
|
let extraProjectVersion = 0;
|
|
8
|
-
const
|
|
9
|
-
const exts = languagePlugins
|
|
8
|
+
const exts = language.plugins
|
|
10
9
|
.map(plugin => plugin.typescript?.extraFileExtensions.map(ext => '.' + ext.extension) ?? [])
|
|
11
10
|
.flat();
|
|
12
11
|
const scripts = new Map();
|
|
@@ -29,8 +28,8 @@ function decorateLanguageServiceHost(virtualFiles, languageServiceHost, ts) {
|
|
|
29
28
|
return readDirectory(path, extensions, exclude, include, depth);
|
|
30
29
|
};
|
|
31
30
|
}
|
|
32
|
-
if (
|
|
33
|
-
const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost,
|
|
31
|
+
if (language.plugins.some(language => language.typescript?.extraFileExtensions.length)) {
|
|
32
|
+
const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, language.plugins, fileName => language.scripts.get(fileName));
|
|
34
33
|
if (resolveModuleNameLiterals) {
|
|
35
34
|
languageServiceHost.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, options, ...rest) => {
|
|
36
35
|
if (moduleLiterals.every(name => !exts.some(ext => name.text.endsWith(ext)))) {
|
|
@@ -82,25 +81,25 @@ function decorateLanguageServiceHost(virtualFiles, languageServiceHost, ts) {
|
|
|
82
81
|
const snapshot = getScriptSnapshot(fileName);
|
|
83
82
|
if (snapshot) {
|
|
84
83
|
extraProjectVersion++;
|
|
85
|
-
const
|
|
86
|
-
if (
|
|
84
|
+
const sourceScript = language.scripts.set(fileName, (0, language_core_1.resolveCommonLanguageId)(fileName), snapshot);
|
|
85
|
+
if (sourceScript.generated) {
|
|
87
86
|
const text = snapshot.getText(0, snapshot.getLength());
|
|
88
87
|
let patchedText = text.split('\n').map(line => ' '.repeat(line.length)).join('\n');
|
|
89
|
-
const
|
|
90
|
-
if (
|
|
91
|
-
extension =
|
|
92
|
-
scriptKind =
|
|
93
|
-
patchedText +=
|
|
88
|
+
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
89
|
+
if (serviceScript) {
|
|
90
|
+
extension = serviceScript.extension;
|
|
91
|
+
scriptKind = serviceScript.scriptKind;
|
|
92
|
+
patchedText += serviceScript.code.snapshot.getText(0, serviceScript.code.snapshot.getLength());
|
|
94
93
|
}
|
|
95
94
|
snapshotSnapshot = ts.ScriptSnapshot.fromString(patchedText);
|
|
96
|
-
if (
|
|
95
|
+
if (sourceScript.generated.languagePlugin.typescript?.getExtraServiceScripts) {
|
|
97
96
|
console.warn('getExtraScripts() is not available in this use case.');
|
|
98
97
|
}
|
|
99
98
|
}
|
|
100
99
|
}
|
|
101
|
-
else if (
|
|
100
|
+
else if (language.scripts.get(fileName)) {
|
|
102
101
|
extraProjectVersion++;
|
|
103
|
-
|
|
102
|
+
language.scripts.delete(fileName);
|
|
104
103
|
}
|
|
105
104
|
if (snapshotSnapshot) {
|
|
106
105
|
scripts.set(fileName, [
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { Language } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare function decorateProgram(
|
|
3
|
+
export declare function decorateProgram(language: Language, program: ts.Program): void;
|