Commit ce8a3ef2de

Tadeo Kondrak <me@tadeo.ca>
2020-08-27 23:02:17
std.zig: Update to new std.meta.TrailerFlags API
1 parent f945830
Changed files (2)
lib
lib/std/zig/ast.zig
@@ -921,17 +921,17 @@ pub const Node = struct {
             semicolon_token: TokenIndex,
         };
 
-        pub fn getTrailer(self: *const VarDecl, comptime name: []const u8) ?TrailerFlags.Field(name) {
+        pub fn getTrailer(self: *const VarDecl, comptime field: TrailerFlags.FieldEnum) ?TrailerFlags.Field(field) {
             const trailers_start = @ptrCast([*]const u8, self) + @sizeOf(VarDecl);
-            return self.trailer_flags.get(trailers_start, name);
+            return self.trailer_flags.get(trailers_start, field);
         }
 
-        pub fn setTrailer(self: *VarDecl, comptime name: []const u8, value: TrailerFlags.Field(name)) void {
+        pub fn setTrailer(self: *VarDecl, comptime field: TrailerFlags.FieldEnum, value: TrailerFlags.Field(field)) void {
             const trailers_start = @ptrCast([*]u8, self) + @sizeOf(VarDecl);
-            self.trailer_flags.set(trailers_start, name, value);
+            self.trailer_flags.set(trailers_start, field, value);
         }
 
-        pub fn create(allocator: *mem.Allocator, required: RequiredFields, trailers: anytype) !*VarDecl {
+        pub fn create(allocator: *mem.Allocator, required: RequiredFields, trailers: TrailerFlags.InitStruct) !*VarDecl {
             const trailer_flags = TrailerFlags.init(trailers);
             const bytes = try allocator.alignedAlloc(u8, @alignOf(VarDecl), sizeInBytes(trailer_flags));
             const var_decl = @ptrCast(*VarDecl, bytes.ptr);
@@ -954,22 +954,22 @@ pub const Node = struct {
         pub fn iterate(self: *const VarDecl, index: usize) ?*Node {
             var i = index;
 
-            if (self.getTrailer("type_node")) |type_node| {
+            if (self.getTrailer(.type_node)) |type_node| {
                 if (i < 1) return type_node;
                 i -= 1;
             }
 
-            if (self.getTrailer("align_node")) |align_node| {
+            if (self.getTrailer(.align_node)) |align_node| {
                 if (i < 1) return align_node;
                 i -= 1;
             }
 
-            if (self.getTrailer("section_node")) |section_node| {
+            if (self.getTrailer(.section_node)) |section_node| {
                 if (i < 1) return section_node;
                 i -= 1;
             }
 
-            if (self.getTrailer("init_node")) |init_node| {
+            if (self.getTrailer(.init_node)) |init_node| {
                 if (i < 1) return init_node;
                 i -= 1;
             }
@@ -978,11 +978,11 @@ pub const Node = struct {
         }
 
         pub fn firstToken(self: *const VarDecl) TokenIndex {
-            if (self.getTrailer("visib_token")) |visib_token| return visib_token;
-            if (self.getTrailer("thread_local_token")) |thread_local_token| return thread_local_token;
-            if (self.getTrailer("comptime_token")) |comptime_token| return comptime_token;
-            if (self.getTrailer("extern_export_token")) |extern_export_token| return extern_export_token;
-            assert(self.getTrailer("lib_name") == null);
+            if (self.getTrailer(.visib_token)) |visib_token| return visib_token;
+            if (self.getTrailer(.thread_local_token)) |thread_local_token| return thread_local_token;
+            if (self.getTrailer(.comptime_token)) |comptime_token| return comptime_token;
+            if (self.getTrailer(.extern_export_token)) |extern_export_token| return extern_export_token;
+            assert(self.getTrailer(.lib_name) == null);
             return self.mut_token;
         }
 
@@ -1320,34 +1320,34 @@ pub const Node = struct {
             std.debug.print("{*} flags: {b} name_token: {} {*} params_len: {}\n", .{
                 self,
                 self.trailer_flags.bits,
-                self.getTrailer("name_token"),
+                self.getTrailer(.name_token),
                 self.trailer_flags.ptrConst(trailers_start, "name_token"),
                 self.params_len,
             });
         }
 
         pub fn body(self: *const FnProto) ?*Node {
-            return self.getTrailer("body_node");
+            return self.getTrailer(.body_node);
         }
 
-        pub fn getTrailer(self: *const FnProto, comptime name: []const u8) ?TrailerFlags.Field(name) {
+        pub fn getTrailer(self: *const FnProto, comptime field: TrailerFlags.FieldEnum) ?TrailerFlags.Field(field) {
             const trailers_start = @alignCast(
                 @alignOf(ParamDecl),
                 @ptrCast([*]const u8, self) + @sizeOf(FnProto) + @sizeOf(ParamDecl) * self.params_len,
             );
-            return self.trailer_flags.get(trailers_start, name);
+            return self.trailer_flags.get(trailers_start, field);
         }
 
-        pub fn setTrailer(self: *FnProto, comptime name: []const u8, value: TrailerFlags.Field(name)) void {
+        pub fn setTrailer(self: *FnProto, comptime field: TrailerFlags.FieldEnum, value: TrailerFlags.Field(field)) void {
             const trailers_start = @alignCast(
                 @alignOf(ParamDecl),
                 @ptrCast([*]u8, self) + @sizeOf(FnProto) + @sizeOf(ParamDecl) * self.params_len,
             );
-            self.trailer_flags.set(trailers_start, name, value);
+            self.trailer_flags.set(trailers_start, field, value);
         }
 
         /// After this the caller must initialize the params list.
-        pub fn create(allocator: *mem.Allocator, required: RequiredFields, trailers: anytype) !*FnProto {
+        pub fn create(allocator: *mem.Allocator, required: RequiredFields, trailers: TrailerFlags.InitStruct) !*FnProto {
             const trailer_flags = TrailerFlags.init(trailers);
             const bytes = try allocator.alignedAlloc(u8, @alignOf(FnProto), sizeInBytes(
                 required.params_len,
@@ -1376,7 +1376,7 @@ pub const Node = struct {
         pub fn iterate(self: *const FnProto, index: usize) ?*Node {
             var i = index;
 
-            if (self.getTrailer("lib_name")) |lib_name| {
+            if (self.getTrailer(.lib_name)) |lib_name| {
                 if (i < 1) return lib_name;
                 i -= 1;
             }
@@ -1394,12 +1394,12 @@ pub const Node = struct {
             }
             i -= params_len;
 
-            if (self.getTrailer("align_expr")) |align_expr| {
+            if (self.getTrailer(.align_expr)) |align_expr| {
                 if (i < 1) return align_expr;
                 i -= 1;
             }
 
-            if (self.getTrailer("section_expr")) |section_expr| {
+            if (self.getTrailer(.section_expr)) |section_expr| {
                 if (i < 1) return section_expr;
                 i -= 1;
             }
@@ -1421,9 +1421,9 @@ pub const Node = struct {
         }
 
         pub fn firstToken(self: *const FnProto) TokenIndex {
-            if (self.getTrailer("visib_token")) |visib_token| return visib_token;
-            if (self.getTrailer("extern_export_inline_token")) |extern_export_inline_token| return extern_export_inline_token;
-            assert(self.getTrailer("lib_name") == null);
+            if (self.getTrailer(.visib_token)) |visib_token| return visib_token;
+            if (self.getTrailer(.extern_export_inline_token)) |extern_export_inline_token| return extern_export_inline_token;
+            assert(self.getTrailer(.lib_name) == null);
             return self.fn_token;
         }
 
@@ -2673,24 +2673,24 @@ pub const Node = struct {
         };
 
         pub fn getRHS(self: *const ControlFlowExpression) ?*Node {
-            return self.getTrailer("rhs");
+            return self.getTrailer(.rhs);
         }
 
         pub fn getLabel(self: *const ControlFlowExpression) ?TokenIndex {
-            return self.getTrailer("label");
+            return self.getTrailer(.label);
         }
 
-        pub fn getTrailer(self: *const ControlFlowExpression, comptime name: []const u8) ?TrailerFlags.Field(name) {
+        pub fn getTrailer(self: *const ControlFlowExpression, comptime field: TrailerFlags.FieldEnum) ?TrailerFlags.Field(field) {
             const trailers_start = @ptrCast([*]const u8, self) + @sizeOf(ControlFlowExpression);
-            return self.trailer_flags.get(trailers_start, name);
+            return self.trailer_flags.get(trailers_start, field);
         }
 
-        pub fn setTrailer(self: *ControlFlowExpression, comptime name: []const u8, value: TrailerFlags.Field(name)) void {
+        pub fn setTrailer(self: *ControlFlowExpression, comptime field: TrailerFlags.FieldEnum, value: TrailerFlags.Field(field)) void {
             const trailers_start = @ptrCast([*]u8, self) + @sizeOf(ControlFlowExpression);
-            self.trailer_flags.set(trailers_start, name, value);
+            self.trailer_flags.set(trailers_start, field, value);
         }
 
-        pub fn create(allocator: *mem.Allocator, required: RequiredFields, trailers: anytype) !*ControlFlowExpression {
+        pub fn create(allocator: *mem.Allocator, required: RequiredFields, trailers: TrailerFlags.InitStruct) !*ControlFlowExpression {
             const trailer_flags = TrailerFlags.init(trailers);
             const bytes = try allocator.alignedAlloc(u8, @alignOf(ControlFlowExpression), sizeInBytes(trailer_flags));
             const ctrl_flow_expr = @ptrCast(*ControlFlowExpression, bytes.ptr);
lib/std/zig/render.zig
@@ -232,9 +232,9 @@ fn renderContainerDecl(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tr
         .FnProto => {
             const fn_proto = @fieldParentPtr(ast.Node.FnProto, "base", decl);
 
-            try renderDocComments(tree, stream, fn_proto, fn_proto.getTrailer("doc_comments"), indent, start_col);
+            try renderDocComments(tree, stream, fn_proto, fn_proto.getTrailer(.doc_comments), indent, start_col);
 
-            if (fn_proto.getTrailer("body_node")) |body_node| {
+            if (fn_proto.getTrailer(.body_node)) |body_node| {
                 try renderExpression(allocator, stream, tree, indent, start_col, decl, .Space);
                 try renderExpression(allocator, stream, tree, indent, start_col, body_node, space);
             } else {
@@ -257,7 +257,7 @@ fn renderContainerDecl(allocator: *mem.Allocator, stream: anytype, tree: *ast.Tr
         .VarDecl => {
             const var_decl = @fieldParentPtr(ast.Node.VarDecl, "base", decl);
 
-            try renderDocComments(tree, stream, var_decl, var_decl.getTrailer("doc_comments"), indent, start_col);
+            try renderDocComments(tree, stream, var_decl, var_decl.getTrailer(.doc_comments), indent, start_col);
             try renderVarDecl(allocator, stream, tree, indent, start_col, var_decl);
         },
 
@@ -1520,23 +1520,23 @@ fn renderExpression(
         .FnProto => {
             const fn_proto = @fieldParentPtr(ast.Node.FnProto, "base", base);
 
-            if (fn_proto.getTrailer("visib_token")) |visib_token_index| {
+            if (fn_proto.getTrailer(.visib_token)) |visib_token_index| {
                 const visib_token = tree.token_ids[visib_token_index];
                 assert(visib_token == .Keyword_pub or visib_token == .Keyword_export);
 
                 try renderToken(tree, stream, visib_token_index, indent, start_col, Space.Space); // pub
             }
 
-            if (fn_proto.getTrailer("extern_export_inline_token")) |extern_export_inline_token| {
-                if (fn_proto.getTrailer("is_extern_prototype") == null)
+            if (fn_proto.getTrailer(.extern_export_inline_token)) |extern_export_inline_token| {
+                if (fn_proto.getTrailer(.is_extern_prototype) == null)
                     try renderToken(tree, stream, extern_export_inline_token, indent, start_col, Space.Space); // extern/export/inline
             }
 
-            if (fn_proto.getTrailer("lib_name")) |lib_name| {
+            if (fn_proto.getTrailer(.lib_name)) |lib_name| {
                 try renderExpression(allocator, stream, tree, indent, start_col, lib_name, Space.Space);
             }
 
-            const lparen = if (fn_proto.getTrailer("name_token")) |name_token| blk: {
+            const lparen = if (fn_proto.getTrailer(.name_token)) |name_token| blk: {
                 try renderToken(tree, stream, fn_proto.fn_token, indent, start_col, Space.Space); // fn
                 try renderToken(tree, stream, name_token, indent, start_col, Space.None); // name
                 break :blk tree.nextToken(name_token);
@@ -1549,11 +1549,11 @@ fn renderExpression(
             const rparen = tree.prevToken(
             // the first token for the annotation expressions is the left
             // parenthesis, hence the need for two prevToken
-            if (fn_proto.getTrailer("align_expr")) |align_expr|
+            if (fn_proto.getTrailer(.align_expr)) |align_expr|
                 tree.prevToken(tree.prevToken(align_expr.firstToken()))
-            else if (fn_proto.getTrailer("section_expr")) |section_expr|
+            else if (fn_proto.getTrailer(.section_expr)) |section_expr|
                 tree.prevToken(tree.prevToken(section_expr.firstToken()))
-            else if (fn_proto.getTrailer("callconv_expr")) |callconv_expr|
+            else if (fn_proto.getTrailer(.callconv_expr)) |callconv_expr|
                 tree.prevToken(tree.prevToken(callconv_expr.firstToken()))
             else switch (fn_proto.return_type) {
                 .Explicit => |node| node.firstToken(),
@@ -1574,12 +1574,12 @@ fn renderExpression(
                 for (fn_proto.params()) |param_decl, i| {
                     try renderParamDecl(allocator, stream, tree, indent, start_col, param_decl, Space.None);
 
-                    if (i + 1 < fn_proto.params_len or fn_proto.getTrailer("var_args_token") != null) {
+                    if (i + 1 < fn_proto.params_len or fn_proto.getTrailer(.var_args_token) != null) {
                         const comma = tree.nextToken(param_decl.lastToken());
                         try renderToken(tree, stream, comma, indent, start_col, Space.Space); // ,
                     }
                 }
-                if (fn_proto.getTrailer("var_args_token")) |var_args_token| {
+                if (fn_proto.getTrailer(.var_args_token)) |var_args_token| {
                     try renderToken(tree, stream, var_args_token, indent, start_col, Space.None);
                 }
             } else {
@@ -1591,7 +1591,7 @@ fn renderExpression(
                     try stream.writeByteNTimes(' ', new_indent);
                     try renderParamDecl(allocator, stream, tree, new_indent, start_col, param_decl, Space.Comma);
                 }
-                if (fn_proto.getTrailer("var_args_token")) |var_args_token| {
+                if (fn_proto.getTrailer(.var_args_token)) |var_args_token| {
                     try stream.writeByteNTimes(' ', new_indent);
                     try renderToken(tree, stream, var_args_token, new_indent, start_col, Space.Comma);
                 }
@@ -1600,7 +1600,7 @@ fn renderExpression(
 
             try renderToken(tree, stream, rparen, indent, start_col, Space.Space); // )
 
-            if (fn_proto.getTrailer("align_expr")) |align_expr| {
+            if (fn_proto.getTrailer(.align_expr)) |align_expr| {
                 const align_rparen = tree.nextToken(align_expr.lastToken());
                 const align_lparen = tree.prevToken(align_expr.firstToken());
                 const align_kw = tree.prevToken(align_lparen);
@@ -1611,7 +1611,7 @@ fn renderExpression(
                 try renderToken(tree, stream, align_rparen, indent, start_col, Space.Space); // )
             }
 
-            if (fn_proto.getTrailer("section_expr")) |section_expr| {
+            if (fn_proto.getTrailer(.section_expr)) |section_expr| {
                 const section_rparen = tree.nextToken(section_expr.lastToken());
                 const section_lparen = tree.prevToken(section_expr.firstToken());
                 const section_kw = tree.prevToken(section_lparen);
@@ -1622,7 +1622,7 @@ fn renderExpression(
                 try renderToken(tree, stream, section_rparen, indent, start_col, Space.Space); // )
             }
 
-            if (fn_proto.getTrailer("callconv_expr")) |callconv_expr| {
+            if (fn_proto.getTrailer(.callconv_expr)) |callconv_expr| {
                 const callconv_rparen = tree.nextToken(callconv_expr.lastToken());
                 const callconv_lparen = tree.prevToken(callconv_expr.firstToken());
                 const callconv_kw = tree.prevToken(callconv_lparen);
@@ -1631,9 +1631,9 @@ fn renderExpression(
                 try renderToken(tree, stream, callconv_lparen, indent, start_col, Space.None); // (
                 try renderExpression(allocator, stream, tree, indent, start_col, callconv_expr, Space.None);
                 try renderToken(tree, stream, callconv_rparen, indent, start_col, Space.Space); // )
-            } else if (fn_proto.getTrailer("is_extern_prototype") != null) {
+            } else if (fn_proto.getTrailer(.is_extern_prototype) != null) {
                 try stream.writeAll("callconv(.C) ");
-            } else if (fn_proto.getTrailer("is_async") != null) {
+            } else if (fn_proto.getTrailer(.is_async) != null) {
                 try stream.writeAll("callconv(.Async) ");
             }
 
@@ -2221,69 +2221,69 @@ fn renderVarDecl(
     start_col: *usize,
     var_decl: *ast.Node.VarDecl,
 ) (@TypeOf(stream).Error || Error)!void {
-    if (var_decl.getTrailer("visib_token")) |visib_token| {
+    if (var_decl.getTrailer(.visib_token)) |visib_token| {
         try renderToken(tree, stream, visib_token, indent, start_col, Space.Space); // pub
     }
 
-    if (var_decl.getTrailer("extern_export_token")) |extern_export_token| {
+    if (var_decl.getTrailer(.extern_export_token)) |extern_export_token| {
         try renderToken(tree, stream, extern_export_token, indent, start_col, Space.Space); // extern
 
-        if (var_decl.getTrailer("lib_name")) |lib_name| {
+        if (var_decl.getTrailer(.lib_name)) |lib_name| {
             try renderExpression(allocator, stream, tree, indent, start_col, lib_name, Space.Space); // "lib"
         }
     }
 
-    if (var_decl.getTrailer("comptime_token")) |comptime_token| {
+    if (var_decl.getTrailer(.comptime_token)) |comptime_token| {
         try renderToken(tree, stream, comptime_token, indent, start_col, Space.Space); // comptime
     }
 
-    if (var_decl.getTrailer("thread_local_token")) |thread_local_token| {
+    if (var_decl.getTrailer(.thread_local_token)) |thread_local_token| {
         try renderToken(tree, stream, thread_local_token, indent, start_col, Space.Space); // threadlocal
     }
     try renderToken(tree, stream, var_decl.mut_token, indent, start_col, Space.Space); // var
 
-    const name_space = if (var_decl.getTrailer("type_node") == null and
-        (var_decl.getTrailer("align_node") != null or
-        var_decl.getTrailer("section_node") != null or
-        var_decl.getTrailer("init_node") != null))
+    const name_space = if (var_decl.getTrailer(.type_node) == null and
+        (var_decl.getTrailer(.align_node) != null or
+        var_decl.getTrailer(.section_node) != null or
+        var_decl.getTrailer(.init_node) != null))
         Space.Space
     else
         Space.None;
     try renderToken(tree, stream, var_decl.name_token, indent, start_col, name_space);
 
-    if (var_decl.getTrailer("type_node")) |type_node| {
+    if (var_decl.getTrailer(.type_node)) |type_node| {
         try renderToken(tree, stream, tree.nextToken(var_decl.name_token), indent, start_col, Space.Space);
-        const s = if (var_decl.getTrailer("align_node") != null or
-            var_decl.getTrailer("section_node") != null or
-            var_decl.getTrailer("init_node") != null) Space.Space else Space.None;
+        const s = if (var_decl.getTrailer(.align_node) != null or
+            var_decl.getTrailer(.section_node) != null or
+            var_decl.getTrailer(.init_node) != null) Space.Space else Space.None;
         try renderExpression(allocator, stream, tree, indent, start_col, type_node, s);
     }
 
-    if (var_decl.getTrailer("align_node")) |align_node| {
+    if (var_decl.getTrailer(.align_node)) |align_node| {
         const lparen = tree.prevToken(align_node.firstToken());
         const align_kw = tree.prevToken(lparen);
         const rparen = tree.nextToken(align_node.lastToken());
         try renderToken(tree, stream, align_kw, indent, start_col, Space.None); // align
         try renderToken(tree, stream, lparen, indent, start_col, Space.None); // (
         try renderExpression(allocator, stream, tree, indent, start_col, align_node, Space.None);
-        const s = if (var_decl.getTrailer("section_node") != null or var_decl.getTrailer("init_node") != null) Space.Space else Space.None;
+        const s = if (var_decl.getTrailer(.section_node) != null or var_decl.getTrailer(.init_node) != null) Space.Space else Space.None;
         try renderToken(tree, stream, rparen, indent, start_col, s); // )
     }
 
-    if (var_decl.getTrailer("section_node")) |section_node| {
+    if (var_decl.getTrailer(.section_node)) |section_node| {
         const lparen = tree.prevToken(section_node.firstToken());
         const section_kw = tree.prevToken(lparen);
         const rparen = tree.nextToken(section_node.lastToken());
         try renderToken(tree, stream, section_kw, indent, start_col, Space.None); // linksection
         try renderToken(tree, stream, lparen, indent, start_col, Space.None); // (
         try renderExpression(allocator, stream, tree, indent, start_col, section_node, Space.None);
-        const s = if (var_decl.getTrailer("init_node") != null) Space.Space else Space.None;
+        const s = if (var_decl.getTrailer(.init_node) != null) Space.Space else Space.None;
         try renderToken(tree, stream, rparen, indent, start_col, s); // )
     }
 
-    if (var_decl.getTrailer("init_node")) |init_node| {
+    if (var_decl.getTrailer(.init_node)) |init_node| {
         const s = if (init_node.tag == .MultilineStringLiteral) Space.None else Space.Space;
-        try renderToken(tree, stream, var_decl.getTrailer("eq_token").?, indent, start_col, s); // =
+        try renderToken(tree, stream, var_decl.getTrailer(.eq_token).?, indent, start_col, s); // =
         try renderExpression(allocator, stream, tree, indent, start_col, init_node, Space.None);
     }