rbi 0.3.1 → 0.3.2

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df7c963f26d929bf1c52a460d2f6f47669aa5eb23ce9ebe061ec556ea91247b1
4
- data.tar.gz: 4d86c174bb9270e060978f512d4193cdf1f427b9059c49bc2c913f3a0b25e4c5
3
+ metadata.gz: 30c1564f6fad1d76035f6cd07bf31237251e6c622350aa4911797980b3a17414
4
+ data.tar.gz: 1d1350fa25cf2dad93c59e74288372701bfe73c6214d46e279350a953269786d
5
5
  SHA512:
6
- metadata.gz: d42622aa6fed586afe5f8c247144d3d36b6409107df4bd8a6e53b9f96812523f9d6e098ab95e8e715e9b0f4a2bb6d24dffa7831f251367038fb69a164a827496
7
- data.tar.gz: 8e97964c77c0b5d96b763ab6e0b502bf5cd6fb56bbab556efe073d30a74cb1912e13777635c26993702ef5974dbe971520ac153fe8f8cc5ce481055659c3c91c
6
+ metadata.gz: a273b8f7e57c8471e8a9d46f71c7b554e2416243e7ef1c953137720543f7dd70f4166b0c916e327dcb9cf516e0668deaf56027ade2c36485f9fce10cfedb9d9d
7
+ data.tar.gz: e03adcd232b2557c68d6a18a62c0e0b1977e8f4cccb3a8718f711ae2ec35ded301026021a7d39829da51286348089cdde3593d0b3bb1703da8d69a86af6364c5
data/Gemfile CHANGED
@@ -10,7 +10,7 @@ group(:development, :test) do
10
10
  gem("minitest")
11
11
  gem("minitest-reporters")
12
12
  gem("rake", "~> 13.2")
13
- gem("rubocop", "~> 1.73", require: false)
13
+ gem("rubocop", "~> 1.75", require: false)
14
14
  gem("rubocop-shopify", require: false)
15
15
  gem("rubocop-sorbet", require: false)
16
16
  gem("sorbet", ">= 0.5.9204", require: false)
data/lib/rbi/formatter.rb CHANGED
@@ -6,14 +6,15 @@ module RBI
6
6
  #: Integer?
7
7
  attr_accessor :max_line_length
8
8
 
9
- #: (?add_sig_templates: bool, ?group_nodes: bool, ?max_line_length: Integer?, ?nest_singleton_methods: bool, ?nest_non_public_members: bool, ?sort_nodes: bool) -> void
9
+ #: (?add_sig_templates: bool, ?group_nodes: bool, ?max_line_length: Integer?, ?nest_singleton_methods: bool, ?nest_non_public_members: bool, ?sort_nodes: bool, ?replace_attributes_with_methods: bool) -> void
10
10
  def initialize(
11
11
  add_sig_templates: false,
12
12
  group_nodes: false,
13
13
  max_line_length: nil,
14
14
  nest_singleton_methods: false,
15
15
  nest_non_public_members: false,
16
- sort_nodes: false
16
+ sort_nodes: false,
17
+ replace_attributes_with_methods: false
17
18
  )
18
19
  @add_sig_templates = add_sig_templates
19
20
  @group_nodes = group_nodes
@@ -21,6 +22,7 @@ module RBI
21
22
  @nest_singleton_methods = nest_singleton_methods
22
23
  @nest_non_public_members = nest_non_public_members
23
24
  @sort_nodes = sort_nodes
25
+ @replace_attributes_with_methods = replace_attributes_with_methods
24
26
  end
25
27
 
26
28
  #: (RBI::File file) -> String
@@ -36,6 +38,7 @@ module RBI
36
38
 
37
39
  #: (RBI::Tree tree) -> void
38
40
  def format_tree(tree)
41
+ tree.replace_attributes_with_methods! if @replace_attributes_with_methods
39
42
  tree.add_sig_templates! if @add_sig_templates
40
43
  tree.nest_singleton_methods! if @nest_singleton_methods
41
44
  tree.nest_non_public_members! if @nest_non_public_members
data/lib/rbi/index.rb CHANGED
@@ -17,7 +17,7 @@ module RBI
17
17
  #: -> void
18
18
  def initialize
19
19
  super
20
- @index = T.let({}, T::Hash[String, T::Array[Node]])
20
+ @index = {} #: Hash[String, Array[Node]]
21
21
  end
22
22
 
23
23
  #: -> Array[String]
@@ -217,7 +217,17 @@ module RBI
217
217
  # @override
218
218
  #: -> Array[String]
219
219
  def index_ids
220
- [to_s]
220
+ [fully_qualified_name]
221
+ end
222
+ end
223
+
224
+ class TEnumValue
225
+ include Indexable
226
+
227
+ # @override
228
+ #: -> Array[String]
229
+ def index_ids
230
+ [fully_qualified_name]
221
231
  end
222
232
  end
223
233
  end
data/lib/rbi/loc.rb CHANGED
@@ -50,7 +50,7 @@ module RBI
50
50
 
51
51
  string = String.new
52
52
  ::File.foreach(file).with_index do |line, line_number|
53
- string << line if line_number + 1 >= begin_line && line_number + 1 <= end_line
53
+ string << line if (line_number + 1).between?(begin_line, end_line)
54
54
  end
55
55
  string
56
56
  end
data/lib/rbi/model.rb CHANGED
@@ -45,7 +45,7 @@ module RBI
45
45
 
46
46
  #: -> Scope?
47
47
  def parent_scope
48
- parent = T.let(parent_tree, T.nilable(Tree))
48
+ parent = parent_tree #: Tree?
49
49
  parent = parent.parent_tree until parent.is_a?(Scope) || parent.nil?
