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/cli.rb CHANGED
@@ -136,10 +136,12 @@ module RBS
136
136
  case command
137
137
  when :version
138
138
  stdout.puts opts.ver
139
+ 0
139
140
  when *COMMANDS
140
141
  __send__ :"run_#{command}", args, options
141
142
  else
142
143
  stdout.puts opts.help
144
+ 0
143
145
  end
144
146
  end
145
147
 
@@ -191,6 +193,8 @@ EOB
191
193
 
192
194
  stdout.print JSON.generate(decls)
193
195
  stdout.flush
196
+
197
+ 0
194
198
  end
195
199
 
196
200
  def run_list(args, options)
@@ -254,6 +258,8 @@ EOB
254
258
  stdout.puts "#{name} (interface)"
255
259
  end
256
260
  end
261
+
262
+ 0
257
263
  end
258
264
 
259
265
  def run_ancestors(args, options)
@@ -279,7 +285,7 @@ EOU
279
285
 
280
286
  unless args.size == 1
281
287
  stdout.puts "Expected one argument."
282
- return
288
+ return 1
283
289
  end
284
290
 
285
291
  loader = options.loader()
@@ -317,6 +323,8 @@ EOU
317
323
  else
318
324
  stdout.puts "Cannot find class: #{type_name}"
319
325
  end
326
+
327
+ 0
320
328
  end
321
329
 
322
330
  def run_methods(args, options)
@@ -344,7 +352,7 @@ EOU
344
352
 
345
353
  unless args.size == 1
346
354
  stdout.puts "Expected one argument."
347
- return
355
+ return 1
348
356
  end
349
357
 
350
358
  loader = options.loader()
@@ -373,6 +381,8 @@ EOU
373
381
  else
374
382
  stdout.puts "Cannot find class: #{type_name}"
375
383
  end
384
+
385
+ 0
376
386
  end
377
387
 
378
388
  def run_method(args, options)
@@ -398,7 +408,7 @@ EOU
398
408
 
399
409
  unless args.size == 2
400
410
  stdout.puts "Expected two arguments, but given #{args.size}."
401
- return
411
+ return 1
402
412
  end
403
413
 
404
414
  loader = options.loader()
@@ -410,7 +420,7 @@ EOU
410
420
 
411
421
  unless env.module_name?(type_name)
412
422
  stdout.puts "Cannot find class: #{type_name}"
413
- return
423
+ return 1
414
424
  end
415
425
 
416
426
  definition = case kind
@@ -426,7 +436,7 @@ EOU
426
436
 
427
437
  unless method
428
438
  stdout.puts "Cannot find method: #{method_name}"
429
- return
439
+ return 1
430
440
  end
431
441
 
432
442
  stdout.puts "#{type_name}#{kind == :instance ? "#" : "."}#{method_name}"
@@ -440,6 +450,8 @@ EOU
440
450
  stdout.puts format(" %s %-#{length_max}s at %s", separator, type, type.location)
441
451
  separator = "|"
442
452
  end
453
+
454
+ 0
443
455
  end
444
456
 
445
457
  def run_validate(args, options)
@@ -469,7 +481,7 @@ EOU
469
481
 
470
482
  unless args.size == 1
471
483
  stdout.puts "Expected one argument."
472
- return
484
+ return 1
473
485
  end
474
486
 
475
487
  loader = options.loader()
@@ -502,6 +514,8 @@ EOU
502
514
  else
503
515
  stdout.puts " => [no constant]"
504
516
  end
517
+
518
+ 0
505
519
  end
506
520
 
507
521
  def run_paths(args, options)
@@ -544,6 +558,8 @@ EOU
544
558
  stdout.puts "#{dir} (#{kind_of[dir]}, library, name=#{source.name})"
545
559
  end
546
560
  end
561
+
562
+ 0
547
563
  end
548
564
 
549
565
  def run_prototype(args, options)
