treeSitterFormatSExpression function
Formats a compact Tree-sitter S-expression using the exact 0.25 state
machine used by Rust's hidden format_sexp helper.
Implementation
String treeSitterFormatSExpression(
String sExpression, [
int initialIndentLevel = 0,
]) {
if (initialIndentLevel < 0) {
throw RangeError.value(
initialIndentLevel,
'initialIndentLevel',
'must be non-negative',
);
}
var indentLevel = initialIndentLevel;
final formatted = StringBuffer();
var hasField = false;
var offset = 0;
int? quote;
var sawParen = false;
var didLast = false;
({bool hasValue, String value}) fetchNextString() {
final next = StringBuffer();
while (offset < sExpression.length) {
final character = sExpression.codeUnitAt(offset++);
if (character == 0x27 || character == 0x22) {
quote = character;
} else if (character == 0x20 || (character == 0x29 && quote != null)) {
if (offset < sExpression.length &&
sExpression.codeUnitAt(offset) == quote) {
next
..writeCharCode(character)
..writeCharCode(sExpression.codeUnitAt(offset++));
quote = null;
continue;
}
break;
}
if (character == 0x29) {
sawParen = true;
break;
}
next.writeCharCode(character);
}
final value = next.toString();
if (offset >= sExpression.length && value.isEmpty) {
if (sawParen) {
sawParen = false;
return (hasValue: true, value: value);
}
if (!didLast) {
didLast = true;
return (hasValue: true, value: value);
}
return (hasValue: false, value: value);
}
return (hasValue: true, value: value);
}
while (true) {
var token = fetchNextString();
if (!token.hasValue) break;
var value = token.value;
if (value.isEmpty && indentLevel > 0) {
indentLevel--;
formatted.write(')');
} else if (value.startsWith('(')) {
if (hasField) {
hasField = false;
} else {
if (indentLevel > 0) {
formatted.write('\n${' ' * indentLevel}');
}
indentLevel++;
}
formatted.write(value);
if (value.startsWith('(MISSING') || value.startsWith('(UNEXPECTED')) {
token = fetchNextString();
value = token.value;
if (value.isEmpty) {
while (indentLevel > 0) {
indentLevel--;
formatted.write(')');
}
} else {
formatted.write(' $value');
}
}
} else if (value.endsWith(':')) {
formatted.write('\n${' ' * indentLevel}$value ');
hasField = true;
indentLevel++;
}
}
return formatted.toString();
}