Class: RBI::Rewriters::Merge

Inherits:
Object
  • Object
show all
Extended by:
T::Sig
Defined in:
lib/rbi/rewriters/merge_trees.rb

Overview

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 ~~~

Defined Under Namespace

Classes: Conflict, ConflictTreeMerger, TreeMerger

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(left_name: "left", right_name: "right") ⇒ Merge

Returns a new instance of Merge.



56
57
58
59
60
61
# File 'lib/rbi/rewriters/merge_trees.rb', line 56

def initialize(left_name: "left", right_name: "right")
  @left_name = left_name
  @right_name = right_name
  @tree = T.let(Tree.new, Tree)
  @scope_stack = T.let([@tree], T::Array[Tree])
end

Instance Attribute Details

#treeObject (readonly)

Returns the value of attribute tree.



53
54
55
# File 'lib/rbi/rewriters/merge_trees.rb', line 53

def tree
  @tree
end

Class Method Details

.merge_trees(left, right, left_name: "left", right_name: "right") ⇒ Object



43
44
45
46
47
48
49
50
# File 'lib/rbi/rewriters/merge_trees.rb', line 43

def self.merge_trees(left, right, left_name: "left", right_name: "right")
  rewriter = Rewriters::Merge.new(left_name: left_name, right_name: right_name)
  rewriter.merge(left)
  rewriter.merge(right)
  tree = rewriter.tree
  ConflictTreeMerger.new.visit(tree)
  tree
end

Instance Method Details

#merge(tree) ⇒ Object



64
65
66
67
68
# File 'lib/rbi/rewriters/merge_trees.rb', line 64

def merge(tree)
  v = TreeMerger.new(@tree, left_name: @left_name, right_name: @right_name)
  v.visit(tree)
  v.conflicts
end