rbs 4.0.0.dev.4 → 4.1.0.pre.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.
Files changed (306) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +1 -0
  3. data/.github/dependabot.yml +16 -14
  4. data/.github/workflows/bundle-update.yml +63 -0
  5. data/.github/workflows/c-check.yml +21 -11
  6. data/.github/workflows/comments.yml +5 -3
  7. data/.github/workflows/dependabot.yml +2 -2
  8. data/.github/workflows/jruby.yml +67 -0
  9. data/.github/workflows/milestone.yml +83 -0
  10. data/.github/workflows/ruby.yml +63 -24
  11. data/.github/workflows/rust.yml +184 -0
  12. data/.github/workflows/truffleruby.yml +54 -0
  13. data/.github/workflows/typecheck.yml +5 -2
  14. data/.github/workflows/wasm.yml +53 -0
  15. data/.github/workflows/windows.yml +8 -2
  16. data/.gitignore +11 -0
  17. data/.rubocop.yml +1 -1
  18. data/CHANGELOG.md +357 -0
  19. data/README.md +4 -4
  20. data/Rakefile +365 -33
  21. data/Steepfile +8 -0
  22. data/config.yml +450 -24
  23. data/core/array.rbs +443 -363
  24. data/core/basic_object.rbs +9 -8
  25. data/core/binding.rbs +0 -2
  26. data/core/builtin.rbs +9 -8
  27. data/core/class.rbs +11 -8
  28. data/core/comparable.rbs +55 -34
  29. data/core/complex.rbs +104 -78
  30. data/core/dir.rbs +61 -49
  31. data/core/encoding.rbs +12 -15
  32. data/core/enumerable.rbs +288 -196
  33. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  34. data/core/enumerator/product.rbs +5 -5
  35. data/core/enumerator.rbs +91 -28
  36. data/core/errno.rbs +11 -2
  37. data/core/errors.rbs +58 -29
  38. data/core/exception.rbs +13 -13
  39. data/core/fiber.rbs +74 -54
  40. data/core/file.rbs +260 -1151
  41. data/core/file_constants.rbs +463 -0
  42. data/core/file_stat.rbs +534 -0
  43. data/core/file_test.rbs +3 -3
  44. data/core/float.rbs +257 -92
  45. data/core/gc.rbs +425 -281
  46. data/core/hash.rbs +1151 -829
  47. data/core/integer.rbs +156 -195
  48. data/core/io/buffer.rbs +53 -42
  49. data/core/io/wait.rbs +13 -35
  50. data/core/io.rbs +216 -150
  51. data/core/kernel.rbs +239 -163
  52. data/core/marshal.rbs +4 -4
  53. data/core/match_data.rbs +15 -13
  54. data/core/math.rbs +107 -66
  55. data/core/method.rbs +69 -33
  56. data/core/module.rbs +302 -150
  57. data/core/nil_class.rbs +7 -6
  58. data/core/numeric.rbs +77 -63
  59. data/core/object.rbs +9 -11
  60. data/core/object_space/weak_key_map.rbs +7 -7
  61. data/core/object_space.rbs +30 -23
  62. data/core/pathname.rbs +1322 -0
  63. data/core/proc.rbs +95 -58
  64. data/core/process.rbs +222 -202
  65. data/core/ractor.rbs +371 -515
  66. data/core/random.rbs +21 -3
  67. data/core/range.rbs +181 -79
  68. data/core/rational.rbs +60 -89
  69. data/core/rbs/ops.rbs +154 -0
  70. data/core/rbs/unnamed/argf.rbs +63 -56
  71. data/core/rbs/unnamed/env_class.rbs +19 -14
  72. data/core/rbs/unnamed/main_class.rbs +123 -0
  73. data/core/rbs/unnamed/random.rbs +11 -118
  74. data/core/regexp.rbs +258 -214
  75. data/core/ruby.rbs +53 -0
  76. data/core/ruby_vm.rbs +78 -34
  77. data/core/rubygems/config_file.rbs +5 -5
  78. data/core/rubygems/errors.rbs +4 -71
  79. data/core/rubygems/requirement.rbs +5 -5
  80. data/core/rubygems/rubygems.rbs +16 -82
  81. data/core/rubygems/version.rbs +2 -3
  82. data/core/set.rbs +493 -363
  83. data/core/signal.rbs +26 -16
  84. data/core/string.rbs +3234 -1285
  85. data/core/struct.rbs +43 -42
  86. data/core/symbol.rbs +41 -34
  87. data/core/thread.rbs +141 -73
  88. data/core/time.rbs +81 -50
  89. data/core/trace_point.rbs +41 -35
  90. data/core/true_class.rbs +2 -2
  91. data/core/unbound_method.rbs +24 -16
  92. data/core/warning.rbs +7 -7
  93. data/docs/CONTRIBUTING.md +2 -1
  94. data/docs/aliases.md +79 -0
  95. data/docs/collection.md +3 -3
  96. data/docs/config.md +171 -0
  97. data/docs/encoding.md +56 -0
  98. data/docs/gem.md +0 -1
  99. data/docs/inline.md +634 -0
  100. data/docs/rbs_by_example.md +20 -20
  101. data/docs/rust.md +96 -0
  102. data/docs/sigs.md +3 -3
  103. data/docs/syntax.md +48 -18
  104. data/docs/type_fingerprint.md +21 -0
  105. data/docs/wasm_serialization.md +80 -0
  106. data/exe/rbs +1 -1
  107. data/ext/rbs_extension/ast_translation.c +1441 -671
  108. data/ext/rbs_extension/ast_translation.h +7 -0
  109. data/ext/rbs_extension/class_constants.c +18 -2
  110. data/ext/rbs_extension/class_constants.h +9 -0
  111. data/ext/rbs_extension/extconf.rb +6 -1
  112. data/ext/rbs_extension/legacy_location.c +33 -56
  113. data/ext/rbs_extension/legacy_location.h +37 -0
  114. data/ext/rbs_extension/main.c +183 -39
  115. data/include/rbs/ast.h +597 -297
  116. data/include/rbs/defines.h +40 -0
  117. data/include/rbs/lexer.h +31 -11
  118. data/include/rbs/location.h +25 -44
  119. data/include/rbs/parser.h +6 -6
  120. data/include/rbs/serialize.h +39 -0
  121. data/include/rbs/string.h +0 -2
  122. data/include/rbs/util/rbs_allocator.h +34 -13
  123. data/include/rbs/util/rbs_assert.h +12 -1
  124. data/include/rbs/util/rbs_constant_pool.h +0 -3
  125. data/include/rbs/util/rbs_encoding.h +2 -0
  126. data/include/rbs/util/rbs_unescape.h +2 -1
  127. data/include/rbs.h +8 -0
  128. data/lib/rbs/annotate/rdoc_annotator.rb +27 -31
  129. data/lib/rbs/ast/annotation.rb +1 -1
  130. data/lib/rbs/ast/comment.rb +1 -1
  131. data/lib/rbs/ast/declarations.rb +10 -10
  132. data/lib/rbs/ast/members.rb +14 -14
  133. data/lib/rbs/ast/ruby/annotations.rb +335 -3
  134. data/lib/rbs/ast/ruby/comment_block.rb +30 -4
  135. data/lib/rbs/ast/ruby/declarations.rb +209 -4
  136. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +4 -0
  137. data/lib/rbs/ast/ruby/helpers/location_helper.rb +1 -1
  138. data/lib/rbs/ast/ruby/members.rb +571 -22
  139. data/lib/rbs/ast/type_param.rb +24 -4
  140. data/lib/rbs/buffer.rb +66 -24
  141. data/lib/rbs/cli/diff.rb +16 -15
  142. data/lib/rbs/cli/validate.rb +38 -106
  143. data/lib/rbs/cli.rb +55 -24
  144. data/lib/rbs/collection/config/lockfile_generator.rb +28 -3
  145. data/lib/rbs/collection/sources/git.rb +7 -0
  146. data/lib/rbs/definition.rb +1 -1
  147. data/lib/rbs/definition_builder/ancestor_builder.rb +62 -9
  148. data/lib/rbs/definition_builder/method_builder.rb +32 -6
  149. data/lib/rbs/definition_builder.rb +147 -25
  150. data/lib/rbs/diff.rb +7 -1
  151. data/lib/rbs/environment.rb +235 -75
  152. data/lib/rbs/environment_loader.rb +0 -6
  153. data/lib/rbs/errors.rb +27 -18
  154. data/lib/rbs/inline_parser.rb +377 -15
  155. data/lib/rbs/location_aux.rb +1 -1
  156. data/lib/rbs/locator.rb +5 -1
  157. data/lib/rbs/method_type.rb +5 -3
  158. data/lib/rbs/namespace.rb +47 -11
  159. data/lib/rbs/parser_aux.rb +20 -7
  160. data/lib/rbs/prototype/helpers.rb +57 -0
  161. data/lib/rbs/prototype/rb.rb +3 -28
  162. data/lib/rbs/prototype/rbi.rb +3 -20
  163. data/lib/rbs/prototype/runtime.rb +10 -0
  164. data/lib/rbs/resolver/constant_resolver.rb +2 -2
  165. data/lib/rbs/resolver/type_name_resolver.rb +120 -44
  166. data/lib/rbs/rewriter.rb +70 -0
  167. data/lib/rbs/subtractor.rb +3 -1
  168. data/lib/rbs/test/type_check.rb +25 -3
  169. data/lib/rbs/type_name.rb +34 -14
  170. data/lib/rbs/types.rb +88 -78
  171. data/lib/rbs/unit_test/type_assertions.rb +44 -8
  172. data/lib/rbs/validator.rb +2 -2
  173. data/lib/rbs/version.rb +1 -1
  174. data/lib/rbs/wasm/deserializer.rb +213 -0
  175. data/lib/rbs/wasm/location.rb +61 -0
  176. data/lib/rbs/wasm/parser.rb +137 -0
  177. data/lib/rbs/wasm/runtime.rb +217 -0
  178. data/lib/rbs/wasm/serialization_schema.rb +110 -0
  179. data/lib/rbs.rb +13 -2
  180. data/lib/rdoc/discover.rb +1 -1
  181. data/lib/rdoc_plugin/parser.rb +1 -1
  182. data/rbs.gemspec +24 -6
  183. data/schema/typeParam.json +17 -1
  184. data/sig/annotate/rdoc_annotater.rbs +12 -9
  185. data/sig/ast/ruby/annotations.rbs +364 -4
  186. data/sig/ast/ruby/comment_block.rbs +8 -0
  187. data/sig/ast/ruby/declarations.rbs +102 -4
  188. data/sig/ast/ruby/members.rbs +128 -2
  189. data/sig/buffer.rbs +19 -1
  190. data/sig/cli/diff.rbs +5 -11
  191. data/sig/cli/validate.rbs +12 -8
  192. data/sig/cli.rbs +18 -18
  193. data/sig/collection/config/lockfile_generator.rbs +2 -0
  194. data/sig/definition.rbs +6 -1
  195. data/sig/definition_builder.rbs +2 -0
  196. data/sig/environment.rbs +70 -12
  197. data/sig/errors.rbs +13 -14
  198. data/sig/inline_parser.rbs +41 -2
  199. data/sig/locator.rbs +0 -2
  200. data/sig/manifest.yaml +0 -2
  201. data/sig/method_builder.rbs +3 -1
  202. data/sig/namespace.rbs +20 -0
  203. data/sig/parser.rbs +41 -13
  204. data/sig/prototype/helpers.rbs +2 -0
  205. data/sig/resolver/type_name_resolver.rbs +36 -10
  206. data/sig/rewriter.rbs +45 -0
  207. data/sig/source.rbs +3 -3
  208. data/sig/type_param.rbs +13 -8
  209. data/sig/typename.rbs +15 -0
  210. data/sig/types.rbs +6 -7
  211. data/sig/unit_test/spy.rbs +0 -8
  212. data/sig/unit_test/type_assertions.rbs +15 -0
  213. data/sig/wasm/deserializer.rbs +66 -0
  214. data/sig/wasm/serialization_schema.rbs +13 -0
  215. data/src/ast.c +443 -162
  216. data/src/lexer.c +1415 -1313
  217. data/src/lexer.re +4 -0
  218. data/src/lexstate.c +63 -37
  219. data/src/location.c +7 -47
  220. data/src/parser.c +1032 -521
  221. data/src/serialize.c +958 -0
  222. data/src/string.c +0 -48
  223. data/src/util/rbs_allocator.c +89 -74
  224. data/src/util/rbs_assert.c +1 -1
  225. data/src/util/rbs_buffer.c +2 -2
  226. data/src/util/rbs_constant_pool.c +10 -14
  227. data/src/util/rbs_encoding.c +4 -8
  228. data/src/util/rbs_unescape.c +56 -20
  229. data/stdlib/abbrev/0/array.rbs +1 -1
  230. data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
  231. data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
  232. data/stdlib/cgi/0/core.rbs +9 -393
  233. data/stdlib/cgi/0/manifest.yaml +1 -0
  234. data/stdlib/cgi-escape/0/escape.rbs +171 -0
  235. data/stdlib/coverage/0/coverage.rbs +7 -4
  236. data/stdlib/csv/0/csv.rbs +5 -5
  237. data/stdlib/date/0/date.rbs +92 -79
  238. data/stdlib/date/0/date_time.rbs +25 -24
  239. data/stdlib/delegate/0/delegator.rbs +10 -7
  240. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  241. data/stdlib/digest/0/digest.rbs +111 -1
  242. data/stdlib/erb/0/erb.rbs +748 -347
  243. data/stdlib/etc/0/etc.rbs +73 -54
  244. data/stdlib/fileutils/0/fileutils.rbs +179 -160
  245. data/stdlib/forwardable/0/forwardable.rbs +13 -10
  246. data/stdlib/io-console/0/io-console.rbs +2 -2
  247. data/stdlib/json/0/json.rbs +223 -142
  248. data/stdlib/monitor/0/monitor.rbs +3 -3
  249. data/stdlib/net-http/0/net-http.rbs +162 -134
  250. data/stdlib/objspace/0/objspace.rbs +17 -34
  251. data/stdlib/open-uri/0/open-uri.rbs +48 -8
  252. data/stdlib/open3/0/open3.rbs +469 -10
  253. data/stdlib/openssl/0/openssl.rbs +482 -364
  254. data/stdlib/optparse/0/optparse.rbs +26 -17
  255. data/stdlib/pathname/0/pathname.rbs +11 -1381
  256. data/stdlib/pp/0/pp.rbs +9 -8
  257. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  258. data/stdlib/pstore/0/pstore.rbs +35 -30
  259. data/stdlib/psych/0/psych.rbs +65 -12
  260. data/stdlib/psych/0/store.rbs +2 -4
  261. data/stdlib/pty/0/pty.rbs +9 -6
  262. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  263. data/stdlib/rdoc/0/code_object.rbs +2 -1
  264. data/stdlib/rdoc/0/parser.rbs +1 -1
  265. data/stdlib/rdoc/0/rdoc.rbs +1 -1
  266. data/stdlib/rdoc/0/store.rbs +1 -1
  267. data/stdlib/resolv/0/resolv.rbs +26 -69
  268. data/stdlib/ripper/0/ripper.rbs +22 -19
  269. data/stdlib/securerandom/0/manifest.yaml +2 -0
  270. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  271. data/stdlib/shellwords/0/shellwords.rbs +3 -3
  272. data/stdlib/singleton/0/singleton.rbs +3 -0
  273. data/stdlib/socket/0/addrinfo.rbs +7 -7
  274. data/stdlib/socket/0/basic_socket.rbs +3 -3
  275. data/stdlib/socket/0/ip_socket.rbs +10 -8
  276. data/stdlib/socket/0/socket.rbs +23 -10
  277. data/stdlib/socket/0/tcp_server.rbs +1 -1
  278. data/stdlib/socket/0/tcp_socket.rbs +11 -3
  279. data/stdlib/socket/0/udp_socket.rbs +1 -1
  280. data/stdlib/socket/0/unix_server.rbs +1 -1
  281. data/stdlib/stringio/0/stringio.rbs +1209 -95
  282. data/stdlib/strscan/0/string_scanner.rbs +101 -80
  283. data/stdlib/tempfile/0/tempfile.rbs +25 -21
  284. data/stdlib/time/0/time.rbs +8 -6
  285. data/stdlib/timeout/0/timeout.rbs +63 -7
  286. data/stdlib/tsort/0/cyclic.rbs +4 -1
  287. data/stdlib/tsort/0/interfaces.rbs +8 -8
  288. data/stdlib/tsort/0/tsort.rbs +16 -15
  289. data/stdlib/uri/0/common.rbs +42 -20
  290. data/stdlib/uri/0/file.rbs +3 -3
  291. data/stdlib/uri/0/generic.rbs +26 -18
  292. data/stdlib/uri/0/http.rbs +2 -2
  293. data/stdlib/uri/0/ldap.rbs +2 -2
  294. data/stdlib/uri/0/mailto.rbs +3 -3
  295. data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
  296. data/stdlib/zlib/0/deflate.rbs +4 -3
  297. data/stdlib/zlib/0/gzip_reader.rbs +8 -8
  298. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  299. data/stdlib/zlib/0/inflate.rbs +1 -1
  300. data/stdlib/zlib/0/need_dict.rbs +1 -1
  301. data/stdlib/zlib/0/zstream.rbs +1 -0
  302. data/wasm/README.md +59 -0
  303. data/wasm/rbs_wasm.c +411 -0
  304. metadata +56 -8
  305. data/.vscode/extensions.json +0 -5
  306. data/.vscode/settings.json +0 -19
