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,
}),
foldNodeProp.add({
Object: foldDelimited('lBrace', 'rBrace'),
Array: foldDelimited('lBracket', 'rBracket'),
MatchExpression: foldDelimited('lBrace', 'rBrace'),
Object: foldDelimited('{', '}'),
Array: foldDelimited('[', ']'),
MatchExpression: foldDelimited('{', '}'),
}),
],
});
function foldDelimited(openName, closeName) {
return (node) => {
const open = node.getChild(openName);
const close = node.getChild(closeName);
if (!open || !close || open.to >= close.from) return null;
return { from: open.to, to: close.from };
function foldDelimited(open, close) {
return (node, state) => {
const text = state.doc.sliceString(node.from, node.to);
const openIndex = text.indexOf(open);
const closeIndex = text.lastIndexOf(close);
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;
};
}