Fix CodeMirror folding ranges

This commit is contained in:
Keisuke Hirata 2026-07-09 00:04:34 +09:00
parent 720c71157e
commit 33ea8b94f9
No known key found for this signature in database

View File

@ -25,19 +25,22 @@ const parserWithMetadata = parser.configure({
LetExpression: context => context.column(context.node.from) + context.unit, LetExpression: context => context.column(context.node.from) + context.unit,
}), }),
foldNodeProp.add({ foldNodeProp.add({
Object: foldDelimited('lBrace', 'rBrace'), Object: foldDelimited('{', '}'),
Array: foldDelimited('lBracket', 'rBracket'), Array: foldDelimited('[', ']'),
MatchExpression: foldDelimited('lBrace', 'rBrace'), MatchExpression: foldDelimited('{', '}'),
}), }),
], ],
}); });
function foldDelimited(openName, closeName) { function foldDelimited(open, close) {
return (node) => { return (node, state) => {
const open = node.getChild(openName); const text = state.doc.sliceString(node.from, node.to);
const close = node.getChild(closeName); const openIndex = text.indexOf(open);
if (!open || !close || open.to >= close.from) return null; const closeIndex = text.lastIndexOf(close);
return { from: open.to, to: close.from }; if (openIndex < 0 || closeIndex <= openIndex) return null;
const from = node.from + openIndex + open.length;
const to = node.from + closeIndex;
return from < to ? { from, to } : null;
}; };
} }