Skip to content

Commit d239d91

Browse files
authored
fix(typescript): fix issue with transpiled TypeScript files not being registered with a project at all (#250)
1 parent a231802 commit d239d91

File tree

5 files changed

+34
-19
lines changed

5 files changed

+34
-19
lines changed

Diff for: packages/language-core/index.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export const defaultMapperFactory: MapperFactory = mappings => new SourceMap(map
2222
export function createLanguage<T>(
2323
plugins: LanguagePlugin<T>[],
2424
scriptRegistry: Map<T, SourceScript<T>>,
25-
sync: (id: T, includeFsFiles: boolean) => void
25+
sync: (id: T, includeFsFiles: boolean, shouldRegister: boolean) => void
2626
) {
2727
const virtualCodeToSourceScriptMap = new WeakMap<VirtualCode, SourceScript<T>>();
2828
const virtualCodeToSourceMap = new WeakMap<IScriptSnapshot, WeakMap<IScriptSnapshot, Mapper>>();
@@ -34,8 +34,8 @@ export function createLanguage<T>(
3434
fromVirtualCode(virtualCode) {
3535
return virtualCodeToSourceScriptMap.get(virtualCode)!;
3636
},
37-
get(id, includeFsFiles = true) {
38-
sync(id, includeFsFiles);
37+
get(id, includeFsFiles = true, shouldRegister = false) {
38+
sync(id, includeFsFiles, shouldRegister);
3939
const result = scriptRegistry.get(id);
4040
// The sync function provider may not always call the set function due to caching, so it is necessary to explicitly check isAssociationDirty.
4141
if (result?.isAssociationDirty) {
@@ -220,7 +220,7 @@ export function createLanguage<T>(
220220
sourceScript.isAssociationDirty = false;
221221
return {
222222
getAssociatedScript(id) {
223-
sync(id, true);
223+
sync(id, true, true);
224224
const relatedSourceScript = scriptRegistry.get(id);
225225
if (relatedSourceScript) {
226226
relatedSourceScript.targetIds.add(sourceScript.id);

Diff for: packages/language-core/lib/types.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export interface Language<T = unknown> {
1515
mapperFactory: MapperFactory;
1616
plugins: LanguagePlugin<T>[];
1717
scripts: {
18-
get(id: T, includeFsFiles?: boolean): SourceScript<T> | undefined;
18+
get(id: T, includeFsFiles?: boolean, shouldRegister?: boolean): SourceScript<T> | undefined;
1919
set(id: T, snapshot: IScriptSnapshot, languageId?: string, plugins?: LanguagePlugin<T>[]): SourceScript<T> | undefined;
2020
delete(id: T): void;
2121
fromVirtualCode(virtualCode: VirtualCode): SourceScript<T>;

Diff for: packages/typescript/lib/node/decorateLanguageServiceHost.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export function decorateLanguageServiceHost(
8383
}
8484

8585
languageServiceHost.getScriptSnapshot = fileName => {
86-
const virtualScript = updateVirtualScript(fileName);
86+
const virtualScript = updateVirtualScript(fileName, true);
8787
if (virtualScript) {
8888
return virtualScript.snapshot;
8989
}
@@ -92,15 +92,15 @@ export function decorateLanguageServiceHost(
9292

9393
if (getScriptKind) {
9494
languageServiceHost.getScriptKind = fileName => {
95-
const virtualScript = updateVirtualScript(fileName);
95+
const virtualScript = updateVirtualScript(fileName, false);
9696
if (virtualScript) {
9797
return virtualScript.scriptKind;
9898
}
9999
return getScriptKind(fileName);
100100
};
101101
}
102102

103-
function updateVirtualScript(fileName: string) {
103+
function updateVirtualScript(fileName: string, shouldRegister: boolean) {
104104
if (crashFileNames.has(fileName)) {
105105
return;
106106
}
@@ -119,7 +119,7 @@ export function decorateLanguageServiceHost(
119119
if (!script || script[0] !== version) {
120120
script = [version];
121121

122-
const sourceScript = language.scripts.get(fileName);
122+
const sourceScript = language.scripts.get(fileName, undefined, shouldRegister);
123123
if (sourceScript?.generated) {
124124
const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root);
125125
if (serviceScript) {

Diff for: packages/typescript/lib/quickstart/createAsyncLanguageServicePlugin.ts

+12-5
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,19 @@ export function createAsyncLanguageServicePlugin(
9191
{ getLanguageId: resolveFileLanguageId },
9292
],
9393
new FileMap(ts.sys.useCaseSensitiveFileNames),
94-
fileName => {
95-
let snapshot = getScriptInfo(fileName)?.getSnapshot();
96-
if (!snapshot) {
97-
// trigger projectService.getOrCreateScriptInfoNotOpenedByClient
98-
info.project.getScriptVersion(fileName);
94+
(fileName, _, shouldRegister) => {
95+
let snapshot: ts.IScriptSnapshot | undefined;
96+
if (shouldRegister) {
97+
// We need to trigger registration of the script file with the project, see #250
98+
snapshot = getScriptSnapshot(fileName);
99+
}
100+
else {
99101
snapshot = getScriptInfo(fileName)?.getSnapshot();
102+
if (!snapshot) {
103+
// trigger projectService.getOrCreateScriptInfoNotOpenedByClient
104+
info.project.getScriptVersion(fileName);
105+
snapshot = getScriptInfo(fileName)?.getSnapshot();
106+
}
100107
}
101108
if (snapshot) {
102109
language.scripts.set(fileName, snapshot);

Diff for: packages/typescript/lib/quickstart/createLanguageServicePlugin.ts

+13-5
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,26 @@ export function createLanguageServicePlugin(
3434
.map(plugin => plugin.typescript?.extraFileExtensions.map(ext => '.' + ext.extension) ?? [])
3535
.flat();
3636
projectExternalFileExtensions.set(info.project, extensions);
37+
const getScriptSnapshot = info.languageServiceHost.getScriptSnapshot.bind(info.languageServiceHost);
3738
const language = createLanguage<string>(
3839
[
3940
...languagePlugins,
4041
{ getLanguageId: resolveFileLanguageId },
4142
],
4243
new FileMap(ts.sys.useCaseSensitiveFileNames),
43-
fileName => {
44-
let snapshot = getScriptInfo(fileName)?.getSnapshot();
45-
if (!snapshot) {
46-
// trigger projectService.getOrCreateScriptInfoNotOpenedByClient
47-
info.project.getScriptVersion(fileName);
44+
(fileName, _, shouldRegister) => {
45+
let snapshot: ts.IScriptSnapshot | undefined;
46+
if (shouldRegister) {
47+
// We need to trigger registration of the script file with the project, see #250
48+
snapshot = getScriptSnapshot(fileName);
49+
}
50+
else {
4851
snapshot = getScriptInfo(fileName)?.getSnapshot();
52+
if (!snapshot) {
53+
// trigger projectService.getOrCreateScriptInfoNotOpenedByClient
54+
info.project.getScriptVersion(fileName);
55+
snapshot = getScriptInfo(fileName)?.getSnapshot();
56+
}
4957
}
5058
if (snapshot) {
5159
language.scripts.set(fileName, snapshot);

0 commit comments

Comments
 (0)