data/lib/rbs/type_name.rb CHANGED
@@ -22,21 +22,47 @@ module RBS
22
22
  end
23
23
  end
24
24
 
25
+ # Process-wide flyweight cache. Two-level Hash keyed by canonical
26
+ # Namespace identity (outer uses `compare_by_identity`) and name
27
+ # Symbol.
28
+ @intern_mutex = Mutex.new
29
+ @intern_cache = {} #: Hash[Namespace, Hash[Symbol, TypeName]]
30
+ @intern_cache.compare_by_identity
31
+
32
+ # Returns a canonical `TypeName` instance for the given `namespace` /
33
+ # `name` pair. The namespace is canonicalized through `Namespace.[]`
34
+ # so identity-based lookup works regardless of the caller passing a
35
+ # fresh `Namespace.new` or an already-interned instance.
36
+ def self.[](namespace, name)
37
+ ns = Namespace[namespace.path, namespace.absolute?]
38
+
39
+ inner = @intern_cache[ns]
40
+ if inner && (cached = inner[name])
41
+ return cached
42
+ end
43
+
44
+ @intern_mutex.synchronize do
45
+ inner = (@intern_cache[ns] ||= {})
46
+ inner[name] ||= new(namespace: ns, name: name)
47
+ end
48
+ end
49
+
25
50
  def ==(other)
