mirror of
https://github.com/ziglang/zig.git
synced 2025-12-24 07:03:11 +00:00
std.zig.parser: changed block exprs from primary expr to expr
This commit is contained in:
parent
706e0d739e
commit
db0812d4b7
@ -766,6 +766,101 @@ pub const Parser = struct {
|
|||||||
dest_ptr.store(&resume_node.base);
|
dest_ptr.store(&resume_node.base);
|
||||||
stack.append(State { .Expression = DestPtr { .Field = &resume_node.rhs } }) catch unreachable;
|
stack.append(State { .Expression = DestPtr { .Field = &resume_node.rhs } }) catch unreachable;
|
||||||
},
|
},
|
||||||
|
Token.Id.Keyword_suspend => {
|
||||||
|
const node = try arena.create(ast.NodeSuspend);
|
||||||
|
*node = ast.NodeSuspend {
|
||||||
|
.base = self.initNode(ast.Node.Id.Suspend),
|
||||||
|
.suspend_token = token,
|
||||||
|
.payload = null,
|
||||||
|
.body = null,
|
||||||
|
};
|
||||||
|
dest_ptr.store(&node.base);
|
||||||
|
stack.append(State { .SuspendBody = node }) catch unreachable;
|
||||||
|
try stack.append(State { .Payload = &node.payload });
|
||||||
|
continue;
|
||||||
|
},
|
||||||
|
Token.Id.Keyword_if => {
|
||||||
|
const node = try arena.create(ast.NodeIf);
|
||||||
|
*node = ast.NodeIf {
|
||||||
|
.base = self.initNode(ast.Node.Id.If),
|
||||||
|
.if_token = token,
|
||||||
|
.condition = undefined,
|
||||||
|
.payload = null,
|
||||||
|
.body = undefined,
|
||||||
|
.@"else" = null,
|
||||||
|
};
|
||||||
|
dest_ptr.store(&node.base);
|
||||||
|
|
||||||
|
stack.append(State { .Else = &node.@"else" }) catch unreachable;
|
||||||
|
try stack.append(State { .Expression = DestPtr { .Field = &node.body } });
|
||||||
|
try stack.append(State { .PointerPayload = &node.payload });
|
||||||
|
try stack.append(State { .ExpectToken = Token.Id.RParen });
|
||||||
|
try stack.append(State { .Expression = DestPtr { .Field = &node.condition } });
|
||||||
|
try stack.append(State { .ExpectToken = Token.Id.LParen });
|
||||||
|
continue;
|
||||||
|
},
|
||||||
|
Token.Id.Keyword_while => {
|
||||||
|
stack.append(State {
|
||||||
|
.While = LoopCtx {
|
||||||
|
.label = null,
|
||||||
|
.inline_token = null,
|
||||||
|
.loop_token = token,
|
||||||
|
.dest_ptr = dest_ptr,
|
||||||
|
}
|
||||||
|
}) catch unreachable;
|
||||||
|
continue;
|
||||||
|
},
|
||||||
|
Token.Id.Keyword_for => {
|
||||||
|
stack.append(State {
|
||||||
|
.For = LoopCtx {
|
||||||
|
.label = null,
|
||||||
|
.inline_token = null,
|
||||||
|
.loop_token = token,
|
||||||
|
.dest_ptr = dest_ptr,
|
||||||
|
}
|
||||||
|
}) catch unreachable;
|
||||||
|
continue;
|
||||||
|
},
|
||||||
|
Token.Id.Keyword_switch => {
|
||||||
|
const node = try arena.create(ast.NodeSwitch);
|
||||||
|
*node = ast.NodeSwitch {
|
||||||
|
.base = self.initNode(ast.Node.Id.Switch),
|
||||||
|
.switch_token = token,
|
||||||
|
.expr = undefined,
|
||||||
|
.cases = ArrayList(&ast.NodeSwitchCase).init(arena),
|
||||||
|
.rbrace = undefined,
|
||||||
|
};
|
||||||
|
dest_ptr.store(&node.base);
|
||||||
|
|
||||||
|
stack.append(State {
|
||||||
|
.SwitchCaseOrEnd = ListSave(&ast.NodeSwitchCase) {
|
||||||
|
.list = &node.cases,
|
||||||
|
.ptr = &node.rbrace,
|
||||||
|
},
|
||||||
|
}) catch unreachable;
|
||||||
|
try stack.append(State { .ExpectToken = Token.Id.LBrace });
|
||||||
|
try stack.append(State { .ExpectToken = Token.Id.RParen });
|
||||||
|
try stack.append(State { .Expression = DestPtr { .Field = &node.expr } });
|
||||||
|
try stack.append(State { .ExpectToken = Token.Id.LParen });
|
||||||
|
},
|
||||||
|
Token.Id.Keyword_comptime => {
|
||||||
|
const node = try arena.create(ast.NodeComptime);
|
||||||
|
*node = ast.NodeComptime {
|
||||||
|
.base = self.initNode(ast.Node.Id.Comptime),
|
||||||
|
.comptime_token = token,
|
||||||
|
.expr = undefined,
|
||||||
|
};
|
||||||
|
dest_ptr.store(&node.base);
|
||||||
|
try stack.append(State { .Expression = DestPtr { .Field = &node.expr } });
|
||||||
|
continue;
|
||||||
|
},
|
||||||
|
Token.Id.LBrace => {
|
||||||
|
const block = try self.createBlock(arena, (?Token)(null), token);
|
||||||
|
dest_ptr.store(&block.base);
|
||||||
|
|
||||||
|
stack.append(State { .Block = block }) catch unreachable;
|
||||||
|
continue;
|
||||||
|
},
|
||||||
else => {
|
else => {
|
||||||
self.putBackToken(token);
|
self.putBackToken(token);
|
||||||
stack.append(State { .UnwrapExpressionBegin = dest_ptr }) catch unreachable;
|
stack.append(State { .UnwrapExpressionBegin = dest_ptr }) catch unreachable;
|
||||||
@ -1328,19 +1423,6 @@ pub const Parser = struct {
|
|||||||
dest_ptr.store(&node.base);
|
dest_ptr.store(&node.base);
|
||||||
continue;
|
continue;
|
||||||
},
|
},
|
||||||
Token.Id.Keyword_suspend => {
|
|
||||||
const node = try arena.create(ast.NodeSuspend);
|
|
||||||
*node = ast.NodeSuspend {
|
|
||||||
.base = self.initNode(ast.Node.Id.Suspend),
|
|
||||||
.suspend_token = token,
|
|
||||||
.payload = null,
|
|
||||||
.body = null,
|
|
||||||
};
|
|
||||||
dest_ptr.store(&node.base);
|
|
||||||
stack.append(State { .SuspendBody = node }) catch unreachable;
|
|
||||||
try stack.append(State { .Payload = &node.payload });
|
|
||||||
continue;
|
|
||||||
},
|
|
||||||
Token.Id.MultilineStringLiteralLine => {
|
Token.Id.MultilineStringLiteralLine => {
|
||||||
const node = try arena.create(ast.NodeMultilineStringLiteral);
|
const node = try arena.create(ast.NodeMultilineStringLiteral);
|
||||||
*node = ast.NodeMultilineStringLiteral {
|
*node = ast.NodeMultilineStringLiteral {
|
||||||
@ -1544,13 +1626,6 @@ pub const Parser = struct {
|
|||||||
}) catch unreachable;
|
}) catch unreachable;
|
||||||
continue;
|
continue;
|
||||||
},
|
},
|
||||||
Token.Id.LBrace => {
|
|
||||||
const block = try self.createBlock(arena, (?Token)(null), token);
|
|
||||||
dest_ptr.store(&block.base);
|
|
||||||
|
|
||||||
stack.append(State { .Block = block }) catch unreachable;
|
|
||||||
continue;
|
|
||||||
},
|
|
||||||
Token.Id.Keyword_fn => {
|
Token.Id.Keyword_fn => {
|
||||||
// TODO shouldn't need these casts
|
// TODO shouldn't need these casts
|
||||||
const fn_proto = try self.createFnProto(arena, token,
|
const fn_proto = try self.createFnProto(arena, token,
|
||||||
@ -1608,26 +1683,6 @@ pub const Parser = struct {
|
|||||||
try stack.append(State { .AsmOutputItems = &node.outputs });
|
try stack.append(State { .AsmOutputItems = &node.outputs });
|
||||||
try stack.append(State { .IfToken = Token.Id.Colon });
|
try stack.append(State { .IfToken = Token.Id.Colon });
|
||||||
},
|
},
|
||||||
Token.Id.Keyword_if => {
|
|
||||||
const node = try arena.create(ast.NodeIf);
|
|
||||||
*node = ast.NodeIf {
|
|
||||||
.base = self.initNode(ast.Node.Id.If),
|
|
||||||
.if_token = token,
|
|
||||||
.condition = undefined,
|
|
||||||
.payload = null,
|
|
||||||
.body = undefined,
|
|
||||||
.@"else" = null,
|
|
||||||
};
|
|
||||||
dest_ptr.store(&node.base);
|
|
||||||
|
|
||||||
stack.append(State { .Else = &node.@"else" }) catch unreachable;
|
|
||||||
try stack.append(State { .Expression = DestPtr { .Field = &node.body } });
|
|
||||||
try stack.append(State { .PointerPayload = &node.payload });
|
|
||||||
try stack.append(State { .ExpectToken = Token.Id.RParen });
|
|
||||||
try stack.append(State { .Expression = DestPtr { .Field = &node.condition } });
|
|
||||||
try stack.append(State { .ExpectToken = Token.Id.LParen });
|
|
||||||
continue;
|
|
||||||
},
|
|
||||||
Token.Id.Keyword_inline => {
|
Token.Id.Keyword_inline => {
|
||||||
stack.append(State {
|
stack.append(State {
|
||||||
.Inline = InlineCtx {
|
.Inline = InlineCtx {
|
||||||
@ -1638,61 +1693,6 @@ pub const Parser = struct {
|
|||||||
}) catch unreachable;
|
}) catch unreachable;
|
||||||
continue;
|
continue;
|
||||||
},
|
},
|
||||||
Token.Id.Keyword_while => {
|
|
||||||
stack.append(State {
|
|
||||||
.While = LoopCtx {
|
|
||||||
.label = null,
|
|
||||||
.inline_token = null,
|
|
||||||
.loop_token = token,
|
|
||||||
.dest_ptr = dest_ptr,
|
|
||||||
}
|
|
||||||
}) catch unreachable;
|
|
||||||
continue;
|
|
||||||
},
|
|
||||||
Token.Id.Keyword_for => {
|
|
||||||
stack.append(State {
|
|
||||||
.For = LoopCtx {
|
|
||||||
.label = null,
|
|
||||||
.inline_token = null,
|
|
||||||
.loop_token = token,
|
|
||||||
.dest_ptr = dest_ptr,
|
|
||||||
}
|
|
||||||
}) catch unreachable;
|
|
||||||
continue;
|
|
||||||
},
|
|
||||||
Token.Id.Keyword_switch => {
|
|
||||||
const node = try arena.create(ast.NodeSwitch);
|
|
||||||
*node = ast.NodeSwitch {
|
|
||||||
.base = self.initNode(ast.Node.Id.Switch),
|
|
||||||
.switch_token = token,
|
|
||||||
.expr = undefined,
|
|
||||||
.cases = ArrayList(&ast.NodeSwitchCase).init(arena),
|
|
||||||
.rbrace = undefined,
|
|
||||||
};
|
|
||||||
dest_ptr.store(&node.base);
|
|
||||||
|
|
||||||
stack.append(State {
|
|
||||||
.SwitchCaseOrEnd = ListSave(&ast.NodeSwitchCase) {
|
|
||||||
.list = &node.cases,
|
|
||||||
.ptr = &node.rbrace,
|
|
||||||
},
|
|
||||||
}) catch unreachable;
|
|
||||||
try stack.append(State { .ExpectToken = Token.Id.LBrace });
|
|
||||||
try stack.append(State { .ExpectToken = Token.Id.RParen });
|
|
||||||
try stack.append(State { .Expression = DestPtr { .Field = &node.expr } });
|
|
||||||
try stack.append(State { .ExpectToken = Token.Id.LParen });
|
|
||||||
},
|
|
||||||
Token.Id.Keyword_comptime => {
|
|
||||||
const node = try arena.create(ast.NodeComptime);
|
|
||||||
*node = ast.NodeComptime {
|
|
||||||
.base = self.initNode(ast.Node.Id.Comptime),
|
|
||||||
.comptime_token = token,
|
|
||||||
.expr = undefined,
|
|
||||||
};
|
|
||||||
dest_ptr.store(&node.base);
|
|
||||||
try stack.append(State { .Expression = DestPtr { .Field = &node.expr } });
|
|
||||||
continue;
|
|
||||||
},
|
|
||||||
else => {
|
else => {
|
||||||
try self.parseError(&stack, token, "expected primary expression, found {}", @tagName(token.id));
|
try self.parseError(&stack, token, "expected primary expression, found {}", @tagName(token.id));
|
||||||
continue;
|
continue;
|
||||||
@ -4966,11 +4966,37 @@ test "zig fmt: coroutines" {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
//{
|
test "zig fmt: coroutines" {
|
||||||
// var it = self.link_libs.iterator();
|
try testCanonical(
|
||||||
// while (true) {
|
\\async fn simpleAsyncFn() void {
|
||||||
// const entry = it.next() ?? break;
|
\\ x += 1;
|
||||||
// zig_args.append("--library") catch unreachable;
|
\\ suspend;
|
||||||
// zig_args.append(entry.key) catch unreachable;
|
\\ x += 1;
|
||||||
// }
|
\\ suspend |p| {}
|
||||||
//}
|
\\ const p = async simpleAsyncFn() catch unreachable;
|
||||||
|
\\ await p;
|
||||||
|
\\}
|
||||||
|
\\
|
||||||
|
\\test "coroutine suspend, resume, cancel" {
|
||||||
|
\\ const p = try async<std.debug.global_allocator> testAsyncSeq();
|
||||||
|
\\ resume p;
|
||||||
|
\\ cancel p;
|
||||||
|
\\}
|
||||||
|
\\
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
test "zig fmt: Block after if" {
|
||||||
|
try testCanonical(
|
||||||
|
\\test "Block after if" {
|
||||||
|
\\ if (true) {
|
||||||
|
\\ const a = 0;
|
||||||
|
\\ }
|
||||||
|
\\
|
||||||
|
\\ {
|
||||||
|
\\ const a = 0;
|
||||||
|
\\ }
|
||||||
|
\\}
|
||||||
|
\\
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@ -1158,7 +1158,6 @@ fn testTokenize(source: []const u8, expected_tokens: []const Token.Id) void {
|
|||||||
var tokenizer = Tokenizer.init(source);
|
var tokenizer = Tokenizer.init(source);
|
||||||
for (expected_tokens) |expected_token_id| {
|
for (expected_tokens) |expected_token_id| {
|
||||||
const token = tokenizer.next();
|
const token = tokenizer.next();
|
||||||
std.debug.warn("{} {}\n", @tagName(expected_token_id), @tagName(token.id));
|
|
||||||
std.debug.assert(@TagType(Token.Id)(token.id) == @TagType(Token.Id)(expected_token_id));
|
std.debug.assert(@TagType(Token.Id)(token.id) == @TagType(Token.Id)(expected_token_id));
|
||||||
switch (expected_token_id) {
|
switch (expected_token_id) {
|
||||||
Token.Id.StringLiteral => |expected_kind| {
|
Token.Id.StringLiteral => |expected_kind| {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user