rbs 0.16.0 → 0.20.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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ruby.yml +1 -1
  3. data/CHANGELOG.md +30 -0
  4. data/README.md +1 -1
  5. data/Rakefile +12 -1
  6. data/core/array.rbs +1 -1
  7. data/core/builtin.rbs +2 -2
  8. data/core/dir.rbs +1 -1
  9. data/core/enumerable.rbs +41 -40
  10. data/core/enumerator.rbs +5 -5
  11. data/core/file.rbs +0 -4
  12. data/core/hash.rbs +9 -11
  13. data/core/io.rbs +1 -1
  14. data/core/object_space.rbs +98 -0
  15. data/core/range.rbs +1 -1
  16. data/core/struct.rbs +1 -1
  17. data/core/time.rbs +0 -12
  18. data/lib/rbs/ast/members.rb +9 -3
  19. data/lib/rbs/definition.rb +9 -4
  20. data/lib/rbs/definition_builder.rb +123 -71
  21. data/lib/rbs/environment.rb +3 -0
  22. data/lib/rbs/environment_loader.rb +1 -1
  23. data/lib/rbs/environment_walker.rb +70 -35
  24. data/lib/rbs/method_type.rb +1 -31
  25. data/lib/rbs/parser.rb +944 -879
  26. data/lib/rbs/parser.y +110 -63
  27. data/lib/rbs/prototype/rb.rb +163 -23
  28. data/lib/rbs/prototype/rbi.rb +5 -5
  29. data/lib/rbs/prototype/runtime.rb +2 -1
  30. data/lib/rbs/test/hook.rb +30 -17
  31. data/lib/rbs/test/type_check.rb +6 -1
  32. data/lib/rbs/types.rb +63 -6
  33. data/lib/rbs/version.rb +1 -1
  34. data/lib/rbs/writer.rb +9 -1
  35. data/schema/members.json +5 -1
  36. data/sig/definition.rbs +8 -3
  37. data/sig/definition_builder.rbs +6 -2
  38. data/sig/members.rbs +4 -1
  39. data/sig/method_types.rbs +3 -16
  40. data/sig/types.rbs +17 -1
  41. data/stdlib/csv/0/csv.rbs +3 -3
  42. data/stdlib/dbm/0/dbm.rbs +1 -3
  43. data/stdlib/monitor/0/monitor.rbs +119 -0
  44. data/stdlib/prime/0/prime.rbs +1 -1
  45. data/stdlib/set/0/set.rbs +10 -10
  46. data/stdlib/singleton/0/singleton.rbs +111 -0
  47. data/stdlib/tsort/0/cyclic.rbs +4 -0
  48. data/stdlib/tsort/0/interfaces.rbs +19 -0
  49. data/stdlib/tsort/0/tsort.rbs +371 -0
  50. data/stdlib/yaml/0/dbm.rbs +221 -0
  51. data/stdlib/yaml/0/store.rbs +53 -0
  52. data/steep/Gemfile.lock +12 -12
  53. metadata +11 -3
@@ -105,7 +105,7 @@
105
105
  class IO < Object
106
106
  include File::Constants
107
107
 
108
- include Enumerable[String, IO]
108
+ include Enumerable[String]
109
109
 
110
110
  def <<: (untyped arg0) -> self
111
111
 