51
+ return true if equal?(other)
26
52
  other.is_a?(self.class) && other.namespace == namespace && other.name == name
27
53
  end
28
54
 
29
55
  alias eql? ==
30
56
 
31
57
  def hash
32
- namespace.hash ^ name.hash
58
+ @hash ||= namespace.hash ^ name.hash
33
59
  end
34
60
 
35
61
  def to_s
36
62
  "#{namespace.to_s}#{name}"
37
63
  end
38
64
 
39
- def to_json(state = _ = nil)
65
+ def to_json(state = nil)
40
66
  to_s.to_json(state)
41
67
  end
42
68
 
@@ -53,7 +79,7 @@ module RBS
53
79
  end
54
80
 
55
81
  def absolute!
56
- self.class.new(namespace: namespace.absolute!, name: name)
82
+ TypeName[namespace.absolute!, name]
57
83
  end
58
84
 
59
85
  def absolute?
@@ -61,7 +87,7 @@ module RBS
61
87
  end
62
88
 
63
89
  def relative!
64
- self.class.new(namespace: namespace.relative!, name: name)
90
+ TypeName[namespace.relative!, name]
65
91
  end
66
92
 
67
93
  def interface?
@@ -69,7 +95,7 @@ module RBS
69
95
  end
70
96
 
