Method: TypeProf::Core::AST::Node#diff

Defined in:
lib/typeprof/core/ast/base.rb

#diff(prev_node) ⇒ Object



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 # annotation
    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