@@ -647,6 +663,8 @@ EOU
647
663
 
648
664
  writer = Writer.new(out: stdout)
649
665
  writer.write decls
666
+
667
+ 0
650
668
  else
651
669
  stdout.puts <<EOU
652
670
  Usage: rbs prototype [generator...] [args...]
@@ -660,7 +678,7 @@ Examples:
660
678
  $ rbs prototype rbi foo.rbi
661
679
  $ rbs prototype runtime String
662
680
  EOU
663
- exit 1
681
+ 1
664
682
  end
665
683
  end
666
684
 
@@ -712,12 +730,12 @@ EOU
712
730
 
713
731
  unless has_parser?
714
732
  stdout.puts "Not supported on this interpreter (#{RUBY_ENGINE})."
715
- exit 1
733
+ return 1
716
734
  end
717
735
 
718
736
  if args.empty?
719
737
  stdout.puts opts
720
- return nil
738
+ return 1
721
739
  end
722
740
 
723
741
  new_parser = -> do
@@ -827,6 +845,8 @@ EOU
827
845
  writer = Writer.new(out: stdout)
828
846
  writer.write parser.decls
829
847
  end
848
+
849
+ 0
830
850
  end
831
851
 
832
852
  def run_vendor(args, options)
@@ -880,6 +900,8 @@ Options:
880
900
 
881
901
  stdout.puts " Copying RBS files..."
882
902
  vendorer.copy!
903
+
904
+ 0
883
905
  end
884
906
 
885
907
  def run_parse(args, options)
@@ -927,7 +949,11 @@ Options:
927
949
  syntax_error = true
928
950
  end
929
951
 
930
- exit 1 if syntax_error
952
+ if syntax_error
953
+ 1
954
+ else
955
+ 0
956
+ end
931
957
  end
932
958
 
933
959
  def run_annotate(args, options)
@@ -936,8 +962,6 @@ Options:
936
962
  source = RBS::Annotate::RDocSource.new()
937
963
  annotator = RBS::Annotate::RDocAnnotator.new(source: source)
938
964
 
939
- preserve = true
940
-
941
965
  OptionParser.new do |opts|
942
966
  opts.banner = <<-EOB
943
967
  Usage: rbs annotate [options...] [files...]
@@ -946,7 +970,7 @@ Import documents from RDoc and update RBS files.
946
970
 
947
971
  Examples:
948
972
 
949
- $ rbs annotate stdlib/pathname/**/*.rbs
973
+ $ rbs annotate stdlib/logger/**/*.rbs
950
974
 
951
975
  Options:
952
976
  EOB
@@ -958,7 +982,7 @@ Options:
958
982
  opts.on("-d", "--dir DIRNAME", "Load RDoc from DIRNAME") {|d| source.extra_dirs << Pathname(d) }
959
983
  opts.on("--[no-]arglists", "Generate arglists section (defaults to true)") {|b| annotator.include_arg_lists = b }
960
984
  opts.on("--[no-]filename", "Include source file name in the documentation (defaults to true)") {|b| annotator.include_filename = b }
961
- opts.on("--[no-]preserve", "Try preserve the format of the original file (defaults to true)") {|b| preserve = b }
985
+ opts.on("--[no-]preserve", "[Deprecated] It always preserves the format") { stdout.puts "The `--preserve` option is deprecated. The tool always preserves the format of RBS files." }
962
986
  end.parse!(args)
963
987
 
964
988
  source.load()
@@ -968,13 +992,15 @@ Options:
968
992
  if path.directory?
969
993
  Pathname.glob((path + "**/*.rbs").to_s).each do |path|
970
994
  stdout.puts "Processing #{path}..."
971
- annotator.annotate_file(path, preserve: preserve)
995
+ annotator.annotate_file(path)
972
996
  end
973
997
  else
974
998
  stdout.puts "Processing #{path}..."