71
97
  def with_prefix(namespace)
72
- self.class.new(namespace: namespace + self.namespace, name: name)
98
+ TypeName[namespace + self.namespace, name]
73
99
  end
74
100
 
75
101
  def split
@@ -80,23 +106,17 @@ module RBS
80
106
  if other.absolute?
81
107
  other
82
108
  else
83
- TypeName.new(
84
- namespace: self.to_namespace + other.namespace,
85
- name: other.name
86
- )
109
+ TypeName[self.to_namespace + other.namespace, other.name]
87
110
  end
88
111
  end
89
-
112
+
90
113
  def self.parse(string)
91
114
  absolute = string.start_with?("::")
92
115
 
93
116
  *path, name = string.delete_prefix("::").split("::").map(&:to_sym)
94
117
  raise unless name
95
118
 
96
- TypeName.new(
97
- name: name,
98
- namespace: RBS::Namespace.new(path: path, absolute: absolute)
99
- )
119
+ TypeName[Namespace[path, absolute], name]
100
120
  end
101
121
  end
102
122
  end
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
 
@@ -199,58 +199,6 @@ module RBS
199
199
  end
200
200
  end
201
201
 
202
- class ClassSingleton
203
- attr_reader :name
204
- attr_reader :location
205
-
206
- def initialize(name:, location:)
207
- @name = name
208
- @location = location
209
- end
210
-
211
- def ==(other)
212
- other.is_a?(ClassSingleton) && other.name == name
213
- end
214
-
215
- alias eql? ==
216
-
217
- def hash
218
- self.class.hash ^ name.hash
219
- end
220
-
221
- include NoFreeVariables
222
- include NoSubst
223
-
224
- def to_json(state = _ = nil)
225
- { class: :class_singleton, name: name, location: location }.to_json(state)
226
- end
227
-
228
- def to_s(level = 0)
229
- "singleton(#{name})"
230
- end
231
-
232
- include EmptyEachType
233
-
234
- def map_type_name(&)
235
- ClassSingleton.new(
236
- name: yield(name, location, self),
237
- location: location
238
- )
239
- end
240
-
241
- def has_self_type?
242
- false
243
- end
244
-
245
- def has_classish_type?
246
- false
247
- end
248
-
249
- def with_nonreturn_void?
250
- false
251
- end
252
- end
253
-
254
202
  module Application