50
50
  parent
51
51
  end
@@ -105,7 +105,9 @@ module RBI
105
105
  def annotations
106
106
  comments
107
107
  .select { |comment| comment.text.start_with?("@") }
108
- .map { |comment| T.must(comment.text[1..]) }
108
+ .map do |comment|
109
+ comment.text[1..] #: as !nil
110
+ end
109
111
  end
110
112
  end
111
113
 
@@ -116,7 +118,7 @@ module RBI
116
118
  #: (?loc: Loc?, ?comments: Array[Comment]) ?{ (Tree node) -> void } -> void
117
119
  def initialize(loc: nil, comments: [], &block)
118
120
  super(loc: loc, comments: comments)
119
- @nodes = T.let([], T::Array[Node])
121
+ @nodes = [] #: Array[Node]
120
122
  block&.call(self)
121
123
  end
122
124
 
@@ -144,7 +146,7 @@ module RBI
144
146
 
145
147
  #: (?strictness: String?, ?comments: Array[Comment]) ?{ (File file) -> void } -> void
146
148
  def initialize(strictness: nil, comments: [], &block)
147
- @root = T.let(Tree.new, Tree)
149
+ @root = Tree.new #: Tree
148
150
  @strictness = strictness
149
151
  @comments = comments
150
152
  block&.call(self)
@@ -313,7 +315,7 @@ module RBI
313
315
  #: (Symbol name, Array[Symbol] names, ?visibility: Visibility, ?sigs: Array[Sig], ?loc: Loc?, ?comments: Array[Comment]) -> void
314
316
  def initialize(name, names, visibility: Public.new, sigs: [], loc: nil, comments: [])
315
317
  super(loc: loc, comments: comments)
316
- @names = T.let([name, *names], T::Array[Symbol])
318
+ @names = [name, *names] #: Array[Symbol]
317
319
  @visibility = visibility
318
320
  @sigs = sigs
319
321
  end
@@ -671,7 +673,7 @@ module RBI
671
673
  #: (String name, Array[String] names, ?loc: Loc?, ?comments: Array[Comment]) -> void
672
674
  def initialize(name, names, loc: nil, comments: [])
673
675
  super(loc: loc, comments: comments)
674
- @names = T.let([name, *names], T::Array[String])
676
+ @names = [name, *names] #: Array[String]
675
677
  end
676
678
  end
677
679
 
@@ -1037,6 +1039,29 @@ module RBI
1037
1039
  end
1038
1040
  end
1039
1041
 
1042
+ class TEnumValue < NodeWithComments
1043
+ #: String
1044
+ attr_reader :name
1045
+
1046
+ #: (String name, ?loc: Loc?, ?comments: Array[Comment]) ?{ (TEnumValue node) -> void } -> void
1047
+ def initialize(name, loc: nil, comments: [], &block)
1048
+ super(loc: loc, comments: comments)
1049
+ @name = name
1050
+ block&.call(self)
1051
+ end
1052
+
1053
+ #: -> String
1054
+ def fully_qualified_name
1055
+ "#{parent_scope&.fully_qualified_name}::#{name}"
1056
+ end
1057
+
1058
+ # @override
1059
+ #: -> String
1060
+ def to_s
1061
+ fully_qualified_name
1062
+ end
1063
+ end
1064
+
1040
1065
  # Sorbet's misc.
1041
1066
 
1042
1067
  class Helper < NodeWithComments
data/lib/rbi/parser.rb CHANGED
@@ -136,7 +136,18 @@ module RBI
136
136
 
137
137
  #: (Prism::Node node) -> String
138
138
  def node_string!(node)
139
- T.must(node_string(node))
139
+ node_string(node) #: as !nil
140
+ end
141
+
142
+ #: (Prism::Node node) -> Prism::Location
143
+ def adjust_prism_location_for_heredoc(node)
144
+ visitor = HeredocLocationVisitor.new(
145
+ node.location.send(:source),
146
+ node.location.start_offset,
147
+ node.location.end_offset,
148
+ )
149
+ visitor.visit(node)
150
+ visitor.location
140
151
  end
141
152
  end
142
153
 
@@ -151,12 +162,12 @@ module RBI
151
162
  def initialize(source, comments:, file:)
152
163
  super(source, file: file)
153
164
 
154
- @comments_by_line = T.let(comments.to_h { |c| [c.location.start_line, c] }, T::Hash[Integer, Prism::Comment])
155
- @tree = T.let(Tree.new, Tree)
165
+ @comments_by_line = comments.to_h { |c| [c.location.start_line, c] } #: Hash[Integer, Prism::Comment]
166
+ @tree = Tree.new #: Tree
156
167
 
157
- @scopes_stack = T.let([@tree], T::Array[Tree])
158
- @last_node = T.let(nil, T.nilable(Prism::Node))
159
- @last_sigs = T.let([], T::Array[RBI::Sig])
168
+ @scopes_stack = [@tree] #: Array[Tree]
169
+ @last_node = nil #: Prism::Node?
170
+ @last_sigs = [] #: Array[RBI::Sig]
160
171
  end
161
172
 
162
173
  # @override
@@ -217,30 +228,51 @@ module RBI
217
228
 
218
229
  current_scope << if struct
219
230
  struct