@@ -0,0 +1,98 @@
1
+ # The ObjectSpace module contains a number of routines that interact with the
2
+ # garbage collection facility and allow you to traverse all living objects with
3
+ # an iterator.
4
+ #
5
+ # ObjectSpace also provides support for object finalizers, procs that will be
6
+ # called when a specific object is about to be destroyed by garbage collection.
7
+ #
8
+ # require 'objspace'
9
+ #
10
+ # a = "A"
11
+ # b = "B"
12
+ #
13
+ # ObjectSpace.define_finalizer(a, proc {|id| puts "Finalizer one on #{id}" })
14
+ # ObjectSpace.define_finalizer(b, proc {|id| puts "Finalizer two on #{id}" })
15
+ #
16
+ # *produces:*
17
+ #
18
+ # Finalizer two on 537763470
19
+ # Finalizer one on 537763480
20
+ module ObjectSpace
21
+ def self._id2ref: (Integer id) -> untyped
22
+
23
+ # Counts all objects grouped by type.
24
+ #
25
+ # It returns a hash, such as:
26
+ # {
27
+ # :TOTAL=>10000,
28
+ # :FREE=>3011,
29
+ # :T_OBJECT=>6,
30
+ # :T_CLASS=>404,
31
+ # # ...
32
+ # }
33
+ #
34
+ # The contents of the returned hash are implementation specific. It may be
35
+ # changed in future.
36
+ #
37
+ # The keys starting with `:T_` means live objects. For example, `:T_ARRAY` is
38
+ # the number of arrays. `:FREE` means object slots which is not used now.
39
+ # `:TOTAL` means sum of above.
40
+ #
41
+ # If the optional argument `result_hash` is given, it is overwritten and
42
+ # returned. This is intended to avoid probe effect.
43
+ #
44
+ # h = {}
45
+ # ObjectSpace.count_objects(h)
46
+ # puts h
47
+ # # => { :TOTAL=>10000, :T_CLASS=>158280, :T_MODULE=>20672, :T_STRING=>527249 }
48
+ #
49
+ # This method is only expected to work on C Ruby.
50
+ #
51
+ def self.count_objects: (?Hash[Symbol, Integer] result_hash) -> Hash[Symbol, Integer]
52
+
53
+ # Adds *aProc* as a finalizer, to be called after *obj* was destroyed. The
54
+ # object ID of the *obj* will be passed as an argument to *aProc*. If *aProc* is
55
+ # a lambda or method, make sure it can be called with a single argument.
56
+ #
57
+ def self.define_finalizer: (untyped obj, ^(Integer id) -> void aProc) -> [ Integer, Proc ]
58
+ | (untyped obj) { (Integer id) -> void } -> [ Integer, Proc ]
59
+
60
+ # Calls the block once for each living, nonimmediate object in this Ruby
61
+ # process. If *module* is specified, calls the block for only those classes or
62
+ # modules that match (or are a subclass of) *module*. Returns the number of
63
+ # objects found. Immediate objects (`Fixnum`s, `Symbol`s `true`, `false`, and
64
+ # `nil`) are never returned. In the example below, #each_object returns both the
65
+ # numbers we defined and several constants defined in the Math module.
66
+ #
67
+ # If no block is given, an enumerator is returned instead.
68
+ #
69
+ # a = 102.7
70
+ # b = 95 # Won't be returned
71
+ # c = 12345678987654321
72
+ # count = ObjectSpace.each_object(Numeric) {|x| p x }
73
+ # puts "Total count: #{count}"
74
+ #
75
+ # *produces:*
76
+ #
77
+ # 12345678987654321
78
+ # 102.7
79
+ # 2.71828182845905
80
+ # 3.14159265358979
81
+ # 2.22044604925031e-16
82
+ # 1.7976931348623157e+308
83
+ # 2.2250738585072e-308
84
+ # Total count: 7
85
+ #
86
+ def self.each_object: (?Module `module`) -> Enumerator[untyped, Integer]
87
+ | (?Module `module`) { (untyped obj) -> void } -> Integer
88
+
89
+ def self.garbage_collect: (?full_mark: bool, ?immediate_mark: bool, ?immediate_sweep: bool) -> void
90
+
91
+ # Removes all finalizers for *obj*.
92
+ #
93
+ def self.undefine_finalizer: [X] (X obj) -> X
94
+
95
+ private
96
+
97
+ def garbage_collect: (?full_mark: bool, ?immediate_mark: bool, ?immediate_sweep: bool) -> void
98
+ end
@@ -88,7 +88,7 @@
88
88
  # r.member?(Xs.new(5)) #=> true
89
89
  # ```
90
90
  class Range[out Elem] < Object
91
- include Enumerable[Elem, Range[Elem]]
91
+ include Enumerable[Elem]
92
92
 
93
93
  def ==: (untyped obj) -> bool
94
94
 
@@ -27,7 +27,7 @@
27
27
  # struct member which is either a quoted string ( `"name"` ) or a
28
28
  # [Symbol](https://ruby-doc.org/core-2.6.3/Symbol.html) ( `:name` ).