255
203
  attr_reader :name
256
204
  attr_reader :args
@@ -303,12 +251,74 @@ module RBS
303
251
  # `void` in immediate generics parameter is allowed
304
252
  false
305
253
  else
306
- type.with_nonreturn_void?
254
+ type.with_nonreturn_void? # steep:ignore DeprecatedReference
307
255
  end
308
256
  end
309
257
  end
310
258
  end
311
259
 
260
+ class ClassSingleton
261
+ attr_reader :location
262
+
263
+ include Application
264
+
265
+ def initialize(name:, location:, args: [])
266
+ @name = name
267
+ @location = location
268
+ @args = args
269
+ end
270
+
271
+ def ==(other)
272
+ other.is_a?(ClassSingleton) && other.name == name && other.args == args
273
+ end
274
+
275
+ alias eql? ==
276
+
277
+ def hash
278
+ self.class.hash ^ name.hash ^ args.hash
279
+ end
280
+
281
+ def sub(s)
282
+ return self if s.empty?
283
+
284
+ self.class.new(name: name,
285
+ args: args.map {|ty| ty.sub(s) },
286
+ location: location)
287
+ end
288
+
289
+ def to_json(state = _ = nil)
290
+ { class: :class_singleton, name: name, args: args, location: location }.to_json(state)
291
+ end
292
+
293
+ def to_s(level = 0)
294
+ if args.empty?
295
+ "singleton(#{name})"
296
+ else
297
+ "singleton(#{name})[#{args.join(", ")}]"
298
+ end
299
+ end
300
+
301
+ def map_type_name(&block)
302
+ ClassSingleton.new(
303
+ name: yield(name, location, self),
304
+ args: args.map {|type| type.map_type_name(&block) },
305
+ location: location
306
+ )
307
+ end
308
+
309
+ def map_type(&block)
310
+ if block
311
+ ClassSingleton.new(
312
+ name: name,
313
+ args: args.map {|type| yield type },
314
+ location: location
315
+ )
316
+ else
317
+ enum_for :map_type
318
+ end
319
+ end
320
+ end
321
+
312
322
  class Interface
