diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2018-04-30 16:16:58 -0400 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2018-04-30 16:16:58 -0400 |
| commit | 37d3ef28351027a83249080d3238d61d9346f6db (patch) | |
| tree | 6bad32bd19b6655960ca706c862989bc6aee9fec /std | |
| parent | 47680cc0d806775dd9576faaff6303e88b14fb5a (diff) | |
| download | zig-37d3ef28351027a83249080d3238d61d9346f6db.tar.gz zig-37d3ef28351027a83249080d3238d61d9346f6db.zip | |
zig fmt: support promise->T
Diffstat (limited to 'std')
| -rw-r--r-- | std/zig/ast.zig | 32 | ||||
| -rw-r--r-- | std/zig/parser.zig | 32 | ||||
| -rw-r--r-- | std/zig/parser_test.zig | 4 | ||||
| -rw-r--r-- | std/zig/tokenizer.zig | 2 |
4 files changed, 68 insertions, 2 deletions
diff --git a/std/zig/ast.zig b/std/zig/ast.zig index 716ed8eb7d..b8b399afc6 100644 --- a/std/zig/ast.zig +++ b/std/zig/ast.zig @@ -36,6 +36,7 @@ pub const Node = struct { VarType, ErrorType, FnProto, + PromiseType, // Primary expressions IntegerLiteral, @@ -495,6 +496,37 @@ pub const Node = struct { } }; + pub const PromiseType = struct { + base: Node, + promise_token: Token, + result: ?Result, + + pub const Result = struct { + arrow_token: Token, + return_type: &Node, + }; + + pub fn iterate(self: &PromiseType, index: usize) ?&Node { + var i = index; + + if (self.result) |result| { + if (i < 1) return result.return_type; + i -= 1; + } + + return null; + } + + pub fn firstToken(self: &PromiseType) Token { + return self.promise_token; + } + + pub fn lastToken(self: &PromiseType) Token { + if (self.result) |result| return result.return_type.lastToken(); + return self.promise_token; + } + }; + pub const ParamDecl = struct { base: Node, comptime_token: ?Token, diff --git a/std/zig/parser.zig b/std/zig/parser.zig index 025bd31715..afef6704cf 100644 --- a/std/zig/parser.zig +++ b/std/zig/parser.zig @@ -2550,6 +2550,30 @@ pub const Parser = struct { _ = try self.createToCtxLiteral(arena, opt_ctx, ast.Node.Unreachable, token); continue; }, + Token.Id.Keyword_promise => { + const node = try arena.construct(ast.Node.PromiseType { + .base = ast.Node { + .id = ast.Node.Id.PromiseType, + .doc_comments = null, + .same_line_comment = null, + }, + .promise_token = token, + .result = null, + }); + opt_ctx.store(&node.base); + const next_token = self.getNextToken(); + if (next_token.id != Token.Id.Arrow) { + self.putBackToken(next_token); + continue; + } + node.result = ast.Node.PromiseType.Result { + .arrow_token = next_token, + .return_type = undefined, + }; + const return_type_ptr = &((??node.result).return_type); + try stack.append(State { .Expression = OptionalCtx { .Required = return_type_ptr, } }); + continue; + }, Token.Id.StringLiteral, Token.Id.MultilineStringLiteralLine => { opt_ctx.store((try self.parseStringLiteral(arena, token)) ?? unreachable); continue; @@ -4147,6 +4171,14 @@ pub const Parser = struct { try stack.append(RenderState { .Text = self.tokenizer.getTokenSlice(visib_token) }); } }, + ast.Node.Id.PromiseType => { + const promise_type = @fieldParentPtr(ast.Node.PromiseType, "base", base); + try stream.write(self.tokenizer.getTokenSlice(promise_type.promise_token)); + if (promise_type.result) |result| { + try stream.write(self.tokenizer.getTokenSlice(result.arrow_token)); + try stack.append(RenderState { .Expression = result.return_type}); + } + }, ast.Node.Id.LineComment => { const line_comment_node = @fieldParentPtr(ast.Node.LineComment, "base", base); try stream.write(self.tokenizer.getTokenSlice(line_comment_node.token)); diff --git a/std/zig/parser_test.zig b/std/zig/parser_test.zig index 4c238254fa..85fd6c807e 100644 --- a/std/zig/parser_test.zig +++ b/std/zig/parser_test.zig @@ -948,12 +948,12 @@ test "zig fmt: coroutines" { \\ suspend; \\ x += 1; \\ suspend |p| {} - \\ const p = async simpleAsyncFn() catch unreachable; + \\ const p: promise->void = async simpleAsyncFn() catch unreachable; \\ await p; \\} \\ \\test "coroutine suspend, resume, cancel" { - \\ const p = try async<std.debug.global_allocator> testAsyncSeq(); + \\ const p: promise = try async<std.debug.global_allocator> testAsyncSeq(); \\ resume p; \\ cancel p; \\} diff --git a/std/zig/tokenizer.zig b/std/zig/tokenizer.zig index 92a0fbc5d5..6fc26bc5fd 100644 --- a/std/zig/tokenizer.zig +++ b/std/zig/tokenizer.zig @@ -40,6 +40,7 @@ pub const Token = struct { KeywordId{.bytes="null", .id = Id.Keyword_null}, KeywordId{.bytes="or", .id = Id.Keyword_or}, KeywordId{.bytes="packed", .id = Id.Keyword_packed}, + KeywordId{.bytes="promise", .id = Id.Keyword_promise}, KeywordId{.bytes="pub", .id = Id.Keyword_pub}, KeywordId{.bytes="resume", .id = Id.Keyword_resume}, KeywordId{.bytes="return", .id = Id.Keyword_return}, @@ -166,6 +167,7 @@ pub const Token = struct { Keyword_null, Keyword_or, Keyword_packed, + Keyword_promise, Keyword_pub, Keyword_resume, Keyword_return, |
