rbs 4.0.0.dev.4 → 4.0.0.dev.5

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 (223) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +14 -14
  3. data/.github/workflows/bundle-update.yml +60 -0
  4. data/.github/workflows/c-check.yml +11 -8
  5. data/.github/workflows/comments.yml +3 -3
  6. data/.github/workflows/dependabot.yml +1 -1
  7. data/.github/workflows/ruby.yml +17 -34
  8. data/.github/workflows/typecheck.yml +2 -2
  9. data/.github/workflows/valgrind.yml +42 -0
  10. data/.github/workflows/windows.yml +2 -2
  11. data/.rubocop.yml +1 -1
  12. data/README.md +1 -1
  13. data/Rakefile +32 -5
  14. data/config.yml +46 -0
  15. data/core/array.rbs +96 -46
  16. data/core/binding.rbs +0 -2
  17. data/core/builtin.rbs +2 -2
  18. data/core/comparable.rbs +13 -6
  19. data/core/complex.rbs +55 -41
  20. data/core/dir.rbs +4 -4
  21. data/core/encoding.rbs +7 -10
  22. data/core/enumerable.rbs +90 -3
  23. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  24. data/core/enumerator.rbs +63 -1
  25. data/core/errno.rbs +8 -0
  26. data/core/errors.rbs +28 -1
  27. data/core/exception.rbs +2 -2
  28. data/core/fiber.rbs +40 -20
  29. data/core/file.rbs +108 -78
  30. data/core/file_test.rbs +1 -1
  31. data/core/float.rbs +225 -69
  32. data/core/gc.rbs +417 -281
  33. data/core/hash.rbs +1023 -727
  34. data/core/integer.rbs +104 -110
  35. data/core/io/buffer.rbs +21 -10
  36. data/core/io/wait.rbs +11 -33
  37. data/core/io.rbs +82 -19
  38. data/core/kernel.rbs +70 -59
  39. data/core/marshal.rbs +1 -1
  40. data/core/match_data.rbs +1 -1
  41. data/core/math.rbs +42 -3
  42. data/core/method.rbs +63 -27
  43. data/core/module.rbs +103 -26
  44. data/core/nil_class.rbs +3 -3
  45. data/core/numeric.rbs +43 -35
  46. data/core/object.rbs +3 -3
  47. data/core/object_space.rbs +21 -15
  48. data/core/pathname.rbs +1272 -0
  49. data/core/proc.rbs +30 -25
  50. data/core/process.rbs +4 -2
  51. data/core/ractor.rbs +361 -509
  52. data/core/random.rbs +17 -0
  53. data/core/range.rbs +113 -16
  54. data/core/rational.rbs +56 -85
  55. data/core/rbs/unnamed/argf.rbs +2 -2
  56. data/core/rbs/unnamed/env_class.rbs +1 -1
  57. data/core/rbs/unnamed/random.rbs +4 -113
  58. data/core/regexp.rbs +25 -20
  59. data/core/ruby.rbs +53 -0
  60. data/core/ruby_vm.rbs +6 -4
  61. data/core/rubygems/errors.rbs +3 -70
  62. data/core/rubygems/rubygems.rbs +11 -79
  63. data/core/rubygems/version.rbs +2 -3
  64. data/core/set.rbs +488 -359
  65. data/core/signal.rbs +24 -14
  66. data/core/string.rbs +3171 -1241
  67. data/core/struct.rbs +1 -1
  68. data/core/symbol.rbs +17 -11
  69. data/core/thread.rbs +95 -33
  70. data/core/time.rbs +35 -9
  71. data/core/trace_point.rbs +7 -4
  72. data/core/unbound_method.rbs +14 -6
  73. data/docs/aliases.md +79 -0
  74. data/docs/collection.md +2 -2
  75. data/docs/encoding.md +56 -0
  76. data/docs/gem.md +0 -1
  77. data/docs/inline.md +470 -0
  78. data/docs/sigs.md +3 -3
  79. data/docs/syntax.md +33 -4
  80. data/docs/type_fingerprint.md +21 -0
  81. data/exe/rbs +1 -1
  82. data/ext/rbs_extension/ast_translation.c +77 -3
  83. data/ext/rbs_extension/ast_translation.h +3 -0
  84. data/ext/rbs_extension/class_constants.c +8 -2
  85. data/ext/rbs_extension/class_constants.h +4 -0
  86. data/ext/rbs_extension/extconf.rb +5 -1
  87. data/ext/rbs_extension/legacy_location.c +5 -5
  88. data/ext/rbs_extension/main.c +37 -20
  89. data/include/rbs/ast.h +85 -38
  90. data/include/rbs/defines.h +27 -0
  91. data/include/rbs/lexer.h +30 -11
  92. data/include/rbs/parser.h +6 -6
  93. data/include/rbs/string.h +0 -2
  94. data/include/rbs/util/rbs_allocator.h +34 -13
  95. data/include/rbs/util/rbs_assert.h +12 -1
  96. data/include/rbs/util/rbs_encoding.h +2 -0
  97. data/include/rbs/util/rbs_unescape.h +2 -1
  98. data/lib/rbs/ast/annotation.rb +1 -1
  99. data/lib/rbs/ast/comment.rb +1 -1
  100. data/lib/rbs/ast/declarations.rb +10 -10
  101. data/lib/rbs/ast/members.rb +14 -14
  102. data/lib/rbs/ast/ruby/annotations.rb +137 -0
  103. data/lib/rbs/ast/ruby/comment_block.rb +24 -0
  104. data/lib/rbs/ast/ruby/declarations.rb +198 -3
  105. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +4 -0
  106. data/lib/rbs/ast/ruby/members.rb +159 -1
  107. data/lib/rbs/ast/type_param.rb +24 -4
  108. data/lib/rbs/buffer.rb +20 -15
  109. data/lib/rbs/cli/diff.rb +16 -15
  110. data/lib/rbs/cli/validate.rb +38 -51
  111. data/lib/rbs/cli.rb +52 -19
  112. data/lib/rbs/collection/config/lockfile_generator.rb +8 -0
  113. data/lib/rbs/collection/sources/git.rb +1 -0
  114. data/lib/rbs/definition.rb +1 -1
  115. data/lib/rbs/definition_builder/ancestor_builder.rb +62 -9
  116. data/lib/rbs/definition_builder/method_builder.rb +20 -0
  117. data/lib/rbs/definition_builder.rb +91 -2
  118. data/lib/rbs/diff.rb +7 -1
  119. data/lib/rbs/environment.rb +227 -74
  120. data/lib/rbs/environment_loader.rb +0 -6
  121. data/lib/rbs/errors.rb +27 -7
  122. data/lib/rbs/inline_parser.rb +341 -5
  123. data/lib/rbs/location_aux.rb +1 -1
  124. data/lib/rbs/locator.rb +5 -1
  125. data/lib/rbs/method_type.rb +5 -3
  126. data/lib/rbs/parser_aux.rb +2 -2
  127. data/lib/rbs/prototype/rb.rb +2 -2
  128. data/lib/rbs/prototype/rbi.rb +2 -0
  129. data/lib/rbs/prototype/runtime.rb +8 -0
  130. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  131. data/lib/rbs/resolver/type_name_resolver.rb +116 -38
  132. data/lib/rbs/subtractor.rb +3 -1
  133. data/lib/rbs/test/type_check.rb +16 -2
  134. data/lib/rbs/type_name.rb +1 -1
  135. data/lib/rbs/types.rb +27 -27
  136. data/lib/rbs/validator.rb +2 -2
  137. data/lib/rbs/version.rb +1 -1
  138. data/lib/rbs.rb +1 -1
  139. data/lib/rdoc/discover.rb +1 -1
  140. data/lib/rdoc_plugin/parser.rb +1 -1
  141. data/rbs.gemspec +3 -2
  142. data/schema/typeParam.json +17 -1
  143. data/sig/ast/ruby/annotations.rbs +124 -0
  144. data/sig/ast/ruby/comment_block.rbs +8 -0
  145. data/sig/ast/ruby/declarations.rbs +102 -4
  146. data/sig/ast/ruby/members.rbs +87 -1
  147. data/sig/cli/diff.rbs +5 -11
  148. data/sig/cli/validate.rbs +13 -4
  149. data/sig/cli.rbs +18 -18
  150. data/sig/definition.rbs +6 -1
  151. data/sig/environment.rbs +70 -12
  152. data/sig/errors.rbs +13 -6
  153. data/sig/inline_parser.rbs +39 -2
  154. data/sig/locator.rbs +0 -2
  155. data/sig/manifest.yaml +0 -1
  156. data/sig/method_builder.rbs +3 -1
  157. data/sig/method_types.rbs +1 -1
  158. data/sig/parser.rbs +16 -2
  159. data/sig/resolver/type_name_resolver.rbs +35 -7
  160. data/sig/source.rbs +3 -3
  161. data/sig/type_param.rbs +13 -8
  162. data/sig/types.rbs +4 -4
  163. data/src/ast.c +80 -1
  164. data/src/lexer.c +1392 -1313
  165. data/src/lexer.re +3 -0
  166. data/src/lexstate.c +58 -37
  167. data/src/location.c +4 -4
  168. data/src/parser.c +412 -145
  169. data/src/string.c +0 -48
  170. data/src/util/rbs_allocator.c +89 -71
  171. data/src/util/rbs_assert.c +1 -1
  172. data/src/util/rbs_buffer.c +2 -2
  173. data/src/util/rbs_constant_pool.c +10 -10
  174. data/src/util/rbs_encoding.c +4 -8
  175. data/src/util/rbs_unescape.c +56 -20
  176. data/stdlib/bigdecimal/0/big_decimal.rbs +100 -82
  177. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  178. data/stdlib/cgi/0/core.rbs +9 -393
  179. data/stdlib/cgi/0/manifest.yaml +1 -0
  180. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  181. data/stdlib/coverage/0/coverage.rbs +3 -1
  182. data/stdlib/date/0/date.rbs +67 -59
  183. data/stdlib/date/0/date_time.rbs +1 -1
  184. data/stdlib/delegate/0/delegator.rbs +10 -7
  185. data/stdlib/digest/0/digest.rbs +110 -0
  186. data/stdlib/erb/0/erb.rbs +737 -347
  187. data/stdlib/fileutils/0/fileutils.rbs +20 -14
  188. data/stdlib/forwardable/0/forwardable.rbs +3 -0
  189. data/stdlib/json/0/json.rbs +82 -28
  190. data/stdlib/net-http/0/net-http.rbs +3 -0
  191. data/stdlib/objspace/0/objspace.rbs +9 -27
  192. data/stdlib/open-uri/0/open-uri.rbs +40 -0
  193. data/stdlib/open3/0/open3.rbs +459 -1
  194. data/stdlib/openssl/0/openssl.rbs +331 -228
  195. data/stdlib/optparse/0/optparse.rbs +8 -3
  196. data/stdlib/pathname/0/pathname.rbs +9 -1379
  197. data/stdlib/psych/0/psych.rbs +4 -4
  198. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  199. data/stdlib/rdoc/0/code_object.rbs +2 -1
  200. data/stdlib/rdoc/0/parser.rbs +1 -1
  201. data/stdlib/rdoc/0/rdoc.rbs +1 -1
  202. data/stdlib/rdoc/0/store.rbs +1 -1
  203. data/stdlib/resolv/0/resolv.rbs +25 -68
  204. data/stdlib/ripper/0/ripper.rbs +2 -2
  205. data/stdlib/securerandom/0/manifest.yaml +2 -0
  206. data/stdlib/securerandom/0/securerandom.rbs +6 -19
  207. data/stdlib/singleton/0/singleton.rbs +3 -0
  208. data/stdlib/socket/0/socket.rbs +13 -1
  209. data/stdlib/socket/0/tcp_socket.rbs +10 -2
  210. data/stdlib/stringio/0/stringio.rbs +1176 -85
  211. data/stdlib/strscan/0/string_scanner.rbs +31 -31
  212. data/stdlib/tempfile/0/tempfile.rbs +3 -3
  213. data/stdlib/time/0/time.rbs +1 -1
  214. data/stdlib/timeout/0/timeout.rbs +63 -7
  215. data/stdlib/tsort/0/cyclic.rbs +3 -0
  216. data/stdlib/uri/0/common.rbs +16 -2
  217. data/stdlib/uri/0/file.rbs +1 -1
  218. data/stdlib/uri/0/generic.rbs +24 -16
  219. data/stdlib/uri/0/rfc2396_parser.rbs +6 -7
  220. data/stdlib/zlib/0/gzip_reader.rbs +2 -2
  221. data/stdlib/zlib/0/gzip_writer.rbs +1 -1
  222. data/stdlib/zlib/0/zstream.rbs +1 -0
  223. metadata +30 -4
