1 /// Copyright: Copyright (c) 2021 Andrey Penechko. 2 /// License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0). 3 /// Authors: Andrey Penechko. 4 module vox.fe.ast.ast_node_state; 5 6 /// Invariant: child.state >= parent.state 7 enum AstNodeState : ubyte 8 { 9 // initial state 10 parse_done, 11 // is set after scope gathered all named entities 12 name_register_self, 13 name_register_self_done, 14 // is set after scope gathered all named entities 15 name_register_nested, 16 name_register_nested_done, 17 // is set after name uses resolved identifier 18 name_resolve, 19 name_resolve_done, 20 // is set after type checking 21 type_check, 22 type_check_done, 23 // is set after IR representation was created 24 ir_gen, 25 ir_gen_done, 26 } 27 static assert(AstNodeState.max <= 15, "Assumed to fit in 4 bits"); 28 29 // Used for fine-grained dependency tracking 30 // Instead of depending on the whole AST node being in some state 31 // node can depend on exact property it intends to read after request 32 // All property readers need to check the property state and calculate it if needed 33 enum PropertyState : ubyte 34 { 35 not_calculated, 36 calculating, 37 calculated, 38 //error_calculating, // no need for now 39 } 40 41 bool isCalculated(PropertyState s) { 42 return s == PropertyState.calculated; 43 } 44 45 enum NodeProperty : ubyte { 46 name_register_self, 47 name_register_nested, 48 name_resolve, 49 type_check, 50 type, 51 ir_header, 52 ir_body, 53 init_value, 54 } 55 static assert(NodeProperty.max <= 15, "Max number of properties per uint is 16 (2 bits per property)");