975
- annotator.annotate_file(path, preserve: preserve)
999
+ annotator.annotate_file(path)
976
1000
  end
977
1001
  end
1002
+
1003
+ 0
978
1004
  end
979
1005
 
980
1006
  def test_opt options
@@ -1028,7 +1054,7 @@ EOB
1028
1054
 
1029
1055
  if args.length.zero?
1030
1056
  stdout.puts opts.help
1031
- exit 1
1057
+ return 1
1032
1058
  end
1033
1059
 
1034
1060
  # @type var env_hash: Hash[String, String?]
@@ -1044,11 +1070,12 @@ EOB
1044
1070
 
1045
1071
  # @type var out: String
1046
1072
  # @type var err: String
1073
+ # @type var status: Process::Status
1047
1074
  out, err, status = __skip__ = Open3.capture3(env_hash, *args)
1048
1075
  stdout.print(out)
1049
1076
  stderr.print(err)
1050
1077
 
1051
- status
1078
+ status.to_i
1052
1079
  end
1053
1080
 
1054
1081
  def run_collection(args, options)
@@ -1073,7 +1100,7 @@ EOB
1073
1100
  when 'init'
1074
1101
  if config_path.exist?
1075
1102
  puts "#{config_path} already exists"
1076
- exit 1
1103
+ return 1
1077
1104
  end
1078
1105
 
1079
1106
  config_path.write(<<~'YAML')
@@ -1101,15 +1128,17 @@ EOB
1101
1128
  when 'clean'
1102
1129
  unless lock_path.exist?
1103
1130
  puts "#{lock_path} should exist to clean"
1104
- exit 1
1131
+ return 1
1105
1132
  end
1106
1133
  Collection::Cleaner.new(lockfile_path: lock_path)
1107
1134
  when 'help', 'hel', 'he', 'h'
1108
1135
  puts opts.help
1109
1136
  else
1110
1137
  puts opts.help
1111
- exit 1
1138
+ return 1
1112
1139
  end
1140
+
1141
+ 0
1113
1142
  end
1114
1143
 
1115
1144
  def collection_options(args)
@@ -1171,7 +1200,7 @@ EOB
1171
1200
  *minuend_paths, subtrahend_path = args
1172
1201
  unless subtrahend_path
1173
1202
  stdout.puts opts.help
1174
- exit 1
1203
+ return 1
1175
1204
  end
1176
1205
  subtrahend_paths << subtrahend_path
1177
1206
  else
@@ -1180,7 +1209,7 @@ EOB
1180
1209
 
1181
1210
  if minuend_paths.empty?
1182
1211
  stdout.puts opts.help
1183
- exit 1
1212
+ return 1
1184
1213
  end
1185
1214
 
1186
1215
  subtrahend = Environment.new.tap do |env|
@@ -1213,10 +1242,12 @@ EOB
1213
1242
  end
1214
1243
  end
1215
1244
  end
1245
+
1246
+ 0
1216
1247
  end
1217
1248
 
1218
1249
  def run_diff(argv, library_options)
1219
- Diff.new(argv: argv, library_options: library_options, stdout: stdout, stderr: stderr).run
1250
+ Diff.new(stdout: stdout, stderr: stderr).run(argv: argv, library_options: library_options)
1220
1251
  end
1221
1252
  end
1222
1253
  end
@@ -8,14 +8,30 @@ module RBS
8
8
  "mutex_m" => ">= 0.3.0",
9
9
  "abbrev" => nil,
10
10
  "base64" => nil,
11
+ "benchmark" => nil,
11
12
  "bigdecimal" => nil,
12
13
  "csv" => nil,
14
+ "kconv" => nil,
15
+ "logger" => nil,
13
16
  "minitest" => nil,
14
17
  "net-smtp" => nil,
15
18
  "nkf" => nil,
16
19
  "observer" => nil,
20
+ "cgi" => nil,
21
+ "pstore" => nil,
17
22
  }
18
23
 
