rbi 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -324,11 +324,26 @@ module RBI
324
324
  #: (Node other) -> void
325
325
  def merge_with(other)
326
326
  return unless other.is_a?(NodeWithComments)
327
+ return unless other.comments?
328
+
329
+ comments_by_text = {} #: Hash[String, Array[Comment]]
330
+ comments.each { |comment| index_comment(comments_by_text, comment) }
327
331
 
328
332
  other.comments.each do |comment|
329
- comments << comment unless comments.include?(comment)
333
+ comments << comment if index_comment(comments_by_text, comment)
330
334
  end
331
335
  end
336
+
337
+ private
338
+
339
+ #: (Hash[String, Array[Comment]] index, Comment comment) -> bool
340
+ def index_comment(index, comment)
341
+ same_text = index[comment.text] ||= []
342
+ return false if same_text.any? { |indexed| indexed == comment }
343
+
344
+ same_text << comment
345
+ true
346
+ end
332
347
  end
333
348
 
334
349
  class Tree
@@ -467,6 +482,9 @@ module RBI
467
482
  return false unless other.is_a?(Method)
468
483
  return false unless name == other.name
469
484
  return false unless params.size == other.params.size
485
+ if (params_have_forwarding?(params) || params_have_forwarding?(other.params)) && params != other.params
486
+ return false
487
+ end
470
488
 
471
489
  if sigs.empty? && other.sigs.empty?
472
490
  compatible_params?(other)
@@ -485,8 +503,9 @@ module RBI
485
503
  super
486
504
 
487
505
  if sigs.empty? && !other.sigs.empty?
488
- @params = other.params.dup
506
+ @params = other.params.map(&:dup)
489
507
  @sigs = other.sigs.dup
508
+ rename_sigs_params(@sigs, @params)
490
509
  return
491
510
  end
492
511
 
@@ -503,8 +522,10 @@ module RBI
503
522
  #: (Method other) -> bool
504
523
  def compatible_params?(other)
505
524
  return true if params == other.params
525
+ return false unless params.size == other.params.size
506
526
 
507
527
  params.zip(other.params).all? do |p1, p2|
528
+ p2 = p2 #: as !nil
508
529
  p1.compatible_with?(p2)
509
530
  end
510
531
  end
@@ -512,20 +533,26 @@ module RBI
512
533
  #: (Array[Param] preferred, Array[Param] fallback) -> Array[Param]
513
534
  def merge_params(preferred, fallback)
514
535
  preferred.zip(fallback).map do |p1, p2|
536
+ p2 = p2 #: as !nil
515
537
  if p1.anonymous?
516
- p2.dup #: as !nil
538
+ p2.dup
517
539
  else
518
540
  p1.dup
519
541
  end
520
542
  end
521
543
  end
522
544
 
545
+ #: (Array[Param] params) -> bool
546
+ def params_have_forwarding?(params)
547
+ params.any?(ForwardingParam)
548
+ end
549
+
523
550
  #: (Array[Sig] sigs, Array[Param] params) -> void
524
551
  def rename_sigs_params(sigs, params)
525
552
  sigs.each do |sig|
526
- sig_params = sig.params.zip(params).map do |sig_param, param|
527
- param = param #: as !nil
528
- name = if sig_param.anonymous? && !param.anonymous?
553
+ sig_params = sig.params.each_with_index.map do |sig_param, index|
554
+ param = params[index]
555
+ name = if param && sig_param.anonymous? && !param.anonymous?
529
556
  param.name #: as !nil
530
557
  else
531
558
  sig_param.name
data/lib/rbi/type.rb CHANGED
@@ -315,29 +315,29 @@ module RBI
315
315
  #: Simple
316
316
  attr_reader :type
317
317
 
318
- #: Type?
319
- attr_reader :type_parameter
318
+ #: Array[Type]
319
+ attr_reader :type_parameters
320
320
 
321
- #: (Simple type, ?Type? type_parameter) -> void
322
- def initialize(type, type_parameter = nil)
321
+ #: (Simple type, *Type type_parameters) -> void
322
+ def initialize(type, *type_parameters)
323
323
  super()
