diff --git a/packages/language-core/index.ts b/packages/language-core/index.ts index 048a3468..573a14b0 100644 --- a/packages/language-core/index.ts +++ b/packages/language-core/index.ts @@ -22,7 +22,7 @@ export const defaultMapperFactory: MapperFactory = mappings => new SourceMap(map export function createLanguage( plugins: LanguagePlugin[], scriptRegistry: Map>, - sync: (id: T, includeFsFiles: boolean) => void + sync: (id: T, includeFsFiles: boolean, shouldRegister: boolean) => void ) { const virtualCodeToSourceScriptMap = new WeakMap>(); const virtualCodeToSourceMap = new WeakMap>(); @@ -34,8 +34,8 @@ export function createLanguage( fromVirtualCode(virtualCode) { return virtualCodeToSourceScriptMap.get(virtualCode)!; }, - get(id, includeFsFiles = true) { - sync(id, includeFsFiles); + get(id, includeFsFiles = true, shouldRegister = false) { + sync(id, includeFsFiles, shouldRegister); const result = scriptRegistry.get(id); // The sync function provider may not always call the set function due to caching, so it is necessary to explicitly check isAssociationDirty. if (result?.isAssociationDirty) { @@ -220,7 +220,7 @@ export function createLanguage( sourceScript.isAssociationDirty = false; return { getAssociatedScript(id) { - sync(id, true); + sync(id, true, true); const relatedSourceScript = scriptRegistry.get(id); if (relatedSourceScript) { relatedSourceScript.targetIds.add(sourceScript.id); diff --git a/packages/language-core/lib/types.ts b/packages/language-core/lib/types.ts index b1d77a4d..8f3a3871 100644 --- a/packages/language-core/lib/types.ts +++ b/packages/language-core/lib/types.ts @@ -15,7 +15,7 @@ export interface Language { mapperFactory: MapperFactory; plugins: LanguagePlugin[]; scripts: { - get(id: T, includeFsFiles?: boolean): SourceScript | undefined; + get(id: T, includeFsFiles?: boolean, shouldRegister?: boolean): SourceScript | undefined; set(id: T, snapshot: IScriptSnapshot, languageId?: string, plugins?: LanguagePlugin[]): SourceScript | undefined; delete(id: T): void; fromVirtualCode(virtualCode: VirtualCode): SourceScript; diff --git a/packages/typescript/lib/node/decorateLanguageServiceHost.ts b/packages/typescript/lib/node/decorateLanguageServiceHost.ts index ce019de2..88a35c2b 100644 --- a/packages/typescript/lib/node/decorateLanguageServiceHost.ts +++ b/packages/typescript/lib/node/decorateLanguageServiceHost.ts @@ -83,7 +83,7 @@ export function decorateLanguageServiceHost( } languageServiceHost.getScriptSnapshot = fileName => { - const virtualScript = updateVirtualScript(fileName); + const virtualScript = updateVirtualScript(fileName, true); if (virtualScript) { return virtualScript.snapshot; } @@ -92,7 +92,7 @@ export function decorateLanguageServiceHost( if (getScriptKind) { languageServiceHost.getScriptKind = fileName => { - const virtualScript = updateVirtualScript(fileName); + const virtualScript = updateVirtualScript(fileName, false); if (virtualScript) { return virtualScript.scriptKind; } @@ -100,7 +100,7 @@ export function decorateLanguageServiceHost( }; } - function updateVirtualScript(fileName: string) { + function updateVirtualScript(fileName: string, shouldRegister: boolean) { if (crashFileNames.has(fileName)) { return; } @@ -119,7 +119,7 @@ export function decorateLanguageServiceHost( if (!script || script[0] !== version) { script = [version]; - const sourceScript = language.scripts.get(fileName); + const sourceScript = language.scripts.get(fileName, undefined, shouldRegister); if (sourceScript?.generated) { const serviceScript = sourceScript.generated.languagePlugin.typescript?.getServiceScript(sourceScript.generated.root); if (serviceScript) { diff --git a/packages/typescript/lib/quickstart/createAsyncLanguageServicePlugin.ts b/packages/typescript/lib/quickstart/createAsyncLanguageServicePlugin.ts index 1585f5f1..90b40998 100644 --- a/packages/typescript/lib/quickstart/createAsyncLanguageServicePlugin.ts +++ b/packages/typescript/lib/quickstart/createAsyncLanguageServicePlugin.ts @@ -91,12 +91,19 @@ export function createAsyncLanguageServicePlugin( { getLanguageId: resolveFileLanguageId }, ], new FileMap(ts.sys.useCaseSensitiveFileNames), - fileName => { - let snapshot = getScriptInfo(fileName)?.getSnapshot(); - if (!snapshot) { - // trigger projectService.getOrCreateScriptInfoNotOpenedByClient - info.project.getScriptVersion(fileName); + (fileName, _, shouldRegister) => { + let snapshot: ts.IScriptSnapshot | undefined; + if (shouldRegister) { + // We need to trigger registration of the script file with the project, see #250 + snapshot = getScriptSnapshot(fileName); + } + else { snapshot = getScriptInfo(fileName)?.getSnapshot(); + if (!snapshot) { + // trigger projectService.getOrCreateScriptInfoNotOpenedByClient + info.project.getScriptVersion(fileName); + snapshot = getScriptInfo(fileName)?.getSnapshot(); + } } if (snapshot) { language.scripts.set(fileName, snapshot); diff --git a/packages/typescript/lib/quickstart/createLanguageServicePlugin.ts b/packages/typescript/lib/quickstart/createLanguageServicePlugin.ts index c33eb699..bf86043b 100644 --- a/packages/typescript/lib/quickstart/createLanguageServicePlugin.ts +++ b/packages/typescript/lib/quickstart/createLanguageServicePlugin.ts @@ -34,18 +34,26 @@ export function createLanguageServicePlugin( .map(plugin => plugin.typescript?.extraFileExtensions.map(ext => '.' + ext.extension) ?? []) .flat(); projectExternalFileExtensions.set(info.project, extensions); + const getScriptSnapshot = info.languageServiceHost.getScriptSnapshot.bind(info.languageServiceHost); const language = createLanguage( [ ...languagePlugins, { getLanguageId: resolveFileLanguageId }, ], new FileMap(ts.sys.useCaseSensitiveFileNames), - fileName => { - let snapshot = getScriptInfo(fileName)?.getSnapshot(); - if (!snapshot) { - // trigger projectService.getOrCreateScriptInfoNotOpenedByClient - info.project.getScriptVersion(fileName); + (fileName, _, shouldRegister) => { + let snapshot: ts.IScriptSnapshot | undefined; + if (shouldRegister) { + // We need to trigger registration of the script file with the project, see #250 + snapshot = getScriptSnapshot(fileName); + } + else { snapshot = getScriptInfo(fileName)?.getSnapshot(); + if (!snapshot) { + // trigger projectService.getOrCreateScriptInfoNotOpenedByClient + info.project.getScriptVersion(fileName); + snapshot = getScriptInfo(fileName)?.getSnapshot(); + } } if (snapshot) { language.scripts.set(fileName, snapshot);