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 }