class RBI::Rewriters::Merge

Merge two RBI trees together

Be this `Tree`: ~~~rb class Foo

attr_accessor :a
def m; end
C = 10

end ~~~

Merged with this one: ~~~rb class Foo

attr_reader :a
def m(x); end
C = 10

end ~~~

Compatible definitions are merged together while incompatible definitions are moved into a `ConflictTree`: ~~~rb class Foo

<<<<<<< left
attr_accessor :a
def m; end
=======
attr_reader :a
def m(x); end
>>>>>>> right
C = 10

end ~~~

Attributes

tree[R]

Public Class Methods

merge_trees(left, right, left_name: "left", right_name: "right", keep: Keep::NONE) click to toggle source
# File lib/rbi/rewriters/merge_trees.rb, line 51
def self.merge_trees(left, right, left_name: "left", right_name: "right", keep: Keep::NONE)
  left.nest_singleton_methods!
  right.nest_singleton_methods!
  rewriter = Rewriters::Merge.new(left_name: left_name, right_name: right_name, keep: keep)
  rewriter.merge(left)
  rewriter.merge(right)
  tree = rewriter.tree
  ConflictTreeMerger.new.visit(tree)
  tree
end
new(left_name: "left", right_name: "right", keep: Keep::NONE) click to toggle source
# File lib/rbi/rewriters/merge_trees.rb, line 66
def initialize(left_name: "left", right_name: "right", keep: Keep::NONE)
  @left_name = left_name
  @right_name = right_name
  @keep = keep
  @tree = T.let(Tree.new, Tree)
  @scope_stack = T.let([@tree], T::Array[Tree])
end

Public Instance Methods

merge(tree) click to toggle source
# File lib/rbi/rewriters/merge_trees.rb, line 75
def merge(tree)
  v = TreeMerger.new(@tree, left_name: @left_name, right_name: @right_name, keep: @keep)
  v.visit(tree)
  v.conflicts
end