139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
# File 'lib/typeprof/core/ast/base.rb', line 139
def diff(prev_node)
if prev_node.is_a?(self.class) && attrs.all? {|key, attr| attr == prev_node.send(key) }
raise unless prev_node s1 = subnodes
s2 = prev_node.subnodes
return if s1.keys != s2.keys
s1.each do |key, subnode|
prev_subnode = s2[key]
if subnode && prev_subnode
subnode = [subnode] if subnode.is_a?(AST::Node)
prev_subnode = [prev_subnode] if prev_subnode.is_a?(AST::Node)
subnode.zip(prev_subnode) do |subnode0, prev_subnode0|
next if subnode0 == nil && prev_subnode0 == nil
subnode0.diff(prev_subnode0)
return unless subnode0.prev_node
end
else
return if subnode != prev_subnode
end
end
@prev_node = prev_node
end
end
|