@@ -128,7 +128,7 @@ def visit(node)
128128 prev = previous_definition ( node )
129129
130130 if prev . is_a? ( Scope )
131- if merge_nodes? ( prev , node ) || @keep == Keep ::LEFT
131+ if merge_nodes ( prev , node ) == :compatible || @keep == Keep ::LEFT
132132 # do nothing it's already merged
133133 elsif @keep == Keep ::RIGHT
134134 prev = replace_scope_header ( prev , node )
@@ -150,7 +150,7 @@ def visit(node)
150150 when Indexable
151151 prev = previous_definition ( node )
152152 if prev
153- if merge_nodes? ( prev , node ) || @keep == Keep ::LEFT
153+ if merge_nodes ( prev , node ) == :compatible || @keep == Keep ::LEFT
154154 # do nothing it's already merged
155155 elsif @keep == Keep ::RIGHT
156156 prev . replace ( node )
@@ -221,12 +221,13 @@ def merge_comments(left, right)
221221 end
222222 end
223223
224- # Returns false if nodes are incompatible. This method merges any
224+ # Returns `:incompatible` or `:compatible` depending on whether the two nodes
225+ # should be merged together. This method merges any
225226 # type references in the node, but the caller is responsible for
226- # merging children if the return value is true .
227- #: (Node left, Node right) -> bool
228- def merge_nodes? ( left , right )
229- return false unless left . class == right . class
227+ # merging children if the return value is :compatible .
228+ #: (Node left, Node right) -> Symbol
229+ def merge_nodes ( left , right )
230+ return :incompatible unless left . class == right . class
230231
231232 merge_comments ( left , right ) if left . is_a? ( NodeWithComments ) && right . is_a? ( NodeWithComments )
232233
@@ -235,17 +236,21 @@ def merge_nodes?(left, right)
235236 right = right #: as Class
236237 left_superclass = lookup_type ( name : left . superclass_name , referrer : left )
237238 right_superclass = lookup_type ( name : right . superclass_name , referrer : right )
238- left_superclass == right_superclass
239+ left_superclass == right_superclass ? :compatible : :incompatible
240+
239241 when Struct
240242 right = right #: as Struct
241- left . members == right . members && left . keyword_init == right . keyword_init
243+ left . members == right . members && left . keyword_init == right . keyword_init ? :compatible : :incompatible
244+
242245 when Const
243246 right = right #: as Const
244- left . name == right . name && left . value == right . value
247+ left . name == right . name && left . value == right . value ? :compatible : :incompatible
248+
245249 when Attr , Method
246250 right = right #: as Attr | Method
247- return false if left . is_a? ( Method ) && right . is_a? ( Method ) && left . params != right . params
248- return false if left . is_a? ( Attr ) && right . is_a? ( Attr ) && left . names != right . names
251+
252+ return :incompatible if left . is_a? ( Method ) && right . is_a? ( Method ) && left . params != right . params
253+ return :incompatible if left . is_a? ( Attr ) && right . is_a? ( Attr ) && left . names != right . names
249254
250255 left_sigs = left . sigs . map { fully_qualify_sig ( _1 , referrer : left ) }
251256 right_sigs = right . sigs . map { fully_qualify_sig ( _1 , referrer : right ) }
@@ -254,27 +259,32 @@ def merge_nodes?(left, right)
254259 left_sigs << sig unless left_sigs . include? ( sig )
255260 end
256261 left . sigs = left_sigs
257- true
262+ :compatible
258263 else
259- false
264+ :incompatible
260265 end
266+
261267 when Mixin
262268 right = right #: as Mixin
263269 left_mixins = left . names . map { lookup_type ( name : _1 , referrer : left ) }
264270 right_mixins = right . names . map { lookup_type ( name : _1 , referrer : right ) }
265- left_mixins == right_mixins
271+ left_mixins == right_mixins ? :compatible : :incompatible
272+
266273 when Helper
267274 # Do Helper names need to be resolved to types?
268275 right = right #: as Helper
269- left . name == right . name
276+ left . name == right . name ? :compatible : :incompatible
277+
270278 when Send
271279 right = right #: as Send
272- left . method == right . method && left . args == right . args
280+ left . method == right . method && left . args == right . args ? :compatible : :incompatible
281+
273282 when TStructField
274283 right = right #: as TStructField
275- left . name == right . name && left . type == right . type && left . default == right . default
284+ left . class == right . class && left . name == right . name && left . type == right . type && left . default == right . default ? :compatible : :incompatible
285+
276286 else
277- true
287+ :compatible
278288 end
279289 end
280290
0 commit comments