@@ -119,8 +119,8 @@ let createEditor = %raw(`
119119 const { vim } = require (" @replit/codemirror-vim" );
120120
121121 // Import custom language modes
122- const { rescriptLanguage } = require (" plugins/cm6-rescript-mode" );
123- const { reasonLanguage } = require (" plugins/cm6-reason-mode" );
122+ const { rescriptLanguage } = require (" ../ plugins/cm6-rescript-mode" );
123+ const { reasonLanguage } = require (" ../ plugins/cm6-reason-mode" );
124124
125125 // Setup language based on mode
126126 let language;
@@ -136,6 +136,7 @@ let createEditor = %raw(`
136136 const languageConf = new Compartment ();
137137 const readOnlyConf = new Compartment ();
138138 const keymapConf = new Compartment ();
139+ const lintConf = new Compartment ();
139140
140141 // Basic extensions
141142 const extensions = [
@@ -181,18 +182,36 @@ let createEditor = %raw(`
181182 }));
182183 }
183184
184- // Add linter for errors
185- if (errors && errors .length > 0 ) {
186- extensions .push (linter ((view ) => {
187- return errors .map (err => ({
188- from: view .state .doc .line (err .row ).from + err .column ,
189- to: view .state .doc .line (err .endRow ).from + err .endColumn ,
190- severity: err .kind === 0 ? " error" : " warning" ,
191- message: err .text
192- }));
193- }));
194- extensions .push (lintGutter ());
195- }
185+ // Add linter for errors - dynamic linter that can be updated
186+ const createLinter = (errorsArray ) => {
187+ if (! errorsArray || errorsArray .length === 0 ) {
188+ return [];
189+ }
190+ return linter ((view ) => {
191+ return errorsArray .map (err => {
192+ try {
193+ const doc = view .state .doc ;
194+ // Validate line numbers (1-based to 0-based conversion)
195+ const fromLine = Math .max (1 , Math .min (err .row , doc .lines ));
196+ const toLine = Math .max (1 , Math .min (err .endRow , doc .lines ));
197+
198+ return {
199+ from: doc .line (fromLine).from + err .column ,
200+ to: doc .line (toLine).from + err .endColumn ,
201+ severity: err .kind === 0 ? " error" : " warning" ,
202+ message: err .text
203+ };
204+ } catch (e) {
205+ // Handle any edge cases gracefully
206+ console .warn (" Error creating lint marker:" , e);
207+ return null ;
208+ }
209+ }).filter (Boolean );
210+ });
211+ };
212+
213+ extensions .push (lintConf .of (createLinter (errors)));
214+ extensions .push (lintGutter ());
196215
197216 // Create editor
198217 const state = EditorState .create ({
@@ -220,6 +239,8 @@ let createEditor = %raw(`
220239 languageConf,
221240 readOnlyConf,
222241 keymapConf,
242+ lintConf,
243+ createLinter,
223244 setValue (value ) {
224245 view .dispatch ({
225246 changes: {from: 0 , to: view .state .doc .length , insert: value}
@@ -251,6 +272,11 @@ let createEditor = %raw(`
251272 view .dispatch ({
252273 effects: keymapConf .reconfigure (keymap .of (newKeymapValue))
253274 });
275+ },
276+ setErrors (newErrors ) {
277+ view .dispatch ({
278+ effects: lintConf .reconfigure (createLinter (newErrors))
279+ });
254280 }
255281 };
256282 }
@@ -265,13 +291,16 @@ let make = (
265291 ~className : option <string >= ?,
266292 ~style : option <ReactDOM .Style .t >= ?,
267293 ~onChange : option <string => unit >= ?,
294+ // Note: onMarkerFocus/onMarkerFocusLeave are kept for backward compatibility but not yet implemented in v6
295+ // These callbacks were used in v5 for hovering over error markers
268296 ~onMarkerFocus as _ : option <((int , int )) => unit >= ?,
269297 ~onMarkerFocusLeave as _ : option <((int , int )) => unit >= ?,
270298 ~value : string ,
271299 ~mode : string ,
272300 ~readOnly = false ,
273301 ~lineNumbers = true ,
274- ~scrollbarStyle = "native" ,
302+ // Note: scrollbarStyle is deprecated in CodeMirror 6 but kept for backward compatibility (ignored)
303+ ~scrollbarStyle as _ = ?,
275304 ~keyMap = KeyMap .Default ,
276305 ~lineWrapping = false ,
277306): React .element => {
@@ -330,6 +359,15 @@ let make = (
330359 }
331360 None
332361 }, [mode ])
362+
363+ // Update errors when they change
364+ React .useEffect (() => {
365+ switch editorRef .current {
366+ | Some (_editor ) => %raw (` _editor .setErrors ` ) (errors )
367+ | None => ()
368+ }
369+ None
370+ }, [errors ])
333371
334372 <div ?className ?style ref = {ReactDOM .Ref .domRef ((Obj .magic (containerRef ): React .ref <Nullable .t <Dom .element >>))} />
335373}
0 commit comments