OILS / asdl / pybase.py View on Github | oilshell.org

51 lines, 25 significant
1#!/usr/bin/env python2
2"""pybase.py."""
3from __future__ import print_function
4
5from mycpp import mylib
6
7from typing import TYPE_CHECKING
8if TYPE_CHECKING:
9 from _devbuild.gen.hnode_asdl import hnode_t
10 from asdl.runtime import TraversalState
11
12
13class Obj(object):
14 # NOTE: We're using CAPS for these static fields, since they are constant at
15 # runtime after metaprogramming.
16 ASDL_TYPE = None # Used for type checking
17
18
19class SimpleObj(int):
20 """Base type of simple sum types."""
21 # TODO: Get rid of this indirection? Although mycpp might use it.
22 pass
23
24
25class CompoundObj(Obj):
26 # The tag is set for variant types, which are subclasses of sum
27 # types. Never set for product types.
28 _type_tag = 0 # Starts at 1. Zero is invalid
29
30 def PrettyTree(self, trav=None):
31 # type: (TraversalState) -> hnode_t
32 raise NotImplementedError(self.__class__.__name__)
33
34 def _AbbreviatedTree(self, trav=None):
35 # type: (TraversalState) -> hnode_t
36 raise NotImplementedError(self.__class__.__name__)
37
38 def AbbreviatedTree(self, trav=None):
39 # type: (TraversalState) -> hnode_t
40 raise NotImplementedError(self.__class__.__name__)
41
42 def __repr__(self):
43 # type: () -> str
44 # TODO: Break this circular dependency.
45 from asdl import format as fmt
46
47 ast_f = fmt.TextOutput(mylib.BufWriter()) # No color by default.
48 tree = self.PrettyTree()
49 fmt.PrintTree(tree, ast_f)
50 s, _ = ast_f.GetRaw()
51 return s