authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-30 16:16:58-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-04-30 16:16:58-04:00
log37d3ef28351027a83249080d3238d61d9346f6db
tree6bad32bd19b6655960ca706c862989bc6aee9fec
parent47680cc0d806775dd9576faaff6303e88b14fb5a

zig fmt: support promise->T


4 files changed, 68 insertions(+), 2 deletions(-)

std/zig/ast.zig+32
......@@ -36,6 +36,7 @@ pub const Node = struct {
3636 VarType,
3737 ErrorType,
3838 FnProto,
39 PromiseType,
3940
4041 // Primary expressions
4142 IntegerLiteral,
......@@ -495,6 +496,37 @@ pub const Node = struct {
495496 }
496497 };
497498
499 pub const PromiseType = struct {
500 base: Node,
501 promise_token: Token,
502 result: ?Result,
503
504 pub const Result = struct {
505 arrow_token: Token,
506 return_type: &Node,
507 };
508
509 pub fn iterate(self: &PromiseType, index: usize) ?&Node {
510 var i = index;
511
512 if (self.result) |result| {
513 if (i < 1) return result.return_type;
514 i -= 1;
515 }
516
517 return null;
518 }
519
520 pub fn firstToken(self: &PromiseType) Token {
521 return self.promise_token;
522 }
523
524 pub fn lastToken(self: &PromiseType) Token {
525 if (self.result) |result| return result.return_type.lastToken();
526 return self.promise_token;
527 }
528 };
529
498530 pub const ParamDecl = struct {
499531 base: Node,
500532 comptime_token: ?Token,
std/zig/parser.zig+32
......@@ -2550,6 +2550,30 @@ pub const Parser = struct {
25502550 _ = try self.createToCtxLiteral(arena, opt_ctx, ast.Node.Unreachable, token);
25512551 continue;
25522552 },
2553 Token.Id.Keyword_promise => {
2554 const node = try arena.construct(ast.Node.PromiseType {
2555 .base = ast.Node {
2556 .id = ast.Node.Id.PromiseType,
2557 .doc_comments = null,
2558 .same_line_comment = null,
2559 },
2560 .promise_token = token,
2561 .result = null,
2562 });
2563 opt_ctx.store(&node.base);
2564 const next_token = self.getNextToken();
2565 if (next_token.id != Token.Id.Arrow) {
2566 self.putBackToken(next_token);
2567 continue;
2568 }
2569 node.result = ast.Node.PromiseType.Result {
2570 .arrow_token = next_token,
2571 .return_type = undefined,
2572 };
2573 const return_type_ptr = &((??node.result).return_type);
2574 try stack.append(State { .Expression = OptionalCtx { .Required = return_type_ptr, } });
2575 continue;
2576 },
25532577 Token.Id.StringLiteral, Token.Id.MultilineStringLiteralLine => {
25542578 opt_ctx.store((try self.parseStringLiteral(arena, token)) ?? unreachable);
25552579 continue;
......@@ -4147,6 +4171,14 @@ pub const Parser = struct {
41474171 try stack.append(RenderState { .Text = self.tokenizer.getTokenSlice(visib_token) });
41484172 }
41494173 },
4174 ast.Node.Id.PromiseType => {
4175 const promise_type = @fieldParentPtr(ast.Node.PromiseType, "base", base);
4176 try stream.write(self.tokenizer.getTokenSlice(promise_type.promise_token));
4177 if (promise_type.result) |result| {
4178 try stream.write(self.tokenizer.getTokenSlice(result.arrow_token));
4179 try stack.append(RenderState { .Expression = result.return_type});
4180 }
4181 },
41504182 ast.Node.Id.LineComment => {
41514183 const line_comment_node = @fieldParentPtr(ast.Node.LineComment, "base", base);
41524184 try stream.write(self.tokenizer.getTokenSlice(line_comment_node.token));
std/zig/parser_test.zig+2-2
......@@ -948,12 +948,12 @@ test "zig fmt: coroutines" {
948948 \\ suspend;
949949 \\ x += 1;
950950 \\ suspend |p| {}
951 \\ const p = async simpleAsyncFn() catch unreachable;
951 \\ const p: promise->void = async simpleAsyncFn() catch unreachable;
952952 \\ await p;
953953 \\}
954954 \\
955955 \\test "coroutine suspend, resume, cancel" {
956 \\ const p = try async<std.debug.global_allocator> testAsyncSeq();
956 \\ const p: promise = try async<std.debug.global_allocator> testAsyncSeq();
957957 \\ resume p;
958958 \\ cancel p;
959959 \\}
std/zig/tokenizer.zig+2
......@@ -40,6 +40,7 @@ pub const Token = struct {
4040 KeywordId{.bytes="null", .id = Id.Keyword_null},
4141 KeywordId{.bytes="or", .id = Id.Keyword_or},
4242 KeywordId{.bytes="packed", .id = Id.Keyword_packed},
43 KeywordId{.bytes="promise", .id = Id.Keyword_promise},
4344 KeywordId{.bytes="pub", .id = Id.Keyword_pub},
4445 KeywordId{.bytes="resume", .id = Id.Keyword_resume},
4546 KeywordId{.bytes="return", .id = Id.Keyword_return},
......@@ -166,6 +167,7 @@ pub const Token = struct {
166167 Keyword_null,
167168 Keyword_or,
168169 Keyword_packed,
170 Keyword_promise,
169171 Keyword_pub,
170172 Keyword_resume,
171173 Keyword_return,