-
Notifications
You must be signed in to change notification settings - Fork 0
/
ast_node.py
130 lines (96 loc) · 3.06 KB
/
ast_node.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
'''
Created on Nov 20, 2015
@author: Tommi Unruh
'''
from _constants import TYPE_SIMPLE_STRING, TYPE_SIMPLE_INT
class ASTNode(object):
'''
classdocs
'''
def __init__(
self, parent=None, level=0, _type=None,
value=None, _childnum=0
):
'''
Constructor
'''
self.level = level
self._type = _type
self.parent = parent
self.children = []
self.name = None
self.flags = None
self.value = value
self.doc_comment = None
self._childnum = _childnum
def addChild(self, ast_node):
ast_node.setLevel(self.level + 1)
self.children.append(ast_node)
ast_node.setParent(self)
def setType(self, _type):
self._type = _type
def getType(self):
return self._type
def getChildren(self):
return self.children
def getChild(self, i):
return self.children[i]
def setLevel(self, level):
self.level = level
def getLevel(self):
return self.level
def setParent(self, node):
self.parent = node
def getParent(self):
return self.parent
def setFlags(self, flags):
self.flags = flags
def getFlags(self):
return self.flags
def setName(self, name):
self.name = name
def getName(self):
return self.name
def setDocComment(self, comment):
self.doc_comment = comment
def getDocComment(self):
return self.doc_comment
def setValue(self, val):
self.value = val
def getValue(self):
return self.value
def setChildnum(self, num):
self._childnum = num
def getChildnum(self):
return self._childnum
def __str__(self, *args, **kwargs):
indentation = " " * self.level * 4
result = str(self._type) + "\n"
if self.flags:
result += indentation + "flags: " + self.flags + "\n"
for i, child in enumerate(self.children):
result += indentation + str(child.getChildnum()) + ": " + str(child)
return result
def isPrimitiveType(self):
# Strings and integers are primitive types.
if self._type == TYPE_SIMPLE_STRING or self._type == TYPE_SIMPLE_INT:
return True
return False
def nodeOnlyRepresentation(self):
result = str(self._type)
if self.flags:
result += "\n" + "flags: " + self.flags
return result
def iter_DFS(self):
"""
Yield all nodes in DFS order.
"""
yield self
if self.getChildren():
for child in self.children:
for child in child.iter_DFS():
yield child
def cutFromParent(self):
for i, child in enumerate(self.getParent().getChildren()):
if child == self:
self.getParent().getChildren().pop(i)