treeSitterFormatSExpression function

String treeSitterFormatSExpression(
  1. String sExpression, [
  2. int initialIndentLevel = 0
])

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();
}