Zig 0.17.0-dev (Split by item) This is an example of documentation generated by
ZigDoc , an alternative to Zig's built-in
Auto Doc feature. See also
examples in other modes/formats . The project being documented here (as the example) is the Zig standard library.
std › zon › parse › Parser › parseArray Private Function parseArray Doc Source Private Function std.zon.parse.Parser.parseArray
fn parseArray (self : *@This (), T : type , node : Zoir .Node .Index ) !T Params self : *@This () T : type node : Zoir .Node .Index File zon/parse.zig: 762
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800 fn parseArray (self : *@This (), T : type , node : Zoir .Node .Index ) !T {
const nodes : Zoir .Node .Index .Range = switch (node .get (self .zoir )) {
.array_literal => |nodes | nodes ,
.empty_literal => .{ .start = node , .len = 0 },
else => return error .WrongType ,
};
const array_info = @typeInfo (T ).array ;
// Check if the size matches
if (nodes .len < array_info .len ) {
return self .failNodeFmt (
node ,
"expected {} array elements; found {}" ,
.{ array_info .len , nodes .len },
);
} else if (nodes .len > array_info .len ) {
return self .failNodeFmt (
nodes .at (array_info .len ),
"index {} outside of array of length {}" ,
.{ array_info .len , array_info .len },
);
}
// Parse the elements and return the array
var result : T = undefined ;
for (&result , 0 ..) |*elem , i | {
// If we fail to parse this field, free all fields before it
errdefer if (self .options .free_on_error ) {
for (result [0 ..i ]) |item | {
free (self .gpa , item );
}
};
elem .* = try self .parseExpr (array_info .child , nodes .at (@intCast (i )));
}
if (array_info .sentinel ()) |s | result [result .len ] = s ;
return result ;
}