@@ -5,17 +5,28 @@ module RBS
5
5
  class TypeNameResolver
6
6
  attr_reader :all_names
7
7
  attr_reader :cache
8
- attr_reader :env
8
+ attr_reader :aliases
9
9
 
10
- def initialize(env)
11
- @all_names = Set[]
10
+ def initialize(all_names, aliases)
11
+ @all_names = all_names
12
+ @aliases = aliases
12
13
  @cache = {}
13
- @env = env
14
+ end
15
+
16
+ def self.build(env)
17
+ all_names = Set.new #: Set[TypeName]
14
18
 
15
19
  all_names.merge(env.class_decls.keys)
16
20
  all_names.merge(env.interface_decls.keys)
17
21
  all_names.merge(env.type_alias_decls.keys)
18
- all_names.merge(env.class_alias_decls.keys)
22
+
23
+ aliases = {} #: Hash[TypeName, [TypeName, context]]
24
+
25
+ env.class_alias_decls.each do |name, entry|
26
+ aliases[name] = [entry.decl.old_name, entry.context]
27
+ end
28
+
29
+ new(all_names, aliases)
19
30
  end
20
31
 
21
32
  def try_cache(query)
@@ -26,64 +37,131 @@ module RBS
26
37
  end
27
38
 
28
39
  def resolve(type_name, context:)