220
- elsif type_variable_definition?(node.value)
221
- TypeMember.new(
231
+ elsif t_enum_value?(node)
232
+ TEnumValue.new(
222
233
  case node
223
234
  when Prism::ConstantWriteNode
224
235
  node.name.to_s
225
236
  when Prism::ConstantPathWriteNode
226
237
  node_string!(node.target)
227
238
  end,
228
- node_string!(node.value),
229
239
  loc: node_loc(node),
230
240
  comments: node_comments(node),
231
241
  )
232
242
  else
233
- Const.new(
234
- case node
235
- when Prism::ConstantWriteNode
236
- node.name.to_s
237
- when Prism::ConstantPathWriteNode
238
- node_string!(node.target)
239
- end,
240
- node_string!(node.value),
241
- loc: node_loc(node),
242
- comments: node_comments(node),
243
+ adjusted_node_location = adjust_prism_location_for_heredoc(node)
244
+
245
+ adjusted_value_location = Prism::Location.new(
246
+ node.value.location.send(:source),
247
+ node.value.location.start_offset,
248
+ adjusted_node_location.end_offset - node.value.location.start_offset,
243
249
  )
250
+
251
+ if type_variable_definition?(node.value)
252
+ TypeMember.new(
253
+ case node
254
+ when Prism::ConstantWriteNode
255
+ node.name.to_s
256
+ when Prism::ConstantPathWriteNode
257
+ node_string!(node.target)
258
+ end,
259
+ adjusted_value_location.slice,
260
+ loc: Loc.from_prism(@file, adjusted_node_location),
261
+ comments: node_comments(node),
262
+ )
263
+ else
264
+ Const.new(
265
+ case node
266
+ when Prism::ConstantWriteNode
267
+ node.name.to_s
268
+ when Prism::ConstantPathWriteNode
269
+ node_string!(node.target)
270
+ end,
271
+ adjusted_value_location.slice,
272
+ loc: Loc.from_prism(@file, adjusted_node_location),
273
+ comments: node_comments(node),
274
+ )
275
+ end
244
276
  end
245
277
  end
246
278
 
@@ -509,7 +541,7 @@ module RBI
509
541
  # Collect all the remaining comments after visiting the tree
510
542
  #: -> void
511
543
  def collect_orphan_comments
512
- last_line = T.let(nil, T.nilable(Integer))
544
+ last_line = nil #: Integer?
513
545
  last_node_end = @tree.nodes.last&.loc&.end_line
514
546
 
515
547
  @comments_by_line.each do |line, comment|
@@ -532,7 +564,7 @@ module RBI
532
564
 
533
565
  #: -> Tree
534
566
  def current_scope
535
- T.must(@scopes_stack.last) # Should never be nil since we create a Tree as the root
567
+ @scopes_stack.last #: as !nil # Should never be nil since we create a Tree as the root
536
568
  end
537
569
 
538
570
  #: -> Array[Sig]
@@ -544,7 +576,7 @@ module RBI
544
576
 
545
577
  #: (Array[Sig] sigs) -> Array[Comment]
546
578
  def detach_comments_from_sigs(sigs)
547
- comments = T.let([], T::Array[Comment])
579
+ comments = [] #: Array[Comment]
548
580
 
549
581
  sigs.each do |sig|
550
582
  comments += sig.comments.dup
@@ -587,7 +619,7 @@ module RBI
587
619
 
588
620
  #: (Prism::Node? node) -> Array[Arg]
589
621
  def parse_send_args(node)
590
- args = T.let([], T::Array[Arg])
622
+ args = [] #: Array[Arg]
591
623
  return args unless node.is_a?(Prism::ArgumentsNode)
592
624
 
593
625
  node.arguments.each do |arg|
@@ -598,11 +630,13 @@ module RBI
598
630
 
599
631
  args << KwArg.new(
600
632
  node_string!(assoc.key).delete_suffix(":"),
601
- T.must(node_string(assoc.value)),
633
+ node_string(assoc.value), #: as !nil
602
634
  )
603
635
  end
604
636
  else
605
- args << Arg.new(T.must(node_string(arg)))
637
+ args << Arg.new(
638
+ node_string(arg), #: as !nil
639
+ )
606
640
  end
607
641
  end
608
642
 
@@ -703,7 +737,7 @@ module RBI
703
737
  return unless node_string(recv) =~ /(::)?Struct/
704
738
 
705
739
  members = []
706
- keyword_init = T.let(false, T::Boolean)
740
+ keyword_init = false #: bool
707
741
 
708
742
  args = send.arguments
709
743
  if args.is_a?(Prism::ArgumentsNode)
@@ -753,7 +787,7 @@ module RBI
753
787
  type = node_string!(type_arg)
754
788
  loc = node_loc(send)
755
789
  comments = node_comments(send)
756
- default_value = T.let(nil, T.nilable(String))
790
+ default_value = nil #: String?
757
791
 
758
792
  rest.each do |arg|
759
793
  next unless arg.is_a?(Prism::KeywordHashNode)
@@ -819,6 +853,19 @@ module RBI
819
853
  def type_variable_definition?(node)
820
854
  node.is_a?(Prism::CallNode) && (node.message == "type_member" || node.message == "type_template")
821
855
  end
856
+
857
+ #: (Prism::Node? node) -> bool
858
+ def t_enum_value?(node)
859
+ return false unless current_scope.is_a?(TEnumBlock)
860
+
861
+ return false unless node.is_a?(Prism::ConstantWriteNode)
862
+
863
+ value = node.value
864
+ return false unless value.is_a?(Prism::CallNode)
865
+ return false unless value.message == "new"
866
+
867
+ true
868
+ end
822
869
  end
823
870
 
824
871
  class SigBuilder < Visitor
@@ -829,7 +876,7 @@ module RBI
829
876
  def initialize(content, file:)
830
877
  super
831
878
 
832
- @current = T.let(Sig.new, Sig)
879
+ @current = Sig.new #: Sig
833
880
  end
834
881
 
835
882
  # @override
@@ -903,5 +950,57 @@ module RBI
903
950
  )
904
951
  end
905
952
  end
953
+
954
+ class HeredocLocationVisitor < Prism::Visitor
955
+ #: (Prism::Source source, Integer begin_offset, Integer end_offset) -> void
956
+ def initialize(source, begin_offset, end_offset)
957
+ super()
958
+ @source = source
959
+ @begin_offset = begin_offset
960
+ @end_offset = end_offset
961
+ @offset_last_newline = false #: bool
962
+ end
963
+
964
+ #: (Prism::StringNode node) -> void
965
+ def visit_string_node(node)
966
+ return unless node.heredoc?
967
+
968
+ closing_loc = node.closing_loc
969
+ return unless closing_loc
970
+
971
+ handle_string_node(node)
972
+ end
973
+
974
+ #: (Prism::InterpolatedStringNode node) -> void
975
+ def visit_interpolated_string_node(node)
976
+ return super unless node.heredoc?
977
+
978
+ closing_loc = node.closing_loc
979
+ return super unless closing_loc
980
+
981
+ handle_string_node(node)
982
+ end
983
+
984
+ #: -> Prism::Location
985
+ def location
986
+ Prism::Location.new(
987
+ @source,
988
+ @begin_offset,
989
+ @end_offset - @begin_offset - (@offset_last_newline ? 1 : 0),
990
+ )
991
+ end
992
+
993
+ private
994
+
995
+ #: (Prism::StringNode | Prism::InterpolatedStringNode node) -> void
996
+ def handle_string_node(node)
997
+ closing_loc = node.closing_loc #: as !nil
998
+
999
+ if closing_loc.end_offset > @end_offset
1000
+ @end_offset = closing_loc.end_offset
1001
+ @offset_last_newline = true if node.closing_loc&.slice&.end_with?("\n")
1002
+ end
1003
+ end
1004
+ end
906
1005
  end
907
1006
  end
data/lib/rbi/printer.rb CHANGED
@@ -23,8 +23,8 @@ module RBI
23
23
  @out = out
24
24
  @current_indent = indent
25
25
  @print_locs = print_locs
26
- @in_visibility_group = T.let(false, T::Boolean)
27
- @previous_node = T.let(nil, T.nilable(Node))
26
+ @in_visibility_group = false #: bool
27
+ @previous_node = nil #: Node?
28
28
  @max_line_length = max_line_length
29
29
  end
30
30
 
@@ -542,6 +542,16 @@ module RBI
542
542
  printl("end")
543
543
  end
544
544
 
545
+ # @override
546
+ #: (TEnumValue node) -> void
547
+ def visit_tenum_value(node)
548
+ print_blank_line_before(node)
549
+ print_loc(node)
550
+ visit_all(node.comments)
551
+
552
+ printl("#{node.name} = new")
553
+ end
554
+
545
555
  # @override
546
556
  #: (TypeMember node) -> void
547
557
  def visit_type_member(node)
@@ -675,6 +685,13 @@ module RBI
675
685
  node.comments.empty? && node.empty?
676
686
  when Attr
677
687
  node.comments.empty? && node.sigs.empty?
688
+ when Const
689
+ return false unless node.comments.empty?
690
+
691
+ loc = node.loc
692
+ return true unless loc
693
+
694
+ loc.begin_line == loc.end_line
678
695
  when Method
679
696
  node.comments.empty? && node.sigs.empty? && node.params.all? { |p| p.comments.empty? }
680
697
  when Sig
@@ -722,7 +739,9 @@ module RBI
722
739
  printn(" do")
723
740
  indent
724
741
  if modifiers.any?
725
- printl(T.must(modifiers.first))
742
+ printl(
743
+ modifiers.first, #: as !nil
744
+ )
726
745
  indent
727
746
  modifiers[1..]&.each do |modifier|
728
747
  printl(".#{modifier}")
@@ -771,7 +790,7 @@ module RBI
771
790
 
772
791
  #: (Sig node) -> Array[String]
773
792
  def sig_modifiers(node)
774
- modifiers = T.let([], T::Array[String])
793
+ modifiers = [] #: Array[String]
775
794
  modifiers << "abstract" if node.is_abstract
776
795
 
777
796
  if node.is_override
@@ -21,7 +21,7 @@ module RBI
21
21
  #: (Method) -> void
22
22
  def initialize(method)
23
23
  @method = method
24
- @result = T.let(Sig.new, Sig)
24
+ @result = Sig.new #: Sig
25
25
  end
26
26
 
27
27
  #: (::RBS::MethodType) -> void
@@ -44,7 +44,7 @@ module RBI
44
44
  raise Error, "No block param found" unless block_param
45
45
 
46
46
  block_name = block_param.name
47
- block_type = T.cast(translate_type(type.type), RBI::Type::Proc)
47
+ block_type = translate_type(type.type) #: as RBI::Type::Proc
48
48
 
49
49
  bind = type.self_type
50
50
  block_type.bind(translate_type(bind)) if bind
@@ -75,7 +75,7 @@ module RBI
75
75
  when ::RBS::Types::Optional
76
76
  Type.nilable(translate(type.type))
77
77
  when ::RBS::Types::Proc
78
- proc = T.cast(translate(type.type), Type::Proc)
78
+ proc = translate(type.type) #: as Type::Proc
79
79
  proc.bind(translate(type.self_type)) if type.self_type
80
80
  proc
81
81
  when ::RBS::Types::Record
@@ -23,9 +23,9 @@ module RBI
23
23
  @out = out
24
24
  @current_indent = indent
25
25
  @print_locs = print_locs
26
- @in_visibility_group = T.let(false, T::Boolean)
27
- @previous_node = T.let(nil, T.nilable(Node))
28
- @positional_names = T.let(positional_names, T::Boolean)
26
+ @in_visibility_group = false #: bool
27
+ @previous_node = nil #: Node?
28
+ @positional_names = positional_names #: bool
29
29
  end
30
30
 
31
31
  # Printing
@@ -349,7 +349,10 @@ module RBI
349
349
  print(": ")
350
350
  if sigs.any?
351
351
  first, *rest = sigs
352
- print_method_sig(node, T.must(first))
352
+ print_method_sig(
353
+ node,
354
+ first, #: as !nil
355
+ )
353
356
  if rest.any?
354
357
  spaces = node.name.size + 4
355
358
  rest.each do |sig|
@@ -645,19 +648,22 @@ module RBI
645
648
  # @override
646
649
  #: (TEnumBlock node) -> void
647
650
  def visit_tenum_block(node)
648
- node.nodes.each do |child|
649
- child = if child.is_a?(Const) && child.value == "new"
650
- parent = node.parent_scope
651
- Const.new(
652
- child.name,
653
- "T.let(nil, #{parent.is_a?(TEnum) ? parent.name : "T.untyped"})",
654
- comments: child.comments,
655
- )
656
- else
657
- child
658
- end
659
- visit(child)
660
- @previous_node = child
651
+ visit_all(node.nodes)
652
+ end
653
+
654
+ # @override
655
+ #: (TEnumValue node) -> void
656
+ def visit_tenum_value(node)
657
+ print_blank_line_before(node)
658
+ print_loc(node)
659
+ visit_all(node.comments)
660
+
661
+ t_enum = node.parent_scope&.parent_scope
662
+
663
+ if t_enum.is_a?(TEnum)
664
+ printl("#{node.name}: #{t_enum.name}")
665
+ else
666
+ printl("#{node.name}: untyped")
661
667
  end
662
668
  end
663
669
 
@@ -882,7 +888,7 @@ module RBI
882
888
 
883
889
  #: -> void
884
890
  def initialize
885
- @string = T.let(String.new, String)
891
+ @string = String.new #: String
886
892
  end
887
893
 
888
894
  #: (Type node) -> void
@@ -41,7 +41,8 @@ module RBI
41
41
 
42
42
  child.detach
43
43
  child.is_singleton = true
44
- T.must(node.parent_tree) << child
44
+ parent_tree = node.parent_tree #: as !nil
45
+ parent_tree << child
45
46
  end
46
47
 
47
48
  node.detach if node.nodes.empty?
@@ -29,7 +29,7 @@ module RBI
29
29
  def initialize
30
30
  super
31
31
 
32
- @current_visibility = T.let([Public.new], T::Array[Visibility])
32
+ @current_visibility = [Public.new] #: Array[Visibility]
33
33
  end
34
34
 
35
35
  # @override
@@ -46,7 +46,7 @@ module RBI
46
46
  visit_all(node.nodes.dup)
47
47
  @current_visibility.pop
48
48
  when Attr, Method
49
- node.visibility = T.must(@current_visibility.last)
49
+ node.visibility = @current_visibility.last #: as !nil
50
50
  end
51
51
  end
52
52
  end
@@ -67,8 +67,8 @@ module RBI
67
67
  @left_name = left_name
68
68
  @right_name = right_name
69
69
  @keep = keep
70
- @tree = T.let(MergeTree.new, MergeTree)
71
- @scope_stack = T.let([@tree], T::Array[Tree])
70
+ @tree = MergeTree.new #: MergeTree
71
+ @scope_stack = [@tree] #: Array[Tree]
72
72
  end
73
73
 
74
74
  #: (Tree tree) -> void
@@ -99,12 +99,12 @@ module RBI
99
99
  def initialize(output, left_name: "left", right_name: "right", keep: Keep::NONE)
100
100
  super()
101
101
  @tree = output
102
- @index = T.let(output.index, Index)
103
- @scope_stack = T.let([@tree], T::Array[Tree])
102
+ @index = output.index #: Index
103
+ @scope_stack = [@tree] #: Array[Tree]
104
104
  @left_name = left_name
105
105
  @right_name = right_name
106
106
  @keep = keep
107
- @conflicts = T.let([], T::Array[Conflict])
107
+ @conflicts = [] #: Array[Conflict]
108
108
  end
109
109
 
110
110
  # @override
@@ -159,7 +159,7 @@ module RBI
159
159
 
160
160
  #: -> Tree
161
161
  def current_scope
162
- T.must(@scope_stack.last)
162
+ @scope_stack.last #: as !nil
163
163
  end
164
164
 
165
165
  #: (Node node) -> Node?
@@ -245,7 +245,7 @@ module RBI
245
245
  # @override
246
246
  #: (Array[Node] nodes) -> void
247
247
  def visit_all(nodes)
248
- last_conflict_tree = T.let(nil, T.nilable(ConflictTree))
248
+ last_conflict_tree = nil #: ConflictTree?
249
249
  nodes.dup.each do |node|
250
250
  if node.is_a?(ConflictTree)
251
251
  if last_conflict_tree
@@ -287,7 +287,7 @@ module RBI
287
287
 
288
288
  #: -> ConflictTree?
289
289
  def parent_conflict_tree
290
- parent = T.let(parent_tree, T.nilable(Node))
290
+ parent = parent_tree #: Node?
291
291
  while parent
292
292
  return parent if parent.is_a?(ConflictTree)
293
293
 
@@ -555,9 +555,9 @@ module RBI
555
555
  super()
556
556
  @left_name = left_name
557
557
  @right_name = right_name
558
- @left = T.let(Tree.new, Tree)
558
+ @left = Tree.new #: Tree
559
559
  @left.parent_tree = self
560
- @right = T.let(Tree.new, Tree)
560
+ @right = Tree.new #: Tree
561
561
  @right.parent_tree = self
562
562
  end
563
563
  end
@@ -24,7 +24,7 @@ module RBI
24
24
  def initialize
25
25
  super
26
26
 
27
- @top_level_object_class = T.let(nil, T.nilable(Class))
27
+ @top_level_object_class = nil #: Class?
28
28
  end
29
29
 
30
30
  # @override
@@ -53,7 +53,7 @@ module RBI
53
53
  def initialize(index)
54
54
  super()
55
55
  @index = index
56
- @operations = T.let([], T::Array[Operation])
56
+ @operations = [] #: Array[Operation]
57
57
  end
58
58
 
59
59
  class << self
@@ -107,10 +107,10 @@ module RBI
107
107
  when Scope
108
108
  node.empty?
109
109
  when Attr
110
- previous = T.cast(previous, Attr)
110
+ previous = previous #: as Attr
111
111
  node.names == previous.names && node.sigs == previous.sigs
112
112
  when Method
113
- previous = T.cast(previous, Method)
113
+ previous = previous #: as Method
114
114
  node.params == previous.params && node.sigs == previous.sigs
115
115
  else
116
116
  true
@@ -31,7 +31,9 @@ module RBI
31
31
  next res if res && res != 0 # we can sort the nodes by their name, let's stop here
32
32
 
33
33
  # Finally, if the two nodes have the same rank and the same name or at least one node is anonymous then,
34
- T.must(original_order[a]) <=> T.must(original_order[b]) # we keep the original order
34
+ original_order_a = original_order[a] #: as !nil
35
+ original_order_b = original_order[b] #: as !nil
36
+ original_order_a <=> original_order_b # we keep the original order
35
37
  end
36
38
  end
37
39
 
@@ -35,7 +35,7 @@ module RBI
35
35
  comments = node.comments.dup
36
36
  node.comments.clear
37
37
 
38
- rbs_sigs = T.let([], T::Array[RBSComment])
38
+ rbs_sigs = [] #: Array[RBSComment]
39
39
 
40
40
  comments.each do |comment|
41
41
  case comment
@@ -67,7 +67,7 @@ module RBI
67
67
  raise Error, "AttrWriter must have exactly one name"
68
68
  end
69
69
 
70
- name = T.must(node.names.first)
70
+ name = node.names.first #: as !nil
71
71
  sig.params << SigParam.new(name.to_s, RBS::TypeTranslator.translate(attr_type))
72
72
  end
73
73
 
data/lib/rbi/type.rb CHANGED
@@ -285,7 +285,7 @@ module RBI
285
285
  def initialize(name, *params)
286
286
  super()
287
287
  @name = name
288
- @params = T.let(params, T::Array[Type])
288
+ @params = params #: Array[Type]
289
289
  end
290
290
 
291
291
  # @override
@@ -395,9 +395,9 @@ module RBI
395
395
  #: -> void
396
396
  def initialize
397
397
  super
398
- @proc_params = T.let({}, T::Hash[Symbol, Type])
399
- @proc_returns = T.let(Type.void, Type)
400
- @proc_bind = T.let(nil, T.nilable(Type))
398
+ @proc_params = {} #: Hash[Symbol, Type]
399
+ @proc_returns = Type.void #: Type
400
+ @proc_bind = nil #: Type?
401
401
  end
402
402
 
403
403
  # @override
@@ -570,7 +570,7 @@ module RBI
570
570
  end.uniq
571
571
 
572
572
  if flattened.size == 1
573
- T.must(flattened.first)
573
+ flattened.first #: as !nil
574
574
  else
575
575
  raise ArgumentError, "RBI::Type.all should have at least 2 types supplied" if flattened.size < 2
576
576
 
@@ -596,7 +596,7 @@ module RBI
596
596
  end
597
597
  end
598
598
 
599
- is_nilable = T.let(false, T::Boolean)
599
+ is_nilable = false #: bool
600
600
 
601
601
  types = flattened.filter_map do |type|
602
602
  case type
@@ -632,7 +632,7 @@ module RBI
632
632
  raise ArgumentError, "RBI::Type.any should have at least 2 types supplied"
633
633
  end
634
634
  when 1
635
- T.must(types.first)
635
+ types.first #: as !nil
636
636
  else
637
637
  Any.new(types)
638
638
  end
@@ -693,7 +693,7 @@ module RBI
693
693
 
694
694
  #: -> void
695
695
  def initialize
696
- @nilable = T.let(false, T::Boolean)
696
+ @nilable = false #: bool
697
697
  end
698
698
 
699
699
  # Returns a new type that is `nilable` if it is not already.
@@ -18,7 +18,7 @@ module RBI
18
18
  raise Error, "Expected a type expression, got nothing" if node.statements.body.empty?
19
19
  raise Error, "Expected a single type expression, got `#{node.slice}`" if node.statements.body.size > 1
20
20
 
21
- node = T.must(node.statements.body.first)
21
+ node = node.statements.body.first #: as !nil
22
22
  parse_node(node)
23
23
  end
24
24
 
@@ -40,7 +40,9 @@ module RBI
40
40
  children = body.body
41
41
  raise Error, "Expected exactly 1 child, got #{children.size}" unless children.size == 1
42
42
 
43
- parse_node(T.must(children.first))
43
+ parse_node(
44
+ children.first, #: as !nil
45
+ )
44
46
  else
45
47
  raise Error, "Unexpected node `#{node}`"
46
48
  end
@@ -84,7 +86,11 @@ module RBI
84
86
  if t_class?(recv)
85
87
  # `T::Class[Foo]` or `::T::Class[Foo]`
86
88
  args = check_arguments_exactly!(node, 1)
87
- return Type::Class.new(parse_node(T.must(args.first)))
89
+ return Type::Class.new(
90
+ parse_node(
91
+ args.first, #: as !nil
92
+ ),
93
+ )
88
94
  else
89
95
  # `::Foo[Bar]` or `::Foo[Bar, Baz]`
90
96
  args = check_arguments_at_least!(node, 1)
@@ -94,11 +100,15 @@ module RBI
94
100
  # `T.class_of(Foo)[Bar]`
95
101
  if t_class_of?(recv)
96
102
  type_args = check_arguments_exactly!(recv, 1)
97
- type = parse_node(T.must(type_args.first))
103
+ type = parse_node(
104
+ type_args.first, #: as !nil
105
+ )
98
106
  raise Error, "Expected a simple type, got `#{type}`" unless type.is_a?(Type::Simple)
99
107
 
100
108
  type_param_args = check_arguments_exactly!(node, 1)
101
- type_param = parse_node(T.must(type_param_args.first))
109
+ type_param = parse_node(
110
+ type_param_args.first, #: as !nil
111
+ )
102
112
  return Type::ClassOf.new(type, type_param)
103
113
  end
104
114
  end
@@ -117,7 +127,9 @@ module RBI
117
127
  when :nilable
118
128
  # `T.nilable(Foo)`
119
129
  args = check_arguments_exactly!(node, 1)
120
- type = parse_node(T.must(args.first))
130
+ type = parse_node(
131
+ args.first, #: as !nil
132
+ )
121
133
  Type::Nilable.new(type)
122
134
  when :anything
123
135
  # `T.anything`
@@ -142,7 +154,9 @@ module RBI
142
154
  when :class_of
143
155
  # `T.class_of(Foo)`
144
156
  args = check_arguments_exactly!(node, 1)
145
- type = parse_node(T.must(args.first))
157
+ type = parse_node(
158
+ args.first, #: as !nil
159
+ )
146
160
  raise Error, "Expected a simple type, got `#{type}`" unless type.is_a?(Type::Simple)
147
161
 
148
162
  Type::ClassOf.new(type)
@@ -180,7 +194,9 @@ module RBI
180
194
  elem_key = elem.key
181
195
  key = case elem_key
182
196
  when Prism::SymbolNode
183
- T.must(elem_key.value).to_sym
197
+ elem_key
198
+ .value #: as !nil
199
+ .to_sym
184
200
  when Prism::StringNode
185
201
  elem_key.content
186
202
  else
@@ -216,14 +232,22 @@ module RBI
216
232
  T.unsafe(type).params(**params)
217
233
  when :returns
218
234
  args = check_arguments_exactly!(call, 1)
219
- type.returns(parse_node(T.must(args.first)))
235
+ type.returns(
236
+ parse_node(
237
+ args.first, #: as !nil
238
+ ),
239
+ )
220
240
  when :void
221
241
  type.void
222
242
  when :proc
223
243
  return type
224
244
  when :bind
225
245
  args = check_arguments_exactly!(call, 1)
226
- type.bind(parse_node(T.must(args.first)))
246
+ type.bind(
247
+ parse_node(
248
+ args.first, #: as !nil
249
+ ),
250
+ )
227
251
  else
228
252
  raise Error, "Unexpected expression `#{node.slice}`"
229
253
  end
@@ -261,8 +285,8 @@ module RBI
261
285
 
262
286
  #: (Prism::CallNode node) -> Array[Prism::Node]
263
287
  def call_chain(node)
264
- call_chain = T.let([node], T::Array[Prism::Node])
265
- receiver = T.let(node.receiver, T.nilable(Prism::Node))
288
+ call_chain = [node] #: Array[Prism::Node]
289
+ receiver = node.receiver #: Prism::Node?
266
290
  while receiver
267
291
  call_chain.prepend(receiver)
268
292
  break unless receiver.is_a?(Prism::CallNode)
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.3.1"
5
+ VERSION = "0.3.2"
6
6
  end
data/lib/rbi/visitor.rb CHANGED
@@ -88,6 +88,8 @@ module RBI
88
88
  visit_sig(node)
89
89
  when SigParam
90
90
  visit_sig_param(node)
91
+ when TEnumValue
92
+ visit_tenum_value(node)
91
93
  when TStructConst
92
94
  visit_tstruct_const(node)
93
95
  when TStructProp
@@ -222,6 +224,9 @@ module RBI
222
224
  #: (TEnumBlock node) -> void
223
225
  def visit_tenum_block(node); end
224
226
 
227
+ #: (TEnumValue node) -> void
228
+ def visit_tenum_value(node); end
229
+
225
230
  #: (Helper node) -> void
226
231
  def visit_helper(node); end
227
232
 
data/rbi/rbi.rbi CHANGED
@@ -403,10 +403,11 @@ class RBI::Formatter
403
403
  max_line_length: T.nilable(::Integer),
404
404
  nest_singleton_methods: T::Boolean,
405
405
  nest_non_public_members: T::Boolean,
406
- sort_nodes: T::Boolean
406
+ sort_nodes: T::Boolean,
407
+ replace_attributes_with_methods: T::Boolean
407
408
  ).void