313
323
  attr_reader :location
314
324
 
@@ -320,7 +330,7 @@ module RBS
320
330
  @location = location
321
331
  end
322
332
 
323
- def to_json(state = _ = nil)
333
+ def to_json(state = nil)
324
334
  { class: :interface, name: name, args: args, location: location }.to_json(state)
325
335
  end
326
336
 
@@ -364,7 +374,7 @@ module RBS
364
374
  @location = location
365
375
  end
366
376
 
367
- def to_json(state = _ = nil)
377
+ def to_json(state = nil)
368
378
  { class: :class_instance, name: name, args: args, location: location }.to_json(state)
369
379
  end
370
380
 
@@ -408,7 +418,7 @@ module RBS
408
418
  @location = location
409
419
  end
410
420
 
411
- def to_json(state = _ = nil)
421
+ def to_json(state = nil)
412
422
  { class: :alias, name: name, args: args, location: location }.to_json(state)
413
423
  end
414
424
 
@@ -466,7 +476,7 @@ module RBS
466
476
  end
467
477
  end
468
478
 
469
- def to_json(state = _ = nil)
479
+ def to_json(state = nil)
470
480
  { class: :tuple, types: types, location: location }.to_json(state)
471
481
  end
472
482
 
@@ -520,7 +530,7 @@ module RBS
520
530
  end
521
531
 
522
532
  def with_nonreturn_void?
523
- each_type.any? {|type| type.with_nonreturn_void? }
533
+ each_type.any? {|type| type.with_nonreturn_void? } # steep:ignore DeprecatedReference
524
534
  end
525
535
  end
526
536
 
@@ -573,7 +583,7 @@ module RBS
573
583
  end
574
584
  end
575
585
 
576
- def to_json(state = _ = nil)
586
+ def to_json(state = nil)
577
587
  { class: :record, fields: fields, optional_fields: optional_fields, location: location }.to_json(state)
578
588
  end
579
589
 
@@ -638,7 +648,7 @@ module RBS
638
648
  end