29
- if type_name.absolute?
40
+ if type_name.absolute? && has_type_name?(type_name)
30
41
  return type_name
31
42
  end
32
43
 
33
44
  try_cache([type_name, context]) do
34
- head, tail = partition(type_name)
45
+ if type_name.class?
46
+ resolve_namespace0(type_name, context, Set.new) || nil
47
+ else
48
+ namespace = type_name.namespace
35
49
 
36
- head = resolve_in(head, context)
37
-
38
- if head
39
- if tail
40
- absolute_name = tail.with_prefix(head.to_namespace)
41
- if env.normalize_type_name?(absolute_name)
42
- absolute_name
43
- end
50
+ if namespace.empty?
51
+ resolve_type_name(type_name.name, context)
44
52
  else
45
- head
53
+ if namespace = resolve_namespace0(namespace.to_type_name, context, Set.new)
54
+ type_name = TypeName.new(name: type_name.name, namespace: namespace.to_namespace)
55
+ has_type_name?(type_name)
56
+ end
46
57
  end
47
58
  end
48
59
  end
49
60
  end
50
61
 
51
- def partition(type_name)
52
- if type_name.namespace.empty?
53
- head = type_name.name
54
- tail = nil
55
- else
56
- head, *tail = type_name.namespace.path
62
+ def resolve_namespace(type_name, context:)
63
+ if type_name.absolute? && has_type_name?(type_name)
64
+ return type_name
65
+ end
57
66
 
