| 1 | # Homogeneous tree for pretty-printing ASDL schemas!
 | 
| 2 | # To avoid bootstrapping problems, it can't be pretty-printed!
 | 
| 3 | # It's generated first with a special flag.
 | 
| 4 | 
 | 
| 5 | module hnode {
 | 
| 6 | 
 | 
| 7 |   color =
 | 
| 8 |     TypeName
 | 
| 9 |   | StringConst
 | 
| 10 |   | OtherConst
 | 
| 11 |   | UserType  # e.g. for Id
 | 
| 12 |   | External
 | 
| 13 | 
 | 
| 14 |   Field = (str name, hnode val)
 | 
| 15 | 
 | 
| 16 |   hnode =
 | 
| 17 |     # Used to prevent infinite loops
 | 
| 18 |     AlreadySeen(int heap_id)
 | 
| 19 |   | Record(str node_type, List[Field] fields,
 | 
| 20 |            bool abbrev, str left, str right, List[hnode] unnamed_fields)
 | 
| 21 |   | Array(List[hnode] children)
 | 
| 22 |   | Leaf(str s, color color)
 | 
| 23 |     # Used for a few value_t variants like value.BuiltinFunc, that point back
 | 
| 24 |     # to mycpp classes
 | 
| 25 |   | External(any obj)
 | 
| 26 | 
 | 
| 27 |   # NIL8 pretty-printing -- see doc/pretty-printing.md
 | 
| 28 | 
 | 
| 29 |   # Idea for bit flags for CreateNull().  NOT part of pretty printing / hnode.
 | 
| 30 |   # We just use a single param alloc_lists=True now
 | 
| 31 | 
 | 
| 32 |   alloc_members =
 | 
| 33 |     List
 | 
| 34 |   | Dict
 | 
| 35 |   | Struct  # ASDL product or sum types
 | 
| 36 |   generate [bit_set]
 | 
| 37 |   # Could also generate alloc_members_b::{None,All}
 | 
| 38 |   
 | 
| 39 |   # Related:
 | 
| 40 |   # - it would be nice to have ASDL value types (pass by value),
 | 
| 41 |   #   e.g. val[Token] or inline[Token]
 | 
| 42 |   # - we should be able to pack i8, i16, u8, u16, or even bitfields
 | 
| 43 |   #   Point = (int x, int y)
 | 
| 44 |   #   Point = (int[signed, 16] x, int[unsigned, 8] y)
 | 
| 45 |   # It's not i16 and u8 because we recognize C++ implicit int conversions. 
 | 
| 46 |   # This is storage only.
 | 
| 47 | }
 |