639
649
 
640
650
  def with_nonreturn_void?
641
- each_type.any? {|type| type.with_nonreturn_void? }
651
+ each_type.any? {|type| type.with_nonreturn_void? } # steep:ignore DeprecatedReference
642
652
  end
643
653
  end
644
654
 
@@ -665,7 +675,7 @@ module RBS
665
675
  type.free_variables(set)
666
676
  end
667
677
 
668
- def to_json(state = _ = nil)
678
+ def to_json(state = nil)
669
679
  { class: :optional, type: type, location: location }.to_json(state)
670
680
  end
671
681
 
@@ -724,7 +734,7 @@ module RBS
724
734
  end
725
735
 
726
736
  def with_nonreturn_void?
727
- each_type.any? {|type| type.with_nonreturn_void? }
737
+ each_type.any? {|type| type.with_nonreturn_void? } # steep:ignore DeprecatedReference
728
738
  end
729
739
  end
730
740
 
@@ -755,7 +765,7 @@ module RBS
755
765
  end
756
766
  end
757
767
 
758
- def to_json(state = _ = nil)
768
+ def to_json(state = nil)
759
769
  { class: :union, types: types, location: location }.to_json(state)
760
770
  end
761
771
 
@@ -815,7 +825,7 @@ module RBS
815
825
  end
816
826
 
817
827
  def with_nonreturn_void?
818
- each_type.any? {|type| type.with_nonreturn_void? }
828
+ each_type.any? {|type| type.with_nonreturn_void? } # steep:ignore DeprecatedReference
819
829
  end
820
830
  end
821
831
 
@@ -846,7 +856,7 @@ module RBS
846
856
  end
847
857
  end
848
858
 
849
- def to_json(state = _ = nil)
859
+ def to_json(state = nil)
850
860
  { class: :intersection, types: types, location: location }.to_json(state)
851
861
  end
852
862
 
@@ -898,7 +908,7 @@ module RBS
898
908
  end
899
909
 
900
910
  def with_nonreturn_void?
901
- each_type.any? {|type| type.with_nonreturn_void? }
911
+ each_type.any? {|type| type.with_nonreturn_void? } # steep:ignore DeprecatedReference
902
912
  end
903
913
  end
904
914
 
@@ -932,7 +942,7 @@ module RBS
932
942
  end
933
943
  end
934
944
 
935
- def to_json(state = _ = nil)
945
+ def to_json(state = nil)
936
946
  { type: type, name: name }.to_json(state)
937
947
  end
938
948
 
@@ -1091,7 +1101,7 @@ module RBS
1091
1101
  end
1092
1102
  end
1093
1103
 