29
29
  class Struct[Elem] < Object
30
- include Enumerable[Elem, Struct[Elem]]
30
+ include Enumerable[Elem]
31
31
 
32
32
  type attribute_name = Symbol | String
33
33
 
@@ -757,18 +757,6 @@ class Time < Object
757
757
  #
758
758
  def subsec: () -> Numeric
759
759
 
760
- # Returns a new Time object, one second later than *time*. Time#succ is obsolete
761
- # since 1.9.2 for time is not a discrete value.
762
- #
763
- # t = Time.now #=> 2007-11-19 08:23:57 -0600
764
- # t.succ #=> 2007-11-19 08:23:58 -0600
765
- #
766
- # Use instead `time + 1`
767
- #
768
- # t + 1 #=> 2007-11-19 08:23:58 -0600
769
- #
770
- def succ: () -> Time
771
-
772
760
  # Returns `true` if *time* represents Sunday.
773
761
  #
774
762
  # t = Time.local(1990, 4, 1) #=> 1990-04-01 00:00:00 -0600
@@ -216,31 +216,34 @@ module RBS
216
216
  module Attribute
217
217
  attr_reader :name
218
218
  attr_reader :type
219
+ attr_reader :kind
219
220
  attr_reader :ivar_name
220
221
  attr_reader :annotations
221
222
  attr_reader :location
222
223
  attr_reader :comment
223
224
 
224
- def initialize(name:, type:, ivar_name:, annotations:, location:, comment:)
225
+ def initialize(name:, type:, ivar_name:, kind:, annotations:, location:, comment:)
225
226
  @name = name
226
227
  @type = type
227
228
  @ivar_name = ivar_name
228
229
  @annotations = annotations
229
230
  @location = location
230
231
  @comment = comment
232
+ @kind = kind
231
233
  end
232
234
 
233
235
  def ==(other)
234
236
  other.is_a?(self.class) &&
235
237
  other.name == name &&
236
238
  other.type == type &&
237
- other.ivar_name == ivar_name
239
+ other.ivar_name == ivar_name &&
240
+ other.kind == kind
238
241
  end
239
242
 
240
243
  alias eql? ==
241
244
 
242
245
  def hash
243
- self.class.hash ^ name.hash ^ type.hash ^ ivar_name.hash
246
+ self.class.hash ^ name.hash ^ type.hash ^ ivar_name.hash ^ kind.hash
244
247
  end
245
248
  end
246
249
 
@@ -253,6 +256,7 @@ module RBS
253
256
  name: name,
254
257
  type: type,
255
258
  ivar_name: ivar_name,
259
+ kind: kind,
256
260
  annotations: annotations,
257
261
  location: location,
258
262
  comment: comment
@@ -269,6 +273,7 @@ module RBS
269
273
  name: name,
270
274
  type: type,
271
275
  ivar_name: ivar_name,
276
+ kind: kind,
272
277
  annotations: annotations,
273
278
  location: location,
274
279
  comment: comment
@@ -285,6 +290,7 @@ module RBS
285
290
  name: name,
286
291
  type: type,
287
292
  ivar_name: ivar_name,
293
+ kind: kind,
288
294
  annotations: annotations,
289
295
  location: location,
290
296
  comment: comment
@@ -60,12 +60,14 @@ module RBS
60
60
  attr_reader :defs
61
61
  attr_reader :accessibility
62
62
  attr_reader :extra_annotations
63
+ attr_reader :alias_of
63
64
 
64
- def initialize(super_method:, defs:, accessibility:, annotations: [])
65
+ def initialize(super_method:, defs:, accessibility:, annotations: [], alias_of:)
65
66
  @super_method = super_method
66
67
  @defs = defs
67
68
  @accessibility = accessibility
68
69
  @extra_annotations = annotations
70
+ @alias_of = alias_of
69
71
  end
70
72
 
71
73
  def defined_in
@@ -110,7 +112,8 @@ module RBS
110
112
  self.class.new(
111
113
  super_method: super_method&.sub(s),
112
114
  defs: defs.map {|defn| defn.update(type: defn.type.sub(s)) },
113
- accessibility: @accessibility
115
+ accessibility: @accessibility,
116
+ alias_of: alias_of
114
117
  )
