From 81219493f87b8345446e387e71279d74f35b6824 Mon Sep 17 00:00:00 2001 From: Justus Klausecker Date: Sun, 3 Aug 2025 14:53:33 +0200 Subject: [PATCH] zig fmt: canonicalize nested cast builtin order --- lib/std/zig/Ast/Render.zig | 43 +++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/lib/std/zig/Ast/Render.zig b/lib/std/zig/Ast/Render.zig index ac982a7897..a33ec740a1 100644 --- a/lib/std/zig/Ast/Render.zig +++ b/lib/std/zig/Ast/Render.zig @@ -783,7 +783,48 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void { => { var buf: [2]Ast.Node.Index = undefined; const params = tree.builtinCallParams(&buf, node).?; - return renderBuiltinCall(r, tree.nodeMainToken(node), params, space); + var builtin_token = tree.nodeMainToken(node); + + canonicalize: { + if (params.len != 1) break :canonicalize; + + const CastKind = enum { + ptrCast, + alignCast, + addrSpaceCast, + constCast, + volatileCast, + }; + const kind = meta.stringToEnum(CastKind, tree.tokenSlice(builtin_token)[1..]) orelse break :canonicalize; + + var cast_map = std.EnumMap(CastKind, Ast.TokenIndex).init(.{}); + cast_map.put(kind, builtin_token); + + var casts_before: usize = 0; + if (builtin_token >= 2) { + var prev_builtin_token = builtin_token - 2; + while (tree.tokenTag(prev_builtin_token) == .builtin) : (prev_builtin_token -= 2) { + const prev_kind = meta.stringToEnum(CastKind, tree.tokenSlice(prev_builtin_token)[1..]) orelse break; + if (cast_map.contains(prev_kind)) break :canonicalize; + cast_map.put(prev_kind, prev_builtin_token); + casts_before += 1; + } + } + + var next_builtin_token = builtin_token + 2; + while (tree.tokenTag(next_builtin_token) == .builtin) : (next_builtin_token += 2) { + const next_kind = meta.stringToEnum(CastKind, tree.tokenSlice(next_builtin_token)[1..]) orelse break; + if (cast_map.contains(next_kind)) break :canonicalize; + cast_map.put(next_kind, next_builtin_token); + } + + var it = cast_map.iterator(); + builtin_token = it.next().?.value.*; + while (casts_before > 0) : (casts_before -= 1) { + builtin_token = it.next().?.value.*; + } + } + return renderBuiltinCall(r, builtin_token, params, space); }, .fn_proto_simple,