Skip to content

Commit 63d9c5d

Browse files
committed
zig fmt: canonicalize nested cast builtin order
1 parent 1ca213d commit 63d9c5d

File tree

2 files changed

+54
-4
lines changed

2 files changed

+54
-4
lines changed

lib/std/zig/render.zig

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,57 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
796796
=> {
797797
var buf: [2]Ast.Node.Index = undefined;
798798
const params = tree.builtinCallParams(&buf, node).?;
799-
return renderBuiltinCall(r, tree.nodeMainToken(node), params, space);
799+
var builtin_token = tree.nodeMainToken(node);
800+
801+
if (params.len == 1) canonicalize: {
802+
const CastKind = enum {
803+
ptr,
804+
@"align",
805+
addrSpace,
806+
@"const",
807+
@"volatile",
808+
};
809+
const kind = blk: {
810+
const slice = tree.tokenSlice(builtin_token);
811+
if (!mem.endsWith(u8, slice, "Cast")) break :canonicalize;
812+
const end = slice.len - "Cast".len;
813+
break :blk meta.stringToEnum(CastKind, slice[1..end]) orelse break :canonicalize;
814+
};
815+
816+
var cast_map = std.EnumMap(CastKind, Ast.TokenIndex).init(.{});
817+
cast_map.put(kind, builtin_token);
818+
819+
var casts_before: usize = 0;
820+
if (builtin_token >= 2) {
821+
var prev_builtin_token = builtin_token - 2;
822+
while (tree.tokenTag(prev_builtin_token) == .builtin) : (prev_builtin_token -= 2) {
823+
const slice = tree.tokenSlice(prev_builtin_token);
824+
if (!mem.endsWith(u8, slice, "Cast")) break;
825+
const end = slice.len - "Cast".len;
826+
const prev_kind = meta.stringToEnum(CastKind, slice[1..end]) orelse break;
827+
if (cast_map.contains(prev_kind)) break :canonicalize;
828+
cast_map.put(prev_kind, prev_builtin_token);
829+
casts_before += 1;
830+
}
831+
}
832+
833+
var next_builtin_token = builtin_token + 2;
834+
while (tree.tokenTag(next_builtin_token) == .builtin) : (next_builtin_token += 2) {
835+
const slice = tree.tokenSlice(next_builtin_token);
836+
if (!mem.endsWith(u8, slice, "Cast")) break;
837+
const end = slice.len - "Cast".len;
838+
const next_kind = meta.stringToEnum(CastKind, slice[1..end]) orelse break;
839+
if (cast_map.contains(next_kind)) break :canonicalize;
840+
cast_map.put(next_kind, next_builtin_token);
841+
}
842+
843+
var it = cast_map.iterator();
844+
builtin_token = it.next().?.value.*;
845+
while (casts_before > 0) : (casts_before -= 1) {
846+
builtin_token = it.next().?.value.*;
847+
}
848+
}
849+
return renderBuiltinCall(r, builtin_token, params, space);
800850
},
801851

802852
.fn_proto_simple,

src/translate_c.zig

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4008,11 +4008,11 @@ fn transCreateCompoundAssign(
40084008
}
40094009

40104010
fn removeCVQualifiers(c: *Context, dst_type_node: Node, expr: Node) Error!Node {
4011-
const const_casted = try Tag.const_cast.create(c.arena, expr);
4012-
const volatile_casted = try Tag.volatile_cast.create(c.arena, const_casted);
4011+
const volatile_casted = try Tag.volatile_cast.create(c.arena, expr);
4012+
const const_casted = try Tag.const_cast.create(c.arena, volatile_casted);
40134013
return Tag.as.create(c.arena, .{
40144014
.lhs = dst_type_node,
4015-
.rhs = try Tag.ptr_cast.create(c.arena, volatile_casted),
4015+
.rhs = try Tag.ptr_cast.create(c.arena, const_casted),
40164016
});
40174017
}
40184018

0 commit comments

Comments
 (0)