Class: RBI::Rewriters::Merge
- Inherits:
-
Object
- Object
- RBI::Rewriters::Merge
- 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
-
#tree ⇒ Object
readonly
: MergeTree.
Class Method Summary collapse
-
.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.
Instance Method Summary collapse
-
#initialize(left_name: "left", right_name: "right", keep: Keep::NONE) ⇒ Merge
constructor
: (?left_name: String, ?right_name: String, ?keep: Keep) -> void.
-
#merge(tree) ⇒ Object
: (Tree tree) -> void.
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
#tree ⇒ Object (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 |