115
118
  end
116
119
 
@@ -118,7 +121,8 @@ module RBS
118
121
  self.class.new(
119
122
  super_method: super_method&.map_type(&block),
120
123
  defs: defs.map {|defn| defn.update(type: defn.type.map_type(&block)) },
121
- accessibility: @accessibility
124
+ accessibility: @accessibility,
125
+ alias_of: alias_of
122
126
  )
123
127
  end
124
128
 
@@ -126,7 +130,8 @@ module RBS
126
130
  self.class.new(
127
131
  super_method: super_method,
128
132
  defs: defs.map {|defn| defn.update(type: yield(defn.type)) },
129
- accessibility: @accessibility
133
+ accessibility: @accessibility,
134
+ alias_of: alias_of
130
135
  )
131
136
  end
132
137
  end
@@ -558,7 +558,7 @@ module RBS
558
558
  )
559
559
  end
560
560
 
561
- unless array.all? {|pair| pair[1] == :public}
561
+ unless array.all? {|pair| pair[1] == :public }
562
562
  raise InconsistentMethodVisibilityError.new(
563
563
  type_name: type_name,
564
564
  method_name: method_name,
@@ -599,10 +599,15 @@ module RBS
599
599
  try_cache(type_name, cache: one_instance_cache) do
600
600
  entry = env.class_decls[type_name]
601
601
 
602
+ param_names = entry.type_params.each.map(&:name)
602
603
  self_type = Types::ClassInstance.new(name: type_name,
603
- args: Types::Variable.build(entry.type_params.each.map(&:name)),
604
+ args: Types::Variable.build(param_names),
604
605
  location: nil)
605
- ancestors = [Definition::Ancestor::Instance.new(name: type_name, args: self_type.args)]
606
+ ancestors = Definition::InstanceAncestors.new(
607
+ type_name: type_name,
608
+ params: param_names,
609
+ ancestors: [Definition::Ancestor::Instance.new(name: type_name, args: self_type.args)]
610
+ )
606
611
 
607
612
  Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
608
613
  method_definition_members(type_name, entry, kind: :instance).each do |method_name, array|
@@ -618,13 +623,15 @@ module RBS
618
623
  Definition::Method.new(
619
624
  super_method: nil,
620
625
  accessibility: visibility,
621
- defs: method_def.defs.map {|defn| defn.update(implemented_in: type_name) }
626
+ defs: method_def.defs.map {|defn| defn.update(implemented_in: type_name) },
627
+ alias_of: nil
622
628
  )
623
629
  else
624
630
  Definition::Method.new(
625
631
  super_method: nil,
626
632
  accessibility: visibility,
627
- defs: []
633
+ defs: [],
634
+ alias_of: nil
628
635
  )
629
636
  end
630
637
 
@@ -641,7 +648,8 @@ module RBS
641
648
  Definition::Method.new(
642
649
  super_method: nil,
643
650
  defs: defs + original.defs,
644
- accessibility: original.accessibility
651
+ accessibility: original.accessibility,
652
+ alias_of: nil
645
653
  )
646
654
  end
647
655
  end
@@ -650,66 +658,15 @@ module RBS
650
658
  each_member_with_accessibility(d.decl.members) do |member, accessibility|
651
659
  case member
652
660
  when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
653
- name = member.name
654
- type = member.type
655
-
656
- ivar_name = case member.ivar_name
657
- when false
658
- nil
659
- else
660
- member.ivar_name || :"@#{member.name}"
661
- end
662
-
663
- if member.is_a?(AST::Members::AttrReader) || member.is_a?(AST::Members::AttrAccessor)
664
- definition.methods[name] = Definition::Method.new(
665
- super_method: nil,
666
- defs: [
667
- Definition::Method::TypeDef.new(
668
- type: MethodType.new(
669
- type_params: [],
670
- type: Types::Function.empty(type),
671
- block: nil,
672
- location: nil
673
- ),
674
- member: member,
675
- defined_in: type_name,
676
- implemented_in: type_name
677
- )
678
- ],
661
+ if member.kind == :instance
662
+ build_attribute(
663
+ type_name: type_name,
664
+ definition: definition,
665
+ member: member,
679
666
  accessibility: accessibility
680
667
  )
681
668
  end
682
669
 
683
- if member.is_a?(AST::Members::AttrWriter) || member.is_a?(AST::Members::AttrAccessor)
684
- definition.methods[:"#{name}="] = Definition::Method.new(
685
- super_method: nil,
686
- defs: [
687
- Definition::Method::TypeDef.new(
688
- type: MethodType.new(
689
- type_params: [],
690
- type: Types::Function.empty(type).update(
691
- required_positionals: [Types::Function::Param.new(name: name, type: type)]
692
- ),
693
- block: nil,
694
- location: nil
695
- ),
696
- member: member,
697
- defined_in: type_name,
698
- implemented_in: type_name
699
- ),
700
- ],
701
- accessibility: accessibility
702
- )
703
- end
704
-
705
- if ivar_name
706
- definition.instance_variables[ivar_name] = Definition::Variable.new(
707
- parent_variable: nil,
708
- type: type,
709
- declared_in: type_name
710
- )
711
- end
712
-
713
670
  when AST::Members::InstanceVariable
714
671
  definition.instance_variables[member.name] = Definition::Variable.new(
715
672
  parent_variable: nil,
@@ -747,7 +704,15 @@ module RBS
747
704
  location: member.location
748
705
  )
749
706
 
750
- definition.methods[member.new_name] = definition.methods[member.old_name]
707
+ original_method = definition.methods[member.old_name]
708
+
709
+ definition.methods[member.new_name] = Definition::Method.new(
710
+ super_method: original_method.super_method,
711
+ defs: original_method.defs,
712
+ accessibility: original_method.accessibility,
713
+ alias_of: original_method,
714
+ annotations: original_method.annotations
715
+ )
751
716
  end
752
717
  end
753
718
  end
@@ -838,7 +803,10 @@ module RBS
838
803
  entry = env.class_decls[type_name]
839
804
 
840
805
  self_type = Types::ClassSingleton.new(name: type_name, location: nil)
841
- ancestors = [Definition::Ancestor::Singleton.new(name: type_name)]
806
+ ancestors = Definition::SingletonAncestors.new(
807
+ type_name: type_name,
808
+ ancestors: [Definition::Ancestor::Singleton.new(name: type_name)]
809
+ )
842
810
 
843
811
  Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
844
812
  method_definition_members(type_name, entry, kind: :singleton).each do |method_name, array|
@@ -855,7 +823,8 @@ module RBS
855
823
  defs: method_def&.yield_self do |method_def|
856
824
  method_def.defs.map {|defn| defn.update(implemented_in: type_name) }
857
825
  end || [],
858
- accessibility: visibility
826
+ accessibility: visibility,
827
+ alias_of: nil
859
828
  )
860
829
  definition.methods[method_name] = members.inject(m) do |original, new|
861
830
  defs = new.types.map do |type|
@@ -869,7 +838,8 @@ module RBS
869
838
  Definition::Method.new(
870
839
  super_method: nil,
871
840
  defs: defs + original.defs,
872
- accessibility: original.accessibility
841
+ accessibility: original.accessibility,
842
+ alias_of: nil
873
843
  )
874
844
  end
875
845
  end
@@ -893,7 +863,14 @@ module RBS
893
863
  location: member.location
894
864
  )