408
409
  end
409
- def initialize(add_sig_templates: T.unsafe(nil), group_nodes: T.unsafe(nil), max_line_length: T.unsafe(nil), nest_singleton_methods: T.unsafe(nil), nest_non_public_members: T.unsafe(nil), sort_nodes: T.unsafe(nil)); end
410
+ def initialize(add_sig_templates: T.unsafe(nil), group_nodes: T.unsafe(nil), max_line_length: T.unsafe(nil), nest_singleton_methods: T.unsafe(nil), nest_non_public_members: T.unsafe(nil), sort_nodes: T.unsafe(nil), replace_attributes_with_methods: T.unsafe(nil)); end
410
411
 
411
412
  sig { params(file: ::RBI::File).void }
412
413
  def format_file(file); end
@@ -1005,6 +1006,25 @@ class RBI::Parser
1005
1006
  end
1006
1007
  end
1007
1008
 
1009
+ class RBI::Parser::HeredocLocationVisitor < ::Prism::Visitor
1010
+ sig { params(source: ::Prism::Source, begin_offset: ::Integer, end_offset: ::Integer).void }
1011
+ def initialize(source, begin_offset, end_offset); end
1012
+
1013
+ sig { returns(::Prism::Location) }
1014
+ def location; end
1015
+
1016
+ sig { params(node: ::Prism::InterpolatedStringNode).void }
1017
+ def visit_interpolated_string_node(node); end
1018
+
1019
+ sig { params(node: ::Prism::StringNode).void }
1020
+ def visit_string_node(node); end
1021
+
1022
+ private
1023
+
1024
+ sig { params(node: T.any(::Prism::InterpolatedStringNode, ::Prism::StringNode)).void }
1025
+ def handle_string_node(node); end
1026
+ end
1027
+
1008
1028
  class RBI::Parser::SigBuilder < ::RBI::Parser::Visitor
