@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.
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.searchExternalFiles = exports.decorateLanguageServiceHost = void 0;
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 = void 0;
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)(undefined, language, d, program, true))
22
- .filter(utils_1.notEmpty),
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)(undefined, language, d, program, true))
48
- .filter(utils_1.notEmpty);
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
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.dedupeDocumentSpans = void 0;
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 = void 0;
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);
@@ -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(targetScript: SourceScript<string> | undefined, language: Language<string>, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
5
- export declare function transformDiagnostic<T extends ts.Diagnostic>(targetScript: SourceScript<string> | undefined, language: Language<string>, diagnostic: T, program: ts.Program | undefined, isTsc: boolean): T | undefined;
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(targetScript: SourceScript<string> | undefined, language: Language<string>, changes: readonly ts.FileTextChanges[], filter: (data: CodeInformation) => boolean): ts.FileTextChanges[];
8
- export declare function transformDocumentSpan<T extends ts.DocumentSpan>(targetScript: SourceScript<string> | undefined, language: Language<string>, documentSpan: T, filter: (data: CodeInformation) => boolean, shouldFallback?: boolean): T | undefined;
9
- export declare function transformSpan(targetScript: SourceScript<string> | undefined, language: Language<string>, fileName: string | undefined, textSpan: ts.TextSpan | undefined, filter: (data: CodeInformation) => boolean): {
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(targetScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, textChange: ts.TextChange, filter: (data: CodeInformation) => boolean): [string, ts.TextChange] | undefined;
14
- export declare function transformTextSpan(targetScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): [string, ts.TextSpan] | undefined;
15
- export declare function toSourceOffset(targetScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, position: number, filter: (data: CodeInformation) => boolean): [fileName: string, offset: number] | undefined;
16
- export declare function toSourceOffsets(targetScript: SourceScript<string> | undefined, language: Language<string>, serviceScript: TypeScriptServiceScript, position: number, filter: (data: CodeInformation) => boolean): Generator<[fileName: string, offset: number]>;
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;
@@ -1,13 +1,27 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getMappingOffset = exports.toGeneratedOffsets = exports.toGeneratedOffset = exports.toSourceOffsets = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.fillSourceFileText = exports.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
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(targetScript, language, item, filter) {
9
- const span = transformSpan(targetScript, language, item.file, item.span, filter);
10
- const selectionSpan = transformSpan(targetScript, language, item.file, item.selectionSpan, filter);
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
- exports.transformCallHierarchyItem = transformCallHierarchyItem;
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(targetScript, language, d, program, isTsc))
26
- .filter(utils_1.notEmpty);
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, sourceScript] = (0, utils_1.getServiceScript)(language, diagnostic.file.fileName);
44
+ const [serviceScript] = (0, utils_1.getServiceScript)(language, diagnostic.file.fileName);
32
45
  if (serviceScript) {
33
- const [sourceSpanFileName, sourceSpan] = transformTextSpan(sourceScript, language, serviceScript, {
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, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
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
- exports.fillSourceFileText = fillSourceFileText;
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(targetScript, language, fileChanges.fileName, c.span, filter) ?? {};
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
- exports.transformFileTextChanges = transformFileTextChanges;
112
- function transformDocumentSpan(targetScript, language, documentSpan, filter, shouldFallback) {
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(targetScript, language, documentSpan.fileName, documentSpan.contextSpan, filter);
124
- const originalTextSpan = transformSpan(targetScript, language, documentSpan.originalFileName, documentSpan.originalTextSpan, filter);
125
- const originalContextSpan = transformSpan(targetScript, language, documentSpan.originalFileName, documentSpan.originalContextSpan, filter);
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
- exports.transformDocumentSpan = transformDocumentSpan;
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, sourceScript] = (0, utils_1.getServiceScript)(language, fileName);
142
- if (sourceScript?.associatedOnly) {
143
- return;
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
- exports.transformSpan = transformSpan;
162
- function transformTextChange(targetScript, language, serviceScript, textChange, filter) {
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
- exports.transformTextChange = transformTextChange;
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 toSourceOffsets(targetScript, language, serviceScript, start, filter)) {
177
- for (const sourceEnd of toSourceOffsets(targetScript, language, serviceScript, end, filter)) {
178
- if (sourceStart[0] === sourceEnd[0]
179
- && sourceEnd[1] >= sourceStart[1]) {
180
- return [sourceStart[0], {
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
- exports.transformTextSpan = transformTextSpan;
189
- function toSourceOffset(targetScript, language, serviceScript, position, filter) {
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
- exports.toSourceOffset = toSourceOffset;
195
- function* toSourceOffsets(targetScript, language, serviceScript, position, filter) {
196
- if (targetScript) {
197
- const map = language.maps.get(serviceScript.code, targetScript);
198
- for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(language, serviceScript))) {
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 [targetScript.id, sourceOffset];
213
+ yield [sourceScript.id, sourceOffset];
201
214
  }
202
215
  }
203
216
  }
204
217
  else {
205
- for (const [fileName, _snapshot, map] of language.maps.forEach(serviceScript.code)) {
206
- for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(language, serviceScript))) {
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 [fileName, sourceOffset];
221
+ yield [sourceScript.id, sourceOffset];
209
222
  }
210
223
  }
211
224
  }
212
225
  }
213
226
  }
214
- exports.toSourceOffsets = toSourceOffsets;
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.getGeneratedOffsets(position)) {
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
@@ -1,3 +1,2 @@
1
1
  import type { Language, SourceScript, TypeScriptServiceScript } from '@volar/language-core';
2
- export declare function notEmpty<T>(value: T | null | undefined): value is T;
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 = exports.notEmpty = void 0;
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 = void 0;
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 = void 0;
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, loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => Promise<LanguagePlugin<string>[]>): ts.server.PluginModuleFactory;
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 = void 0;
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
- const externalFiles = new WeakMap();
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
- loadLanguagePlugins(ts, info).then(languagePlugins => {
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
- info.project.markAsDirty();
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 >= (1)
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 function createLanguageServicePlugin(loadLanguagePlugins: (ts: typeof import('typescript'), info: ts.server.PluginCreateInfo) => LanguagePlugin<string>[]): ts.server.PluginModuleFactory;
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;