58
- head or raise
67
+ unless type_name.class?
68
+ raise "Type name must be a class name: #{type_name}"
69
+ end
59
70
 
60
- tail = TypeName.new(
61
- name: type_name.name,
62
- namespace: Namespace.new(absolute: false, path: tail)
63
- )
71
+ try_cache([type_name, context]) do
72
+ ns = resolve_namespace0(type_name, context, Set.new) or return ns
64
73
  end
74
+ end
65
75
 
66
- [head, tail]
76
+ def has_type_name?(full_name)
77
+ if all_names.include?(full_name)
78
+ full_name
79
+ end
67
80
  end
68
81
 
69
- def resolve_in(head, context)
82
+ def aliased_name?(type_name)
83
+ if aliases.key?(type_name)
84
+ type_name
85
+ end
86
+ end
87
+
88
+ def resolve_type_name(type_name, context)
70
89
  if context
71
- parent, child = context
72
- case child
90
+ outer, inner = context
91
+ case inner
73
92
  when false
74
- resolve_in(head, parent)
93
+ resolve_type_name(type_name, outer)
94
+ else
95
+ has_type_name?(inner) or raise "Context must be normalized: #{inner.inspect}"
96
+ has_type_name?(TypeName.new(name: type_name, namespace: inner.to_namespace)) || resolve_type_name(type_name, outer)
97
+ end
98
+ else
99
+ type_name = TypeName.new(name: type_name, namespace: Namespace.root)
100
+ has_type_name?(type_name)
101
+ end
102
+ end
103
+
104
+ def resolve_head_namespace(head, context)
105
+ if context
106
+ outer, inner = context
107
+ case inner
108
+ when false
109
+ resolve_head_namespace(head, outer)
75
110
  when TypeName
