diff --git a/src/lib/editorFile.js b/src/lib/editorFile.js index c59127d03..b151fda80 100644 --- a/src/lib/editorFile.js +++ b/src/lib/editorFile.js @@ -1465,6 +1465,8 @@ export default class EditorFile { // Store mode info for later use when creating editor view this.currentMode = mode; this.currentLanguageExtension = modeInfo?.getExtension() || null; + this.__cmCachedLanguageExtension = null; + this.__cmCachedLanguageSignature = null; if (options.recommend !== false) { maybeRecommendLanguageModeExtension(this, modeInfo); } diff --git a/src/lib/editorManager.js b/src/lib/editorManager.js index 3a12f6184..84b905999 100644 --- a/src/lib/editorManager.js +++ b/src/lib/editorManager.js @@ -2709,6 +2709,8 @@ async function EditorManager($header, $body) { effects: languageCompartment.reconfigure(ext || []), }); file.session = targetEditor.state; + file.__cmCachedLanguageExtension = ext || []; + file.__cmCachedLanguageSignature = languageSignature; markLanguageReady(file, languageSignature, true); } catch (error) { warnRecoverable("Failed to apply language extensions.", error, warnKey); @@ -2722,6 +2724,14 @@ async function EditorManager($header, $body) { return []; } + if ( + file.__cmCachedLanguageExtension && + file.__cmCachedLanguageSignature === languageSignature + ) { + markLanguageReady(file, languageSignature, true); + return file.__cmCachedLanguageExtension; + } + let result; try { result = langExtFn(); @@ -2735,12 +2745,13 @@ async function EditorManager($header, $body) { markLanguageReady(file, languageSignature, false); result .then((ext) => { + if (file.__cmLanguageSignature !== languageSignature) { + return; + } + file.__cmCachedLanguageExtension = ext || []; + file.__cmCachedLanguageSignature = languageSignature; const pane = getFileLspPane(file); - if ( - !pane?.editor || - pane.activeFile?.id !== fileId || - file.__cmLanguageSignature !== languageSignature - ) { + if (!pane?.editor || pane.activeFile?.id !== fileId) { return; } @@ -2759,6 +2770,8 @@ async function EditorManager($header, $body) { } markLanguageReady(file, languageSignature, true); + file.__cmCachedLanguageExtension = result || []; + file.__cmCachedLanguageSignature = languageSignature; return result || []; }