Skip to content

Commit cc339b5

Browse files
Copilottsnobip
andcommitted
Address code review feedback - fix import paths, error handling, and add documentation
Co-authored-by: tsnobip <[email protected]>
1 parent 1040aa7 commit cc339b5

File tree

1 file changed

+53
-15
lines changed

1 file changed

+53
-15
lines changed

src/components/CodeMirror.res

Lines changed: 53 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)