76
- name = TypeName.new(name: head, namespace: child.to_namespace)
77
- has_name?(name) || resolve_in(head, parent)
111
+ has_type_name?(inner) or raise "Context must be normalized: #{inner.inspect}"
112
+ type_name = TypeName.new(name: head, namespace: inner.to_namespace)
113
+ has_type_name?(type_name) || aliased_name?(type_name) || resolve_head_namespace(head, outer)
78
114
  end
79
115
  else
80
- has_name?(TypeName.new(name: head, namespace: Namespace.root))
116
+ type_name = TypeName.new(name: head, namespace: Namespace.root)
117
+ has_type_name?(type_name) || aliased_name?(type_name)
81
118
  end
82
119
  end
83
120
 
84
- def has_name?(full_name)
85
- if all_names.include?(full_name)
86
- full_name
121
+ def normalize_namespace(type_name, rhs, context, visited)
122
+ if visited.include?(type_name)
123
+ # Cycle detected
124
+ return false
125
+ end
126
+
127
+ visited << type_name
128
+
129
+ begin
130
+ resolve_namespace0(rhs, context, visited)
131
+ ensure
132
+ visited.delete(type_name)
133
+ end
134
+ end
135
+
136
+ def resolve_namespace0(type_name, context, visited)
137
+ head, *tail = [*type_name.namespace.path, type_name.name]
138
+
139
+ head = head #: Symbol
140
+
141
+ head =
142
+ if type_name.absolute?
143
+ root_name = TypeName.new(name: head, namespace: Namespace.root)
144
+ has_type_name?(root_name) || aliased_name?(root_name)
145
+ else
146
+ resolve_head_namespace(head, context)
147
+ end
148
+
149
+ if head
150
+ if (rhs, context = aliases.fetch(head, nil))
151
+ head = normalize_namespace(head, rhs, context, visited) or return head
152
+ end
153
+
154
+ tail.inject(head) do |namespace, name|
155
+ type_name = TypeName.new(name: name, namespace: namespace.to_namespace)
156
+ case
157
+ when has_type_name?(type_name)
158
+ type_name
159
+ when (rhs, context = aliases.fetch(type_name, nil))
160
+ m = normalize_namespace(type_name, rhs, context, visited) or return m
161
+ else
162
+ return nil
163
+ end
164
+ end
87
165
  end
88
166
  end
89
167
  end
@@ -107,7 +107,9 @@ module RBS
107
107
  each_member(owner).any? do |m|
108
108
  case m
109
109
  when AST::Members::InstanceVariable
110
- m.name == name
110
+ m.name == name && kind == :instance
111
+ when AST::Members::ClassInstanceVariable
112
+ m.name == name && kind == :singleton
111
113
  when AST::Members::Attribute
112
114
  ivar_name = m.ivar_name == false ? nil : m.ivar_name || :"@#{m.name}"
113
115
  ivar_name == name && m.kind == kind
@@ -245,7 +245,7 @@ module RBS
245
245
  when Types::Bases::Any
246
246
  true
247
247
  when Types::Bases::Bool
248
- val.is_a?(TrueClass) || val.is_a?(FalseClass)
248
+ Test.call(val, IS_AP, TrueClass) || Test.call(val, IS_AP, FalseClass)
249
249
  when Types::Bases::Top
250
250
  true
251
251
  when Types::Bases::Bottom
@@ -288,6 +288,19 @@ module RBS
288
288
  values << args
289
289
  nil
290
290
  end
291
+ when nil
292
+ values = []
293
+ count = 10_000
294
+
295
+ ret = val.each do |*args|
296
+ count -= 1
297
+ values << args
298
+ break if count <= 0
299
+ end
300
+
301
+ if count == 0
302
+ ret = self
303
+ end
291
304
  else
292
305
  values = []
293
306
  ret = val.each do |*args|
@@ -323,7 +336,7 @@ module RBS
323
336
  rescue TypeError
324
337
  return false
325
338
  end
326
- val.is_a?(singleton_class)
339
+ Test.call(val, IS_AP, singleton_class)
327
340
  when Types::Interface
328
341
  if (definition = builder.build_interface(type.name.absolute!))
329
342
  definition.methods.each.all? do |method_name, method|
@@ -351,6 +364,7 @@ module RBS
351
364
  value(val, builder.expand_alias2(type.name.absolute!, type.args))
352
365
  when Types::Tuple
