1 /// Copyright: Copyright (c) 2017-2019 Andrey Penechko.
2 /// License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0).
3 /// Authors: Andrey Penechko.
4 module vox.fe.ast.stmt.do_stmt;
5 
6 import vox.all;
7 
8 
9 @(AstType.stmt_do_while)
10 struct DoWhileStmtNode {
11 	mixin AstNodeData!(AstType.stmt_do_while, 0, AstNodeState.name_register_self_done);
12 	AstIndex condition;
13 	AstNodes statements;
14 }
15 
16 void print_do(DoWhileStmtNode* node, ref AstPrintState state)
17 {
18 	state.print("DO");
19 	print_ast(node.condition, state);
20 	state.print("WHILE");
21 	print_ast(node.statements, state);
22 }
23 
24 void post_clone_do(DoWhileStmtNode* node, ref CloneState state)
25 {
26 	state.fixAstIndex(node.condition);
27 	state.fixAstNodes(node.statements);
28 }
29 
30 void name_register_nested_do(DoWhileStmtNode* node, ref NameRegisterState state) {
31 	node.state = AstNodeState.name_register_nested;
32 	require_name_register(node.statements, state);
33 	require_name_register(node.condition, state);
34 	node.state = AstNodeState.name_register_nested_done;
35 }
36 
37 void name_resolve_do(DoWhileStmtNode* node, ref NameResolveState state) {
38 	node.state = AstNodeState.name_resolve;
39 	require_name_resolve(node.statements, state);
40 	require_name_resolve(node.condition, state);
41 	node.state = AstNodeState.name_resolve_done;
42 }
43 
44 void type_check_do(DoWhileStmtNode* node, ref TypeCheckState state)
45 {
46 	node.state = AstNodeState.type_check;
47 	require_type_check(node.statements, state);
48 	require_type_check(node.condition, state);
49 	autoconvToBool(node.condition, state.context);
50 	node.state = AstNodeState.type_check_done;
51 }
52 
53 void ir_gen_do(ref IrGenState gen, IrIndex currentBlock, ref IrLabel nextStmt, DoWhileStmtNode* d)
54 {
55 	gen.context.unreachable;
56 }