24
+ NONGEM_STDLIBS = Set[
25
+ "cgi-escape",
26
+ "coverage",
27
+ "monitor",
28
+ "objspace",
29
+ "pathname",
30
+ "pty",
31
+ "ripper",
32
+ "socket",
33
+ ]
34
+
19
35
  class GemfileLockMismatchError < StandardError
20
36
  def initialize(expected:, actual:)
21
37
  @expected = expected
@@ -163,7 +179,9 @@ module RBS
163
179
  end
164
180
  end
165
181
  else
166
- RBS.logger.warn "Cannot find `#{name}` gem. Using incorrect Bundler context? (#{definition.lockfile})"
182
+ unless NONGEM_STDLIBS.include?(name)
183
+ RBS.logger.warn "Cannot find `#{name}` gem. Using incorrect Bundler context? (#{definition.lockfile})"
184
+ end
167
185
  end
168
186
  end
169
187
 
@@ -171,8 +189,8 @@ module RBS
171
189
  return if lockfile.gems.key?(name)
172
190
 
173
191
  case name
174
- when 'bigdecimal-math'
175
- # The `bigdecimal-math` is never released as a gem.
192
+ when 'bigdecimal-math', 'kconv'
193
+ # These gems are never released as a gem.
176
194
  # Therefore, `assign_gem` should not be called.