1094
- def to_json(state = _ = nil)
1104
+ def to_json(state = nil)
1095
1105
  {
1096
1106
  required_positionals: required_positionals,
1097
1107
  optional_positionals: optional_positionals,
@@ -1226,13 +1236,13 @@ module RBS
1226
1236
  end
1227
1237
 
1228
1238
  def with_nonreturn_void?
1229
- if each_param.any? {|param| param.type.with_nonreturn_void? }
1239
+ if each_param.any? {|param| param.type.with_nonreturn_void? } # steep:ignore DeprecatedReference
1230
1240
  true
1231
1241
  else
1232
1242
  if return_type.is_a?(Bases::Void)
1233
1243
  false
1234
1244
  else
1235
- return_type.with_nonreturn_void?
1245
+ return_type.with_nonreturn_void? # steep:ignore DeprecatedReference
1236
1246
  end
1237
1247
  end
1238
1248
  end
@@ -1279,7 +1289,7 @@ module RBS
1279
1289
  end
1280
1290
  end
1281
1291
 
1282
- def to_json(state = _ = nil)
1292
+ def to_json(state = nil)
1283
1293
  {
1284
1294
  return_type: return_type
1285
1295
  }.to_json(state)
@@ -1355,7 +1365,7 @@ module RBS
1355
1365
  other.self_type == self_type
1356
1366
  end
1357
1367
 
1358
- def to_json(state = _ = nil)
1368
+ def to_json(state = nil)
1359
1369
  {
1360
1370
  type: type,
1361
1371
  required: required,
@@ -1424,7 +1434,7 @@ module RBS
1424
1434
  set
1425
1435
  end
1426
1436
 
1427
- def to_json(state = _ = nil)
1437
+ def to_json(state = nil)
1428
1438
  {
1429
1439
  class: :proc,
1430
1440
  type: type,
@@ -1505,11 +1515,11 @@ module RBS
1505
1515
  end
1506
1516
 
1507
1517
  def with_nonreturn_void?
1508
- if type.with_nonreturn_void? || self_type&.with_nonreturn_void?
1518
+ if type.with_nonreturn_void? || self_type&.with_nonreturn_void? # steep:ignore DeprecatedReference
1509
1519
  true
1510
1520
  else
1511
1521
  if block = block()
1512
- block.type.with_nonreturn_void? || block.self_type&.with_nonreturn_void? || false
1522
+ block.type.with_nonreturn_void? || block.self_type&.with_nonreturn_void? || false # steep:ignore DeprecatedReference
1513
1523
  else
1514
1524
  false
1515
1525
  end
@@ -1541,7 +1551,7 @@ module RBS
1541
1551
  include EmptyEachType
1542
1552
  include NoTypeName
1543
1553
 
1544
- def to_json(state = _ = nil)
1554
+ def to_json(state = nil)
1545
1555
  { class: :literal, literal: literal.inspect, location: location }.to_json(state)
1546
1556
  end
1547
1557
 
@@ -192,6 +192,31 @@ module RBS
192
192
  end
193
193
  end
194
194
 
195
+ ruby2_keywords def assert_send_type_error(method_type, error_type, receiver, method, *args, &block)
196
+ send_setup(method_type, receiver, method, args, block) do |method_type, trace, result, exception|
197
+ typecheck = RBS::Test::TypeCheck.new(
198
+ self_class: receiver.class,
199
+ builder: builder,
200
+ sample_size: 100,
201
+ unchecked_classes: [],
202
+ instance_class: instance_class,
203
+ class_class: class_class
204
+ )
205
+ errors = typecheck.method_call(method, method_type, trace, errors: [])
206
+
207
+ assert_empty errors.map {|x| RBS::Test::Errors.to_string(x) }, "Call trace does not match with given method type: #{trace.inspect}"
208
+
209
+ method_defs = method_defs(method)
210
+ all_errors = method_defs.map {|t| typecheck.method_call(method, t.type, trace, errors: [], annotations: t.each_annotation.to_a) }
211
+ assert all_errors.any? {|es| es.empty? }, "Call trace does not match one of method definitions:\n #{trace.inspect}\n #{method_defs.map(&:type).join(" | ")}"
212
+
213
+ # Use `instnace_of?` instead of `is_a?` as we want to check for _the exact exception class_.
214
+ assert exception.instance_of? error_type
215
+
216
+ result
217
+ end
218
+ end
219
+
195
220
  ruby2_keywords def refute_send_type(method_type, receiver, method, *args, &block)
196
221
  send_setup(method_type, receiver, method, args, block) do |method_type, trace, result, exception|
197
222
  method_type = method_type.update(
@@ -231,15 +256,17 @@ module RBS
231
256
  type, definition = target
232
257
 
233
258
  case type
234
- when Types::ClassInstance
235
- subst = RBS::Substitution.build(definition.type_params, type.args)
236
- definition.methods[method].defs.map do |type_def|
237
- type_def.update(
238
- type: type_def.type.sub(subst)
239
- )
259
+ when Types::ClassInstance, Types::ClassSingleton
260
+ if type.is_a?(Types::ClassSingleton) && type.args.empty?
261
+ definition.methods[method].defs
262
+ else
263
+ subst = RBS::Substitution.build(definition.type_params, type.args)
264
+ definition.methods[method].defs.map do |type_def|
265
+ type_def.update(
266
+ type: type_def.type.sub(subst)
267
+ )
268
+ end
240
269
  end
241
- when Types::ClassSingleton
242
- definition.methods[method].defs
243
270
  else
244
271
  raise
245
272
  end
@@ -296,6 +323,15 @@ module RBS
296
323
  assert typecheck.value(constant, definition_type), "`#{constant_name}` (#{constant.inspect}) must be compatible with RBS type definition `#{definition_type}`"
297
324
  end
298
325
 
326
+ def assert_visibility(visibility, method)
327
+ _, definition = target
328
+ method_entry = definition.methods[method]
329
+
330
+ assert method_entry, "Method `#{method}` not found in RBS definition"
331
+ assert visibility == method_entry.accessibility,
332
+ "Expected `#{method}` to be #{visibility}, but was #{method_entry.accessibility}"
333
+ end
334
+
299
335
  def assert_type(type, value)
300
336
  typecheck = RBS::Test::TypeCheck.new(
301
337
  self_class: value.class,
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.1.0.pre.2"
5
5
  end