@@ -252,7 +252,7 @@ pub const Root = struct {
252252 const gpa = root .translator .gpa ;
253253 const arena = root .translator .arena ;
254254
255- var member_names : std .StringArrayHashMapUnmanaged (u32 ) = .empty ;
255+ var member_names : std .StringArrayHashMapUnmanaged (void ) = .empty ;
256256 defer member_names .deinit (gpa );
257257 for (root .container_member_fns_map .values ()) | members | {
258258 member_names .clearRetainingCapacity ();
@@ -261,7 +261,7 @@ pub const Root = struct {
261261 const payload : * ast.Payload.Container = @alignCast (@fieldParentPtr ("base" , members .container_decl_ptr .ptr_otherwise ));
262262 // Avoid duplication with field names
263263 for (payload .data .fields ) | field | {
264- try member_names .put (gpa , field .name , 0 );
264+ try member_names .put (gpa , field .name , {} );
265265 }
266266 break :blk_record & payload .data .decls ;
267267 },
@@ -278,34 +278,39 @@ pub const Root = struct {
278278 };
279279
280280 const old_decls = decls_ptr .* ;
281- const new_decls = try arena .alloc (ast .Node , old_decls .len + members .member_fns .items .len );
281+ const new_decls = try arena .alloc (ast .Node , old_decls .len + members .member_fns .items .len * 2 );
282282 @memcpy (new_decls [0.. old_decls .len ], old_decls );
283283 // Assume the allocator of payload.data.decls is arena,
284284 // so don't add arena.free(old_variables).
285285 const func_ref_vars = new_decls [old_decls .len .. ];
286286 var count : u32 = 0 ;
287+
288+ // Add members without mangling them - only fields may cause name conflicts
287289 for (members .member_fns .items ) | func | {
288290 const func_name = func .data .name .? ;
291+ const member_name_slot = try member_names .getOrPutValue (gpa , func_name , {});
292+ if (member_name_slot .found_existing ) continue ;
293+ func_ref_vars [count ] = try ast .Node .Tag .pub_var_simple .create (arena , .{
294+ .name = func_name ,
295+ .init = try ast .Node .Tag .root_ref .create (arena , func_name ),
296+ });
297+ count += 1 ;
298+ }
289299
290- const last_index = std .mem .lastIndexOf (u8 , func_name , "_" );
291- const last_name = if (last_index ) | index | func_name [index + 1 .. ] else continue ;
292- var same_count : u32 = 0 ;
293- const gop = try member_names .getOrPutValue (gpa , last_name , same_count );
294- if (gop .found_existing ) {
295- gop .value_ptr .* += 1 ;
296- same_count = gop .value_ptr .* ;
297- }
298- const var_name = if (same_count == 0 )
299- last_name
300- else
301- try std .fmt .allocPrint (arena , "{s}{d}" , .{ last_name , same_count });
302-
300+ for (members .member_fns .items ) | func | {
301+ const func_name = func .data .name .? ;
302+ const func_name_trimmed = std .mem .trimEnd (u8 , func_name , "_" );
303+ const last_idx = std .mem .lastIndexOf (u8 , func_name_trimmed , "_" ) orelse continue ;
304+ const func_name_alias = func_name [last_idx + 1 .. ];
305+ const member_name_slot = try member_names .getOrPutValue (gpa , func_name_alias , {});
306+ if (member_name_slot .found_existing ) continue ;
303307 func_ref_vars [count ] = try ast .Node .Tag .pub_var_simple .create (arena , .{
304- .name = var_name ,
305- .init = try ast .Node .Tag .identifier .create (arena , func_name ),
308+ .name = func_name_alias ,
309+ .init = try ast .Node .Tag .root_ref .create (arena , func_name ),
306310 });
307311 count += 1 ;
308312 }
313+
309314 decls_ptr .* = new_decls [0 .. old_decls .len + count ];
310315 }
311316 }
0 commit comments