353
366
  Test.call(val, IS_AP, ::Array) &&
367
+ type.types.length == val.length &&
354
368
  type.types.map.with_index {|ty, index| value(val[index], ty) }.all?
355
369
  when Types::Record
356
370
  Test::call(val, IS_AP, ::Hash) &&
data/lib/rbs/type_name.rb CHANGED
@@ -36,7 +36,7 @@ module RBS
36
36
  "#{namespace.to_s}#{name}"
37
37
  end
38
38
 
39
- def to_json(state = _ = nil)
39
+ def to_json(state = nil)
40
40
  to_s.to_json(state)
41
41
  end
42
42
 
data/lib/rbs/types.rb CHANGED
@@ -61,7 +61,7 @@ module RBS
61
61
  include EmptyEachType
62
62
  include NoTypeName
63
63
 
64
- def to_json(state = _ = nil)
64
+ def to_json(state = nil)
65
65
  klass = to_s.to_sym
66
66
  { class: klass, location: location }.to_json(state)
67
67
  end
@@ -157,7 +157,7 @@ module RBS
157
157
  end
158
158
  end
159
159
 
160
- def to_json(state = _ = nil)
160
+ def to_json(state = nil)
161
161
  { class: :variable, name: name, location: location }.to_json(state)
162
162
  end
163
163
 
@@ -221,7 +221,7 @@ module RBS
221
221
  include NoFreeVariables
222
222
  include NoSubst
223
223
 
224
- def to_json(state = _ = nil)
224
+ def to_json(state = nil)
225
225
  { class: :class_singleton, name: name, location: location }.to_json(state)
226
226
  end
227
227
 
@@ -303,7 +303,7 @@ module RBS
303
303
  # `void` in immediate generics parameter is allowed
304
304
  false
305
305
  else
306
- type.with_nonreturn_void?
306
+ type.with_nonreturn_void? # steep:ignore DeprecatedReference
307
307
  end
308
308
  end
309
309
  end
@@ -320,7 +320,7 @@ module RBS
320
320
  @location = location
321
321
  end
322
322
 
323
- def to_json(state = _ = nil)
323
+ def to_json(state = nil)
324
324
  { class: :interface, name: name, args: args, location: location }.to_json(state)
325
325
  end
326
326
 
@@ -364,7 +364,7 @@ module RBS
364
364
  @location = location
365
365
  end
366
366
 
367
- def to_json(state = _ = nil)
367
+ def to_json(state = nil)
368
368
  { class: :class_instance, name: name, args: args, location: location }.to_json(state)
369
369
  end
370
370
 
@@ -408,7 +408,7 @@ module RBS
408
408
  @location = location
409
409
  end
410
410
 
411
- def to_json(state = _ = nil)
411
+ def to_json(state = nil)
412
412
  { class: :alias, name: name, args: args, location: location }.to_json(state)
413
413
  end
414
414
 
@@ -466,7 +466,7 @@ module RBS
466
466
  end
467
467
  end
468
468
 
469
- def to_json(state = _ = nil)
469
+ def to_json(state = nil)
470
470
  { class: :tuple, types: types, location: location }.to_json(state)
471
471
  end
472
472
 
@@ -520,7 +520,7 @@ module RBS
520
520
  end
521
521
 
522
522
  def with_nonreturn_void?
523
- each_type.any? {|type| type.with_nonreturn_void? }
523
+ each_type.any? {|type| type.with_nonreturn_void? } # steep:ignore DeprecatedReference
524
524
  end
525
525
  end
526
526
 
@@ -573,7 +573,7 @@ module RBS
573
573
  end
574
574
  end
575
575
 
576
- def to_json(state = _ = nil)
576
+ def to_json(state = nil)
577
577
  { class: :record, fields: fields, optional_fields: optional_fields, location: location }.to_json(state)
578
578
  end
579
579
 
@@ -638,7 +638,7 @@ module RBS
638
638
  end
639
639
 
640
640
  def with_nonreturn_void?
641
- each_type.any? {|type| type.with_nonreturn_void? }
641
+ each_type.any? {|type| type.with_nonreturn_void? } # steep:ignore DeprecatedReference
642
642
  end
643
643
  end
644
644
 
@@ -665,7 +665,7 @@ module RBS
665
665
  type.free_variables(set)
666
666
  end
667
667
 