895
865
 
896
- definition.methods[member.new_name] = definition.methods[member.old_name]
866
+ original_method = definition.methods[member.old_name]
867
+ definition.methods[member.new_name] = Definition::Method.new(
868
+ super_method: original_method.super_method,
869
+ defs: original_method.defs,
870
+ accessibility: original_method.accessibility,
871
+ alias_of: original_method,
872
+ annotations: original_method.annotations
873
+ )
897
874
  end
898
875
  end
899
876
  end
@@ -945,14 +922,23 @@ module RBS
945
922
  )
946
923
  end,
947
924
  accessibility: :public,
948
- annotations: [AST::Annotation.new(location: nil, string: "rbs:test:target")]
925
+ annotations: [AST::Annotation.new(location: nil, string: "rbs:test:target")],
926
+ alias_of: nil
949
927
  )
950
928
  end
951
929
  end
952
930
 
953
931
  entry.decls.each do |d|
954
- each_member_with_accessibility(d.decl.members) do |member, _|
932
+ each_member_with_accessibility(d.decl.members) do |member, accessibility|
955
933
  case member
934
+ when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
935
+ if member.kind == :singleton
936
+ build_attribute(type_name: type_name,
937
+ definition: definition,
938
+ member: member,
939
+ accessibility: accessibility)
940
+ end
941
+
956
942
  when AST::Members::ClassInstanceVariable
