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)");