@volar/typescript 2.3.0-alpha.4 → 2.3.0-alpha.6

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.
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.decorateLanguageService = void 0;
4
4
  const language_core_1 = require("@volar/language-core");
5
5
  const dedupe_1 = require("./dedupe");
6
- const utils_1 = require("./utils");
7
6
  const transform_1 = require("./transform");
7
+ const utils_1 = require("./utils");
8
8
  const windowsPathReg = /\\/g;
9
9
  function decorateLanguageService(language, languageService) {
10
10
  // ignored methods
@@ -42,7 +42,7 @@ function decorateLanguageService(language, languageService) {
42
42
  }
43
43
  const edits = getFormattingEditsForDocument(fileName, options);
44
44
  return edits
45
- .map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
45
+ .map(edit => (0, transform_1.transformTextChange)(serviceScript, sourceScript, map, edit, language_core_1.isFormattingEnabled))
46
46
  .filter(utils_1.notEmpty);
47
47
  }
48
48
  else {
@@ -53,12 +53,12 @@ function decorateLanguageService(language, languageService) {
53
53
  const fileName = filePath.replace(windowsPathReg, '/');
54
54
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
55
55
  if (serviceScript) {
56
- const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isFormattingEnabled);
57
- const generateEnd = (0, transform_1.toGeneratedOffset)(sourceScript, map, end, language_core_1.isFormattingEnabled);
56
+ const generateStart = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, start, language_core_1.isFormattingEnabled);
57
+ const generateEnd = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, end, language_core_1.isFormattingEnabled);
58
58
  if (generateStart !== undefined && generateEnd !== undefined) {
59
59
  const edits = getFormattingEditsForRange(fileName, generateStart, generateEnd, options);
60
60
  return edits
61
- .map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
61
+ .map(edit => (0, transform_1.transformTextChange)(serviceScript, sourceScript, map, edit, language_core_1.isFormattingEnabled))
62
62
  .filter(utils_1.notEmpty);
63
63
  }
64
64
  return [];
@@ -71,11 +71,11 @@ function decorateLanguageService(language, languageService) {
71
71
  const fileName = filePath.replace(windowsPathReg, '/');
72
72
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
73
73
  if (serviceScript) {
74
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isFormattingEnabled);
74
+ const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isFormattingEnabled);
75
75
  if (generatePosition !== undefined) {
76
76
  const edits = getFormattingEditsAfterKeystroke(fileName, generatePosition, key, options);
77
77
  return edits
78
- .map(edit => (0, transform_1.transformTextChange)(sourceScript, map, edit, language_core_1.isFormattingEnabled))
78
+ .map(edit => (0, transform_1.transformTextChange)(serviceScript, sourceScript, map, edit, language_core_1.isFormattingEnabled))
79
79
  .filter(utils_1.notEmpty);
80
80
  }
81
81
  return [];
