Class: RBI::Rewriters::Merge

Inherits:
Object
  • Object
show all
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, Keep, TreeMerger

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

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

: (?left_name: String, ?right_name: String, ?keep: Keep) -> void



66
67
68
69
70
71
72
# 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(MergeTree.new, MergeTree)
  @scope_stack = T.let([@tree], T::Array[Tree])
end

Instance Attribute Details

#treeObject (readonly)

: MergeTree



63
64
65
# File 'lib/rbi/rewriters/merge_trees.rb', line 63

def tree
  @tree
end

Class Method Details

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

: (Tree left, Tree right, ?left_name: String, ?right_name: String, ?keep: Keep) -> MergeTree



50
51
52
53
54
55
56
57
58
59
# File 'lib/rbi/rewriters/merge_trees.rb', line 50

def 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

Instance Method Details

#merge(tree) ⇒ Object

: (Tree tree) -> void



75
76
77
78
79
# 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)
  @tree.conflicts.concat(v.conflicts)
end