@@ -528,10 +528,10 @@ pub const Decl = struct {
528528 /// Decl is marked alive, then it sends the Decl to the linker. Otherwise it
529529 /// deletes the Decl on the spot.
530530 alive : bool ,
531- /// Whether the Decl is a `usingnamespace` declaration.
532- is_usingnamespace : bool ,
533531 /// If true `name` is already fully qualified.
534532 name_fully_qualified : bool = false ,
533+ /// What kind of a declaration is this.
534+ kind : Kind ,
535535
536536 /// Represents the position of the code in the output file.
537537 /// This is populated regardless of semantic analysis and code generation.
@@ -551,6 +551,14 @@ pub const Decl = struct {
551551 /// typed_value may need to be regenerated.
552552 dependencies : DepsTable = .{},
553553
554+ pub const Kind = enum {
555+ @"usingnamespace" ,
556+ @"test" ,
557+ @"comptime" ,
558+ named ,
559+ anon ,
560+ };
561+
554562 pub const Index = enum (u32 ) {
555563 _ ,
556564
@@ -4438,7 +4446,7 @@ fn semaDecl(mod: *Module, decl_index: Decl.Index) !bool {
44384446 // not the struct itself.
44394447 try sema .resolveTypeLayout (decl_tv .ty );
44404448
4441- if (decl .is_usingnamespace ) {
4449+ if (decl .kind == .@"usingnamespace" ) {
44424450 if (! decl_tv .ty .eql (Type .type , mod )) {
44434451 return sema .fail (& block_scope , ty_src , "expected type, found {}" , .{
44444452 decl_tv .ty .fmt (mod ),
@@ -4964,42 +4972,47 @@ fn scanDecl(iter: *ScanDeclIter, decl_sub_index: usize, flags: u4) Allocator.Err
49644972
49654973 // Every Decl needs a name.
49664974 var is_named_test = false ;
4975+ var kind : Decl.Kind = .named ;
49674976 const decl_name : [:0 ]const u8 = switch (decl_name_index ) {
49684977 0 = > name : {
49694978 if (export_bit ) {
49704979 const i = iter .usingnamespace_index ;
49714980 iter .usingnamespace_index += 1 ;
4981+ kind = .@"usingnamespace" ;
49724982 break :name try std .fmt .allocPrintZ (gpa , "usingnamespace_{d}" , .{i });
49734983 } else {
49744984 const i = iter .comptime_index ;
49754985 iter .comptime_index += 1 ;
4986+ kind = .@"comptime" ;
49764987 break :name try std .fmt .allocPrintZ (gpa , "comptime_{d}" , .{i });
49774988 }
49784989 },
49794990 1 = > name : {
49804991 const i = iter .unnamed_test_index ;
49814992 iter .unnamed_test_index += 1 ;
4993+ kind = .@"test" ;
49824994 break :name try std .fmt .allocPrintZ (gpa , "test_{d}" , .{i });
49834995 },
49844996 2 = > name : {
49854997 is_named_test = true ;
49864998 const test_name = zir .nullTerminatedString (decl_doccomment_index );
4999+ kind = .@"test" ;
49875000 break :name try std .fmt .allocPrintZ (gpa , "decltest.{s}" , .{test_name });
49885001 },
49895002 else = > name : {
49905003 const raw_name = zir .nullTerminatedString (decl_name_index );
49915004 if (raw_name .len == 0 ) {
49925005 is_named_test = true ;
49935006 const test_name = zir .nullTerminatedString (decl_name_index + 1 );
5007+ kind = .@"test" ;
49945008 break :name try std .fmt .allocPrintZ (gpa , "test.{s}" , .{test_name });
49955009 } else {
49965010 break :name try gpa .dupeZ (u8 , raw_name );
49975011 }
49985012 },
49995013 };
50005014 const is_exported = export_bit and decl_name_index != 0 ;
5001- const is_usingnamespace = export_bit and decl_name_index == 0 ;
5002- if (is_usingnamespace ) try namespace .usingnamespace_set .ensureUnusedCapacity (gpa , 1 );
5015+ if (kind == .@"usingnamespace" ) try namespace .usingnamespace_set .ensureUnusedCapacity (gpa , 1 );
50035016
50045017 // We create a Decl for it regardless of analysis status.
50055018 const gop = try namespace .decls .getOrPutContextAdapted (
@@ -5012,8 +5025,9 @@ fn scanDecl(iter: *ScanDeclIter, decl_sub_index: usize, flags: u4) Allocator.Err
50125025 if (! gop .found_existing ) {
50135026 const new_decl_index = try mod .allocateNewDecl (namespace , decl_node , iter .parent_decl .src_scope );
50145027 const new_decl = mod .declPtr (new_decl_index );
5028+ new_decl .kind = kind ;
50155029 new_decl .name = decl_name ;
5016- if (is_usingnamespace ) {
5030+ if (kind == .@"usingnamespace" ) {
50175031 namespace .usingnamespace_set .putAssumeCapacity (new_decl_index , is_pub );
50185032 }
50195033 log .debug ("scan new {*} ({s}) into {*}" , .{ new_decl , decl_name , namespace });
@@ -5058,7 +5072,6 @@ fn scanDecl(iter: *ScanDeclIter, decl_sub_index: usize, flags: u4) Allocator.Err
50585072 }
50595073 new_decl .is_pub = is_pub ;
50605074 new_decl .is_exported = is_exported ;
5061- new_decl .is_usingnamespace = is_usingnamespace ;
50625075 new_decl .has_align = has_align ;
50635076 new_decl .has_linksection_or_addrspace = has_linksection_or_addrspace ;
50645077 new_decl .zir_decl_index = @intCast (u32 , decl_sub_index );
@@ -5076,7 +5089,7 @@ fn scanDecl(iter: *ScanDeclIter, decl_sub_index: usize, flags: u4) Allocator.Err
50765089
50775090 decl .is_pub = is_pub ;
50785091 decl .is_exported = is_exported ;
5079- decl .is_usingnamespace = is_usingnamespace ;
5092+ decl .kind = kind ;
50805093 decl .has_align = has_align ;
50815094 decl .has_linksection_or_addrspace = has_linksection_or_addrspace ;
50825095 decl .zir_decl_index = @intCast (u32 , decl_sub_index );
@@ -5635,7 +5648,7 @@ pub fn allocateNewDecl(
56355648 .has_linksection_or_addrspace = false ,
56365649 .has_align = false ,
56375650 .alive = false ,
5638- .is_usingnamespace = false ,
5651+ .kind = .anon ,
56395652 };
56405653
56415654 return decl_and_index .decl_index ;
0 commit comments