668
- def to_json(state = _ = nil)
668
+ def to_json(state = nil)
669
669
  { class: :optional, type: type, location: location }.to_json(state)
670
670
  end
671
671
 
@@ -724,7 +724,7 @@ module RBS
724
724
  end
725
725
 
726
726
  def with_nonreturn_void?
727
- each_type.any? {|type| type.with_nonreturn_void? }
727
+ each_type.any? {|type| type.with_nonreturn_void? } # steep:ignore DeprecatedReference
728
728
  end
729
729
  end
730
730
 
@@ -755,7 +755,7 @@ module RBS
755
755
  end
756
756
  end
757
757
 
758
- def to_json(state = _ = nil)
758
+ def to_json(state = nil)
759
759
  { class: :union, types: types, location: location }.to_json(state)
760
760
  end
761
761
 
@@ -815,7 +815,7 @@ module RBS
815
815
  end
816
816
 
817
817
  def with_nonreturn_void?
818
- each_type.any? {|type| type.with_nonreturn_void? }
818
+ each_type.any? {|type| type.with_nonreturn_void? } # steep:ignore DeprecatedReference
819
819
  end
820
820
  end
821
821
 
@@ -846,7 +846,7 @@ module RBS
846
846
  end
847
847
  end
848
848
 
849
- def to_json(state = _ = nil)
849
+ def to_json(state = nil)
850
850
  { class: :intersection, types: types, location: location }.to_json(state)
851
851
  end
852
852
 
@@ -898,7 +898,7 @@ module RBS
898
898
  end
899
899
 
900
900
  def with_nonreturn_void?
901
- each_type.any? {|type| type.with_nonreturn_void? }
901
+ each_type.any? {|type| type.with_nonreturn_void? } # steep:ignore DeprecatedReference
902
902
  end
903
903
  end
904
904
 
@@ -932,7 +932,7 @@ module RBS
932
932
  end
933
933
  end
934
934
 
935
- def to_json(state = _ = nil)
935
+ def to_json(state = nil)
936
936
  { type: type, name: name }.to_json(state)
937
937
  end
938
938
 
@@ -1091,7 +1091,7 @@ module RBS
1091
1091
  end
1092
1092
  end
1093
1093
 