1009
1029
  sig { params(content: ::String, file: ::String).void }
1010
1030
  def initialize(content, file:); end
@@ -1109,6 +1129,9 @@ class RBI::Parser::TreeBuilder < ::RBI::Parser::Visitor
1109
1129
  sig { void }
1110
1130
  def set_root_tree_loc; end
1111
1131
 
1132
+ sig { params(node: T.nilable(::Prism::Node)).returns(T::Boolean) }
1133
+ def t_enum_value?(node); end
1134
+
1112
1135
  sig { params(node: T.nilable(::Prism::Node)).returns(T::Boolean) }
1113
1136
  def type_variable_definition?(node); end
1114
1137
  end
@@ -1119,6 +1142,9 @@ class RBI::Parser::Visitor < ::Prism::Visitor
1119
1142
 
1120
1143
  private
1121
1144
 
1145
+ sig { params(node: ::Prism::Node).returns(::Prism::Location) }
1146
+ def adjust_prism_location_for_heredoc(node); end
1147
+
1122
1148
  sig { params(node: ::Prism::Node).returns(::RBI::Loc) }
1123
1149
  def node_loc(node); end
1124
1150
 
@@ -1345,6 +1371,9 @@ class RBI::Printer < ::RBI::Visitor
1345
1371
  sig { override.params(node: ::RBI::TEnumBlock).void }
