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

473 lines, 339 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 Break = 1
12 Text = 2
13 Indent = 3
14 Concat = 4
15 Group = 5
16
17_doc_str = {
18 1: 'Break',
19 2: 'Text',
20 3: 'Indent',
21 4: 'Concat',
22 5: 'Group',
23}
24
25def doc_str(tag, dot=True):
26 # type: (int, bool) -> str
27 v = _doc_str[tag]
28 if dot:
29 return "doc.%s" % v
30 else:
31 return v
32
33class doc_t(pybase.CompoundObj):
34 def tag(self):
35 # type: () -> int
36 return self._type_tag
37 pass
38
39class doc(object):
40 class Break(doc_t):
41 _type_tag = 1
42 __slots__ = ('string',)
43
44 def __init__(self, string):
45 # type: (str) -> None
46 self.string = string
47
48 @staticmethod
49 def CreateNull(alloc_lists=False):
50 # type: () -> doc.Break
51 return doc.Break('')
52
53 def PrettyTree(self, trav=None):
54 # type: (Optional[TraversalState]) -> hnode_t
55 trav = trav or TraversalState()
56 heap_id = id(self)
57 if heap_id in trav.seen:
58 return hnode.AlreadySeen(heap_id)
59 trav.seen[heap_id] = True
60 out_node = NewRecord('doc.Break')
61 L = out_node.fields
62
63 x0 = NewLeaf(self.string, color_e.StringConst)
64 L.append(Field('string', x0))
65
66 return out_node
67
68 def _AbbreviatedTree(self, trav=None):
69 # type: (Optional[TraversalState]) -> hnode_t
70 trav = trav or TraversalState()
71 heap_id = id(self)
72 if heap_id in trav.seen:
73 return hnode.AlreadySeen(heap_id)
74 trav.seen[heap_id] = True
75 out_node = NewRecord('doc.Break')
76 L = out_node.fields
77 x0 = NewLeaf(self.string, color_e.StringConst)
78 L.append(Field('string', x0))
79
80 return out_node
81
82 def AbbreviatedTree(self, trav=None):
83 # type: (Optional[TraversalState]) -> hnode_t
84 return self._AbbreviatedTree(trav=trav)
85
86 class Text(doc_t):
87 _type_tag = 2
88 __slots__ = ('string',)
89
90 def __init__(self, string):
91 # type: (str) -> None
92 self.string = string
93
94 @staticmethod
95 def CreateNull(alloc_lists=False):
96 # type: () -> doc.Text
97 return doc.Text('')
98
99 def PrettyTree(self, trav=None):
100 # type: (Optional[TraversalState]) -> hnode_t
101 trav = trav or TraversalState()
102 heap_id = id(self)
103 if heap_id in trav.seen:
104 return hnode.AlreadySeen(heap_id)
105 trav.seen[heap_id] = True
106 out_node = NewRecord('doc.Text')
107 L = out_node.fields
108
109 x0 = NewLeaf(self.string, color_e.StringConst)
110 L.append(Field('string', x0))
111
112 return out_node
113
114 def _AbbreviatedTree(self, trav=None):
115 # type: (Optional[TraversalState]) -> hnode_t
116 trav = trav or TraversalState()
117 heap_id = id(self)
118 if heap_id in trav.seen:
119 return hnode.AlreadySeen(heap_id)
120 trav.seen[heap_id] = True
121 out_node = NewRecord('doc.Text')
122 L = out_node.fields
123 x0 = NewLeaf(self.string, color_e.StringConst)
124 L.append(Field('string', x0))
125
126 return out_node
127
128 def AbbreviatedTree(self, trav=None):
129 # type: (Optional[TraversalState]) -> hnode_t
130 return self._AbbreviatedTree(trav=trav)
131
132 class Indent(doc_t):
133 _type_tag = 3
134 __slots__ = ('indent', 'mdoc')
135
136 def __init__(self, indent, mdoc):
137 # type: (int, MeasuredDoc) -> None
138 self.indent = indent
139 self.mdoc = mdoc
140
141 @staticmethod
142 def CreateNull(alloc_lists=False):
143 # type: () -> doc.Indent
144 return doc.Indent(-1, cast(MeasuredDoc, None))
145
146 def PrettyTree(self, trav=None):
147 # type: (Optional[TraversalState]) -> hnode_t
148 trav = trav or TraversalState()
149 heap_id = id(self)
150 if heap_id in trav.seen:
151 return hnode.AlreadySeen(heap_id)
152 trav.seen[heap_id] = True
153 out_node = NewRecord('doc.Indent')
154 L = out_node.fields
155
156 x0 = hnode.Leaf(str(self.indent), color_e.OtherConst)
157 L.append(Field('indent', x0))
158
159 assert self.mdoc is not None
160 x1 = self.mdoc.PrettyTree(trav=trav)
161 L.append(Field('mdoc', 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.indent), color_e.OtherConst)
175 L.append(Field('indent', x0))
176
177 assert self.mdoc is not None
178 x1 = self.mdoc.AbbreviatedTree(trav=trav)
179 L.append(Field('mdoc', x1))
180
181 return out_node
182
183 def AbbreviatedTree(self, trav=None):
184 # type: (Optional[TraversalState]) -> hnode_t
185 return self._AbbreviatedTree(trav=trav)
186
187 class Concat(doc_t):
188 _type_tag = 4
189 __slots__ = ('mdocs',)
190
191 def __init__(self, mdocs):
192 # type: (List[MeasuredDoc]) -> None
193 self.mdocs = mdocs
194
195 @staticmethod
196 def CreateNull(alloc_lists=False):
197 # type: () -> doc.Concat
198 return doc.Concat([] if alloc_lists else cast('List[MeasuredDoc]', None))
199
200 def PrettyTree(self, trav=None):
201 # type: (Optional[TraversalState]) -> hnode_t
202 trav = trav or TraversalState()
203 heap_id = id(self)
204 if heap_id in trav.seen:
205 return hnode.AlreadySeen(heap_id)
206 trav.seen[heap_id] = True
207 out_node = NewRecord('doc.Concat')
208 L = out_node.fields
209
210 if self.mdocs is not None: # List
211 x0 = hnode.Array([])
212 for i0 in self.mdocs:
213 h = (hnode.Leaf("_", color_e.OtherConst) if i0 is None else
214 i0.PrettyTree(trav=trav))
215 x0.children.append(h)
216 L.append(Field('mdocs', x0))
217
218 return out_node
219
220 def _AbbreviatedTree(self, trav=None):
221 # type: (Optional[TraversalState]) -> hnode_t
222 trav = trav or TraversalState()
223 heap_id = id(self)
224 if heap_id in trav.seen:
225 return hnode.AlreadySeen(heap_id)
226 trav.seen[heap_id] = True
227 out_node = NewRecord('doc.Concat')
228 L = out_node.fields
229 if self.mdocs is not None: # List
230 x0 = hnode.Array([])
231 for i0 in self.mdocs:
232 h = (hnode.Leaf("_", color_e.OtherConst) if i0 is None else
233 i0.AbbreviatedTree(trav=trav))
234 x0.children.append(h)
235 L.append(Field('mdocs', x0))
236
237 return out_node
238
239 def AbbreviatedTree(self, trav=None):
240 # type: (Optional[TraversalState]) -> hnode_t
241 return self._AbbreviatedTree(trav=trav)
242
243 class Group(doc_t):
244 _type_tag = 5
245 __slots__ = ('mdoc',)
246
247 def __init__(self, mdoc):
248 # type: (MeasuredDoc) -> None
249 self.mdoc = mdoc
250
251 @staticmethod
252 def CreateNull(alloc_lists=False):
253 # type: () -> doc.Group
254 return doc.Group(cast(MeasuredDoc, None))
255
256 def PrettyTree(self, trav=None):
257 # type: (Optional[TraversalState]) -> hnode_t
258 trav = trav or TraversalState()
259 heap_id = id(self)
260 if heap_id in trav.seen:
261 return hnode.AlreadySeen(heap_id)
262 trav.seen[heap_id] = True
263 out_node = NewRecord('doc.Group')
264 L = out_node.fields
265
266 assert self.mdoc is not None
267 x0 = self.mdoc.PrettyTree(trav=trav)
268 L.append(Field('mdoc', x0))
269
270 return out_node
271
272 def _AbbreviatedTree(self, trav=None):
273 # type: (Optional[TraversalState]) -> hnode_t
274 trav = trav or TraversalState()
275 heap_id = id(self)
276 if heap_id in trav.seen:
277 return hnode.AlreadySeen(heap_id)
278 trav.seen[heap_id] = True
279 out_node = NewRecord('doc.Group')
280 L = out_node.fields
281 assert self.mdoc is not None
282 x0 = self.mdoc.AbbreviatedTree(trav=trav)
283 L.append(Field('mdoc', x0))
284
285 return out_node
286
287 def AbbreviatedTree(self, trav=None):
288 # type: (Optional[TraversalState]) -> hnode_t
289 return self._AbbreviatedTree(trav=trav)
290
291 pass
292
293class MeasuredDoc(pybase.CompoundObj):
294 _type_tag = 64
295 __slots__ = ('doc', 'measure')
296
297 def __init__(self, doc, measure):
298 # type: (doc_t, Measure) -> None
299 self.doc = doc
300 self.measure = measure
301
302 @staticmethod
303 def CreateNull(alloc_lists=False):
304 # type: () -> MeasuredDoc
305 return MeasuredDoc(cast(doc_t, None), cast(Measure, None))
306
307 def PrettyTree(self, trav=None):
308 # type: (Optional[TraversalState]) -> hnode_t
309 trav = trav or TraversalState()
310 heap_id = id(self)
311 if heap_id in trav.seen:
312 return hnode.AlreadySeen(heap_id)
313 trav.seen[heap_id] = True
314 out_node = NewRecord('MeasuredDoc')
315 L = out_node.fields
316
317 assert self.doc is not None
318 x0 = self.doc.PrettyTree(trav=trav)
319 L.append(Field('doc', x0))
320
321 assert self.measure is not None
322 x1 = self.measure.PrettyTree(trav=trav)
323 L.append(Field('measure', x1))
324
325 return out_node
326
327 def _AbbreviatedTree(self, trav=None):
328 # type: (Optional[TraversalState]) -> hnode_t
329 trav = trav or TraversalState()
330 heap_id = id(self)
331 if heap_id in trav.seen:
332 return hnode.AlreadySeen(heap_id)
333 trav.seen[heap_id] = True
334 out_node = NewRecord('MeasuredDoc')
335 L = out_node.fields
336 assert self.doc is not None
337 x0 = self.doc.AbbreviatedTree(trav=trav)
338 L.append(Field('doc', x0))
339
340 assert self.measure is not None
341 x1 = self.measure.AbbreviatedTree(trav=trav)
342 L.append(Field('measure', x1))
343
344 return out_node
345
346 def AbbreviatedTree(self, trav=None):
347 # type: (Optional[TraversalState]) -> hnode_t
348 return self._AbbreviatedTree(trav=trav)
349
350class Measure(pybase.CompoundObj):
351 _type_tag = 65
352 __slots__ = ('flat', 'nonflat')
353
354 def __init__(self, flat, nonflat):
355 # type: (int, int) -> None
356 self.flat = flat
357 self.nonflat = nonflat
358
359 @staticmethod
360 def CreateNull(alloc_lists=False):
361 # type: () -> Measure
362 return Measure(-1, -1)
363
364 def PrettyTree(self, trav=None):
365 # type: (Optional[TraversalState]) -> hnode_t
366 trav = trav or TraversalState()
367 heap_id = id(self)
368 if heap_id in trav.seen:
369 return hnode.AlreadySeen(heap_id)
370 trav.seen[heap_id] = True
371 out_node = NewRecord('Measure')
372 L = out_node.fields
373
374 x0 = hnode.Leaf(str(self.flat), color_e.OtherConst)
375 L.append(Field('flat', x0))
376
377 x1 = hnode.Leaf(str(self.nonflat), color_e.OtherConst)
378 L.append(Field('nonflat', x1))
379
380 return out_node
381
382 def _AbbreviatedTree(self, trav=None):
383 # type: (Optional[TraversalState]) -> hnode_t
384 trav = trav or TraversalState()
385 heap_id = id(self)
386 if heap_id in trav.seen:
387 return hnode.AlreadySeen(heap_id)
388 trav.seen[heap_id] = True
389 out_node = NewRecord('Measure')
390 L = out_node.fields
391 x0 = hnode.Leaf(str(self.flat), color_e.OtherConst)
392 L.append(Field('flat', x0))
393
394 x1 = hnode.Leaf(str(self.nonflat), color_e.OtherConst)
395 L.append(Field('nonflat', x1))
396
397 return out_node
398
399 def AbbreviatedTree(self, trav=None):
400 # type: (Optional[TraversalState]) -> hnode_t
401 return self._AbbreviatedTree(trav=trav)
402
403class DocFragment(pybase.CompoundObj):
404 _type_tag = 66
405 __slots__ = ('mdoc', 'indent', 'is_flat', 'measure')
406
407 def __init__(self, mdoc, indent, is_flat, measure):
408 # type: (MeasuredDoc, int, bool, Measure) -> None
409 self.mdoc = mdoc
410 self.indent = indent
411 self.is_flat = is_flat
412 self.measure = measure
413
414 @staticmethod
415 def CreateNull(alloc_lists=False):
416 # type: () -> DocFragment
417 return DocFragment(cast(MeasuredDoc, None), -1, False, cast(Measure, None))
418
419 def PrettyTree(self, trav=None):
420 # type: (Optional[TraversalState]) -> hnode_t
421 trav = trav or TraversalState()
422 heap_id = id(self)
423 if heap_id in trav.seen:
424 return hnode.AlreadySeen(heap_id)
425 trav.seen[heap_id] = True
426 out_node = NewRecord('DocFragment')
427 L = out_node.fields
428
429 assert self.mdoc is not None
430 x0 = self.mdoc.PrettyTree(trav=trav)
431 L.append(Field('mdoc', x0))
432
433 x1 = hnode.Leaf(str(self.indent), color_e.OtherConst)
434 L.append(Field('indent', x1))
435
436 x2 = hnode.Leaf('T' if self.is_flat else 'F', color_e.OtherConst)
437 L.append(Field('is_flat', x2))
438
439 assert self.measure is not None
440 x3 = self.measure.PrettyTree(trav=trav)
441 L.append(Field('measure', x3))
442
443 return out_node
444
445 def _AbbreviatedTree(self, trav=None):
446 # type: (Optional[TraversalState]) -> hnode_t
447 trav = trav or TraversalState()
448 heap_id = id(self)
449 if heap_id in trav.seen:
450 return hnode.AlreadySeen(heap_id)
451 trav.seen[heap_id] = True
452 out_node = NewRecord('DocFragment')
453 L = out_node.fields
454 assert self.mdoc is not None
455 x0 = self.mdoc.AbbreviatedTree(trav=trav)
456 L.append(Field('mdoc', x0))
457
458 x1 = hnode.Leaf(str(self.indent), color_e.OtherConst)
459 L.append(Field('indent', x1))
460
461 x2 = hnode.Leaf('T' if self.is_flat else 'F', color_e.OtherConst)
462 L.append(Field('is_flat', x2))
463
464 assert self.measure is not None
465 x3 = self.measure.AbbreviatedTree(trav=trav)
466 L.append(Field('measure', x3))
467
468 return out_node
469
470 def AbbreviatedTree(self, trav=None):
471 # type: (Optional[TraversalState]) -> hnode_t
472 return self._AbbreviatedTree(trav=trav)
473