324
324
  @type = type
325
- @type_parameter = type_parameter
325
+ @type_parameters = type_parameters #: Array[Type]
326
326
  end
327
327
 
328
328
  # @override
329
329
  #: (BasicObject other) -> bool
330
330
  def ==(other)
331
- ClassOf === other && @type == other.type && @type_parameter == other.type_parameter
331
+ ClassOf === other && @type == other.type && @type_parameters == other.type_parameters
332
332
  end
333
333
 
334
334
  # @override
335
335
  #: -> String
336
336
  def to_rbi
337
- if @type_parameter
338
- "::T.class_of(#{@type.to_rbi})[#{@type_parameter.to_rbi}]"
339
- else
337
+ if @type_parameters.empty?
340
338
  "::T.class_of(#{@type.to_rbi})"
339
+ else
340
+ "::T.class_of(#{@type.to_rbi})[#{@type_parameters.map(&:to_rbi).join(", ")}]"
341
341
  end
342
342
  end
343
343
 
@@ -913,9 +913,9 @@ module RBI
913
913
  end
914
914
 
915
915
  # Builds a type that represents the singleton class of another type like `T.class_of(Foo)`.
916
- #: (Simple type, ?Type? type_parameter) -> ClassOf
917
- def class_of(type, type_parameter = nil)
918
- ClassOf.new(type, type_parameter)
916
+ #: (Simple type, *(Type | Array[Type]) type_parameters) -> ClassOf
917
+ def class_of(type, *type_parameters)
918
+ ClassOf.new(type, *type_parameters.flatten)
919
919
  end
920
920
 
921
921
  # Builds a type that represents a nilable of another type like `T.nilable(String)`.
@@ -130,7 +130,7 @@ module RBI
130
130
  return Type::Generic.new(recv.slice, *args.map { |arg| parse_node(arg) })
131
131
  end
132
132
  when Prism::CallNode
133
- # `T.class_of(Foo)[Bar]`
133
+ # `T.class_of(Foo)[Foo]` or `T.class_of(Foo)[Foo, Bar]`
134
134
  if t_class_of?(recv)
135
135
  type_args = check_arguments_exactly!(recv, 1)
136
136
  type = parse_node(
@@ -138,11 +138,9 @@ module RBI
138
138
  )
139
139
  raise Error, "Expected a simple type, got `#{type}`" unless type.is_a?(Type::Simple)
140
140
 
141
- type_param_args = check_arguments_exactly!(node, 1)
142
- type_param = parse_node(
143
- type_param_args.first, #: as !nil
144
- )
145
- return Type::ClassOf.new(type, type_param)
141
+ type_parameter_args = check_arguments_at_least!(node, 1)
142
+ type_parameters = type_parameter_args.map { |arg| parse_node(arg) }
143
+ return Type::ClassOf.new(type, *type_parameters)
146
144
  end
147
145
  end
148
146
 
data/lib/rbi/version.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module RBI
5
- VERSION = "0.4.2"
5
+ VERSION = "0.5.0"
6
6
  end
data/lib/rbi/visitor.rb CHANGED
@@ -63,8 +63,12 @@ module RBI
63
63
  visit_kw_opt_param(node)
64
64
  when KwRestParam
65
65
  visit_kw_rest_param(node)
66
+ when NoKwParam
67
+ visit_no_kw_param(node)
66
68
  when BlockParam
67
69
  visit_block_param(node)
70
+ when ForwardingParam
71
+ visit_forwarding_param(node)
68
72
  when Include
69
73
  visit_include(node)
70
74
  when Extend
@@ -173,9 +177,15 @@ module RBI
173
177
  #: (KwRestParam node) -> void
174
178
  def visit_kw_rest_param(node); end
175
179
 
180
+ #: (NoKwParam node) -> void
181
+ def visit_no_kw_param(node); end
182
+
176
183
  #: (BlockParam node) -> void
177
184
  def visit_block_param(node); end
178
185
 
186
+ #: (ForwardingParam node) -> void
187
+ def visit_forwarding_param(node); end
188
+
179
189
  #: (Include node) -> void
180
190
  def visit_include(node); end
181
191