@@ -94,13 +94,13 @@ function decorateLanguageService(language, languageService) {
94
94
  const fileName = filePath.replace(windowsPathReg, '/');
95
95
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
96
96
  if (serviceScript) {
97
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isLinkedEditingEnabled);
97
+ const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isLinkedEditingEnabled);
98
98
  if (generatePosition !== undefined) {
99
99
  const info = getLinkedEditingRangeAtPosition(fileName, generatePosition);
100
100
  if (info) {
101
101
  return {
102
102
  ranges: info.ranges
103
- .map(span => (0, transform_1.transformTextSpan)(sourceScript, map, span, language_core_1.isLinkedEditingEnabled))
103
+ .map(span => (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, span, language_core_1.isLinkedEditingEnabled))
104
104
  .filter(utils_1.notEmpty),
105
105
  wordPattern: info.wordPattern,
106
106
  };
@@ -115,7 +115,7 @@ function decorateLanguageService(language, languageService) {
115
115
  const fileName = filePath.replace(windowsPathReg, '/');
116
116
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
117
117
  if (serviceScript) {
118
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
118
+ const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
119
119
  if (generatePosition !== undefined) {
120
120
  const item = prepareCallHierarchy(fileName, generatePosition);
121
121
  if (Array.isArray(item)) {
@@ -135,7 +135,7 @@ function decorateLanguageService(language, languageService) {
135
135
  const fileName = filePath.replace(windowsPathReg, '/');
136
136
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
137
137
  if (serviceScript) {
138
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
138
+ const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
139
139
  if (generatePosition !== undefined) {
140
140
  calls = provideCallHierarchyIncomingCalls(fileName, generatePosition);
141
141
  }
@@ -160,7 +160,7 @@ function decorateLanguageService(language, languageService) {
160
160
  const fileName = filePath.replace(windowsPathReg, '/');
161
161
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
162
162
  if (serviceScript) {
163
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
163
+ const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCallHierarchyEnabled);
164
164
  if (generatePosition !== undefined) {
165
165
  calls = provideCallHierarchyOutgoingCalls(fileName, generatePosition);
166
166
  }
@@ -173,7 +173,7 @@ function decorateLanguageService(language, languageService) {
173
173
  const to = (0, transform_1.transformCallHierarchyItem)(language, call.to, language_core_1.isCallHierarchyEnabled);
174
174
  const fromSpans = call.fromSpans
175
175
  .map(span => sourceScript
176
- ? (0, transform_1.transformTextSpan)(sourceScript, map, span, language_core_1.isCallHierarchyEnabled)
176
+ ? (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, span, language_core_1.isCallHierarchyEnabled)
177
177
  : span)
178
178
  .filter(utils_1.notEmpty);
179
179
  return {
@@ -194,13 +194,13 @@ function decorateLanguageService(language, languageService) {
194
194
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
195
195
  if (serviceScript) {
196
196
  const infos = [];
197
- for (const [generatePosition, mapping] of (0, transform_1.toGeneratedOffsets)(sourceScript, map, position)) {
197
+ for (const [generatePosition, mapping] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position)) {
198
198
  if (!(0, language_core_1.isHoverEnabled)(mapping.data)) {
199
199
  continue;
200
200
  }
201
201
  const info = getQuickInfoAtPosition(fileName, generatePosition);
202
202
  if (info) {
203
- const textSpan = (0, transform_1.transformTextSpan)(sourceScript, map, info.textSpan, language_core_1.isHoverEnabled);
203
+ const textSpan = (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, info.textSpan, language_core_1.isHoverEnabled);
204
204
  if (textSpan) {
205
205
  infos.push({
206
206
  ...info,
@@ -256,11 +256,11 @@ function decorateLanguageService(language, languageService) {
256
256
  const fileName = filePath.replace(windowsPathReg, '/');
257
257
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
258
258
  if (serviceScript) {
259
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isSignatureHelpEnabled);
259
+ const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isSignatureHelpEnabled);
260
260
  if (generatePosition !== undefined) {
261
261
  const result = getSignatureHelpItems(fileName, generatePosition, options);
262
262
  if (result) {
263
- const applicableSpan = (0, transform_1.transformTextSpan)(sourceScript, map, result.applicableSpan, language_core_1.isSignatureHelpEnabled);
263
+ const applicableSpan = (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, result.applicableSpan, language_core_1.isSignatureHelpEnabled);
264
264
  if (applicableSpan) {
265
265
  return {
266
266
  ...result,
@@ -308,7 +308,7 @@ function decorateLanguageService(language, languageService) {
308
308
  const fileName = filePath.replace(windowsPathReg, '/');
309
309
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
310
310
  if (serviceScript) {
311
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
311
+ const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, typeof positionOrRange === 'number' ? positionOrRange : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
312
312
  if (generatePosition !== undefined) {
313
313
  const por = typeof positionOrRange === 'number'
314
314
  ? generatePosition
@@ -329,7 +329,7 @@ function decorateLanguageService(language, languageService) {
329
329
  const fileName = filePath.replace(windowsPathReg, '/');
330
330
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
331
331
  if (serviceScript) {
332
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, typeof positionOrRange === 'number'
332
+ const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, typeof positionOrRange === 'number'
333
333
  ? positionOrRange
334
334
  : positionOrRange.pos, language_core_1.isCodeActionsEnabled);
335
335
  if (generatePosition !== undefined) {
@@ -357,13 +357,13 @@ function decorateLanguageService(language, languageService) {
357
357
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
358
358
  if (serviceScript) {
359
359
  let failed;
360
- for (const [generateOffset, mapping] of (0, transform_1.toGeneratedOffsets)(sourceScript, map, position)) {
360
+ for (const [generateOffset, mapping] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position)) {
361
361
  if (!(0, language_core_1.isRenameEnabled)(mapping.data)) {
362
362
  continue;
363
363
  }
364
364
  const info = getRenameInfo(fileName, generateOffset, options);
365
365
  if (info.canRename) {
366
- const span = (0, transform_1.transformTextSpan)(sourceScript, map, info.triggerSpan, language_core_1.isRenameEnabled);
366
+ const span = (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, info.triggerSpan, language_core_1.isRenameEnabled);
367
367
  if (span) {
368
368
  info.triggerSpan = span;
369
369
  return info;
@@ -390,8 +390,8 @@ function decorateLanguageService(language, languageService) {
390
390
  const fileName = filePath.replace(windowsPathReg, '/');
391
391
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
392
392
  if (serviceScript) {
393
- const generateStart = (0, transform_1.toGeneratedOffset)(sourceScript, map, start, language_core_1.isCodeActionsEnabled);
394
- const generateEnd = (0, transform_1.toGeneratedOffset)(sourceScript, map, end, language_core_1.isCodeActionsEnabled);
393
+ const generateStart = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, start, language_core_1.isCodeActionsEnabled);
394
+ const generateEnd = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, end, language_core_1.isCodeActionsEnabled);
395
395
  if (generateStart !== undefined && generateEnd !== undefined) {
396
396
  fixes = getCodeFixesAtPosition(fileName, generateStart, generateEnd, errorCodes, formatOptions, preferences);
397
397
  }
@@ -422,13 +422,14 @@ function decorateLanguageService(language, languageService) {
422
422
  }
423
423
  start ??= 0;
424
424
  end ??= sourceScript.snapshot.getLength();
425
- start += sourceScript.snapshot.getLength();
426
- end += sourceScript.snapshot.getLength();
425
+ const mappingOffset = (0, transform_1.getMappingOffset)(serviceScript, sourceScript);
426
+ start += mappingOffset;
427
+ end += mappingOffset;
427
428
  const result = getEncodedSemanticClassifications(fileName, { start, length: end - start }, format);
428
429
  const spans = [];
429
430
  for (let i = 0; i < result.spans.length; i += 3) {
430
- const sourceStart = (0, transform_1.toSourceOffset)(sourceScript, map, result.spans[i], language_core_1.isSemanticTokensEnabled);
431
- const sourceEnd = (0, transform_1.toSourceOffset)(sourceScript, map, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled);
431
+ const sourceStart = (0, transform_1.toSourceOffset)(serviceScript, sourceScript, map, result.spans[i], language_core_1.isSemanticTokensEnabled);
432
+ const sourceEnd = (0, transform_1.toSourceOffset)(serviceScript, sourceScript, map, result.spans[i] + result.spans[i + 1], language_core_1.isSemanticTokensEnabled);
432
433
  if (sourceStart !== undefined && sourceEnd !== undefined) {
433
434
  spans.push(sourceStart, sourceEnd - sourceStart, result.spans[i + 2]);
434
435
  }
@@ -574,7 +575,7 @@ function decorateLanguageService(language, languageService) {
574
575
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
575
576
  if (serviceScript) {
576
577
  const results = [];
577
- for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(sourceScript, map, position)) {
578
+ for (const [generatedOffset, mapping] of (0, transform_1.toGeneratedOffsets)(serviceScript, sourceScript, map, position)) {
578
579
  if (!(0, language_core_1.isCompletionEnabled)(mapping.data)) {
579
580
  continue;
580
581
  }
@@ -586,10 +587,10 @@ function decorateLanguageService(language, languageService) {
586
587
  result.entries = result.entries.filter(entry => !!entry.sourceDisplay);
587
588
  }
588
589
  for (const entry of result.entries) {
589
- entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(sourceScript, map, entry.replacementSpan, language_core_1.isCompletionEnabled);
590
+ entry.replacementSpan = entry.replacementSpan && (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, entry.replacementSpan, language_core_1.isCompletionEnabled);
590
591
  }
591
592
  result.optionalReplacementSpan = result.optionalReplacementSpan
592
- && (0, transform_1.transformTextSpan)(sourceScript, map, result.optionalReplacementSpan, language_core_1.isCompletionEnabled);
593
+ && (0, transform_1.transformTextSpan)(serviceScript, sourceScript, map, result.optionalReplacementSpan, language_core_1.isCompletionEnabled);
593
594
  const isAdditional = typeof mapping.data.completion === 'object' && mapping.data.completion.isAdditional;
594
595
  if (isAdditional) {
595
596
  results.push(result);
@@ -616,7 +617,7 @@ function decorateLanguageService(language, languageService) {
616
617
  const fileName = filePath.replace(windowsPathReg, '/');
617
618
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
618
619
  if (serviceScript) {
619
- const generatePosition = (0, transform_1.toGeneratedOffset)(sourceScript, map, position, language_core_1.isCompletionEnabled);
620
+ const generatePosition = (0, transform_1.toGeneratedOffset)(serviceScript, sourceScript, map, position, language_core_1.isCompletionEnabled);
620
621
  if (generatePosition !== undefined) {
621
622
  details = getCompletionEntryDetails(fileName, generatePosition, entryName, formatOptions, source, preferences, data);
622
623
  }
@@ -649,12 +650,13 @@ function decorateLanguageService(language, languageService) {
649
650
  start = 0;
650
651
  end = 0;
651
652
  }
652
- start += sourceScript.snapshot.getLength();
653
- end += sourceScript.snapshot.getLength();
653
+ const mappingOffset = (0, transform_1.getMappingOffset)(serviceScript, sourceScript);
654
+ start += mappingOffset;
655
+ end += mappingOffset;
654
656
  const result = provideInlayHints(fileName, { start, length: end - start }, preferences);
655
657
  const hints = [];
656
658
  for (const hint of result) {
657
- const sourcePosition = (0, transform_1.toSourceOffset)(sourceScript, map, hint.position, language_core_1.isInlayHintsEnabled);
659
+ const sourcePosition = (0, transform_1.toSourceOffset)(serviceScript, sourceScript, map, hint.position, language_core_1.isInlayHintsEnabled);
658
660
  if (sourcePosition !== undefined) {
659
661
  hints.push({
660
662
  ...hint,
@@ -683,7 +685,7 @@ function decorateLanguageService(language, languageService) {
683
685
  if (serviceScript) {
684
686
  for (const [generatedOffset, mapping] of map.getGeneratedOffsets(position)) {
685
687
  if (filter(mapping.data)) {
686
- process(fileName, generatedOffset + sourceScript.snapshot.getLength());
688
+ process(fileName, generatedOffset + (0, transform_1.getMappingOffset)(serviceScript, sourceScript));
687
689
  }
688
690
  }
689
691
  }
@@ -703,16 +705,17 @@ function decorateLanguageService(language, languageService) {
703
705
  results.push(result);
704
706
  for (const ref of getLinkedCodes(result)) {
705
707
  processedFilePositions.add(ref[0] + ':' + ref[1]);
706
- const [virtualFile, sourceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
707
- if (!virtualFile) {
708
+ const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, ref[0]);
709
+ if (!serviceScript) {
708
710
  continue;
709
711
  }
710
- const linkedCodeMap = language.linkedCodeMaps.get(virtualFile.code);
712
+ const linkedCodeMap = language.linkedCodeMaps.get(serviceScript.code);
711
713
  if (!linkedCodeMap) {
712
714
  continue;
713
715
  }
714
- for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - sourceScript.snapshot.getLength())) {
715
- process(ref[0], linkedCodeOffset + sourceScript.snapshot.getLength());
716
+ const mappingOffset = (0, transform_1.getMappingOffset)(serviceScript, sourceScript);
717
+ for (const linkedCodeOffset of linkedCodeMap.getLinkedOffsets(ref[1] - mappingOffset)) {
718
+ process(ref[0], linkedCodeOffset + mappingOffset);
716
719
  }
717
720
  }
718
721
  }
@@ -64,7 +64,7 @@ function decorateLanguageServiceHost(ts, language, languageServiceHost) {
64
64
  languageServiceHost.getScriptKind = fileName => {
65
65
  const virtualScript = updateVirtualScript(fileName);
66
66
  if (virtualScript) {
67
- return virtualScript.kind;
67
+ return virtualScript.scriptKind;
68
68
  }
69
69
  return getScriptKind(fileName);
70
70
  };
@@ -92,14 +92,23 @@ function decorateLanguageServiceHost(ts, language, languageServiceHost) {
92
92
  if (sourceScript?.generated) {
93
93
  const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
94
94
  if (serviceScript) {
95
- const sourceContents = sourceScript.snapshot.getText(0, sourceScript.snapshot.getLength());
96
- let virtualContents = sourceContents.split('\n').map(line => ' '.repeat(line.length)).join('\n');
97
- virtualContents += serviceScript.code.snapshot.getText(0, serviceScript.code.snapshot.getLength());
98
- script[1] = {
99
- extension: serviceScript.extension,
100
- kind: serviceScript.scriptKind,
101
- snapshot: ts.ScriptSnapshot.fromString(virtualContents),
102
- };
95
+ if (serviceScript.preventLeadingOffset) {
96
+ script[1] = {
97
+ extension: serviceScript.extension,
98
+ scriptKind: serviceScript.scriptKind,
99
+ snapshot: serviceScript.code.snapshot,
100
+ };
101
+ }
102
+ else {
103
+ const sourceContents = sourceScript.snapshot.getText(0, sourceScript.snapshot.getLength());
104
+ const virtualContents = sourceContents.split('\n').map(line => ' '.repeat(line.length)).join('\n')
105
+ + serviceScript.code.snapshot.getText(0, serviceScript.code.snapshot.getLength());
106
+ script[1] = {
107
+ extension: serviceScript.extension,
108
+ scriptKind: serviceScript.scriptKind,
109
+ snapshot: ts.ScriptSnapshot.fromString(virtualContents),
110
+ };
111
+ }
103
112
  }
104
113
  if (sourceScript.generated.languagePlugin.typescript?.getExtraServiceScripts) {
105
114
  console.warn('getExtraServiceScripts() is not available in TS plugin.');
@@ -112,11 +112,11 @@ function proxyCreateProgram(ts, original, getLanguagePlugins) {
112
112
  if (!parsedSourceFiles.has(originalSourceFile)) {
113
113
  const sourceScript = language.scripts.get(fileName);
114
114
  assert(!!sourceScript, '!!sourceScript');
115
- parsedSourceFiles.set(originalSourceFile, originalSourceFile);
115
+ parsedSourceFiles.set(originalSourceFile, undefined);
116
116
  if (sourceScript.generated?.languagePlugin.typescript) {
117
117
  const { getServiceScript, getExtraServiceScripts } = sourceScript.generated.languagePlugin.typescript;
118
118
  const serviceScript = getServiceScript(sourceScript.generated.root);
119
- if (serviceScript) {
119
+ if (serviceScript && !serviceScript.preventLeadingOffset) {
120
120
  let patchedText = originalSourceFile.text.split('\n').map(line => ' '.repeat(line.length)).join('\n');
121
121
  let scriptKind = ts.ScriptKind.TS;
122
122
  scriptKind = serviceScript.scriptKind;
@@ -131,7 +131,7 @@ function proxyCreateProgram(ts, original, getLanguagePlugins) {
131
131
  }
132
132
  }
133
133
  }
134
- return parsedSourceFiles.get(originalSourceFile);
134
+ return parsedSourceFiles.get(originalSourceFile) ?? originalSourceFile;
135
135
  };
136
136
  if (extensions.length) {
137
137
  options.options.allowArbitraryExtensions = true;
@@ -1,4 +1,4 @@
1
- import type { CodeInformation, SourceMap, SourceScript } from '@volar/language-core';
1
+ import type { CodeInformation, SourceMap, SourceScript, TypeScriptServiceScript } from '@volar/language-core';
2
2
  import { Language } from '@volar/language-core';
3
3
  import type * as ts from 'typescript';
4
4
  export declare function transformCallHierarchyItem(language: Language<string>, item: ts.CallHierarchyItem, filter: (data: CodeInformation) => boolean): ts.CallHierarchyItem;
@@ -10,8 +10,9 @@ export declare function transformSpan(language: Language<string>, fileName: stri
10
10
  fileName: string;
11
11
  textSpan: ts.TextSpan;
12
12
  } | undefined;
13
- export declare function transformTextChange(sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, textChange: ts.TextChange, filter: (data: CodeInformation) => boolean): ts.TextChange | undefined;
14
- export declare function transformTextSpan(sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): ts.TextSpan | undefined;
15
- export declare function toSourceOffset(sourceScript: SourceScript<string>, map: SourceMap, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
16
- export declare function toGeneratedOffset(sourceScript: SourceScript<string>, map: SourceMap, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
17
- export declare function toGeneratedOffsets(sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, position: number): Generator<readonly [number, import("@volar/language-core").Mapping<CodeInformation>], void, unknown>;
13
+ export declare function transformTextChange(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, textChange: ts.TextChange, filter: (data: CodeInformation) => boolean): ts.TextChange | undefined;
14
+ export declare function transformTextSpan(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, textSpan: ts.TextSpan, filter: (data: CodeInformation) => boolean): ts.TextSpan | undefined;
15
+ export declare function toSourceOffset(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
16
+ export declare function toGeneratedOffset(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, position: number, filter: (data: CodeInformation) => boolean): number | undefined;
17
+ export declare function toGeneratedOffsets(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>, map: SourceMap<CodeInformation>, position: number): Generator<readonly [number, import("@volar/language-core").Mapping<CodeInformation>], void, unknown>;
18
+ export declare function getMappingOffset(serviceScript: TypeScriptServiceScript, sourceScript: SourceScript<string>): number;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.toGeneratedOffsets = exports.toGeneratedOffset = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.fillSourceFileText = exports.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
3
+ exports.getMappingOffset = exports.toGeneratedOffsets = exports.toGeneratedOffset = exports.toSourceOffset = exports.transformTextSpan = exports.transformTextChange = exports.transformSpan = exports.transformDocumentSpan = exports.transformFileTextChanges = exports.fillSourceFileText = exports.transformDiagnostic = exports.transformCallHierarchyItem = void 0;
4
4
  const language_core_1 = require("@volar/language-core");
5
5
  const utils_1 = require("./utils");
6
6
  const transformedDiagnostics = new WeakMap();
@@ -29,7 +29,7 @@ function transformDiagnostic(language, diagnostic, isTsc) {
29
29
  && diagnostic.length !== undefined) {
30
30
  const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, diagnostic.file.fileName);
31
31
  if (serviceScript) {
32
- const sourceSpan = transformTextSpan(sourceScript, map, { start: diagnostic.start, length: diagnostic.length }, language_core_1.shouldReportDiagnostics);
32
+ const sourceSpan = transformTextSpan(serviceScript, sourceScript, map, { start: diagnostic.start, length: diagnostic.length }, language_core_1.shouldReportDiagnostics);
33
33
  if (sourceSpan) {
34
34
  if (isTsc) {
35
35
  fillSourceFileText(language, diagnostic.file);
@@ -59,7 +59,7 @@ function fillSourceFileText(language, sourceFile) {
59
59
  }
60
60
  transformedSourceFile.add(sourceFile);
61
61
  const [serviceScript, sourceScript] = (0, utils_1.getServiceScript)(language, sourceFile.fileName);
62
- if (serviceScript) {
62
+ if (serviceScript && !serviceScript.preventLeadingOffset) {
63
63
  sourceFile.text = sourceScript.snapshot.getText(0, sourceScript.snapshot.getLength())
64
64
  + sourceFile.text.substring(sourceScript.snapshot.getLength());
65
65
  }
@@ -115,9 +115,9 @@ function transformSpan(language, fileName, textSpan, filter) {
115
115
  if (!fileName || !textSpan) {
116
116
  return;
117
117
  }
118
- const [virtualFile, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
119
- if (virtualFile) {
120
- const sourceSpan = transformTextSpan(sourceScript, map, textSpan, filter);
118
+ const [serviceScript, sourceScript, map] = (0, utils_1.getServiceScript)(language, fileName);
119
+ if (serviceScript) {
120
+ const sourceSpan = transformTextSpan(serviceScript, sourceScript, map, textSpan, filter);
121
121
  if (sourceSpan) {
122
122
  return {
123
123
  fileName,
@@ -133,8 +133,8 @@ function transformSpan(language, fileName, textSpan, filter) {
133
133
  }
134
134
  }
135
135
  exports.transformSpan = transformSpan;
136
- function transformTextChange(sourceScript, map, textChange, filter) {
137
- const sourceSpan = transformTextSpan(sourceScript, map, textChange.span, filter);
136
+ function transformTextChange(serviceScript, sourceScript, map, textChange, filter) {
137
+ const sourceSpan = transformTextSpan(serviceScript, sourceScript, map, textChange.span, filter);
138
138
  if (sourceSpan) {
139
139
  return {
140
140
  newText: textChange.newText,
@@ -143,11 +143,11 @@ function transformTextChange(sourceScript, map, textChange, filter) {
143
143
  }
144
144
  }
145
145
  exports.transformTextChange = transformTextChange;
146
- function transformTextSpan(sourceScript, map, textSpan, filter) {
146
+ function transformTextSpan(serviceScript, sourceScript, map, textSpan, filter) {
147
147
  const start = textSpan.start;
148
148
  const end = textSpan.start + textSpan.length;
149
- const sourceStart = toSourceOffset(sourceScript, map, start, filter);
150
- const sourceEnd = toSourceOffset(sourceScript, map, end, filter);
149
+ const sourceStart = toSourceOffset(serviceScript, sourceScript, map, start, filter);
150
+ const sourceEnd = toSourceOffset(serviceScript, sourceScript, map, end, filter);
151
151
  if (sourceStart !== undefined && sourceEnd !== undefined && sourceEnd >= sourceStart) {
152
152
  return {
153
153
  start: sourceStart,
@@ -156,26 +156,32 @@ function transformTextSpan(sourceScript, map, textSpan, filter) {
156
156
  }
157
157
  }
158
158
  exports.transformTextSpan = transformTextSpan;
159
- function toSourceOffset(sourceScript, map, position, filter) {
160
- for (const [sourceOffset, mapping] of map.getSourceOffsets(position - sourceScript.snapshot.getLength())) {
159
+ function toSourceOffset(serviceScript, sourceScript, map, position, filter) {
160
+ for (const [sourceOffset, mapping] of map.getSourceOffsets(position - getMappingOffset(serviceScript, sourceScript))) {
161
161
  if (filter(mapping.data)) {
162
162
  return sourceOffset;
163
163
  }
164
164
  }
165
165
  }
166
166
  exports.toSourceOffset = toSourceOffset;
167
- function toGeneratedOffset(sourceScript, map, position, filter) {
167
+ function toGeneratedOffset(serviceScript, sourceScript, map, position, filter) {
168
168
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
169
169
  if (filter(mapping.data)) {
170
- return generateOffset + sourceScript.snapshot.getLength();
170
+ return generateOffset + getMappingOffset(serviceScript, sourceScript);
171
171
  }
172
172
  }
173
173
  }
174
174
  exports.toGeneratedOffset = toGeneratedOffset;
175
- function* toGeneratedOffsets(sourceScript, map, position) {
175
+ function* toGeneratedOffsets(serviceScript, sourceScript, map, position) {
176
176
  for (const [generateOffset, mapping] of map.getGeneratedOffsets(position)) {
177
- yield [generateOffset + sourceScript.snapshot.getLength(), mapping];
177
+ yield [generateOffset + getMappingOffset(serviceScript, sourceScript), mapping];
178
178
  }
179
179
  }
180
180
  exports.toGeneratedOffsets = toGeneratedOffsets;
181
+ function getMappingOffset(serviceScript, sourceScript) {
182
+ return !serviceScript.preventLeadingOffset
183
+ ? sourceScript.snapshot.getLength()
184
+ : 0;
185
+ }
186
+ exports.getMappingOffset = getMappingOffset;
181
187
  //# sourceMappingURL=transform.js.map
@@ -1,3 +1,3 @@
1
1
  import type { Language } from '@volar/language-core';
2
2
  export declare function notEmpty<T>(value: T | null | undefined): value is T;
3
- export declare function getServiceScript(language: Language<string>, fileName: string): readonly [import("@volar/language-core").TypeScriptServiceScript, import("@volar/language-core").SourceScript<string>, import("@volar/language-core").SourceMap<import("@volar/language-core").CodeInformation>] | readonly [undefined, undefined, undefined];
3
+ export declare function getServiceScript(language: Language<string>, fileName: string): readonly [import("@volar/language-core").TypeScriptServiceScript<string>, import("@volar/language-core").SourceScript<string>, import("@volar/language-core").SourceMap<import("@volar/language-core").CodeInformation>] | readonly [undefined, undefined, undefined];
package/lib/node/utils.js CHANGED
@@ -10,7 +10,7 @@ function getServiceScript(language, fileName) {
10
10
  if (sourceScript?.generated) {
11
11
  const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
12
12
  if (serviceScript) {
13
- const map = language.maps.get(serviceScript.code, sourceScript.id);
13
+ const map = language.maps.get(serviceScript.code);
14
14
  if (map) {
15
15
  return [serviceScript, sourceScript, map];
16
16
  }
@@ -1,9 +1,9 @@
1
- import { Language, SourceScript, TypeScriptExtraServiceScript } from '@volar/language-core';
1
+ import { Language, TypeScriptExtraServiceScript } from '@volar/language-core';
2
2
  import type * as ts from 'typescript';
3
3
  import type { createSys } from './createSys';
4
4
  export interface TypeScriptProjectHost extends Pick<ts.LanguageServiceHost, 'getLocalizedDiagnosticMessages' | 'getCurrentDirectory' | 'getCompilationSettings' | 'getProjectReferences' | 'getScriptFileNames' | 'getProjectVersion' | 'getScriptSnapshot'> {
5
5
  }
6
6
  export declare function createLanguageServiceHost<T>(ts: typeof import('typescript'), sys: ReturnType<typeof createSys> | ts.System, language: Language<T>, asScrpitId: (fileName: string) => T, projectHost: TypeScriptProjectHost): {
7
7
  languageServiceHost: ts.LanguageServiceHost;
8
- getExtraServiceScript: (fileName: string) => [SourceScript<T>, TypeScriptExtraServiceScript] | undefined;
8
+ getExtraServiceScript: (fileName: string) => TypeScriptExtraServiceScript<T> | undefined;
9
9
  };
@@ -80,7 +80,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
80
80
  getScriptKind(fileName) {
81
81
  sync();
82
82
  if (extraScriptRegistry.has(fileName)) {
83
- return extraScriptRegistry.get(fileName)[1].scriptKind;
83
+ return extraScriptRegistry.get(fileName).scriptKind;
84
84
  }
85
85
  const sourceScript = language.scripts.get(asScrpitId(fileName));
86
86
  if (sourceScript?.generated) {
@@ -170,7 +170,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
170
170
  for (const extraServiceScript of sourceScript.generated.languagePlugin.typescript?.getExtraServiceScripts?.(fileName, sourceScript.generated.root) ?? []) {
171
171
  newTsVirtualFileSnapshots.add(extraServiceScript.code.snapshot);
172
172
  tsFileNamesSet.add(extraServiceScript.fileName);
173
- extraScriptRegistry.set(extraServiceScript.fileName, [sourceScript, extraServiceScript]);
173
+ extraScriptRegistry.set(extraServiceScript.fileName, extraServiceScript);
174
174
  }
175
175
  for (const code of (0, language_core_1.forEachEmbeddedCode)(sourceScript.generated.root)) {
176
176
  newOtherVirtualFileSnapshots.add(code.snapshot);
@@ -197,7 +197,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
197
197
  function getScriptSnapshot(fileName) {
198
198
  sync();
199
199
  if (extraScriptRegistry.has(fileName)) {
200
- return extraScriptRegistry.get(fileName)[1].code.snapshot;
200
+ return extraScriptRegistry.get(fileName).code.snapshot;
201
201
  }
202
202
  const sourceScript = language.scripts.get(asScrpitId(fileName));
203
203
  if (sourceScript?.generated) {
@@ -217,7 +217,7 @@ function createLanguageServiceHost(ts, sys, language, asScrpitId, projectHost) {
217
217
  }
218
218
  const version = scriptVersions.get(fileName);
219
219
  if (extraScriptRegistry.has(fileName)) {
220
- const snapshot = extraScriptRegistry.get(fileName)[1].code.snapshot;
220
+ const snapshot = extraScriptRegistry.get(fileName).code.snapshot;
221
221
  if (!version.map.has(snapshot)) {
222
222
  version.map.set(snapshot, version.lastVersion++);
223
223
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@volar/typescript",
3
- "version": "2.3.0-alpha.4",
3
+ "version": "2.3.0-alpha.6",
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.3.0-alpha.4",
15
+ "@volar/language-core": "2.3.0-alpha.6",
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.3.0-alpha.4"
22
+ "@volar/language-service": "2.3.0-alpha.6"
23
23
  },
24
- "gitHead": "8ab3ce02b06a410e9321eea3e9f23d36f97fedda"
24
+ "gitHead": "f3103e86be8d80cb36f66be4c054ef9a255c29b1"
25
25
  }
package/env.d.ts DELETED
@@ -1,15 +0,0 @@
1
- declare module '@volar/langauge-core' {
2
- interface Language<T> {
3
- typescript?: {
4
- configFileName: string | undefined;
5
- sys: ts.System & {
6
- version?: number;
7
- sync?(): Promise<number>;
8
- };
9
- languageServiceHost: ts.LanguageServiceHost;
10
- getExtraServiceScript(fileName: string): [SourceScript<T>, TypeScriptExtraServiceScript] | undefined;
11
- asScriptId(fileName: string): T;
12
- asFileName(scriptId: T): string;
13
- };
14
- }
15
- }