@volar/typescript 2.3.0-alpha.9 → 2.3.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/lib/common.js +1 -2
- package/lib/node/decorateLanguageService.js +141 -146
- package/lib/node/decorateLanguageServiceHost.js +2 -3
- package/lib/node/decorateProgram.js +38 -24
- package/lib/node/dedupe.js +1 -2
- package/lib/node/proxyCreateProgram.js +1 -2
- package/lib/node/transform.d.ts +11 -9
- package/lib/node/transform.js +79 -61
- package/lib/node/utils.d.ts +1 -2
- package/lib/node/utils.js +5 -10
- package/lib/protocol/createProject.js +1 -2
- package/lib/protocol/createSys.js +1 -2
- package/lib/quickstart/createAsyncLanguageServicePlugin.d.ts +5 -2
- package/lib/quickstart/createAsyncLanguageServicePlugin.js +16 -17
- package/lib/quickstart/createLanguageServicePlugin.d.ts +9 -2
- package/lib/quickstart/createLanguageServicePlugin.js +21 -20
- package/lib/quickstart/runTsc.js +2 -2
- package/lib/resolveModuleName.js +1 -2
- package/lib/typescript/core.js +18 -20
- package/lib/typescript/path.js +10 -11
- package/lib/typescript/utilities.js +1 -3
- package/package.json +4 -4
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.decorateLanguageServiceHost = decorateLanguageServiceHost;
|
|
4
|
+
exports.searchExternalFiles = searchExternalFiles;
|
|
4
5
|
const resolveModuleName_1 = require("../resolveModuleName");
|
|
5
6
|
function decorateLanguageServiceHost(ts, language, languageServiceHost) {
|
|
6
7
|
const pluginExtensions = language.plugins
|
|
@@ -119,7 +120,6 @@ function decorateLanguageServiceHost(ts, language, languageServiceHost) {
|
|
|
119
120
|
return script[1];
|
|
120
121
|
}
|
|
121
122
|
}
|
|
122
|
-
exports.decorateLanguageServiceHost = decorateLanguageServiceHost;
|
|
123
123
|
function searchExternalFiles(ts, project, exts) {
|
|
124
124
|
if (project.projectKind !== ts.server.ProjectKind.Configured) {
|
|
125
125
|
return [];
|
|
@@ -138,5 +138,4 @@ function searchExternalFiles(ts, project, exts) {
|
|
|
138
138
|
const parsed = ts.parseJsonSourceFileConfigFileContent(config, parseHost, project.getCurrentDirectory());
|
|
139
139
|
return parsed.fileNames;
|
|
140
140
|
}
|
|
141
|
-
exports.searchExternalFiles = searchExternalFiles;
|
|
142
141
|
//# sourceMappingURL=decorateLanguageServiceHost.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.decorateProgram =
|
|
3
|
+
exports.decorateProgram = decorateProgram;
|
|
4
4
|
const transform_1 = require("./transform");
|
|
5
5
|
const utils_1 = require("./utils");
|
|
6
6
|
function decorateProgram(language, program) {
|
|
@@ -18,45 +18,60 @@ function decorateProgram(language, program) {
|
|
|
18
18
|
return {
|
|
19
19
|
...result,
|
|
20
20
|
diagnostics: result.diagnostics
|
|
21
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
22
|
-
.filter(
|
|
21
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
|
|
22
|
+
.filter(d => !!d),
|
|
23
23
|
};
|
|
24
24
|
};
|
|
25
25
|
program.getSyntacticDiagnostics = (sourceFile, cancellationToken) => {
|
|
26
26
|
if (!sourceFile) {
|
|
27
|
-
return
|
|
27
|
+
return getSyntacticDiagnostics(undefined, cancellationToken)
|
|
28
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
|
|
29
|
+
.filter(d => !!d);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
33
|
+
const actualSourceFile = targetScript ? program.getSourceFile(targetScript.id) : sourceFile;
|
|
34
|
+
return getSyntacticDiagnostics(actualSourceFile, cancellationToken)
|
|
35
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
|
|
36
|
+
.filter(d => !!d)
|
|
37
|
+
.filter(d => !serviceScript || !d.file || language.scripts.get(d.file.fileName) === sourceScript);
|
|
28
38
|
}
|
|
29
|
-
const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
30
|
-
const actualSourceFile = sourceScript ? program.getSourceFile(sourceScript.id) : sourceFile;
|
|
31
|
-
return getSyntacticDiagnostics(actualSourceFile, cancellationToken)
|
|
32
|
-
.map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, program, true))
|
|
33
|
-
.filter(utils_1.notEmpty);
|
|
34
39
|
};
|
|
35
40
|
program.getSemanticDiagnostics = (sourceFile, cancellationToken) => {
|
|
36
41
|
if (!sourceFile) {
|
|
37
|
-
return
|
|
42
|
+
return getSemanticDiagnostics(undefined, cancellationToken)
|
|
43
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
|
|
44
|
+
.filter(d => !!d);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
48
|
+
const actualSourceFile = targetScript ? program.getSourceFile(targetScript.id) : sourceFile;
|
|
49
|
+
return getSemanticDiagnostics(actualSourceFile, cancellationToken)
|
|
50
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
|
|
51
|
+
.filter(d => !!d)
|
|
52
|
+
.filter(d => !serviceScript || !d.file || language.scripts.get(d.file.fileName) === sourceScript);
|
|
38
53
|
}
|
|
39
|
-
const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
40
|
-
const actualSourceFile = sourceScript ? program.getSourceFile(sourceScript.id) : sourceFile;
|
|
41
|
-
return getSemanticDiagnostics(actualSourceFile, cancellationToken)
|
|
42
|
-
.map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, program, true))
|
|
43
|
-
.filter(utils_1.notEmpty);
|
|
44
54
|
};
|
|
45
55
|
program.getGlobalDiagnostics = cancellationToken => {
|
|
46
56
|
return getGlobalDiagnostics(cancellationToken)
|
|
47
|
-
.map(d => (0, transform_1.transformDiagnostic)(
|
|
48
|
-
.filter(
|
|
57
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
|
|
58
|
+
.filter(d => !!d);
|
|
49
59
|
};
|
|
50
60
|
// @ts-ignore
|
|
51
61
|
program.getBindAndCheckDiagnostics = (sourceFile, cancellationToken) => {
|
|
52
62
|
if (!sourceFile) {
|
|
53
|
-
return
|
|
63
|
+
return getBindAndCheckDiagnostics(undefined, cancellationToken)
|
|
64
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
|
|
65
|
+
.filter(d => !!d);
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
const [serviceScript, targetScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
69
|
+
const actualSourceFile = targetScript ? program.getSourceFile(targetScript.id) : sourceFile;
|
|
70
|
+
return getBindAndCheckDiagnostics(actualSourceFile, cancellationToken)
|
|
71
|
+
.map(d => (0, transform_1.transformDiagnostic)(language, d, program, true))
|
|
72
|
+
.filter(d => !!d)
|
|
73
|
+
.filter(d => !serviceScript || language.scripts.get(d.file.fileName) === sourceScript);
|
|
54
74
|
}
|
|
55
|
-
const [_serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
56
|
-
const actualSourceFile = sourceScript ? program.getSourceFile(sourceScript.id) : sourceFile;
|
|
57
|
-
return getBindAndCheckDiagnostics(actualSourceFile, cancellationToken)
|
|
58
|
-
.map(d => (0, transform_1.transformDiagnostic)(sourceScript, language, d, program, true))
|
|
59
|
-
.filter(utils_1.notEmpty);
|
|
60
75
|
};
|
|
61
76
|
// fix https://github.com/vuejs/language-tools/issues/4099 with `incremental`
|
|
62
77
|
program.getSourceFileByPath = path => {
|
|
@@ -67,5 +82,4 @@ function decorateProgram(language, program) {
|
|
|
67
82
|
return sourceFile;
|
|
68
83
|
};
|
|
69
84
|
}
|
|
70
|
-
exports.decorateProgram = decorateProgram;
|
|
71
85
|
//# sourceMappingURL=decorateProgram.js.map
|
package/lib/node/dedupe.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.dedupeDocumentSpans =
|
|
3
|
+
exports.dedupeDocumentSpans = dedupeDocumentSpans;
|
|
4
4
|
function dedupeDocumentSpans(items) {
|
|
5
5
|
return dedupe(items, item => [
|
|
6
6
|
item.fileName,
|
|
@@ -8,7 +8,6 @@ function dedupeDocumentSpans(items) {
|
|
|
8
8
|
item.textSpan.length,
|
|
9
9
|
].join(':'));
|
|
10
10
|
}
|
|
11
|
-
exports.dedupeDocumentSpans = dedupeDocumentSpans;
|
|
12
11
|
function dedupe(items, getKey) {
|
|
13
12
|
const map = new Map();
|
|
14
13
|
for (const item of items.reverse()) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.proxyCreateProgram =
|
|
3
|
+
exports.proxyCreateProgram = proxyCreateProgram;
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
5
|
const resolveModuleName_1 = require("../resolveModuleName");
|
|
6
6
|
const decorateProgram_1 = require("./decorateProgram");
|
|
@@ -163,7 +163,6 @@ function proxyCreateProgram(ts, original, getLanguagePlugins) {
|
|
|
163
163
|
},
|
|
164
164
|
});
|
|
165
165
|
}
|
|
166
|
-
exports.proxyCreateProgram = proxyCreateProgram;
|
|
167
166
|
function assert(condition, message) {
|
|
168
167
|
if (!condition) {
|
|
169
168
|
console.error(message);
|
package/lib/node/transform.d.ts
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
import type { CodeInformation, SourceScript, TypeScriptServiceScript } from '@volar/language-core';
|
|
2
2
|
import { Language } from '@volar/language-core';
|
|
3
3
|
import type * as ts from 'typescript';
|
|
4
|
-
export declare function transformCallHierarchyItem(
|
|
5
|
-
export declare function transformDiagnostic<T extends ts.Diagnostic>(
|
|
4
|
+
export declare function transformCallHierarchyItem(language: Language<string>, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
|
|
5
|
+
export declare function transformDiagnostic<T extends ts.Diagnostic>(language: Language<string>, diagnostic: T, program: ts.Program | undefined, isTsc: boolean): T | undefined;
|
|
6
6
|
export declare function fillSourceFileText(language: Language<string>, sourceFile: ts.SourceFile): void;
|
|
7
|
-
export declare function transformFileTextChanges(
|
|
8
|
-
export declare function transformDocumentSpan<T extends ts.DocumentSpan>(
|
|
9
|
-
export declare function transformSpan(
|
|
7
|
+
export declare function transformFileTextChanges(language: Language<string>, changes: readonly ts.FileTextChanges[], filter: (data: CodeInformation) => boolean): ts.FileTextChanges[];
|
|
8
|
+
export declare function transformDocumentSpan<T extends ts.DocumentSpan>(language: Language<string>, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
|
|
9
|
+
export declare function transformSpan(language: Language<string>, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
|
|
10
10
|
fileName: string;
|
|
11
11
|
textSpan: ts.TextSpan;
|
|
12
12
|
} | undefined;
|
|
13
|
-
export declare function transformTextChange(
|
|
14
|
-
export declare function transformTextSpan(
|
|
15
|
-
export declare function toSourceOffset(
|
|
16
|
-
export declare function
|
|
13
|
+
export declare function transformTextChange(sourceScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, textChange: ts.TextChange, filter: (data: CodeInformation) => boolean): [string, ts.TextChange] | undefined;
|
|
14
|
+
export declare function transformTextSpan(sourceScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): [string, ts.TextSpan] | undefined;
|
|
15
|
+
export declare function toSourceOffset(sourceScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, position: number, filter: (data: CodeInformation) => boolean): [fileName: string, offset: number] | undefined;
|
|
16
|
+
export declare function toSourceRanges(sourceScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, start: number, end: number, filter: (data: CodeInformation) => boolean): Generator<[fileName: string, start: number, end: number]>;
|
|
17
|
+
export declare function toSourceOffsets(sourceScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, position: number, filter: (data: CodeInformation) => boolean): Generator<[fileName: string, offset: number]>;
|
|
18
|
+
export declare function toGeneratedRanges(language: Language, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, start: number, end: number, filter: (data: CodeInformation) => boolean): Generator<readonly [number, number], void, unknown>;
|
|
17
19
|
export declare function toGeneratedOffset(language: Language, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
|
|
18
20
|
export declare function toGeneratedOffsets(language: Language, serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, position: number, filter: (data: CodeInformation) => boolean): Generator<readonly [number, import("@volar/language-core").Mapping<CodeInformation>], void, unknown>;
|
|
19
21
|
export declare function getMappingOffset(language: Language, serviceScript: TypeScriptServiceScript): number;
|
package/lib/node/transform.js
CHANGED
|
@@ -1,13 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.transformCallHierarchyItem = transformCallHierarchyItem;
|
|
4
|
+
exports.transformDiagnostic = transformDiagnostic;
|
|
5
|
+
exports.fillSourceFileText = fillSourceFileText;
|
|
6
|
+
exports.transformFileTextChanges = transformFileTextChanges;
|
|
7
|
+
exports.transformDocumentSpan = transformDocumentSpan;
|
|
8
|
+
exports.transformSpan = transformSpan;
|
|
9
|
+
exports.transformTextChange = transformTextChange;
|
|
10
|
+
exports.transformTextSpan = transformTextSpan;
|
|
11
|
+
exports.toSourceOffset = toSourceOffset;
|
|
12
|
+
exports.toSourceRanges = toSourceRanges;
|
|
13
|
+
exports.toSourceOffsets = toSourceOffsets;
|
|
14
|
+
exports.toGeneratedRanges = toGeneratedRanges;
|
|
15
|
+
exports.toGeneratedOffset = toGeneratedOffset;
|
|
16
|
+
exports.toGeneratedOffsets = toGeneratedOffsets;
|
|
17
|
+
exports.getMappingOffset = getMappingOffset;
|
|
4
18
|
const language_core_1 = require("@volar/language-core");
|
|
5
19
|
const utils_1 = require("./utils");
|
|
6
20
|
const transformedDiagnostics = new WeakMap();
|
|
7
21
|
const transformedSourceFile = new WeakSet();
|
|
8
|
-
function transformCallHierarchyItem(
|
|
9
|
-
const span = transformSpan(
|
|
10
|
-
const selectionSpan = transformSpan(
|
|
22
|
+
function transformCallHierarchyItem(language, item, filter) {
|
|
23
|
+
const span = transformSpan(language, item.file, item.span, filter);
|
|
24
|
+
const selectionSpan = transformSpan(language, item.file, item.selectionSpan, filter);
|
|
11
25
|
return {
|
|
12
26
|
...item,
|
|
13
27
|
file: span?.fileName ?? item.file,
|
|
@@ -15,22 +29,21 @@ function transformCallHierarchyItem(targetScript, language, item, filter) {
|
|
|
15
29
|
selectionSpan: selectionSpan?.textSpan ?? { start: 0, length: 0 },
|
|
16
30
|
};
|
|
17
31
|
}
|
|
18
|
-
|
|
19
|
-
function transformDiagnostic(targetScript, language, diagnostic, program, isTsc) {
|
|
32
|
+
function transformDiagnostic(language, diagnostic, program, isTsc) {
|
|
20
33
|
if (!transformedDiagnostics.has(diagnostic)) {
|
|
21
34
|
transformedDiagnostics.set(diagnostic, undefined);
|
|
22
35
|
const { relatedInformation } = diagnostic;
|
|
23
36
|
if (relatedInformation) {
|
|
24
37
|
diagnostic.relatedInformation = relatedInformation
|
|
25
|
-
.map(d => transformDiagnostic(
|
|
26
|
-
.filter(
|
|
38
|
+
.map(d => transformDiagnostic(language, d, program, isTsc))
|
|
39
|
+
.filter(d => !!d);
|
|
27
40
|
}
|
|
28
41
|
if (diagnostic.file !== undefined
|
|
29
42
|
&& diagnostic.start !== undefined
|
|
30
43
|
&& diagnostic.length !== undefined) {
|
|
31
|
-
const [serviceScript
|
|
44
|
+
const [serviceScript] = (0, utils_1.getServiceScript)(language, diagnostic.file.fileName);
|
|
32
45
|
if (serviceScript) {
|
|
33
|
-
const [sourceSpanFileName, sourceSpan] = transformTextSpan(
|
|
46
|
+
const [sourceSpanFileName, sourceSpan] = transformTextSpan(undefined, language, serviceScript, {
|
|
34
47
|
start: diagnostic.start,
|
|
35
48
|
length: diagnostic.length
|
|
36
49
|
}, language_core_1.shouldReportDiagnostics) ?? [];
|
|
@@ -61,28 +74,27 @@ function transformDiagnostic(targetScript, language, diagnostic, program, isTsc)
|
|
|
61
74
|
}
|
|
62
75
|
return transformedDiagnostics.get(diagnostic);
|
|
63
76
|
}
|
|
64
|
-
exports.transformDiagnostic = transformDiagnostic;
|
|
65
77
|
// fix https://github.com/vuejs/language-tools/issues/4099 without `incremental`
|
|
66
78
|
function fillSourceFileText(language, sourceFile) {
|
|
67
79
|
if (transformedSourceFile.has(sourceFile)) {
|
|
68
80
|
return;
|
|
69
81
|
}
|
|
70
82
|
transformedSourceFile.add(sourceFile);
|
|
71
|
-
const [serviceScript
|
|
83
|
+
const [serviceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
|
|
72
84
|
if (serviceScript && !serviceScript.preventLeadingOffset) {
|
|
85
|
+
const sourceScript = language.scripts.fromVirtualCode(serviceScript.code);
|
|
73
86
|
sourceFile.text = sourceScript.snapshot.getText(0, sourceScript.snapshot.getLength())
|
|
74
87
|
+ sourceFile.text.substring(sourceScript.snapshot.getLength());
|
|
75
88
|
}
|
|
76
89
|
}
|
|
77
|
-
|
|
78
|
-
function transformFileTextChanges(targetScript, language, changes, filter) {
|
|
90
|
+
function transformFileTextChanges(language, changes, filter) {
|
|
79
91
|
const changesPerFile = {};
|
|
80
92
|
const newFiles = new Set();
|
|
81
93
|
for (const fileChanges of changes) {
|
|
82
94
|
const [_, source] = (0, utils_1.getServiceScript)(language, fileChanges.fileName);
|
|
83
95
|
if (source) {
|
|
84
96
|
fileChanges.textChanges.forEach(c => {
|
|
85
|
-
const { fileName, textSpan } = transformSpan(
|
|
97
|
+
const { fileName, textSpan } = transformSpan(language, fileChanges.fileName, c.span, filter) ?? {};
|
|
86
98
|
if (fileName && textSpan) {
|
|
87
99
|
(changesPerFile[fileName] ?? (changesPerFile[fileName] = [])).push({ ...c, span: textSpan });
|
|
88
100
|
}
|
|
@@ -108,9 +120,8 @@ function transformFileTextChanges(targetScript, language, changes, filter) {
|
|
|
108
120
|
}
|
|
109
121
|
return result;
|
|
110
122
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
let textSpan = transformSpan(targetScript, language, documentSpan.fileName, documentSpan.textSpan, filter);
|
|
123
|
+
function transformDocumentSpan(language, documentSpan, filter, shouldFallback) {
|
|
124
|
+
let textSpan = transformSpan(language, documentSpan.fileName, documentSpan.textSpan, filter);
|
|
114
125
|
if (!textSpan && shouldFallback) {
|
|
115
126
|
textSpan = {
|
|
116
127
|
fileName: documentSpan.fileName,
|
|
@@ -120,9 +131,9 @@ function transformDocumentSpan(targetScript, language, documentSpan, filter, sho
|
|
|
120
131
|
if (!textSpan) {
|
|
121
132
|
return;
|
|
122
133
|
}
|
|
123
|
-
const contextSpan = transformSpan(
|
|
124
|
-
const originalTextSpan = transformSpan(
|
|
125
|
-
const originalContextSpan = transformSpan(
|
|
134
|
+
const contextSpan = transformSpan(language, documentSpan.fileName, documentSpan.contextSpan, filter);
|
|
135
|
+
const originalTextSpan = transformSpan(language, documentSpan.originalFileName, documentSpan.originalTextSpan, filter);
|
|
136
|
+
const originalContextSpan = transformSpan(language, documentSpan.originalFileName, documentSpan.originalContextSpan, filter);
|
|
126
137
|
return {
|
|
127
138
|
...documentSpan,
|
|
128
139
|
fileName: textSpan.fileName,
|
|
@@ -133,17 +144,13 @@ function transformDocumentSpan(targetScript, language, documentSpan, filter, sho
|
|
|
133
144
|
originalContextSpan: originalContextSpan?.textSpan,
|
|
134
145
|
};
|
|
135
146
|
}
|
|
136
|
-
|
|
137
|
-
function transformSpan(targetScript, language, fileName, textSpan, filter) {
|
|
147
|
+
function transformSpan(language, fileName, textSpan, filter) {
|
|
138
148
|
if (!fileName || !textSpan) {
|
|
139
149
|
return;
|
|
140
150
|
}
|
|
141
|
-
const [serviceScript
|
|
142
|
-
if (
|
|
143
|
-
|
|
144
|
-
}
|
|
145
|
-
else if (serviceScript) {
|
|
146
|
-
const [sourceSpanFileName, sourceSpan] = transformTextSpan(targetScript, language, serviceScript, textSpan, filter) ?? [];
|
|
151
|
+
const [serviceScript] = (0, utils_1.getServiceScript)(language, fileName);
|
|
152
|
+
if (serviceScript) {
|
|
153
|
+
const [sourceSpanFileName, sourceSpan] = transformTextSpan(undefined, language, serviceScript, textSpan, filter) ?? [];
|
|
147
154
|
if (sourceSpan && sourceSpanFileName) {
|
|
148
155
|
return {
|
|
149
156
|
fileName: sourceSpanFileName,
|
|
@@ -158,9 +165,8 @@ function transformSpan(targetScript, language, fileName, textSpan, filter) {
|
|
|
158
165
|
};
|
|
159
166
|
}
|
|
160
167
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
const [sourceSpanFileName, sourceSpan] = transformTextSpan(targetScript, language, serviceScript, textChange.span, filter) ?? [];
|
|
168
|
+
function transformTextChange(sourceScript, language, serviceScript, textChange, filter) {
|
|
169
|
+
const [sourceSpanFileName, sourceSpan] = transformTextSpan(sourceScript, language, serviceScript, textChange.span, filter) ?? [];
|
|
164
170
|
if (sourceSpan && sourceSpanFileName) {
|
|
165
171
|
return [sourceSpanFileName, {
|
|
166
172
|
newText: textChange.newText,
|
|
@@ -169,64 +175,77 @@ function transformTextChange(targetScript, language, serviceScript, textChange,
|
|
|
169
175
|
}
|
|
170
176
|
return undefined;
|
|
171
177
|
}
|
|
172
|
-
|
|
173
|
-
function transformTextSpan(targetScript, language, serviceScript, textSpan, filter) {
|
|
178
|
+
function transformTextSpan(sourceScript, language, serviceScript, textSpan, filter) {
|
|
174
179
|
const start = textSpan.start;
|
|
175
180
|
const end = textSpan.start + textSpan.length;
|
|
176
|
-
for (const sourceStart of
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
start: sourceStart[1],
|
|
182
|
-
length: sourceEnd[1] - sourceStart[1],
|
|
183
|
-
}];
|
|
184
|
-
}
|
|
185
|
-
}
|
|
181
|
+
for (const [fileName, sourceStart, sourceEnd] of toSourceRanges(sourceScript, language, serviceScript, start, end, filter)) {
|
|
182
|
+
return [fileName, {
|
|
183
|
+
start: sourceStart,
|
|
184
|
+
length: sourceEnd - sourceStart,
|
|
185
|
+
}];
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
for (const source of toSourceOffsets(targetScript, language, serviceScript, position, filter)) {
|
|
188
|
+
function toSourceOffset(sourceScript, language, serviceScript, position, filter) {
|
|
189
|
+
for (const source of toSourceOffsets(sourceScript, language, serviceScript, position, filter)) {
|
|
191
190
|
return source;
|
|
192
191
|
}
|
|
193
192
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
const map
|
|
198
|
-
|
|
193
|
+
function* toSourceRanges(sourceScript, language, serviceScript, start, end, filter) {
|
|
194
|
+
if (sourceScript) {
|
|
195
|
+
const map = language.maps.get(serviceScript.code, sourceScript);
|
|
196
|
+
for (const [sourceStart, sourceEnd] of map.toSourceRange(start - getMappingOffset(language, serviceScript), end - getMappingOffset(language, serviceScript), true, filter)) {
|
|
197
|
+
yield [sourceScript.id, sourceStart, sourceEnd];
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
for (const [sourceScript, map] of language.maps.forEach(serviceScript.code)) {
|
|
202
|
+
for (const [sourceStart, sourceEnd] of map.toSourceRange(start - getMappingOffset(language, serviceScript), end - getMappingOffset(language, serviceScript), true, filter)) {
|
|
203
|
+
yield [sourceScript.id, sourceStart, sourceEnd];
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
function* toSourceOffsets(sourceScript, language, serviceScript, position, filter) {
|
|
209
|
+
if (sourceScript) {
|
|
210
|
+
const map = language.maps.get(serviceScript.code, sourceScript);
|
|
211
|
+
for (const [sourceOffset, mapping] of map.toSourceLocation(position - getMappingOffset(language, serviceScript))) {
|
|
199
212
|
if (filter(mapping.data)) {
|
|
200
|
-
yield [
|
|
213
|
+
yield [sourceScript.id, sourceOffset];
|
|
201
214
|
}
|
|
202
215
|
}
|
|
203
216
|
}
|
|
204
217
|
else {
|
|
205
|
-
for (const [
|
|
206
|
-
for (const [sourceOffset, mapping] of map.
|
|
218
|
+
for (const [sourceScript, map] of language.maps.forEach(serviceScript.code)) {
|
|
219
|
+
for (const [sourceOffset, mapping] of map.toSourceLocation(position - getMappingOffset(language, serviceScript))) {
|
|
207
220
|
if (filter(mapping.data)) {
|
|
208
|
-
yield [
|
|
221
|
+
yield [sourceScript.id, sourceOffset];
|
|
209
222
|
}
|
|
210
223
|
}
|
|
211
224
|
}
|
|
212
225
|
}
|
|
213
226
|
}
|
|
214
|
-
|
|
227
|
+
function* toGeneratedRanges(language, serviceScript, sourceScript, start, end, filter) {
|
|
228
|
+
const map = language.maps.get(serviceScript.code, sourceScript);
|
|
229
|
+
for (const [generateStart, generateEnd] of map.toGeneratedRange(start, end, true, filter)) {
|
|
230
|
+
yield [
|
|
231
|
+
generateStart + getMappingOffset(language, serviceScript),
|
|
232
|
+
generateEnd + getMappingOffset(language, serviceScript),
|
|
233
|
+
];
|
|
234
|
+
}
|
|
235
|
+
}
|
|
215
236
|
function toGeneratedOffset(language, serviceScript, sourceScript, position, filter) {
|
|
216
237
|
for (const [generateOffset] of toGeneratedOffsets(language, serviceScript, sourceScript, position, filter)) {
|
|
217
238
|
return generateOffset;
|
|
218
239
|
}
|
|
219
240
|
}
|
|
220
|
-
exports.toGeneratedOffset = toGeneratedOffset;
|
|
221
241
|
function* toGeneratedOffsets(language, serviceScript, sourceScript, position, filter) {
|
|
222
242
|
const map = language.maps.get(serviceScript.code, sourceScript);
|
|
223
|
-
for (const [generateOffset, mapping] of map.
|
|
243
|
+
for (const [generateOffset, mapping] of map.toGeneratedLocation(position)) {
|
|
224
244
|
if (filter(mapping.data)) {
|
|
225
245
|
yield [generateOffset + getMappingOffset(language, serviceScript), mapping];
|
|
226
246
|
}
|
|
227
247
|
}
|
|
228
248
|
}
|
|
229
|
-
exports.toGeneratedOffsets = toGeneratedOffsets;
|
|
230
249
|
function getMappingOffset(language, serviceScript) {
|
|
231
250
|
if (serviceScript.preventLeadingOffset) {
|
|
232
251
|
return 0;
|
|
@@ -234,5 +253,4 @@ function getMappingOffset(language, serviceScript) {
|
|
|
234
253
|
const sourceScript = language.scripts.fromVirtualCode(serviceScript.code);
|
|
235
254
|
return sourceScript.snapshot.getLength();
|
|
236
255
|
}
|
|
237
|
-
exports.getMappingOffset = getMappingOffset;
|
|
238
256
|
//# sourceMappingURL=transform.js.map
|
package/lib/node/utils.d.ts
CHANGED
|
@@ -1,3 +1,2 @@
|
|
|
1
1
|
import type { Language, SourceScript, TypeScriptServiceScript } from '@volar/language-core';
|
|
2
|
-
export declare function
|
|
3
|
-
export declare function getServiceScript(language: Language<string>, fileName: string): [TypeScriptServiceScript, SourceScript<string>] | [undefined, SourceScript<string>] | [undefined, undefined];
|
|
2
|
+
export declare function getServiceScript(language: Language<string>, fileName: string): [serviceScript: TypeScriptServiceScript, targetScript: SourceScript<string>, sourceScript: SourceScript<string>] | [serviceScript: undefined, sourceScript: SourceScript<string>, sourceScript: SourceScript<string>] | [serviceScript: undefined, sourceScript: undefined, targetScript: undefined];
|
package/lib/node/utils.js
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getServiceScript =
|
|
4
|
-
function notEmpty(value) {
|
|
5
|
-
return value !== null && value !== undefined;
|
|
6
|
-
}
|
|
7
|
-
exports.notEmpty = notEmpty;
|
|
3
|
+
exports.getServiceScript = getServiceScript;
|
|
8
4
|
function getServiceScript(language, fileName) {
|
|
9
5
|
const sourceScript = language.scripts.get(fileName);
|
|
10
6
|
if (sourceScript?.targetIds.size) {
|
|
@@ -13,21 +9,20 @@ function getServiceScript(language, fileName) {
|
|
|
13
9
|
if (targetScript?.generated) {
|
|
14
10
|
const serviceScript = targetScript.generated.languagePlugin.typescript?.getServiceScript(targetScript.generated.root);
|
|
15
11
|
if (serviceScript) {
|
|
16
|
-
return [serviceScript, targetScript];
|
|
12
|
+
return [serviceScript, targetScript, sourceScript];
|
|
17
13
|
}
|
|
18
14
|
}
|
|
19
15
|
}
|
|
20
16
|
}
|
|
21
17
|
if (sourceScript?.associatedOnly) {
|
|
22
|
-
return [undefined, sourceScript];
|
|
18
|
+
return [undefined, sourceScript, sourceScript];
|
|
23
19
|
}
|
|
24
20
|
if (sourceScript?.generated) {
|
|
25
21
|
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
|
|
26
22
|
if (serviceScript) {
|
|
27
|
-
return [serviceScript, sourceScript];
|
|
23
|
+
return [serviceScript, sourceScript, sourceScript];
|
|
28
24
|
}
|
|
29
25
|
}
|
|
30
|
-
return [undefined, undefined];
|
|
26
|
+
return [undefined, undefined, undefined];
|
|
31
27
|
}
|
|
32
|
-
exports.getServiceScript = getServiceScript;
|
|
33
28
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createLanguageServiceHost =
|
|
3
|
+
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");
|
|
@@ -249,7 +249,6 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
|
|
|
249
249
|
return '';
|
|
250
250
|
}
|
|
251
251
|
}
|
|
252
|
-
exports.createLanguageServiceHost = createLanguageServiceHost;
|
|
253
252
|
function setEquals(a, b) {
|
|
254
253
|
if (a.size !== b.size) {
|
|
255
254
|
return false;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createSys =
|
|
3
|
+
exports.createSys = createSys;
|
|
4
4
|
const path = require("path-browserify");
|
|
5
5
|
const utilities_1 = require("../typescript/utilities");
|
|
6
6
|
const vscode_uri_1 = require("vscode-uri");
|
|
@@ -368,5 +368,4 @@ function createSys(sys, env, workspaceFolder, uriConverter) {
|
|
|
368
368
|
return caseSensitive ? fileName : fileName.toLowerCase();
|
|
369
369
|
}
|
|
370
370
|
}
|
|
371
|
-
exports.createSys = createSys;
|
|
372
371
|
//# sourceMappingURL=createSys.js.map
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
import { LanguagePlugin } from '@volar/language-core';
|
|
1
|
+
import { Language, LanguagePlugin } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare function createAsyncLanguageServicePlugin(extensions: string[], scriptKind: ts.ScriptKind,
|
|
3
|
+
export declare function createAsyncLanguageServicePlugin(extensions: string[], scriptKind: ts.ScriptKind, create: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => Promise<{
|
|
4
|
+
languagePlugins: LanguagePlugin<string>[];
|
|
5
|
+
setup?: (language: Language<string>) => void;
|
|
6
|
+
}>): ts.server.PluginModuleFactory;
|
|
@@ -1,23 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createAsyncLanguageServicePlugin =
|
|
3
|
+
exports.createAsyncLanguageServicePlugin = createAsyncLanguageServicePlugin;
|
|
4
4
|
const language_core_1 = require("@volar/language-core");
|
|
5
5
|
const common_1 = require("../common");
|
|
6
6
|
const decorateLanguageService_1 = require("../node/decorateLanguageService");
|
|
7
7
|
const decorateLanguageServiceHost_1 = require("../node/decorateLanguageServiceHost");
|
|
8
8
|
const createLanguageServicePlugin_1 = require("./createLanguageServicePlugin");
|
|
9
|
-
|
|
10
|
-
const decoratedLanguageServices = new WeakSet();
|
|
11
|
-
const decoratedLanguageServiceHosts = new WeakSet();
|
|
12
|
-
function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePlugins) {
|
|
9
|
+
function createAsyncLanguageServicePlugin(extensions, scriptKind, create) {
|
|
13
10
|
return modules => {
|
|
14
11
|
const { typescript: ts } = modules;
|
|
15
12
|
const pluginModule = {
|
|
16
13
|
create(info) {
|
|
17
|
-
if (!decoratedLanguageServices.has(info.languageService)
|
|
18
|
-
&& !decoratedLanguageServiceHosts.has(info.languageServiceHost)) {
|
|
19
|
-
decoratedLanguageServices.add(info.languageService);
|
|
20
|
-
decoratedLanguageServiceHosts.add(info.languageServiceHost);
|
|
14
|
+
if (!createLanguageServicePlugin_1.decoratedLanguageServices.has(info.languageService)
|
|
15
|
+
&& !createLanguageServicePlugin_1.decoratedLanguageServiceHosts.has(info.languageServiceHost)) {
|
|
16
|
+
createLanguageServicePlugin_1.decoratedLanguageServices.add(info.languageService);
|
|
17
|
+
createLanguageServicePlugin_1.decoratedLanguageServiceHosts.add(info.languageServiceHost);
|
|
21
18
|
const emptySnapshot = ts.ScriptSnapshot.fromString('');
|
|
22
19
|
const getScriptSnapshot = info.languageServiceHost.getScriptSnapshot.bind(info.languageServiceHost);
|
|
23
20
|
const getScriptVersion = info.languageServiceHost.getScriptVersion.bind(info.languageServiceHost);
|
|
@@ -52,7 +49,7 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
|
|
|
52
49
|
return getProjectVersion();
|
|
53
50
|
};
|
|
54
51
|
}
|
|
55
|
-
|
|
52
|
+
create(ts, info).then(({ languagePlugins, setup }) => {
|
|
56
53
|
const syncedScriptVersions = new language_core_1.FileMap(ts.sys.useCaseSensitiveFileNames);
|
|
57
54
|
const language = (0, language_core_1.createLanguage)([
|
|
58
55
|
...languagePlugins,
|
|
@@ -73,27 +70,29 @@ function createAsyncLanguageServicePlugin(extensions, scriptKind, loadLanguagePl
|
|
|
73
70
|
});
|
|
74
71
|
(0, decorateLanguageService_1.decorateLanguageService)(language, info.languageService);
|
|
75
72
|
(0, decorateLanguageServiceHost_1.decorateLanguageServiceHost)(ts, language, info.languageServiceHost);
|
|
76
|
-
|
|
73
|
+
setup?.(language);
|
|
74
|
+
if ('markAsDirty' in info.project && typeof info.project.markAsDirty === 'function') {
|
|
75
|
+
info.project.markAsDirty();
|
|
76
|
+
}
|
|
77
77
|
initialized = true;
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
80
|
return info.languageService;
|
|
81
81
|
},
|
|
82
82
|
getExternalFiles(project, updateLevel = 0) {
|
|
83
|
-
if (updateLevel >=
|
|
84
|
-
|| !externalFiles.has(project)) {
|
|
85
|
-
const oldFiles = externalFiles.get(project);
|
|
83
|
+
if (updateLevel >= 1
|
|
84
|
+
|| !createLanguageServicePlugin_1.externalFiles.has(project)) {
|
|
85
|
+
const oldFiles = createLanguageServicePlugin_1.externalFiles.get(project);
|
|
86
86
|
const newFiles = extensions.length ? (0, decorateLanguageServiceHost_1.searchExternalFiles)(ts, project, extensions) : [];
|
|
87
|
-
externalFiles.set(project, newFiles);
|
|
87
|
+
createLanguageServicePlugin_1.externalFiles.set(project, newFiles);
|
|
88
88
|
if (oldFiles && !(0, createLanguageServicePlugin_1.arrayItemsEqual)(oldFiles, newFiles)) {
|
|
89
89
|
project.refreshDiagnostics();
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
|
-
return externalFiles.get(project);
|
|
92
|
+
return createLanguageServicePlugin_1.externalFiles.get(project);
|
|
93
93
|
},
|
|
94
94
|
};
|
|
95
95
|
return pluginModule;
|
|
96
96
|
};
|
|
97
97
|
}
|
|
98
|
-
exports.createAsyncLanguageServicePlugin = createAsyncLanguageServicePlugin;
|
|
99
98
|
//# sourceMappingURL=createAsyncLanguageServicePlugin.js.map
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
import { LanguagePlugin } from '@volar/language-core';
|
|
1
|
+
import { Language, LanguagePlugin } from '@volar/language-core';
|
|
2
2
|
import type * as ts from 'typescript';
|
|
3
|
-
export declare
|
|
3
|
+
export declare const externalFiles: WeakMap<ts.server.Project, string[]>;
|
|
4
|
+
export declare const projectExternalFileExtensions: WeakMap<ts.server.Project, string[]>;
|
|
5
|
+
export declare const decoratedLanguageServices: WeakSet<ts.LanguageService>;
|
|
6
|
+
export declare const decoratedLanguageServiceHosts: WeakSet<ts.LanguageServiceHost>;
|
|
7
|
+
export declare function createLanguageServicePlugin(create: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => {
|
|
8
|
+
languagePlugins: LanguagePlugin<string>[];
|
|
9
|
+
setup?: (language: Language<string>) => void;
|
|
10
|
+
}): ts.server.PluginModuleFactory;
|
|
4
11
|
export declare function arrayItemsEqual(a: string[], b: string[]): boolean;
|