1346
1372
  def visit_tenum_block(node); end
1347
1373
 
1374
+ sig { override.params(node: ::RBI::TEnumValue).void }
1375
+ def visit_tenum_value(node); end
1376
+
1348
1377
  sig { override.params(node: ::RBI::Tree).void }
1349
1378
  def visit_tree(node); end
1350
1379
 
@@ -1658,6 +1687,9 @@ class RBI::RBSPrinter < ::RBI::Visitor
1658
1687
  sig { override.params(node: ::RBI::TEnumBlock).void }
1659
1688
  def visit_tenum_block(node); end
1660
1689
 
1690
+ sig { override.params(node: ::RBI::TEnumValue).void }
1691
+ def visit_tenum_value(node); end
1692
+
1661
1693
  sig { override.params(node: ::RBI::Tree).void }
1662
1694
  def visit_tree(node); end
1663
1695
 
@@ -2549,6 +2581,32 @@ class RBI::TEnumBlock < ::RBI::Scope
2549
2581
  def to_s; end
2550
2582
  end
2551
2583
 
2584
+ class RBI::TEnumValue < ::RBI::NodeWithComments
2585
+ include ::RBI::Indexable
2586
+
2587
+ sig do
2588
+ params(
2589
+ name: ::String,
2590
+ loc: T.nilable(::RBI::Loc),
2591
+ comments: T::Array[::RBI::Comment],
2592
+ block: T.nilable(T.proc.params(node: ::RBI::TEnumValue).void)
2593
+ ).void
2594
+ end
2595
+ def initialize(name, loc: T.unsafe(nil), comments: T.unsafe(nil), &block); end
2596
+
2597
+ sig { returns(::String) }
2598
+ def fully_qualified_name; end
2599
+
2600
+ sig { override.returns(T::Array[::String]) }
2601
+ def index_ids; end
2602
+
2603
+ sig { returns(::String) }
2604
+ def name; end
2605
+
2606
+ sig { override.returns(::String) }
2607
+ def to_s; end
2608
+ end
2609
+
2552
2610
  # Sorbet's T::Struct
2553
2611
  class RBI::TStruct < ::RBI::Class
2554
2612
  sig do
@@ -3590,6 +3648,9 @@ class RBI::Visitor
3590
3648
  sig { params(node: ::RBI::TEnumBlock).void }
3591
3649
  def visit_tenum_block(node); end
3592
3650
 
3651
+ sig { params(node: ::RBI::TEnumValue).void }
3652
+ def visit_tenum_value(node); end
3653
+
3593
3654
  sig { params(node: ::RBI::Tree).void }
3594
3655
  def visit_tree(node); end
3595
3656
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.3.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexandre Terrasa
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-03-13 00:00:00.000000000 Z
10
+ date: 2025-04-10 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: prism
@@ -110,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
112
  requirements: []
113
- rubygems_version: 3.6.5
113
+ rubygems_version: 3.6.6
114
114
  specification_version: 4
115
115
  summary: RBI generation framework
116
116
  test_files: []