177
195
  RBS.logger.info {
178
196
  from = from_gem || "rbs_collection.yaml"
@@ -183,6 +201,13 @@ module RBS
183
201
  lockfile.gems[name] = { name: name, version: "0", source: source }
184
202
  end
185
203
  return
204
+ when 'set'
205
+ # set is migrated to core from stdlib.
206
+ RBS.logger.info {
207
+ from = from_gem || "rbs_collection.yaml"
208
+ "`#{name}` is a part of the Ruby core library. The dependency to the library can be safely deleted from #{from}."
209
+ }
210
+ return
186
211
  when *ALUMNI_STDLIBS.keys
187
212
  version = ALUMNI_STDLIBS.fetch(name)
188
213
  if from_gem
@@ -3,6 +3,7 @@
3
3
  require 'digest/sha2'
4
4
  require 'open3'
5
5
  require 'find'
6
+ require 'fileutils'
6
7
 
7
8
  module RBS
8
9
  module Collection
@@ -139,6 +140,12 @@ module RBS
139
140
  # git v2.27.0 or greater
140
141
  git 'clone', '--filter=blob:none', remote, git_dir.to_s, chdir: nil
141
142
  rescue CommandError
143
+ # The failed `--filter=blob:none` clone may leave behind a
144
+ # partial repository (e.g. when the server returned an error
145
+ # mid-clone), which would cause the fallback `git clone` to
146
+ # fail with "destination path ... already exists and is not
147
+ # an empty directory". Clean it up before retrying.
148
+ FileUtils.rm_rf(git_dir)
142
149
  git 'clone', remote, git_dir.to_s, chdir: nil
143
150
  end
144
151
  end
@@ -66,7 +66,7 @@ module RBS
66
66
  when AST::Members::Base
67
67
  member.comment
68
68
  when AST::Ruby::Members::Base
69
- nil
69
+ member.leading_comment&.as_comment
70
70
  end
71
71
  end
72
72
 
@@ -220,7 +220,7 @@ module RBS
220
220
  InvalidTypeApplicationError.check2!(type_name: super_class.name, args: super_class.args, env: env, location: super_class.location)
221
221
  end
222
222
 
223
- super_entry = env.normalized_class_entry(super_name) or raise
223
+ super_entry = env.class_entry(super_name, normalized: true) or raise
224
224
  super_args = AST::TypeParam.normalize_args(super_entry.type_params, super_args)
225
225
 
226
226
  ancestors = OneAncestors.class_instance(
@@ -248,7 +248,7 @@ module RBS
248
248
 
249
249
  module_name = module_self.name
250
250
  if module_name.class?
251
- module_entry = env.normalized_module_class_entry(module_name) or raise
251
+ module_entry = env.module_class_entry(module_name, normalized: true) or raise
252
252
  module_name = module_entry.name
253
253
  self_args = AST::TypeParam.normalize_args(module_entry.type_params, module_self.args)
254
254
  end
@@ -361,7 +361,7 @@ module RBS
361
361
  MixinClassError.check!(type_name: type_name, env: env, member: member)
362
362
  NoMixinFoundError.check!(member.name, env: env, member: member)
363
363
 
364
- module_decl = env.normalized_module_entry(module_name) or raise
364
+ module_decl = env.module_entry(module_name, normalized: true) or raise
365
365
  module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
366
366
 
367
367
  module_name = env.normalize_module_name(module_name)
@@ -380,7 +380,7 @@ module RBS
380
380
  MixinClassError.check!(type_name: type_name, env: env, member: member)
381
381
  NoMixinFoundError.check!(member.name, env: env, member: member)
382
382
 
383
- module_decl = env.normalized_module_entry(member.name) or raise
383
+ module_decl = env.module_entry(member.name, normalized: true) or raise
384
384
  module_name = module_decl.name
385
385
 
386
386
  module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
@@ -398,7 +398,7 @@ module RBS
398
398
  MixinClassError.check!(type_name: type_name, env: env, member: member)
399
399
  NoMixinFoundError.check!(member.name, env: env, member: member)
400
400
 
401
- module_decl = env.normalized_module_entry(module_name) or raise
401
+ module_decl = env.module_entry(module_name, normalized: true) or raise
402
402
  module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
403
403
 
404
404
  module_name = env.normalize_module_name(module_name)
@@ -414,7 +414,60 @@ module RBS
414
414
  end
415
415
  end
416
416
  when AST::Ruby::Declarations::Base
417
- # noop
417
+ decl.members.each do |member|
418
+ case member
419
+ when AST::Ruby::Members::IncludeMember
420
+ if included_modules
421
+ module_name = member.module_name
422
+ module_args = member.type_args
423
+
424
+ # Check if mixing in a class (not allowed)
425
+ if env.class_decl?(module_name)
426
+ raise MixinClassError.new(type_name: type_name, member: member)
427
+ end
428
+
429
+ # Check if module exists
430
+ module_decl = env.module_entry(module_name, normalized: true) or raise NoMixinFoundError.new(type_name: module_name, member: member)
431
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
432
+ module_name = env.normalize_module_name(module_name)
433
+ included_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
434
+ end
435
+
436
+ when AST::Ruby::Members::ExtendMember
437
+ if extended_modules
438
+ module_name = member.module_name
439
+ module_args = member.type_args
440
+
441
+ # Check if mixing in a class (not allowed)
442
+ if env.class_decl?(module_name)
443
+ raise MixinClassError.new(type_name: type_name, member: member)
444
+ end
445
+
446
+ # Check if module exists
447
+ module_decl = env.module_entry(module_name, normalized: true) or raise NoMixinFoundError.new(type_name: module_name, member: member)
448
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
449
+ module_name = env.normalize_module_name(module_name)
450
+ extended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
451
+ end
452
+
453
+ when AST::Ruby::Members::PrependMember
454
+ if prepended_modules
455
+ module_name = member.module_name
456
+ module_args = member.type_args
457
+
458
+ # Check if mixing in a class (not allowed)
459
+ if env.class_decl?(module_name)
460
+ raise MixinClassError.new(type_name: type_name, member: member)
461
+ end
462
+
463
+ # Check if module exists
464
+ module_decl = env.module_entry(module_name, normalized: true) or raise NoMixinFoundError.new(type_name: module_name, member: member)
465
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
466
+ module_name = env.normalize_module_name(module_name)
467
+ prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
468
+ end
469
+ end
470
+ end
418
471
  end
419
472
  end
420
473
 
@@ -484,7 +537,7 @@ module RBS
484
537
  included_modules.each do |mod|
485
538
  name = mod.name
486
539
  arg_types = mod.args
487
- mod.source.is_a?(AST::Members::Include) or raise
540
+ (mod.source.is_a?(AST::Members::Include) || mod.source.is_a?(AST::Ruby::Members::IncludeMember)) or raise
488
541
  mod_ancestors =
489
542
  instance_ancestors(name, building_ancestors: building_ancestors)
490
543
  .apply(arg_types, env: env, location: mod.source.location)
@@ -499,7 +552,7 @@ module RBS
499
552
  prepended_modules.each do |mod|
500
553
  name = mod.name
501
554
  arg_types = mod.args
502
- mod.source.is_a?(AST::Members::Prepend) or raise
555
+ (mod.source.is_a?(AST::Members::Prepend) || mod.source.is_a?(AST::Ruby::Members::PrependMember)) or raise
503
556
  mod_ancestors =
504
557
  instance_ancestors(name, building_ancestors: building_ancestors)
505
558
  .apply(arg_types, env: env, location: mod.source.location)
@@ -554,7 +607,7 @@ module RBS
554
607
  extended_modules.each do |mod|
555
608
  name = mod.name
556
609
  args = mod.args
557
- mod.source.is_a?(AST::Members::Extend) or raise
610
+ (mod.source.is_a?(AST::Members::Extend) || mod.source.is_a?(AST::Ruby::Members::ExtendMember)) or raise
558
611
  mod_ancestors =
559
612
  instance_ancestors(name, building_ancestors: building_ancestors)
560
613
  .apply(args, env: env, location: mod.source.location)
@@ -143,12 +143,16 @@ module RBS
143
143
  decl.members.each do |member|
144
144
  case member
145
145
  when AST::Ruby::Members::DefMember
146
- build_method(
147
- methods,
148
- type,
149
- member: member,
150
- accessibility: :public
151
- )
146
+ if member.instance?
147
+ build_method(
148
+ methods,
149
+ type,
150
+ member: member,
151
+ accessibility: :public
152
+ )
153
+ end
154
+ when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
155
+ build_ruby_attribute(methods, type, member: member, accessibility: :public)
152
156
  end
153
157
  end
154
158
  end
@@ -179,6 +183,10 @@ module RBS
179
183
  if member.kind == :singleton
180
184
  build_alias(methods, type, member: member)
181
185
  end
186
+ when AST::Ruby::Members::DefMember
187
+ if member.singleton?
188
+ build_method(methods, type, member: member, accessibility: :public)
189
+ end
182
190
  end
183
191
  end
184
192
  end
@@ -227,6 +235,24 @@ module RBS
227
235
  end
228
236
  end
229
237
 
238
+ def build_ruby_attribute(methods, type, member:, accessibility:)
239
+ member.names.each do |name|
240
+ if member.is_a?(AST::Ruby::Members::AttrReaderMember) || member.is_a?(AST::Ruby::Members::AttrAccessorMember)
241
+ defn = methods.methods[name] ||= Methods::Definition.empty(type: type, name: name)
242
+
243
+ defn.accessibilities << accessibility
244
+ defn.originals << member
245
+ end
246
+
247
+ if member.is_a?(AST::Ruby::Members::AttrWriterMember) || member.is_a?(AST::Ruby::Members::AttrAccessorMember)
248
+ defn = methods.methods[:"#{name}="] ||= Methods::Definition.empty(type: type, name: :"#{name}=")
249
+
250
+ defn.accessibilities << accessibility
251
+ defn.originals << member
252
+ end
253
+ end
254
+ end
255
+
230
256
  def build_method(methods, type, member:, accessibility:)
231
257
  defn = methods.methods[member.name] ||= Methods::Definition.empty(type: type, name: member.name)
232
258