OILS / _devbuild / gen / pretty_asdl.py View on Github | oilshell.org

249 lines, 180 significant
1from asdl import pybase
2from mycpp import mops
3from typing import Optional, List, Tuple, Dict, Any, cast, TYPE_CHECKING
4
5
6from asdl import runtime # For runtime.NO_SPID
7from asdl.runtime import NewRecord, NewLeaf, TraversalState
8from _devbuild.gen.hnode_asdl import color_e, hnode, hnode_e, hnode_t, Field
9
10class doc_e(object):
11 Newline = 1
12 Text = 2
13 Indent = 3
14 Cat = 4
15
16_doc_str = {
17 1: 'Newline',
18 2: 'Text',
19 3: 'Indent',
20 4: 'Cat',
21}
22
23def doc_str(tag, dot=True):
24 # type: (int, bool) -> str
25 v = _doc_str[tag]
26 if dot:
27 return "doc.%s" % v
28 else:
29 return v
30
31class doc_t(pybase.CompoundObj):
32 def tag(self):
33 # type: () -> int
34 return self._type_tag
35 pass
36
37class doc__Newline(doc_t):
38 _type_tag = 1
39 __slots__ = ()
40
41 def __init__(self, ):
42 # type: () -> None
43 pass
44
45 def PrettyTree(self, trav=None):
46 # type: (Optional[TraversalState]) -> hnode_t
47 trav = trav or TraversalState()
48 heap_id = id(self)
49 if heap_id in trav.seen:
50 return hnode.AlreadySeen(heap_id)
51 trav.seen[heap_id] = True
52 out_node = NewRecord('doc__Newline')
53 L = out_node.fields
54
55 return out_node
56
57 def _AbbreviatedTree(self, trav=None):
58 # type: (Optional[TraversalState]) -> hnode_t
59 trav = trav or TraversalState()
60 heap_id = id(self)
61 if heap_id in trav.seen:
62 return hnode.AlreadySeen(heap_id)
63 trav.seen[heap_id] = True
64 out_node = NewRecord('doc__Newline')
65 L = out_node.fields
66 return out_node
67
68 def AbbreviatedTree(self, trav=None):
69 # type: (Optional[TraversalState]) -> hnode_t
70 return self._AbbreviatedTree(trav=trav)
71
72class doc(object):
73 Newline = doc__Newline()
74
75 class Text(doc_t):
76 _type_tag = 2
77 __slots__ = ('s', 'width')
78
79 def __init__(self, s, width):
80 # type: (str, int) -> None
81 self.s = s
82 self.width = width
83
84 @staticmethod
85 def CreateNull(alloc_lists=False):
86 # type: () -> doc.Text
87 return doc.Text('', -1)
88
89 def PrettyTree(self, trav=None):
90 # type: (Optional[TraversalState]) -> hnode_t
91 trav = trav or TraversalState()
92 heap_id = id(self)
93 if heap_id in trav.seen:
94 return hnode.AlreadySeen(heap_id)
95 trav.seen[heap_id] = True
96 out_node = NewRecord('doc.Text')
97 L = out_node.fields
98
99 x0 = NewLeaf(self.s, color_e.StringConst)
100 L.append(Field('s', x0))
101
102 x1 = hnode.Leaf(str(self.width), color_e.OtherConst)
103 L.append(Field('width', x1))
104
105 return out_node
106
107 def _AbbreviatedTree(self, trav=None):
108 # type: (Optional[TraversalState]) -> hnode_t
109 trav = trav or TraversalState()
110 heap_id = id(self)
111 if heap_id in trav.seen:
112 return hnode.AlreadySeen(heap_id)
113 trav.seen[heap_id] = True
114 out_node = NewRecord('doc.Text')
115 L = out_node.fields
116 x0 = NewLeaf(self.s, color_e.StringConst)
117 L.append(Field('s', x0))
118
119 x1 = hnode.Leaf(str(self.width), color_e.OtherConst)
120 L.append(Field('width', x1))
121
122 return out_node
123
124 def AbbreviatedTree(self, trav=None):
125 # type: (Optional[TraversalState]) -> hnode_t
126 return self._AbbreviatedTree(trav=trav)
127
128 class Indent(doc_t):
129 _type_tag = 3
130 __slots__ = ('ind', 'children')
131
132 def __init__(self, ind, children):
133 # type: (int, List[doc_t]) -> None
134 self.ind = ind
135 self.children = children
136
137 @staticmethod
138 def CreateNull(alloc_lists=False):
139 # type: () -> doc.Indent
140 return doc.Indent(-1, [] if alloc_lists else cast('List[doc_t]', None))
141
142 def PrettyTree(self, trav=None):
143 # type: (Optional[TraversalState]) -> hnode_t
144 trav = trav or TraversalState()
145 heap_id = id(self)
146 if heap_id in trav.seen:
147 return hnode.AlreadySeen(heap_id)
148 trav.seen[heap_id] = True
149 out_node = NewRecord('doc.Indent')
150 L = out_node.fields
151
152 x0 = hnode.Leaf(str(self.ind), color_e.OtherConst)
153 L.append(Field('ind', x0))
154
155 if self.children is not None: # List
156 x1 = hnode.Array([])
157 for i1 in self.children:
158 h = (hnode.Leaf("_", color_e.OtherConst) if i1 is None else
159 i1.PrettyTree(trav=trav))
160 x1.children.append(h)
161 L.append(Field('children', x1))
162
163 return out_node
164
165 def _AbbreviatedTree(self, trav=None):
166 # type: (Optional[TraversalState]) -> hnode_t
167 trav = trav or TraversalState()
168 heap_id = id(self)
169 if heap_id in trav.seen:
170 return hnode.AlreadySeen(heap_id)
171 trav.seen[heap_id] = True
172 out_node = NewRecord('doc.Indent')
173 L = out_node.fields
174 x0 = hnode.Leaf(str(self.ind), color_e.OtherConst)
175 L.append(Field('ind', x0))
176
177 if self.children is not None: # List
178 x1 = hnode.Array([])
179 for i1 in self.children:
180 h = (hnode.Leaf("_", color_e.OtherConst) if i1 is None else
181 i1.AbbreviatedTree(trav=trav))
182 x1.children.append(h)
183 L.append(Field('children', x1))
184
185 return out_node
186
187 def AbbreviatedTree(self, trav=None):
188 # type: (Optional[TraversalState]) -> hnode_t
189 return self._AbbreviatedTree(trav=trav)
190
191 class Cat(doc_t):
192 _type_tag = 4
193 __slots__ = ('left', 'right')
194
195 def __init__(self, left, right):
196 # type: (doc_t, doc_t) -> None
197 self.left = left
198 self.right = right
199
200 @staticmethod
201 def CreateNull(alloc_lists=False):
202 # type: () -> doc.Cat
203 return doc.Cat(cast(doc_t, None), cast(doc_t, None))
204
205 def PrettyTree(self, trav=None):
206 # type: (Optional[TraversalState]) -> hnode_t
207 trav = trav or TraversalState()
208 heap_id = id(self)
209 if heap_id in trav.seen:
210 return hnode.AlreadySeen(heap_id)
211 trav.seen[heap_id] = True
212 out_node = NewRecord('doc.Cat')
213 L = out_node.fields
214
215 assert self.left is not None
216 x0 = self.left.PrettyTree(trav=trav)
217 L.append(Field('left', x0))
218
219 assert self.right is not None
220 x1 = self.right.PrettyTree(trav=trav)
221 L.append(Field('right', x1))
222
223 return out_node
224
225 def _AbbreviatedTree(self, trav=None):
226 # type: (Optional[TraversalState]) -> hnode_t
227 trav = trav or TraversalState()
228 heap_id = id(self)
229 if heap_id in trav.seen:
230 return hnode.AlreadySeen(heap_id)
231 trav.seen[heap_id] = True
232 out_node = NewRecord('doc.Cat')
233 L = out_node.fields
234 assert self.left is not None
235 x0 = self.left.AbbreviatedTree(trav=trav)
236 L.append(Field('left', x0))
237
238 assert self.right is not None
239 x1 = self.right.AbbreviatedTree(trav=trav)
240 L.append(Field('right', x1))
241
242 return out_node
243
244 def AbbreviatedTree(self, trav=None):
245 # type: (Optional[TraversalState]) -> hnode_t
246 return self._AbbreviatedTree(trav=trav)
247
248 pass
249