@@ -796,7 +796,57 @@ fn renderExpression(r: *Render, node: Ast.Node.Index, space: Space) Error!void {
796
796
= > {
797
797
var buf : [2 ]Ast.Node.Index = undefined ;
798
798
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 );
800
850
},
801
851
802
852
.fn_proto_simple ,
0 commit comments