Skip to content

Commit 4abd2aa

Browse files
brielovclaude
andcommitted
Improve formatter for lists and if-then-else expressions
- Multi-line lists with leading comma style when > 100 chars - If-then-else always formatted on separate lines - Fix float literals to preserve decimal point (0.0 not 0) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 5ac353e commit 4abd2aa

1 file changed

Lines changed: 22 additions & 6 deletions

File tree

src/format.ts

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -371,9 +371,9 @@ const formatExprInner = (ctx: FormatContext, expr: SExpr, level: number): string
371371

372372
case "SIf": {
373373
const cond = formatExpr(ctx, expr.cond, level, Prec.Lowest);
374-
const thenBr = formatExpr(ctx, expr.thenBranch, level, Prec.Lowest);
375-
const elseBr = formatExpr(ctx, expr.elseBranch, level, Prec.Lowest);
376-
return `if ${cond} then ${thenBr} else ${elseBr}`;
374+
const thenBr = formatExpr(ctx, expr.thenBranch, level + 1, Prec.Lowest);
375+
const elseBr = formatExpr(ctx, expr.elseBranch, level + 1, Prec.Lowest);
376+
return `if ${cond}\n${ind(level + 1)}then ${thenBr}\n${ind(level + 1)}else ${elseBr}`;
377377
}
378378

379379
case "SMatch": {
@@ -404,9 +404,21 @@ const formatExprInner = (ctx: FormatContext, expr: SExpr, level: number): string
404404
case "SField":
405405
return `${formatExpr(ctx, expr.record, level, Prec.Atom)}.${expr.field}`;
406406

407-
case "SList":
407+
case "SList": {
408408
if (expr.elements.length === 0) return "[]";
409-
return `[${expr.elements.map((e) => formatExpr(ctx, e, level, Prec.Lowest)).join(", ")}]`;
409+
const elements = expr.elements.map((e) => formatExpr(ctx, e, level + 1, Prec.Lowest));
410+
const singleLine = `[${elements.join(", ")}]`;
411+
// Keep short lists on one line
412+
if (singleLine.length <= 100) return singleLine;
413+
// Multi-line with leading commas
414+
const [first, ...rest] = elements;
415+
const lines = [`[ ${first}`];
416+
for (const el of rest) {
417+
lines.push(`${ind(level + 1)}, ${el}`);
418+
}
419+
lines.push(`${ind(level + 1)}]`);
420+
return lines.join("\n");
421+
}
410422

411423
case "SPipe":
412424
return `${formatExpr(ctx, expr.left, level, Prec.Pipe)} |> ${formatExpr(ctx, expr.right, level, Prec.Pipe + 1)}`;
@@ -446,8 +458,12 @@ const formatLiteral = (lit: {
446458
}): string => {
447459
switch (lit.kind) {
448460
case "int":
449-
case "float":
450461
return String(lit.value);
462+
case "float": {
463+
const s = String(lit.value);
464+
// Ensure float always has decimal point (0 -> 0.0)
465+
return s.includes(".") || s.includes("e") ? s : s + ".0";
466+
}
451467
case "string":
452468
return JSON.stringify(lit.value);
453469
case "char":

0 commit comments

Comments
 (0)