957
943
  definition.instance_variables[member.name] = Definition::Variable.new(
958
944
  parent_variable: nil,
@@ -973,6 +959,70 @@ module RBS
973
959
  end
974
960
  end
975
961
 
962
+ def build_attribute(type_name:, definition:, member:, accessibility:)
963
+ name = member.name
964
+ type = member.type
965
+
966
+ ivar_name = case member.ivar_name
967
+ when false
968
+ nil
969
+ else
970
+ member.ivar_name || :"@#{member.name}"
971
+ end
972
+
973
+ if member.is_a?(AST::Members::AttrReader) || member.is_a?(AST::Members::AttrAccessor)
974
+ definition.methods[name] = Definition::Method.new(
975
+ super_method: nil,
976
+ defs: [
977
+ Definition::Method::TypeDef.new(
978
+ type: MethodType.new(
979
+ type_params: [],
980
+ type: Types::Function.empty(type),
981
+ block: nil,
982
+ location: nil
983
+ ),
984
+ member: member,
985
+ defined_in: type_name,
986
+ implemented_in: type_name
987
+ )
988
+ ],
989
+ accessibility: accessibility,
990
+ alias_of: nil
991
+ )
992
+ end
993
+
994
+ if member.is_a?(AST::Members::AttrWriter) || member.is_a?(AST::Members::AttrAccessor)
995
+ definition.methods[:"#{name}="] = Definition::Method.new(
996
+ super_method: nil,
997
+ defs: [
998
+ Definition::Method::TypeDef.new(
999
+ type: MethodType.new(
1000
+ type_params: [],
1001
+ type: Types::Function.empty(type).update(
1002
+ required_positionals: [Types::Function::Param.new(name: name, type: type)]
1003
+ ),
1004
+ block: nil,
1005
+ location: nil
1006
+ ),
1007
+ member: member,
1008
+ defined_in: type_name,
1009
+ implemented_in: type_name
1010
+ ),
1011
+ ],
1012
+ accessibility: accessibility,
1013
+ alias_of: nil
1014
+ )
1015
+ end
1016
+
1017
+ if ivar_name
1018
+ definition.instance_variables[ivar_name] = Definition::Variable.new(
1019
+ parent_variable: nil,
1020
+ type: type,
1021
+ declared_in: type_name
1022
+ )
1023
+ end
1024
+ end
1025
+
976
1026
  def merge_definitions(type_name, pairs, entry:, self_type:, ancestors:)
977
1027
  Definition.new(type_name: type_name, entry: entry, self_type: self_type, ancestors: ancestors).tap do |definition|
978
1028
  pairs.reverse_each do |ancestor, current_definition|
@@ -1029,7 +1079,8 @@ module RBS
1029
1079
  methods[name] = Definition::Method.new(
1030
1080
  super_method: super_method,
1031
1081
  accessibility: method.accessibility,
1032
- defs: sub.mapping.empty? ? defs : defs.map {|defn| defn.update(type: defn.type.sub(sub)) }
1082
+ defs: sub.mapping.empty? ? defs : defs.map {|defn| defn.update(type: defn.type.sub(sub)) },
1083
+ alias_of: nil
1033
1084
  )
1034
1085
  end
1035
1086
 
@@ -1123,7 +1174,8 @@ module RBS
1123
1174
  implemented_in: nil
1124
1175
  )
1125
1176
  end,
1126
- accessibility: :public
1177
+ accessibility: :public,
1178
+ alias_of: nil
1127
1179
  )
1128
1180
  definition.methods[member.name] = method
1129
1181
  end