@volar/typescript 2.4.0-alpha.0 → 2.4.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 +14 -11
- package/index.js +1 -1
- package/lib/node/proxyLanguageService.d.ts +6 -0
- package/lib/node/proxyLanguageService.js +910 -0
- package/lib/protocol/createProject.d.ts +2 -1
- package/lib/protocol/createProject.js +8 -8
- package/lib/quickstart/createAsyncLanguageServicePlugin.js +4 -2
- package/lib/quickstart/createLanguageServicePlugin.js +4 -2
- package/lib/quickstart/runTsc.d.ts +1 -1
- package/package.json +4 -4
package/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export * from './lib/common';
|
|
2
|
-
export * from './lib/node/
|
|
2
|
+
export * from './lib/node/proxyLanguageService';
|
|
3
3
|
export * from './lib/node/decorateLanguageServiceHost';
|
|
4
4
|
export * from './lib/node/decorateProgram';
|
|
5
5
|
export * from './lib/node/proxyCreateProgram';
|
|
@@ -7,8 +7,9 @@ export * from './lib/protocol/createProject';
|
|
|
7
7
|
export * from './lib/protocol/createSys';
|
|
8
8
|
import type { VirtualCode } from '@volar/language-core';
|
|
9
9
|
import type * as ts from 'typescript';
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
import { URI } from 'vscode-uri';
|
|
11
|
+
declare module '@volar/language-service' {
|
|
12
|
+
interface ProjectContext {
|
|
12
13
|
typescript?: {
|
|
13
14
|
configFileName: string | undefined;
|
|
14
15
|
sys: ts.System & {
|
|
@@ -17,27 +18,29 @@ declare module '@volar/language-core' {
|
|
|
17
18
|
};
|
|
18
19
|
languageServiceHost: ts.LanguageServiceHost;
|
|
19
20
|
getExtraServiceScript(fileName: string): TypeScriptExtraServiceScript | undefined;
|
|
20
|
-
|
|
21
|
-
asFileName(
|
|
21
|
+
asUri(fileName: string): URI;
|
|
22
|
+
asFileName(uri: URI): string;
|
|
22
23
|
};
|
|
23
24
|
}
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
}
|
|
26
|
+
declare module '@volar/language-core' {
|
|
27
|
+
interface LanguagePlugin {
|
|
28
|
+
typescript?: TypeScriptGenericOptions & TypeScriptNonTSPluginOptions;
|
|
26
29
|
}
|
|
27
30
|
}
|
|
28
31
|
/**
|
|
29
32
|
* The following options available to all situations.
|
|
30
33
|
*/
|
|
31
|
-
interface TypeScriptGenericOptions
|
|
34
|
+
interface TypeScriptGenericOptions {
|
|
32
35
|
extraFileExtensions: ts.FileExtensionInfo[];
|
|
33
36
|
resolveHiddenExtensions?: boolean;
|
|
34
|
-
getServiceScript(root:
|
|
37
|
+
getServiceScript(root: VirtualCode): TypeScriptServiceScript | undefined;
|
|
35
38
|
}
|
|
36
39
|
/**
|
|
37
40
|
* The following options will not be available in TS plugin.
|
|
38
41
|
*/
|
|
39
|
-
interface TypeScriptNonTSPluginOptions
|
|
40
|
-
getExtraServiceScripts?(fileName: string,
|
|
42
|
+
interface TypeScriptNonTSPluginOptions {
|
|
43
|
+
getExtraServiceScripts?(fileName: string, root: VirtualCode): TypeScriptExtraServiceScript[];
|
|
41
44
|
resolveLanguageServiceHost?(host: ts.LanguageServiceHost): ts.LanguageServiceHost;
|
|
42
45
|
}
|
|
43
46
|
export interface TypeScriptServiceScript {
|
package/index.js
CHANGED
|
@@ -15,7 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./lib/common"), exports);
|
|
18
|
-
__exportStar(require("./lib/node/
|
|
18
|
+
__exportStar(require("./lib/node/proxyLanguageService"), exports);
|
|
19
19
|
__exportStar(require("./lib/node/decorateLanguageServiceHost"), exports);
|
|
20
20
|
__exportStar(require("./lib/node/decorateProgram"), exports);
|
|
21
21
|
__exportStar(require("./lib/node/proxyCreateProgram"), exports);
|
|
@@ -0,0 +1,910 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createProxyLanguageService = createProxyLanguageService;
|
|
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 createProxyLanguageService(languageService) {
|
|
10
|
+
const proxyCache = new Map();
|
|
11
|
+
let getProxyMethod;
|
|
12
|
+
return {
|
|
13
|
+
initialize(language) {
|
|
14
|
+
getProxyMethod = (target, p) => {
|
|
15
|
+
switch (p) {
|
|
16
|
+
case 'getNavigationTree': return getNavigationTree(language, target[p]);
|
|
17
|
+
case 'getOutliningSpans': return getOutliningSpans(language, target[p]);
|
|
18
|
+
case 'getFormattingEditsForDocument': return getFormattingEditsForDocument(language, target[p]);
|
|
19
|
+
case 'getFormattingEditsForRange': return getFormattingEditsForRange(language, target[p]);
|
|
20
|
+
case 'getFormattingEditsAfterKeystroke': return getFormattingEditsAfterKeystroke(language, target[p]);
|
|
21
|
+
case 'getEditsForFileRename': return getEditsForFileRename(language, target[p]);
|
|
22
|
+
case 'getLinkedEditingRangeAtPosition': return getLinkedEditingRangeAtPosition(language, target[p]);
|
|
23
|
+
case 'prepareCallHierarchy': return prepareCallHierarchy(language, target[p]);
|
|
24
|
+
case 'provideCallHierarchyIncomingCalls': return provideCallHierarchyIncomingCalls(language, target[p]);
|
|
25
|
+
case 'provideCallHierarchyOutgoingCalls': return provideCallHierarchyOutgoingCalls(language, target[p]);
|
|
26
|
+
case 'organizeImports': return organizeImports(language, target[p]);
|
|
27
|
+
case 'getQuickInfoAtPosition': return getQuickInfoAtPosition(language, target[p]);
|
|
28
|
+
case 'getSignatureHelpItems': return getSignatureHelpItems(language, target[p]);
|
|
29
|
+
case 'getDocumentHighlights': return getDocumentHighlights(language, target[p]);
|
|
30
|
+
case 'getApplicableRefactors': return getApplicableRefactors(language, target[p]);
|
|
31
|
+
case 'getEditsForRefactor': return getEditsForRefactor(language, target[p]);
|
|
32
|
+
case 'getRenameInfo': return getRenameInfo(language, target[p]);
|
|
33
|
+
case 'getCodeFixesAtPosition': return getCodeFixesAtPosition(language, target[p]);
|
|
34
|
+
case 'getEncodedSemanticClassifications': return getEncodedSemanticClassifications(language, target[p]);
|
|
35
|
+
case 'getSyntacticDiagnostics': return getSyntacticDiagnostics(language, languageService, target[p]);
|
|
36
|
+
case 'getSemanticDiagnostics': return getSemanticDiagnostics(language, languageService, target[p]);
|
|
37
|
+
case 'getSuggestionDiagnostics': return getSuggestionDiagnostics(language, languageService, target[p]);
|
|
38
|
+
case 'getDefinitionAndBoundSpan': return getDefinitionAndBoundSpan(language, target[p]);
|
|
39
|
+
case 'findReferences': return findReferences(language, target[p]);
|
|
40
|
+
case 'getDefinitionAtPosition': return getDefinitionAtPosition(language, target[p]);
|
|
41
|
+
case 'getTypeDefinitionAtPosition': return getTypeDefinitionAtPosition(language, target[p]);
|
|
42
|
+
case 'getImplementationAtPosition': return getImplementationAtPosition(language, target[p]);
|
|
43
|
+
case 'findRenameLocations': return findRenameLocations(language, target[p]);
|
|
44
|
+
case 'getReferencesAtPosition': return getReferencesAtPosition(language, target[p]);
|
|
45
|
+
case 'getCompletionsAtPosition': return getCompletionsAtPosition(language, target[p]);
|
|
46
|
+
case 'getCompletionEntryDetails': return getCompletionEntryDetails(language, target[p]);
|
|
47
|
+
case 'provideInlayHints': return provideInlayHints(language, target[p]);
|
|
48
|
+
case 'getFileReferences': return getFileReferences(language, target[p]);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
proxy: new Proxy(languageService, {
|
|
53
|
+
get(target, p, receiver) {
|
|
54
|
+
if (getProxyMethod) {
|
|
55
|
+
if (!proxyCache.has(p)) {
|
|
56
|
+
proxyCache.set(p, getProxyMethod(target, p));
|
|
57
|
+
}
|
|
58
|
+
const proxyMethod = proxyCache.get(p);
|
|
59
|
+
if (proxyMethod) {
|
|
60
|
+
return proxyMethod;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return Reflect.get(target, p, receiver);
|
|
64
|
+
},
|
|
65
|
+
set(target, p, value, receiver) {
|
|
66
|
+
return Reflect.set(target, p, value, receiver);
|
|
67
|
+
},
|
|
68
|
+
}),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// ignored methods
|
|
72
|
+
function getNavigationTree(language, getNavigationTree) {
|
|
73
|
+
return filePath => {
|
|
74
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
75
|
+
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
76
|
+
if (serviceScript || targetScript?.associatedOnly) {
|
|
77
|
+
const tree = getNavigationTree(targetScript.id);
|
|
78
|
+
tree.childItems = undefined;
|
|
79
|
+
return tree;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
return getNavigationTree(fileName);
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function getOutliningSpans(language, getOutliningSpans) {
|
|
87
|
+
return filePath => {
|
|
88
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
89
|
+
const [serviceScript, targetScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
90
|
+
if (serviceScript || targetScript?.associatedOnly) {
|
|
91
|
+
return [];
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
return getOutliningSpans(fileName);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
// proxy methods
|
|
99
|
+
function getFormattingEditsForDocument(language, getFormattingEditsForDocument) {
|
|
100
|
+
return (filePath, options) => {
|
|
101
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
102
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
103
|
+
if (targetScript?.associatedOnly) {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
if (serviceScript) {
|
|
107
|
+
const map = language.maps.get(serviceScript.code, targetScript);
|
|
108
|
+
if (!map.mappings.some(mapping => (0, language_core_1.isFormattingEnabled)(mapping.data))) {
|
|
109
|
+
return [];
|
|
110
|
+
}
|
|
111
|
+
const edits = getFormattingEditsForDocument(targetScript.id, options);
|
|
112
|
+
return edits
|
|
113
|
+
.map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
|
|
114
|
+
.filter(edit => !!edit);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
return getFormattingEditsForDocument(fileName, options);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function getFormattingEditsForRange(language, getFormattingEditsForRange) {
|
|
122
|
+
return (filePath, start, end, options) => {
|
|
123
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
124
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
125
|
+
if (targetScript?.associatedOnly) {
|
|
126
|
+
return [];
|
|
127
|
+
}
|
|
128
|
+
if (serviceScript) {
|
|
129
|
+
const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, start, language_core_1.isFormattingEnabled);
|
|
130
|
+
const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, end, language_core_1.isFormattingEnabled);
|
|
131
|
+
if (generateStart !== undefined && generateEnd !== undefined) {
|
|
132
|
+
const edits = getFormattingEditsForRange(targetScript.id, generateStart, generateEnd, options);
|
|
133
|
+
return edits
|
|
134
|
+
.map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
|
|
135
|
+
.filter(edit => !!edit);
|
|
136
|
+
}
|
|
137
|
+
return [];
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
return getFormattingEditsForRange(fileName, start, end, options);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
function getFormattingEditsAfterKeystroke(language, getFormattingEditsAfterKeystroke) {
|
|
145
|
+
return (filePath, position, key, options) => {
|
|
146
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
147
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
148
|
+
if (targetScript?.associatedOnly) {
|
|
149
|
+
return [];
|
|
150
|
+
}
|
|
151
|
+
if (serviceScript) {
|
|
152
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isFormattingEnabled);
|
|
153
|
+
if (generatePosition !== undefined) {
|
|
154
|
+
const edits = getFormattingEditsAfterKeystroke(targetScript.id, generatePosition, key, options);
|
|
155
|
+
return edits
|
|
156
|
+
.map(edit => (0, transform_1.transformTextChange)(sourceScript, language, serviceScript, edit, language_core_1.isFormattingEnabled)?.[1])
|
|
157
|
+
.filter(edit => !!edit);
|
|
158
|
+
}
|
|
159
|
+
return [];
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
return getFormattingEditsAfterKeystroke(fileName, position, key, options);
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
function getEditsForFileRename(language, getEditsForFileRename) {
|
|
167
|
+
return (oldFilePath, newFilePath, formatOptions, preferences) => {
|
|
168
|
+
const edits = getEditsForFileRename(oldFilePath, newFilePath, formatOptions, preferences);
|
|
169
|
+
return (0, transform_1.transformFileTextChanges)(language, edits, language_core_1.isRenameEnabled);
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
function getLinkedEditingRangeAtPosition(language, getLinkedEditingRangeAtPosition) {
|
|
173
|
+
return (filePath, position) => {
|
|
174
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
175
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
176
|
+
if (targetScript?.associatedOnly) {
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
if (serviceScript) {
|
|
180
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isLinkedEditingEnabled);
|
|
181
|
+
if (generatePosition !== undefined) {
|
|
182
|
+
const info = getLinkedEditingRangeAtPosition(targetScript.id, generatePosition);
|
|
183
|
+
if (info) {
|
|
184
|
+
return {
|
|
185
|
+
ranges: info.ranges
|
|
186
|
+
.map(span => (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, span, language_core_1.isLinkedEditingEnabled)?.[1])
|
|
187
|
+
.filter(span => !!span),
|
|
188
|
+
wordPattern: info.wordPattern,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
return getLinkedEditingRangeAtPosition(fileName, position);
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
function prepareCallHierarchy(language, prepareCallHierarchy) {
|
|
199
|
+
return (filePath, position) => {
|
|
200
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
201
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
202
|
+
if (targetScript?.associatedOnly) {
|
|
203
|
+
return undefined;
|
|
204
|
+
}
|
|
205
|
+
if (serviceScript) {
|
|
206
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
|
|
207
|
+
if (generatePosition !== undefined) {
|
|
208
|
+
const item = prepareCallHierarchy(targetScript.id, generatePosition);
|
|
209
|
+
if (Array.isArray(item)) {
|
|
210
|
+
return item.map(item => (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled));
|
|
211
|
+
}
|
|
212
|
+
else if (item) {
|
|
213
|
+
return (0, transform_1.transformCallHierarchyItem)(language, item, language_core_1.isCallHierarchyEnabled);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
return prepareCallHierarchy(fileName, position);
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
function provideCallHierarchyIncomingCalls(language, provideCallHierarchyIncomingCalls) {
|
|
223
|
+
return (filePath, position) => {
|
|
224
|
+
let calls = [];
|
|
225
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
226
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
227
|
+
if (targetScript?.associatedOnly) {
|
|
228
|
+
return [];
|
|
229
|
+
}
|
|
230
|
+
if (serviceScript) {
|
|
231
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
|
|
232
|
+
if (generatePosition !== undefined) {
|
|
233
|
+
calls = provideCallHierarchyIncomingCalls(targetScript.id, generatePosition);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
calls = provideCallHierarchyIncomingCalls(fileName, position);
|
|
238
|
+
}
|
|
239
|
+
return calls
|
|
240
|
+
.map(call => {
|
|
241
|
+
const from = (0, transform_1.transformCallHierarchyItem)(language, call.from, language_core_1.isCallHierarchyEnabled);
|
|
242
|
+
const fromSpans = call.fromSpans
|
|
243
|
+
.map(span => (0, transform_1.transformSpan)(language, call.from.file, span, language_core_1.isCallHierarchyEnabled)?.textSpan)
|
|
244
|
+
.filter(span => !!span);
|
|
245
|
+
return {
|
|
246
|
+
from,
|
|
247
|
+
fromSpans,
|
|
248
|
+
};
|
|
249
|
+
});
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
function provideCallHierarchyOutgoingCalls(language, provideCallHierarchyOutgoingCalls) {
|
|
253
|
+
return (filePath, position) => {
|
|
254
|
+
let calls = [];
|
|
255
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
256
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
257
|
+
if (targetScript?.associatedOnly) {
|
|
258
|
+
return [];
|
|
259
|
+
}
|
|
260
|
+
if (serviceScript) {
|
|
261
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCallHierarchyEnabled);
|
|
262
|
+
if (generatePosition !== undefined) {
|
|
263
|
+
calls = provideCallHierarchyOutgoingCalls(targetScript.id, generatePosition);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
calls = provideCallHierarchyOutgoingCalls(fileName, position);
|
|
268
|
+
}
|
|
269
|
+
return calls
|
|
270
|
+
.map(call => {
|
|
271
|
+
const to = (0, transform_1.transformCallHierarchyItem)(language, call.to, language_core_1.isCallHierarchyEnabled);
|
|
272
|
+
const fromSpans = call.fromSpans
|
|
273
|
+
.map(span => serviceScript
|
|
274
|
+
? (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, span, language_core_1.isCallHierarchyEnabled)?.[1]
|
|
275
|
+
: span)
|
|
276
|
+
.filter(span => !!span);
|
|
277
|
+
return {
|
|
278
|
+
to,
|
|
279
|
+
fromSpans,
|
|
280
|
+
};
|
|
281
|
+
});
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
function organizeImports(language, organizeImports) {
|
|
285
|
+
return (args, formatOptions, preferences) => {
|
|
286
|
+
const unresolved = organizeImports(args, formatOptions, preferences);
|
|
287
|
+
return (0, transform_1.transformFileTextChanges)(language, unresolved, language_core_1.isCodeActionsEnabled);
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
function getQuickInfoAtPosition(language, getQuickInfoAtPosition) {
|
|
291
|
+
return (filePath, position) => {
|
|
292
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
293
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
294
|
+
if (targetScript?.associatedOnly) {
|
|
295
|
+
return undefined;
|
|
296
|
+
}
|
|
297
|
+
if (serviceScript) {
|
|
298
|
+
const infos = [];
|
|
299
|
+
for (const [generatePosition] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isHoverEnabled)) {
|
|
300
|
+
const info = getQuickInfoAtPosition(targetScript.id, generatePosition);
|
|
301
|
+
if (info) {
|
|
302
|
+
const textSpan = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.textSpan, language_core_1.isHoverEnabled)?.[1];
|
|
303
|
+
if (textSpan) {
|
|
304
|
+
infos.push({
|
|
305
|
+
...info,
|
|
306
|
+
textSpan: textSpan,
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
if (infos.length === 1) {
|
|
312
|
+
return infos[0];
|
|
313
|
+
}
|
|
314
|
+
else if (infos.length >= 2) {
|
|
315
|
+
const combine = { ...infos[0] };
|
|
316
|
+
combine.displayParts = combine.displayParts?.slice();
|
|
317
|
+
combine.documentation = combine.documentation?.slice();
|
|
318
|
+
combine.tags = combine.tags?.slice();
|
|
319
|
+
const displayPartsStrs = new Set([displayPartsToString(infos[0].displayParts)]);
|
|
320
|
+
const documentationStrs = new Set([displayPartsToString(infos[0].documentation)]);
|
|
321
|
+
const tagsStrs = new Set();
|
|
322
|
+
for (const tag of infos[0].tags ?? []) {
|
|
323
|
+
tagsStrs.add(tag.name + '__volar__' + displayPartsToString(tag.text));
|
|
324
|
+
}
|
|
325
|
+
for (let i = 1; i < infos.length; i++) {
|
|
326
|
+
const { displayParts, documentation, tags } = infos[i];
|
|
327
|
+
if (displayParts?.length && !displayPartsStrs.has(displayPartsToString(displayParts))) {
|
|
328
|
+
displayPartsStrs.add(displayPartsToString(displayParts));
|
|
329
|
+
combine.displayParts ??= [];
|
|
330
|
+
combine.displayParts.push({ ...displayParts[0], text: '\n\n' + displayParts[0].text });
|
|
331
|
+
combine.displayParts.push(...displayParts.slice(1));
|
|
332
|
+
}
|
|
333
|
+
if (documentation?.length && !documentationStrs.has(displayPartsToString(documentation))) {
|
|
334
|
+
documentationStrs.add(displayPartsToString(documentation));
|
|
335
|
+
combine.documentation ??= [];
|
|
336
|
+
combine.documentation.push({ ...documentation[0], text: '\n\n' + documentation[0].text });
|
|
337
|
+
combine.documentation.push(...documentation.slice(1));
|
|
338
|
+
}
|
|
339
|
+
for (const tag of tags ?? []) {
|
|
340
|
+
if (!tagsStrs.has(tag.name + '__volar__' + displayPartsToString(tag.text))) {
|
|
341
|
+
tagsStrs.add(tag.name + '__volar__' + displayPartsToString(tag.text));
|
|
342
|
+
combine.tags ??= [];
|
|
343
|
+
combine.tags.push(tag);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return combine;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
return getQuickInfoAtPosition(fileName, position);
|
|
352
|
+
}
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
function getSignatureHelpItems(language, getSignatureHelpItems) {
|
|
356
|
+
return (filePath, position, options) => {
|
|
357
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
358
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
359
|
+
if (targetScript?.associatedOnly) {
|
|
360
|
+
return undefined;
|
|
361
|
+
}
|
|
362
|
+
if (serviceScript) {
|
|
363
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isSignatureHelpEnabled);
|
|
364
|
+
if (generatePosition !== undefined) {
|
|
365
|
+
const result = getSignatureHelpItems(targetScript.id, generatePosition, options);
|
|
366
|
+
if (result) {
|
|
367
|
+
const applicableSpan = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, result.applicableSpan, language_core_1.isSignatureHelpEnabled)?.[1];
|
|
368
|
+
if (applicableSpan) {
|
|
369
|
+
return {
|
|
370
|
+
...result,
|
|
371
|
+
applicableSpan,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
return getSignatureHelpItems(fileName, position, options);
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
function getDocumentHighlights(language, getDocumentHighlights) {
|
|
383
|
+
return (filePath, position, filesToSearch) => {
|
|
384
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
385
|
+
const unresolved = linkedCodeFeatureWorker(language, fileName, position, language_core_1.isHighlightEnabled, (fileName, position) => getDocumentHighlights(fileName, position, filesToSearch), function* (result) {
|
|
386
|
+
for (const ref of result) {
|
|
387
|
+
for (const reference of ref.highlightSpans) {
|
|
388
|
+
yield [reference.fileName ?? ref.fileName, reference.textSpan.start];
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
const resolved = unresolved
|
|
393
|
+
.flat()
|
|
394
|
+
.map(highlights => {
|
|
395
|
+
return {
|
|
396
|
+
...highlights,
|
|
397
|
+
highlightSpans: highlights.highlightSpans
|
|
398
|
+
.map(span => {
|
|
399
|
+
const { textSpan } = (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.textSpan, language_core_1.isHighlightEnabled) ?? {};
|
|
400
|
+
if (textSpan) {
|
|
401
|
+
return {
|
|
402
|
+
...span,
|
|
403
|
+
contextSpan: (0, transform_1.transformSpan)(language, span.fileName ?? highlights.fileName, span.contextSpan, language_core_1.isHighlightEnabled)?.textSpan,
|
|
404
|
+
textSpan,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
})
|
|
408
|
+
.filter(span => !!span),
|
|
409
|
+
};
|
|
410
|
+
});
|
|
411
|
+
return resolved;
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
function getApplicableRefactors(language, getApplicableRefactors) {
|
|
415
|
+
return (filePath, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions) => {
|
|
416
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
417
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
418
|
+
if (targetScript?.associatedOnly) {
|
|
419
|
+
return [];
|
|
420
|
+
}
|
|
421
|
+
if (serviceScript) {
|
|
422
|
+
if (typeof positionOrRange === 'number') {
|
|
423
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, positionOrRange, language_core_1.isCodeActionsEnabled);
|
|
424
|
+
if (generatePosition !== undefined) {
|
|
425
|
+
return getApplicableRefactors(targetScript.id, generatePosition, preferences, triggerReason, kind, includeInteractiveActions);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
for (const [generatedStart, generatedEnd] of (0, transform_1.toGeneratedRanges)(language, serviceScript, sourceScript, positionOrRange.pos, positionOrRange.end, language_core_1.isCodeActionsEnabled)) {
|
|
430
|
+
return getApplicableRefactors(targetScript.id, { pos: generatedStart, end: generatedEnd }, preferences, triggerReason, kind, includeInteractiveActions);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
return [];
|
|
434
|
+
}
|
|
435
|
+
else {
|
|
436
|
+
return getApplicableRefactors(fileName, positionOrRange, preferences, triggerReason, kind, includeInteractiveActions);
|
|
437
|
+
}
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
function getEditsForRefactor(language, getEditsForRefactor) {
|
|
441
|
+
return (filePath, formatOptions, positionOrRange, refactorName, actionName, preferences) => {
|
|
442
|
+
let edits;
|
|
443
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
444
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
445
|
+
if (targetScript?.associatedOnly) {
|
|
446
|
+
return undefined;
|
|
447
|
+
}
|
|
448
|
+
if (serviceScript) {
|
|
449
|
+
if (typeof positionOrRange === 'number') {
|
|
450
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, positionOrRange, language_core_1.isCodeActionsEnabled);
|
|
451
|
+
if (generatePosition !== undefined) {
|
|
452
|
+
edits = getEditsForRefactor(targetScript.id, formatOptions, generatePosition, refactorName, actionName, preferences);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
for (const [generatedStart, generatedEnd] of (0, transform_1.toGeneratedRanges)(language, serviceScript, sourceScript, positionOrRange.pos, positionOrRange.end, language_core_1.isCodeActionsEnabled)) {
|
|
457
|
+
edits = getEditsForRefactor(targetScript.id, formatOptions, { pos: generatedStart, end: generatedEnd }, refactorName, actionName, preferences);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
edits = getEditsForRefactor(fileName, formatOptions, positionOrRange, refactorName, actionName, preferences);
|
|
463
|
+
}
|
|
464
|
+
if (edits) {
|
|
465
|
+
edits.edits = (0, transform_1.transformFileTextChanges)(language, edits.edits, language_core_1.isCodeActionsEnabled);
|
|
466
|
+
return edits;
|
|
467
|
+
}
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
function getRenameInfo(language, getRenameInfo) {
|
|
471
|
+
return (filePath, position, options) => {
|
|
472
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
473
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
474
|
+
if (targetScript?.associatedOnly) {
|
|
475
|
+
return {
|
|
476
|
+
canRename: false,
|
|
477
|
+
localizedErrorMessage: "Cannot rename"
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
if (serviceScript) {
|
|
481
|
+
let failed;
|
|
482
|
+
for (const [generateOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isRenameEnabled)) {
|
|
483
|
+
const info = getRenameInfo(targetScript.id, generateOffset, options);
|
|
484
|
+
if (info.canRename) {
|
|
485
|
+
const span = (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, info.triggerSpan, language_core_1.isRenameEnabled)?.[1];
|
|
486
|
+
if (span) {
|
|
487
|
+
info.triggerSpan = span;
|
|
488
|
+
return info;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
failed = info;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
if (failed) {
|
|
496
|
+
return failed;
|
|
497
|
+
}
|
|
498
|
+
return {
|
|
499
|
+
canRename: false,
|
|
500
|
+
localizedErrorMessage: 'Failed to get rename locations',
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
return getRenameInfo(fileName, position, options);
|
|
505
|
+
}
|
|
506
|
+
};
|
|
507
|
+
}
|
|
508
|
+
function getCodeFixesAtPosition(language, getCodeFixesAtPosition) {
|
|
509
|
+
return (filePath, start, end, errorCodes, formatOptions, preferences) => {
|
|
510
|
+
let fixes = [];
|
|
511
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
512
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
513
|
+
if (targetScript?.associatedOnly) {
|
|
514
|
+
return [];
|
|
515
|
+
}
|
|
516
|
+
if (serviceScript) {
|
|
517
|
+
const generateStart = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, start, language_core_1.isCodeActionsEnabled);
|
|
518
|
+
const generateEnd = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, end, language_core_1.isCodeActionsEnabled);
|
|
519
|
+
if (generateStart !== undefined && generateEnd !== undefined) {
|
|
520
|
+
fixes = getCodeFixesAtPosition(targetScript.id, generateStart, generateEnd, errorCodes, formatOptions, preferences);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
else {
|
|
524
|
+
fixes = getCodeFixesAtPosition(fileName, start, end, errorCodes, formatOptions, preferences);
|
|
525
|
+
}
|
|
526
|
+
fixes = fixes.map(fix => {
|
|
527
|
+
fix.changes = (0, transform_1.transformFileTextChanges)(language, fix.changes, language_core_1.isCodeActionsEnabled);
|
|
528
|
+
return fix;
|
|
529
|
+
});
|
|
530
|
+
return fixes;
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
function getEncodedSemanticClassifications(language, getEncodedSemanticClassifications) {
|
|
534
|
+
return (filePath, span, format) => {
|
|
535
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
536
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
537
|
+
if (targetScript?.associatedOnly) {
|
|
538
|
+
return {
|
|
539
|
+
spans: [],
|
|
540
|
+
endOfLineState: 0
|
|
541
|
+
};
|
|
542
|
+
}
|
|
543
|
+
if (serviceScript) {
|
|
544
|
+
let start;
|
|
545
|
+
let end;
|
|
546
|
+
const map = language.maps.get(serviceScript.code, targetScript);
|
|
547
|
+
for (const mapping of map.mappings) {
|
|
548
|
+
// TODO reuse the logic from language service
|
|
549
|
+
if ((0, language_core_1.isSemanticTokensEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
|
|
550
|
+
start ??= mapping.generatedOffsets[0];
|
|
551
|
+
end ??= mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + (mapping.generatedLengths ?? mapping.lengths)[mapping.lengths.length - 1];
|
|
552
|
+
start = Math.min(start, mapping.generatedOffsets[0]);
|
|
553
|
+
end = Math.max(end, mapping.generatedOffsets[mapping.generatedOffsets.length - 1] + (mapping.generatedLengths ?? mapping.lengths)[mapping.lengths.length - 1]);
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
start ??= 0;
|
|
557
|
+
end ??= targetScript.snapshot.getLength();
|
|
558
|
+
const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
|
|
559
|
+
start += mappingOffset;
|
|
560
|
+
end += mappingOffset;
|
|
561
|
+
const result = getEncodedSemanticClassifications(targetScript.id, { start, length: end - start }, format);
|
|
562
|
+
const spans = [];
|
|
563
|
+
for (let i = 0; i < result.spans.length; i += 3) {
|
|
564
|
+
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)) {
|
|
565
|
+
spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
|
|
566
|
+
break;
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
result.spans = spans;
|
|
570
|
+
return result;
|
|
571
|
+
}
|
|
572
|
+
else {
|
|
573
|
+
return getEncodedSemanticClassifications(fileName, span, format);
|
|
574
|
+
}
|
|
575
|
+
};
|
|
576
|
+
}
|
|
577
|
+
function getSyntacticDiagnostics(language, languageService, getSyntacticDiagnostics) {
|
|
578
|
+
return filePath => {
|
|
579
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
580
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
581
|
+
if (targetScript?.associatedOnly) {
|
|
582
|
+
return [];
|
|
583
|
+
}
|
|
584
|
+
return getSyntacticDiagnostics(targetScript?.id ?? fileName)
|
|
585
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, languageService.getProgram(), false))
|
|
586
|
+
.filter(d => !!d)
|
|
587
|
+
.filter(d => !serviceScript || language.scripts.get(d.file.fileName) === sourceScript);
|
|
588
|
+
};
|
|
589
|
+
}
|
|
590
|
+
function getSemanticDiagnostics(language, languageService, getSemanticDiagnostics) {
|
|
591
|
+
return filePath => {
|
|
592
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
593
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
594
|
+
if (targetScript?.associatedOnly) {
|
|
595
|
+
return [];
|
|
596
|
+
}
|
|
597
|
+
return getSemanticDiagnostics(targetScript?.id ?? fileName)
|
|
598
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, languageService.getProgram(), false))
|
|
599
|
+
.filter(d => !!d)
|
|
600
|
+
.filter(d => !serviceScript || !d.file || language.scripts.get(d.file.fileName) === sourceScript);
|
|
601
|
+
};
|
|
602
|
+
}
|
|
603
|
+
function getSuggestionDiagnostics(language, languageService, getSuggestionDiagnostics) {
|
|
604
|
+
return filePath => {
|
|
605
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
606
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
607
|
+
if (targetScript?.associatedOnly) {
|
|
608
|
+
return [];
|
|
609
|
+
}
|
|
610
|
+
return getSuggestionDiagnostics(targetScript?.id ?? fileName)
|
|
611
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, languageService.getProgram(), false))
|
|
612
|
+
.filter(d => !!d)
|
|
613
|
+
.filter(d => !serviceScript || !d.file || language.scripts.get(d.file.fileName) === sourceScript);
|
|
614
|
+
};
|
|
615
|
+
}
|
|
616
|
+
function getDefinitionAndBoundSpan(language, getDefinitionAndBoundSpan) {
|
|
617
|
+
return (filePath, position) => {
|
|
618
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
619
|
+
const unresolved = linkedCodeFeatureWorker(language, fileName, position, language_core_1.isDefinitionEnabled, (fileName, position) => getDefinitionAndBoundSpan(fileName, position), function* (result) {
|
|
620
|
+
for (const ref of result.definitions ?? []) {
|
|
621
|
+
yield [ref.fileName, ref.textSpan.start];
|
|
622
|
+
}
|
|
623
|
+
});
|
|
624
|
+
const textSpan = unresolved
|
|
625
|
+
.map(s => (0, transform_1.transformSpan)(language, fileName, s.textSpan, language_core_1.isDefinitionEnabled)?.textSpan)
|
|
626
|
+
.filter(s => !!s)[0];
|
|
627
|
+
if (!textSpan) {
|
|
628
|
+
return;
|
|
629
|
+
}
|
|
630
|
+
const definitions = unresolved
|
|
631
|
+
.map(s => s.definitions
|
|
632
|
+
?.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
|
|
633
|
+
.filter(s => !!s)
|
|
634
|
+
?? [])
|
|
635
|
+
.flat();
|
|
636
|
+
return {
|
|
637
|
+
textSpan,
|
|
638
|
+
definitions: (0, dedupe_1.dedupeDocumentSpans)(definitions),
|
|
639
|
+
};
|
|
640
|
+
};
|
|
641
|
+
}
|
|
642
|
+
function findReferences(language, findReferences) {
|
|
643
|
+
return (filePath, position) => {
|
|
644
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
645
|
+
const unresolved = linkedCodeFeatureWorker(language, fileName, position, language_core_1.isReferencesEnabled, (fileName, position) => findReferences(fileName, position), function* (result) {
|
|
646
|
+
for (const ref of result) {
|
|
647
|
+
for (const reference of ref.references) {
|
|
648
|
+
yield [reference.fileName, reference.textSpan.start];
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
});
|
|
652
|
+
const resolved = unresolved
|
|
653
|
+
.flat()
|
|
654
|
+
.map(symbol => {
|
|
655
|
+
const definition = (0, transform_1.transformDocumentSpan)(language, symbol.definition, language_core_1.isDefinitionEnabled, true);
|
|
656
|
+
return {
|
|
657
|
+
definition,
|
|
658
|
+
references: symbol.references
|
|
659
|
+
.map(r => (0, transform_1.transformDocumentSpan)(language, r, language_core_1.isReferencesEnabled))
|
|
660
|
+
.filter(r => !!r),
|
|
661
|
+
};
|
|
662
|
+
});
|
|
663
|
+
return resolved;
|
|
664
|
+
};
|
|
665
|
+
}
|
|
666
|
+
function getDefinitionAtPosition(language, getDefinitionAtPosition) {
|
|
667
|
+
return (filePath, position) => {
|
|
668
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
669
|
+
const unresolved = linkedCodeFeatureWorker(language, fileName, position, language_core_1.isDefinitionEnabled, (fileName, position) => getDefinitionAtPosition(fileName, position), function* (result) {
|
|
670
|
+
for (const ref of result) {
|
|
671
|
+
yield [ref.fileName, ref.textSpan.start];
|
|
672
|
+
}
|
|
673
|
+
});
|
|
674
|
+
const resolved = unresolved
|
|
675
|
+
.flat()
|
|
676
|
+
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isDefinitionEnabled, s.fileName !== fileName))
|
|
677
|
+
.filter(s => !!s);
|
|
678
|
+
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
679
|
+
};
|
|
680
|
+
}
|
|
681
|
+
function getTypeDefinitionAtPosition(language, getTypeDefinitionAtPosition) {
|
|
682
|
+
return (filePath, position) => {
|
|
683
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
684
|
+
const unresolved = linkedCodeFeatureWorker(language, fileName, position, language_core_1.isTypeDefinitionEnabled, (fileName, position) => getTypeDefinitionAtPosition(fileName, position), function* (result) {
|
|
685
|
+
for (const ref of result) {
|
|
686
|
+
yield [ref.fileName, ref.textSpan.start];
|
|
687
|
+
}
|
|
688
|
+
});
|
|
689
|
+
const resolved = unresolved
|
|
690
|
+
.flat()
|
|
691
|
+
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isTypeDefinitionEnabled))
|
|
692
|
+
.filter(s => !!s);
|
|
693
|
+
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
694
|
+
};
|
|
695
|
+
}
|
|
696
|
+
function getImplementationAtPosition(language, getImplementationAtPosition) {
|
|
697
|
+
return (filePath, position) => {
|
|
698
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
699
|
+
const unresolved = linkedCodeFeatureWorker(language, fileName, position, language_core_1.isImplementationEnabled, (fileName, position) => getImplementationAtPosition(fileName, position), function* (result) {
|
|
700
|
+
for (const ref of result) {
|
|
701
|
+
yield [ref.fileName, ref.textSpan.start];
|
|
702
|
+
}
|
|
703
|
+
});
|
|
704
|
+
const resolved = unresolved
|
|
705
|
+
.flat()
|
|
706
|
+
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isImplementationEnabled))
|
|
707
|
+
.filter(s => !!s);
|
|
708
|
+
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
709
|
+
};
|
|
710
|
+
}
|
|
711
|
+
function findRenameLocations(language, findRenameLocations) {
|
|
712
|
+
return (filePath, position, findInStrings, findInComments, preferences) => {
|
|
713
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
714
|
+
const unresolved = linkedCodeFeatureWorker(language, fileName, position, language_core_1.isRenameEnabled, (fileName, position) => findRenameLocations(fileName, position, findInStrings, findInComments, preferences), function* (result) {
|
|
715
|
+
for (const ref of result) {
|
|
716
|
+
yield [ref.fileName, ref.textSpan.start];
|
|
717
|
+
}
|
|
718
|
+
});
|
|
719
|
+
const resolved = unresolved
|
|
720
|
+
.flat()
|
|
721
|
+
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isRenameEnabled))
|
|
722
|
+
.filter(s => !!s);
|
|
723
|
+
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
724
|
+
};
|
|
725
|
+
}
|
|
726
|
+
function getReferencesAtPosition(language, getReferencesAtPosition) {
|
|
727
|
+
return (filePath, position) => {
|
|
728
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
729
|
+
const unresolved = linkedCodeFeatureWorker(language, fileName, position, language_core_1.isReferencesEnabled, (fileName, position) => getReferencesAtPosition(fileName, position), function* (result) {
|
|
730
|
+
for (const ref of result) {
|
|
731
|
+
yield [ref.fileName, ref.textSpan.start];
|
|
732
|
+
}
|
|
733
|
+
});
|
|
734
|
+
const resolved = unresolved
|
|
735
|
+
.flat()
|
|
736
|
+
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
|
|
737
|
+
.filter(s => !!s);
|
|
738
|
+
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
739
|
+
};
|
|
740
|
+
}
|
|
741
|
+
function getCompletionsAtPosition(language, getCompletionsAtPosition) {
|
|
742
|
+
return (filePath, position, options, formattingSettings) => {
|
|
743
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
744
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
745
|
+
if (targetScript?.associatedOnly) {
|
|
746
|
+
return undefined;
|
|
747
|
+
}
|
|
748
|
+
if (serviceScript) {
|
|
749
|
+
const results = [];
|
|
750
|
+
for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, language_core_1.isCompletionEnabled)) {
|
|
751
|
+
const result = getCompletionsAtPosition(targetScript.id, generatedOffset, options, formattingSettings);
|
|
752
|
+
if (!result) {
|
|
753
|
+
continue;
|
|
754
|
+
}
|
|
755
|
+
if (typeof mapping.data.completion === 'object' && mapping.data.completion.onlyImport) {
|
|
756
|
+
result.entries = result.entries.filter(entry => !!entry.sourceDisplay);
|
|
757
|
+
}
|
|
758
|
+
for (const entry of result.entries) {
|
|
759
|
+
entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, entry.replacementSpan, language_core_1.isCompletionEnabled)?.[1];
|
|
760
|
+
}
|
|
761
|
+
result.optionalReplacementSpan = result.optionalReplacementSpan
|
|
762
|
+
&& (0, transform_1.transformTextSpan)(sourceScript, language, serviceScript, result.optionalReplacementSpan, language_core_1.isCompletionEnabled)?.[1];
|
|
763
|
+
const isAdditional = typeof mapping.data.completion === 'object' && mapping.data.completion.isAdditional;
|
|
764
|
+
if (isAdditional) {
|
|
765
|
+
results.push(result);
|
|
766
|
+
}
|
|
767
|
+
else {
|
|
768
|
+
results.unshift(result);
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
if (results.length) {
|
|
772
|
+
return {
|
|
773
|
+
...results[0],
|
|
774
|
+
entries: results
|
|
775
|
+
.map(additionalResult => additionalResult.entries)
|
|
776
|
+
.flat(),
|
|
777
|
+
};
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
else {
|
|
781
|
+
return getCompletionsAtPosition(fileName, position, options, formattingSettings);
|
|
782
|
+
}
|
|
783
|
+
};
|
|
784
|
+
}
|
|
785
|
+
function getCompletionEntryDetails(language, getCompletionEntryDetails) {
|
|
786
|
+
return (filePath, position, entryName, formatOptions, source, preferences, data) => {
|
|
787
|
+
let details;
|
|
788
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
789
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
790
|
+
if (targetScript?.associatedOnly) {
|
|
791
|
+
return undefined;
|
|
792
|
+
}
|
|
793
|
+
if (serviceScript) {
|
|
794
|
+
const generatePosition = (0, transform_1.toGeneratedOffset)(language, serviceScript, sourceScript, position, language_core_1.isCompletionEnabled);
|
|
795
|
+
if (generatePosition !== undefined) {
|
|
796
|
+
details = getCompletionEntryDetails(targetScript.id, generatePosition, entryName, formatOptions, source, preferences, data);
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
else {
|
|
800
|
+
return getCompletionEntryDetails(fileName, position, entryName, formatOptions, source, preferences, data);
|
|
801
|
+
}
|
|
802
|
+
if (details?.codeActions) {
|
|
803
|
+
for (const codeAction of details.codeActions) {
|
|
804
|
+
codeAction.changes = (0, transform_1.transformFileTextChanges)(language, codeAction.changes, language_core_1.isCompletionEnabled);
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
return details;
|
|
808
|
+
};
|
|
809
|
+
}
|
|
810
|
+
function provideInlayHints(language, provideInlayHints) {
|
|
811
|
+
return (filePath, span, preferences) => {
|
|
812
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
813
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
814
|
+
if (targetScript?.associatedOnly) {
|
|
815
|
+
return [];
|
|
816
|
+
}
|
|
817
|
+
if (serviceScript) {
|
|
818
|
+
let start;
|
|
819
|
+
let end;
|
|
820
|
+
const map = language.maps.get(serviceScript.code, targetScript);
|
|
821
|
+
for (const mapping of map.mappings) {
|
|
822
|
+
if ((0, language_core_1.isInlayHintsEnabled)(mapping.data) && mapping.sourceOffsets[0] >= span.start && mapping.sourceOffsets[0] <= span.start + span.length) {
|
|
823
|
+
start ??= mapping.generatedOffsets[0];
|
|
824
|
+
end ??= mapping.generatedOffsets[mapping.generatedOffsets.length - 1];
|
|
825
|
+
start = Math.min(start, mapping.generatedOffsets[0]);
|
|
826
|
+
end = Math.max(end, mapping.generatedOffsets[mapping.generatedOffsets.length - 1]);
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
if (start === undefined || end === undefined) {
|
|
830
|
+
start = 0;
|
|
831
|
+
end = 0;
|
|
832
|
+
}
|
|
833
|
+
const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
|
|
834
|
+
start += mappingOffset;
|
|
835
|
+
end += mappingOffset;
|
|
836
|
+
const result = provideInlayHints(targetScript.id, { start, length: end - start }, preferences);
|
|
837
|
+
const hints = [];
|
|
838
|
+
for (const hint of result) {
|
|
839
|
+
const sourcePosition = (0, transform_1.toSourceOffset)(sourceScript, language, serviceScript, hint.position, language_core_1.isInlayHintsEnabled);
|
|
840
|
+
if (sourcePosition !== undefined) {
|
|
841
|
+
hints.push({
|
|
842
|
+
...hint,
|
|
843
|
+
position: sourcePosition[1],
|
|
844
|
+
});
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
return hints;
|
|
848
|
+
}
|
|
849
|
+
else {
|
|
850
|
+
return provideInlayHints(fileName, span, preferences);
|
|
851
|
+
}
|
|
852
|
+
};
|
|
853
|
+
}
|
|
854
|
+
function getFileReferences(language, getFileReferences) {
|
|
855
|
+
return filePath => {
|
|
856
|
+
const fileName = filePath.replace(windowsPathReg, '/');
|
|
857
|
+
const unresolved = getFileReferences(fileName);
|
|
858
|
+
const resolved = unresolved
|
|
859
|
+
.map(s => (0, transform_1.transformDocumentSpan)(language, s, language_core_1.isReferencesEnabled))
|
|
860
|
+
.filter(s => !!s);
|
|
861
|
+
return (0, dedupe_1.dedupeDocumentSpans)(resolved);
|
|
862
|
+
};
|
|
863
|
+
}
|
|
864
|
+
function linkedCodeFeatureWorker(language, fileName, position, filter, worker, getLinkedCodes) {
|
|
865
|
+
const results = [];
|
|
866
|
+
const processedFilePositions = new Set();
|
|
867
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
868
|
+
if (serviceScript) {
|
|
869
|
+
for (const [generatedOffset] of (0, transform_1.toGeneratedOffsets)(language, serviceScript, sourceScript, position, filter)) {
|
|
870
|
+
process(targetScript.id, generatedOffset);
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
else {
|
|
874
|
+
process(fileName, position);
|
|
875
|
+
}
|
|
876
|
+
return results;
|
|
877
|
+
function process(fileName, position) {
|
|
878
|
+
if (processedFilePositions.has(fileName + ':' + position)) {
|
|
879
|
+
return;
|
|
880
|
+
}
|
|
881
|
+
processedFilePositions.add(fileName + ':' + position);
|
|
882
|
+
const result = worker(fileName, position);
|
|
883
|
+
if (!result) {
|
|
884
|
+
return;
|
|
885
|
+
}
|
|
886
|
+
results.push(result);
|
|
887
|
+
for (const ref of getLinkedCodes(result)) {
|
|
888
|
+
processedFilePositions.add(ref[0] + ':' + ref[1]);
|
|
889
|
+
const [serviceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
|
|
890
|
+
if (!serviceScript) {
|
|
891
|
+
continue;
|
|
892
|
+
}
|
|
893
|
+
const linkedCodeMap = language.linkedCodeMaps.get(serviceScript.code);
|
|
894
|
+
if (!linkedCodeMap) {
|
|
895
|
+
continue;
|
|
896
|
+
}
|
|
897
|
+
const mappingOffset = (0, transform_1.getMappingOffset)(language, serviceScript);
|
|
898
|
+
for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - mappingOffset)) {
|
|
899
|
+
process(ref[0], linkedCodeOffset + mappingOffset);
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
function displayPartsToString(displayParts) {
|
|
905
|
+
if (displayParts) {
|
|
906
|
+
return displayParts.map(displayPart => displayPart.text).join('');
|
|
907
|
+
}
|
|
908
|
+
return '';
|
|
909
|
+
}
|
|
910
|
+
//# sourceMappingURL=proxyLanguageService.js.map
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { Language } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
+
import { URI } from 'vscode-uri';
|
|
3
4
|
import type { TypeScriptExtraServiceScript } from '../..';
|
|
4
5
|
import type { createSys } from './createSys';
|
|
5
6
|
export interface TypeScriptProjectHost extends Pick<ts.LanguageServiceHost, 'getLocalizedDiagnosticMessages' | 'getCurrentDirectory' | 'getCompilationSettings' | 'getProjectReferences' | 'getScriptFileNames' | 'getProjectVersion' | 'getScriptSnapshot'> {
|
|
6
7
|
}
|
|
7
|
-
export declare function createLanguageServiceHost
|
|
8
|
+
export declare function createLanguageServiceHost(ts: typeof import('typescript'), sys: ReturnType<typeof createSys> | ts.System, language: Language<URI>, asUri: (fileName: string) => URI, projectHost: TypeScriptProjectHost): {
|
|
8
9
|
languageServiceHost: ts.LanguageServiceHost;
|
|
9
10
|
getExtraServiceScript: (fileName: string) => TypeScriptExtraServiceScript | undefined;
|
|
10
11
|
};
|
|
@@ -4,7 +4,7 @@ exports.createLanguageServiceHost = createLanguageServiceHost;
|
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
5
|
const path = require("path-browserify");
|
|
6
6
|
const resolveModuleName_1 = require("../resolveModuleName");
|
|
7
|
-
function createLanguageServiceHost(ts, sys, language,
|
|
7
|
+
function createLanguageServiceHost(ts, sys, language, asUri, projectHost) {
|
|
8
8
|
const scriptVersions = new language_core_1.FileMap(sys.useCaseSensitiveFileNames);
|
|
9
9
|
let lastProjectVersion;
|
|
10
10
|
let tsProjectVersion = 0;
|
|
@@ -82,7 +82,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
|
|
|
82
82
|
if (extraScriptRegistry.has(fileName)) {
|
|
83
83
|
return extraScriptRegistry.get(fileName).scriptKind;
|
|
84
84
|
}
|
|
85
|
-
const sourceScript = language.scripts.get(
|
|
85
|
+
const sourceScript = language.scripts.get(asUri(fileName));
|
|
86
86
|
if (sourceScript?.generated) {
|
|
87
87
|
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
88
88
|
if (serviceScript) {
|
|
@@ -116,10 +116,10 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
|
|
|
116
116
|
languageServiceHost = plugin.typescript.resolveLanguageServiceHost(languageServiceHost);
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
|
-
if (language.plugins.some(
|
|
119
|
+
if (language.plugins.some(plugin => plugin.typescript?.extraFileExtensions.length)) {
|
|
120
120
|
// TODO: can this share between monorepo packages?
|
|
121
121
|
const moduleCache = ts.createModuleResolutionCache(languageServiceHost.getCurrentDirectory(), languageServiceHost.useCaseSensitiveFileNames?.() ? s => s : s => s.toLowerCase(), languageServiceHost.getCompilationSettings());
|
|
122
|
-
const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, language.plugins, fileName => language.scripts.get(
|
|
122
|
+
const resolveModuleName = (0, resolveModuleName_1.createResolveModuleName)(ts, languageServiceHost, language.plugins, fileName => language.scripts.get(asUri(fileName)));
|
|
123
123
|
let lastSysVersion = 'version' in sys ? sys.version : undefined;
|
|
124
124
|
languageServiceHost.resolveModuleNameLiterals = (moduleLiterals, containingFile, redirectedReference, options, sourceFile) => {
|
|
125
125
|
if ('version' in sys && lastSysVersion !== sys.version) {
|
|
@@ -160,7 +160,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
|
|
|
160
160
|
const newOtherVirtualFileSnapshots = new Set();
|
|
161
161
|
const tsFileNamesSet = new Set();
|
|
162
162
|
for (const fileName of projectHost.getScriptFileNames()) {
|
|
163
|
-
const sourceScript = language.scripts.get(
|
|
163
|
+
const sourceScript = language.scripts.get(asUri(fileName));
|
|
164
164
|
if (sourceScript?.generated) {
|
|
165
165
|
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
166
166
|
if (serviceScript) {
|
|
@@ -199,7 +199,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
|
|
|
199
199
|
if (extraScriptRegistry.has(fileName)) {
|
|
200
200
|
return extraScriptRegistry.get(fileName).code.snapshot;
|
|
201
201
|
}
|
|
202
|
-
const sourceScript = language.scripts.get(
|
|
202
|
+
const sourceScript = language.scripts.get(asUri(fileName));
|
|
203
203
|
if (sourceScript?.generated) {
|
|
204
204
|
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
205
205
|
if (serviceScript) {
|
|
@@ -223,7 +223,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
|
|
|
223
223
|
}
|
|
224
224
|
return version.map.get(snapshot).toString();
|
|
225
225
|
}
|
|
226
|
-
const sourceScript = language.scripts.get(
|
|
226
|
+
const sourceScript = language.scripts.get(asUri(fileName));
|
|
227
227
|
if (sourceScript?.generated) {
|
|
228
228
|
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
229
229
|
if (serviceScript) {
|
|
@@ -235,7 +235,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
|
|
|
235
235
|
}
|
|
236
236
|
const isOpenedFile = !!projectHost.getScriptSnapshot(fileName);
|
|
237
237
|
if (isOpenedFile) {
|
|
238
|
-
const sourceScript = language.scripts.get(
|
|
238
|
+
const sourceScript = language.scripts.get(asUri(fileName));
|
|
239
239
|
if (sourceScript && !sourceScript.generated) {
|
|
240
240
|
if (!version.map.has(sourceScript.snapshot)) {
|
|
241
241
|
version.map.set(sourceScript.snapshot, version.lastVersion++);
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.createAsyncLanguageServicePlugin = createAsyncLanguageServicePlugin;
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
5
|
const common_1 = require("../common");
|
|
6
|
-
const
|
|
6
|
+
const proxyLanguageService_1 = require("../node/proxyLanguageService");
|
|
7
7
|
const decorateLanguageServiceHost_1 = require("../node/decorateLanguageServiceHost");
|
|
8
8
|
const createLanguageServicePlugin_1 = require("./createLanguageServicePlugin");
|
|
9
9
|
function createAsyncLanguageServicePlugin(extensions, scriptKind, create) {
|
|
@@ -49,6 +49,8 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, create) {
|
|
|
49
49
|
return getProjectVersion();
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
|
+
const { proxy, initialize } = (0, proxyLanguageService_1.createProxyLanguageService)(info.languageService);
|
|
53
|
+
info.languageService = proxy;
|
|
52
54
|
create(ts, info).then(({ languagePlugins, setup }) => {
|
|
53
55
|
const syncedScriptVersions = new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames);
|
|
54
56
|
const language = (0, language_core_1.createLanguage)([
|
|
@@ -68,7 +70,7 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, create) {
|
|
|
68
70
|
language.scripts.delete(fileName);
|
|
69
71
|
}
|
|
70
72
|
});
|
|
71
|
-
(
|
|
73
|
+
initialize(language);
|
|
72
74
|
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost);
|
|
73
75
|
setup?.(language);
|
|
74
76
|
if ('markAsDirty' in info.project && typeof info.project.markAsDirty === 'function') {
|
|
@@ -5,7 +5,7 @@ exports.createLanguageServicePlugin = createLanguageServicePlugin;
|
|
|
5
5
|
exports.arrayItemsEqual = arrayItemsEqual;
|
|
6
6
|
const language_core_1 = require("@volar/language-core");
|
|
7
7
|
const common_1 = require("../common");
|
|
8
|
-
const
|
|
8
|
+
const proxyLanguageService_1 = require("../node/proxyLanguageService");
|
|
9
9
|
const decorateLanguageServiceHost_1 = require("../node/decorateLanguageServiceHost");
|
|
10
10
|
exports.externalFiles = new WeakMap();
|
|
11
11
|
exports.projectExternalFileExtensions = new WeakMap();
|
|
@@ -45,7 +45,9 @@ function createLanguageServicePlugin(create) {
|
|
|
45
45
|
language.scripts.delete(fileName);
|
|
46
46
|
}
|
|
47
47
|
});
|
|
48
|
-
(0,
|
|
48
|
+
const { proxy, initialize } = (0, proxyLanguageService_1.createProxyLanguageService)(info.languageService);
|
|
49
|
+
info.languageService = proxy;
|
|
50
|
+
initialize(language);
|
|
49
51
|
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost);
|
|
50
52
|
setup?.(language);
|
|
51
53
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type * as ts from 'typescript';
|
|
2
2
|
import type { Language, LanguagePlugin } from '@volar/language-core';
|
|
3
3
|
export declare let getLanguagePlugins: (ts: typeof import('typescript'), options: ts.CreateProgramOptions) => LanguagePlugin<string>[] | {
|
|
4
|
-
|
|
4
|
+
languagePlugins: LanguagePlugin<string>[];
|
|
5
5
|
setup?(language: Language<string>): void;
|
|
6
6
|
};
|
|
7
7
|
export declare function runTsc(tscPath: string, extensions: string[], _getLanguagePlugins: typeof getLanguagePlugins): void;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volar/typescript",
|
|
3
|
-
"version": "2.4.0-alpha.
|
|
3
|
+
"version": "2.4.0-alpha.1",
|
|
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.
|
|
15
|
+
"@volar/language-core": "2.4.0-alpha.1",
|
|
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.
|
|
22
|
+
"@volar/language-service": "2.4.0-alpha.1"
|
|
23
23
|
},
|
|
24
|
-
"gitHead": "
|
|
24
|
+
"gitHead": "c096c457fea026fcd432b82224026f747fab571b"
|
|
25
25
|
}
|