1094
- def to_json(state = _ = nil)
1094
+ def to_json(state = nil)
1095
1095
  {
1096
1096
  required_positionals: required_positionals,
1097
1097
  optional_positionals: optional_positionals,
@@ -1226,13 +1226,13 @@ module RBS
1226
1226
  end
1227
1227
 
1228
1228
  def with_nonreturn_void?
1229
- if each_param.any? {|param| param.type.with_nonreturn_void? }
1229
+ if each_param.any? {|param| param.type.with_nonreturn_void? } # steep:ignore DeprecatedReference
1230
1230
  true
1231
1231
  else
1232
1232
  if return_type.is_a?(Bases::Void)
1233
1233
  false
1234
1234
  else
1235
- return_type.with_nonreturn_void?
1235
+ return_type.with_nonreturn_void? # steep:ignore DeprecatedReference
1236
1236
  end
1237
1237
  end
1238
1238
  end
@@ -1279,7 +1279,7 @@ module RBS
1279
1279
  end
1280
1280
  end
1281
1281
 
1282
- def to_json(state = _ = nil)
1282
+ def to_json(state = nil)
1283
1283
  {
1284
1284
  return_type: return_type
1285
1285
  }.to_json(state)
@@ -1355,7 +1355,7 @@ module RBS
1355
1355
  other.self_type == self_type
1356
1356
  end
1357
1357
 
1358
- def to_json(state = _ = nil)
1358
+ def to_json(state = nil)
1359
1359
  {
1360
1360
  type: type,
1361
1361
  required: required,
@@ -1424,7 +1424,7 @@ module RBS
1424
1424
  set
1425
1425
  end
1426
1426
 
1427
- def to_json(state = _ = nil)
1427
+ def to_json(state = nil)
1428
1428
  {
1429
1429
  class: :proc,
1430
1430
  type: type,
@@ -1505,11 +1505,11 @@ module RBS
1505
1505
  end
1506
1506
 
1507
1507
  def with_nonreturn_void?
1508
- if type.with_nonreturn_void? || self_type&.with_nonreturn_void?
1508
+ if type.with_nonreturn_void? || self_type&.with_nonreturn_void? # steep:ignore DeprecatedReference
1509
1509
  true
1510
1510
  else
1511
1511
  if block = block()
1512
- block.type.with_nonreturn_void? || block.self_type&.with_nonreturn_void? || false
1512
+ block.type.with_nonreturn_void? || block.self_type&.with_nonreturn_void? || false # steep:ignore DeprecatedReference
1513
1513
  else
1514
1514
  false
1515
1515
  end
@@ -1541,7 +1541,7 @@ module RBS
1541
1541
  include EmptyEachType
1542
1542
  include NoTypeName
1543
1543
 
1544
- def to_json(state = _ = nil)
1544
+ def to_json(state = nil)
1545
1545
  { class: :literal, literal: literal.inspect, location: location }.to_json(state)
1546
1546
  end
1547
1547
 
data/lib/rbs/validator.rb CHANGED
@@ -127,8 +127,8 @@ module RBS
127
127
  # @type var each_child: ^(Symbol) { (Symbol) -> void } -> void
128
128
  each_child = -> (name, &block) do
129
129
  if param = params.find {|p| p.name == name }
130
- if b = param.upper_bound_type
131
- b.free_variables.each do |tv|
130
+ [param.upper_bound_type, param.lower_bound_type].compact.each do |bound|
131
+ bound.free_variables.each do |tv|
132
132
  block[tv]
133
133
  end
134
134
  end
data/lib/rbs/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RBS
4
- VERSION = "4.0.0.dev.4"
4
+ VERSION = "4.0.0.dev.5"
5
5
  end
data/lib/rbs.rb CHANGED
@@ -4,7 +4,7 @@ require "rbs/version"
4
4
 
5
5
  require "set"
6
6
  require "json"
7
- require "pathname"
7
+ require "pathname" unless defined?(Pathname)
8
8
  require "pp"
9
9
  require "ripper"
10
10
  require "logger"
data/lib/rdoc/discover.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  begin
4
- gem 'rdoc', '~> 6.13'
4
+ gem 'rdoc', '>= 6.16'
5
5
  require 'rdoc_plugin/parser'
6
6
  module RDoc
7
7
  class Parser
@@ -76,7 +76,7 @@ module RBS
76
76
  method.visibility = decl.visibility
77
77
  method.call_seq = decl.overloads.map {|overload| "#{decl.name.to_s}#{overload.method_type.to_s}" }.join("\n")
78
78
  if loc = decl.location
79
- method.start_collecting_tokens
79
+ method.start_collecting_tokens(:ruby)
80
80
  method.add_token({ line_no: 1, char_no: 1, kind: :on_comment, text: "# File #{@top_level.relative_name}, line(s) #{loc.start_line}:#{loc.end_line}\n" })
81
81
  method.add_token({ line_no: 1, char_no: 1, text: loc.source })
82
82
  method.line = loc.start_line
data/rbs.gemspec CHANGED
@@ -38,13 +38,14 @@ Gem::Specification.new do |spec|
38
38
  spec.extensions = %w{ext/rbs_extension/extconf.rb}
39
39
 
40
40
  if false
41
- spec.required_ruby_version = ">= 3.3"
41
+ spec.required_ruby_version = ">= 3.4"
42
42
  end
43
43
 
44
44
  spec.bindir = "exe"
45
45
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
46
46
  spec.require_paths = ["lib"]
47
- spec.required_ruby_version = ">= 3.1"
47
+ spec.required_ruby_version = ">= 3.2"
48
48
  spec.add_dependency "logger"
49
49
  spec.add_dependency "prism", ">= 1.3.0"
50
+ spec.add_dependency "tsort"
50
51
  end
@@ -28,9 +28,25 @@
28
28
  }
29
29
  ]
30
30
  },
31
+ "lower_bound": {
32
+ "oneOf": [
33
+ {
34
+ "$ref": "types.json#/definitions/classInstance"
35
+ },
36
+ {
37
+ "$ref": "types.json#/definitions/classSingleton"
38
+ },
39
+ {
40
+ "$ref": "types.json#/definitions/interface"
41
+ },
42
+ {
43
+ "type": "null"
44
+ }
45
+ ]
46
+ },
31
47
  "location": {
32
48
  "$ref": "location.json"
33
49
  }
34
50
  },
35
- "required": ["name", "variance", "unchecked", "upper_bound", "location"]
51
+ "required": ["name", "variance", "unchecked", "upper_bound", "lower_bound", "location"]
36
52
  }