authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-12 08:46:26+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-04-12 08:46:26+02:00
log0d8646d262ebc3db6631421db8fc79228b6622f8
treec5f410df568cf79e10106e159173a025e3b10a1a
parent2b86ffe34a7a03b20544b13f541f61bbc50ae015

std.zig.parser now parses alignment of functions

Related #909 This allows it to parse `std/special/compiler_rt/index.zig`

1 files changed, 19 insertions(+), 32 deletions(-)

std/zig/parser.zig+19-32
...@@ -2330,12 +2330,14 @@ pub const Parser = struct {...@@ -2330,12 +2330,14 @@ pub const Parser = struct {
2330 },2330 },
23312331
2332 State.FnProtoAlign => |fn_proto| {2332 State.FnProtoAlign => |fn_proto| {
2333 stack.append(State { .FnProtoReturnType = fn_proto }) catch unreachable;
2334
2333 if (self.eatToken(Token.Id.Keyword_align)) |align_token| {2335 if (self.eatToken(Token.Id.Keyword_align)) |align_token| {
2334 @panic("TODO fn proto align");2336 try stack.append(State { .ExpectToken = Token.Id.RParen });
2337 try stack.append(State { .Expression = DestPtr { .NullableField = &fn_proto.align_expr } });
2338 try stack.append(State { .ExpectToken = Token.Id.LParen });
2335 }2339 }
2336 stack.append(State {2340
2337 .FnProtoReturnType = fn_proto,
2338 }) catch unreachable;
2339 continue;2341 continue;
2340 },2342 },
23412343
...@@ -2349,10 +2351,6 @@ pub const Parser = struct {...@@ -2349,10 +2351,6 @@ pub const Parser = struct {
2349 }) catch unreachable;2351 }) catch unreachable;
2350 continue;2352 continue;
2351 },2353 },
2352 Token.Id.Keyword_align => {
2353 @panic("TODO fn proto align");
2354 continue;
2355 },
2356 else => {2354 else => {
2357 // TODO: this is a special case. Remove this when #760 is fixed2355 // TODO: this is a special case. Remove this when #760 is fixed
2358 if (token.id == Token.Id.Keyword_error) {2356 if (token.id == Token.Id.Keyword_error) {
...@@ -3179,7 +3177,6 @@ pub const Parser = struct {...@@ -3179,7 +3177,6 @@ pub const Parser = struct {
31793177
3180 const RenderState = union(enum) {3178 const RenderState = union(enum) {
3181 TopLevelDecl: &ast.Node,3179 TopLevelDecl: &ast.Node,
3182 FnProtoRParen: &ast.NodeFnProto,
3183 ParamDecl: &ast.Node,3180 ParamDecl: &ast.Node,
3184 Text: []const u8,3181 Text: []const u8,
3185 Expression: &ast.Node,3182 Expression: &ast.Node,
...@@ -3868,8 +3865,10 @@ pub const Parser = struct {...@@ -3868,8 +3865,10 @@ pub const Parser = struct {
3868 },3865 },
3869 }3866 }
38703867
3871 if (fn_proto.align_expr != null) {3868 if (fn_proto.align_expr) |align_expr| {
3872 @panic("TODO");3869 try stack.append(RenderState { .Text = ") " });
3870 try stack.append(RenderState { .Expression = align_expr});
3871 try stack.append(RenderState { .Text = "align(" });
3873 }3872 }
38743873
3875 try stack.append(RenderState { .Text = ") " });3874 try stack.append(RenderState { .Text = ") " });
...@@ -4271,26 +4270,6 @@ pub const Parser = struct {...@@ -4271,26 +4270,6 @@ pub const Parser = struct {
4271 ast.Node.Id.TestDecl,4270 ast.Node.Id.TestDecl,
4272 ast.Node.Id.ParamDecl => unreachable,4271 ast.Node.Id.ParamDecl => unreachable,
4273 },4272 },
4274 RenderState.FnProtoRParen => |fn_proto| {
4275 try stream.print(")");
4276 if (fn_proto.align_expr != null) {
4277 @panic("TODO");
4278 }
4279 try stream.print(" ");
4280 if (fn_proto.body_node) |body_node| {
4281 try stack.append(RenderState { .Expression = body_node});
4282 try stack.append(RenderState { .Text = " "});
4283 }
4284 switch (fn_proto.return_type) {
4285 ast.NodeFnProto.ReturnType.Explicit => |node| {
4286 try stack.append(RenderState { .Expression = node});
4287 },
4288 ast.NodeFnProto.ReturnType.InferErrorSet => |node| {
4289 try stream.print("!");
4290 try stack.append(RenderState { .Expression = node});
4291 },
4292 }
4293 },
4294 RenderState.Statement => |base| {4273 RenderState.Statement => |base| {
4295 if (base.comment) |comment| {4274 if (base.comment) |comment| {
4296 for (comment.lines.toSliceConst()) |line_token| {4275 for (comment.lines.toSliceConst()) |line_token| {
...@@ -4644,12 +4623,20 @@ test "zig fmt: var type" {...@@ -4644,12 +4623,20 @@ test "zig fmt: var type" {
4644 );4623 );
4645}4624}
46464625
4647test "zig fmt: extern function" {4626test "zig fmt: functions" {
4648 try testCanonical(4627 try testCanonical(
4649 \\extern fn puts(s: &const u8) c_int;4628 \\extern fn puts(s: &const u8) c_int;
4650 \\extern "c" fn puts(s: &const u8) c_int;4629 \\extern "c" fn puts(s: &const u8) c_int;
4651 \\export fn puts(s: &const u8) c_int;4630 \\export fn puts(s: &const u8) c_int;
4652 \\inline fn puts(s: &const u8) c_int;4631 \\inline fn puts(s: &const u8) c_int;
4632 \\pub extern fn puts(s: &const u8) c_int;
4633 \\pub extern "c" fn puts(s: &const u8) c_int;
4634 \\pub export fn puts(s: &const u8) c_int;
4635 \\pub inline fn puts(s: &const u8) c_int;
4636 \\pub extern fn puts(s: &const u8) align(2 + 2) c_int;
4637 \\pub extern "c" fn puts(s: &const u8) align(2 + 2) c_int;
4638 \\pub export fn puts(s: &const u8) align(2 + 2) c_int;
4639 \\pub inline fn puts(s: &const u8) align(2 + 2) c_int;
4653 \\4640 \\
4654 );4641 );
4655}4642}