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