From 3047d4be1fae4280ee466a31b45aef72c850abde Mon Sep 17 00:00:00 2001 From: Priyanshu Jain Date: Wed, 8 Jul 2026 14:39:21 +0530 Subject: [PATCH 1/3] fix(editor): prevent syntax highlight color flicker on state recreation (#2304) --- src/lib/editorFile.js | 2 ++ src/lib/editorManager.js | 20 ++++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) 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..85a6a1399 100644 --- a/src/lib/editorManager.js +++ b/src/lib/editorManager.js @@ -2705,6 +2705,8 @@ async function EditorManager($header, $body) { targetEditor = editor, ) { try { + file.__cmCachedLanguageExtension = ext || []; + file.__cmCachedLanguageSignature = languageSignature; targetEditor.dispatch({ effects: languageCompartment.reconfigure(ext || []), }); @@ -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,11 +2745,15 @@ 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 + pane.activeFile?.id !== fileId ) { return; } @@ -2759,6 +2773,8 @@ async function EditorManager($header, $body) { } markLanguageReady(file, languageSignature, true); + file.__cmCachedLanguageExtension = result || []; + file.__cmCachedLanguageSignature = languageSignature; return result || []; } From fa4e0082acc92e283358d4d563b4e9e727b5c3cf Mon Sep 17 00:00:00 2001 From: Priyanshu Jain Date: Wed, 8 Jul 2026 14:42:40 +0530 Subject: [PATCH 2/3] style: normalize line endings with biome format --- src/lib/editorManager.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/lib/editorManager.js b/src/lib/editorManager.js index 85a6a1399..4fde43cc2 100644 --- a/src/lib/editorManager.js +++ b/src/lib/editorManager.js @@ -2751,10 +2751,7 @@ async function EditorManager($header, $body) { file.__cmCachedLanguageExtension = ext || []; file.__cmCachedLanguageSignature = languageSignature; const pane = getFileLspPane(file); - if ( - !pane?.editor || - pane.activeFile?.id !== fileId - ) { + if (!pane?.editor || pane.activeFile?.id !== fileId) { return; } From a9dbf875479f54a091df2d7b08f41f7080e08c00 Mon Sep 17 00:00:00 2001 From: Priyanshu Jain Date: Wed, 8 Jul 2026 14:58:34 +0530 Subject: [PATCH 3/3] fix(editor): move language extension cache assignment after successful dispatch --- src/lib/editorManager.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/editorManager.js b/src/lib/editorManager.js index 4fde43cc2..84b905999 100644 --- a/src/lib/editorManager.js +++ b/src/lib/editorManager.js @@ -2705,12 +2705,12 @@ async function EditorManager($header, $body) { targetEditor = editor, ) { try { - file.__cmCachedLanguageExtension = ext || []; - file.__cmCachedLanguageSignature = languageSignature; targetEditor.dispatch({ 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);