rbs 3.10.4 → 4.0.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 (267) 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 +7 -5
  5. data/.github/workflows/comments.yml +2 -2
  6. data/.github/workflows/dependabot.yml +2 -2
  7. data/.github/workflows/ruby.yml +16 -26
  8. data/.github/workflows/rust.yml +95 -0
  9. data/.github/workflows/typecheck.yml +1 -1
  10. data/.github/workflows/windows.yml +2 -2
  11. data/.rubocop.yml +2 -2
  12. data/.vscode/extensions.json +5 -0
  13. data/.vscode/settings.json +19 -0
  14. data/CHANGELOG.md +202 -2
  15. data/Rakefile +9 -23
  16. data/Steepfile +2 -0
  17. data/config.yml +457 -13
  18. data/core/array.rbs +218 -188
  19. data/core/basic_object.rbs +9 -8
  20. data/core/binding.rbs +0 -2
  21. data/core/builtin.rbs +2 -2
  22. data/core/class.rbs +6 -5
  23. data/core/comparable.rbs +45 -31
  24. data/core/complex.rbs +66 -55
  25. data/core/dir.rbs +57 -45
  26. data/core/encoding.rbs +6 -6
  27. data/core/enumerable.rbs +105 -91
  28. data/core/enumerator/arithmetic_sequence.rbs +70 -0
  29. data/core/enumerator.rbs +24 -3
  30. data/core/errno.rbs +3 -2
  31. data/core/errors.rbs +31 -29
  32. data/core/exception.rbs +12 -12
  33. data/core/fiber.rbs +47 -36
  34. data/core/file.rbs +242 -169
  35. data/core/file_test.rbs +2 -2
  36. data/core/float.rbs +42 -68
  37. data/core/gc.rbs +78 -70
  38. data/core/hash.rbs +70 -60
  39. data/core/integer.rbs +32 -75
  40. data/core/io/buffer.rbs +36 -36
  41. data/core/io/wait.rbs +7 -7
  42. data/core/io.rbs +192 -146
  43. data/core/kernel.rbs +198 -147
  44. data/core/marshal.rbs +3 -3
  45. data/core/match_data.rbs +14 -12
  46. data/core/math.rbs +69 -67
  47. data/core/method.rbs +6 -8
  48. data/core/module.rbs +148 -88
  49. data/core/nil_class.rbs +4 -3
  50. data/core/numeric.rbs +53 -50
  51. data/core/object.rbs +6 -8
  52. data/core/object_space.rbs +11 -10
  53. data/core/pathname.rbs +131 -81
  54. data/core/proc.rbs +65 -34
  55. data/core/process.rbs +221 -201
  56. data/core/ractor.rbs +15 -11
  57. data/core/random.rbs +21 -3
  58. data/core/range.rbs +152 -49
  59. data/core/rational.rbs +5 -56
  60. data/core/rbs/unnamed/argf.rbs +58 -51
  61. data/core/rbs/unnamed/env_class.rbs +18 -13
  62. data/core/rbs/unnamed/main_class.rbs +123 -0
  63. data/core/rbs/unnamed/random.rbs +7 -116
  64. data/core/regexp.rbs +236 -197
  65. data/core/ruby.rbs +1 -1
  66. data/core/ruby_vm.rbs +32 -30
  67. data/core/rubygems/config_file.rbs +5 -5
  68. data/core/rubygems/errors.rbs +1 -1
  69. data/core/rubygems/requirement.rbs +5 -5
  70. data/core/rubygems/rubygems.rbs +5 -3
  71. data/core/set.rbs +17 -16
  72. data/core/signal.rbs +2 -2
  73. data/core/string.rbs +318 -298
  74. data/core/struct.rbs +26 -25
  75. data/core/symbol.rbs +25 -24
  76. data/core/thread.rbs +40 -41
  77. data/core/time.rbs +47 -42
  78. data/core/trace_point.rbs +34 -31
  79. data/core/true_class.rbs +2 -2
  80. data/core/unbound_method.rbs +10 -10
  81. data/core/warning.rbs +7 -7
  82. data/docs/collection.md +1 -1
  83. data/docs/config.md +171 -0
  84. data/docs/inline.md +576 -0
  85. data/docs/syntax.md +46 -16
  86. data/docs/type_fingerprint.md +21 -0
  87. data/exe/rbs +1 -1
  88. data/ext/rbs_extension/ast_translation.c +595 -98
  89. data/ext/rbs_extension/class_constants.c +30 -0
  90. data/ext/rbs_extension/class_constants.h +15 -0
  91. data/ext/rbs_extension/legacy_location.c +30 -53
  92. data/ext/rbs_extension/legacy_location.h +37 -0
  93. data/ext/rbs_extension/main.c +125 -24
  94. data/include/rbs/ast.h +485 -150
  95. data/include/rbs/lexer.h +11 -4
  96. data/include/rbs/location.h +25 -44
  97. data/include/rbs/parser.h +20 -2
  98. data/include/rbs/util/rbs_constant_pool.h +0 -3
  99. data/include/rbs.h +8 -0
  100. data/lib/rbs/ast/annotation.rb +1 -1
  101. data/lib/rbs/ast/comment.rb +1 -1
  102. data/lib/rbs/ast/declarations.rb +10 -10
  103. data/lib/rbs/ast/members.rb +14 -14
  104. data/lib/rbs/ast/ruby/annotations.rb +409 -0
  105. data/lib/rbs/ast/ruby/comment_block.rb +245 -0
  106. data/lib/rbs/ast/ruby/declarations.rb +281 -0
  107. data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
  108. data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
  109. data/lib/rbs/ast/ruby/members.rb +723 -0
  110. data/lib/rbs/ast/type_param.rb +24 -4
  111. data/lib/rbs/buffer.rb +105 -20
  112. data/lib/rbs/cli/diff.rb +16 -15
  113. data/lib/rbs/cli/validate.rb +62 -125
  114. data/lib/rbs/cli.rb +55 -23
  115. data/lib/rbs/collection/config/lockfile_generator.rb +8 -4
  116. data/lib/rbs/collection/sources/git.rb +1 -0
  117. data/lib/rbs/collection.rb +0 -1
  118. data/lib/rbs/definition.rb +6 -1
  119. data/lib/rbs/definition_builder/ancestor_builder.rb +119 -63
  120. data/lib/rbs/definition_builder/method_builder.rb +65 -30
  121. data/lib/rbs/definition_builder.rb +177 -20
  122. data/lib/rbs/diff.rb +7 -1
  123. data/lib/rbs/environment/class_entry.rb +69 -0
  124. data/lib/rbs/environment/module_entry.rb +66 -0
  125. data/lib/rbs/environment.rb +338 -155
  126. data/lib/rbs/environment_loader.rb +2 -2
  127. data/lib/rbs/errors.rb +30 -20
  128. data/lib/rbs/inline_parser/comment_association.rb +117 -0
  129. data/lib/rbs/inline_parser.rb +542 -0
  130. data/lib/rbs/location_aux.rb +36 -4
  131. data/lib/rbs/locator.rb +5 -1
  132. data/lib/rbs/method_type.rb +5 -3
  133. data/lib/rbs/namespace.rb +0 -7
  134. data/lib/rbs/parser_aux.rb +31 -8
  135. data/lib/rbs/prototype/helpers.rb +57 -0
  136. data/lib/rbs/prototype/rb.rb +3 -28
  137. data/lib/rbs/prototype/rbi.rb +3 -20
  138. data/lib/rbs/prototype/runtime.rb +10 -2
  139. data/lib/rbs/resolver/type_name_resolver.rb +0 -8
  140. data/lib/rbs/source.rb +99 -0
  141. data/lib/rbs/subtractor.rb +4 -3
  142. data/lib/rbs/test/type_check.rb +5 -2
  143. data/lib/rbs/type_name.rb +1 -8
  144. data/lib/rbs/types.rb +88 -78
  145. data/lib/rbs/unit_test/convertibles.rb +1 -0
  146. data/lib/rbs/unit_test/type_assertions.rb +35 -8
  147. data/lib/rbs/validator.rb +2 -2
  148. data/lib/rbs/version.rb +1 -1
  149. data/lib/rbs.rb +12 -1
  150. data/rbs.gemspec +3 -2
  151. data/rust/.gitignore +1 -0
  152. data/rust/Cargo.lock +378 -0
  153. data/rust/Cargo.toml +7 -0
  154. data/rust/ruby-rbs/Cargo.toml +22 -0
  155. data/rust/ruby-rbs/build.rs +764 -0
  156. data/rust/ruby-rbs/examples/locations.rs +60 -0
  157. data/rust/ruby-rbs/src/lib.rs +1 -0
  158. data/rust/ruby-rbs/src/node/mod.rs +742 -0
  159. data/rust/ruby-rbs/tests/sanity.rs +47 -0
  160. data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
  161. data/rust/ruby-rbs-sys/Cargo.toml +23 -0
  162. data/rust/ruby-rbs-sys/build.rs +204 -0
  163. data/rust/ruby-rbs-sys/src/lib.rs +50 -0
  164. data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
  165. data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
  166. data/rust/ruby-rbs-sys/wrapper.h +1 -0
  167. data/schema/typeParam.json +17 -1
  168. data/sig/ancestor_builder.rbs +1 -1
  169. data/sig/ast/ruby/annotations.rbs +421 -0
  170. data/sig/ast/ruby/comment_block.rbs +127 -0
  171. data/sig/ast/ruby/declarations.rbs +158 -0
  172. data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
  173. data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
  174. data/sig/ast/ruby/members.rbs +178 -0
  175. data/sig/buffer.rbs +63 -5
  176. data/sig/cli/diff.rbs +5 -11
  177. data/sig/cli/validate.rbs +12 -8
  178. data/sig/cli.rbs +18 -18
  179. data/sig/definition.rbs +6 -0
  180. data/sig/definition_builder.rbs +3 -1
  181. data/sig/environment/class_entry.rbs +50 -0
  182. data/sig/environment/module_entry.rbs +50 -0
  183. data/sig/environment.rbs +37 -81
  184. data/sig/errors.rbs +26 -20
  185. data/sig/inline_parser/comment_association.rbs +71 -0
  186. data/sig/inline_parser.rbs +124 -0
  187. data/sig/location.rbs +32 -7
  188. data/sig/locator.rbs +0 -2
  189. data/sig/method_builder.rbs +9 -4
  190. data/sig/namespace.rbs +0 -5
  191. data/sig/parser.rbs +47 -13
  192. data/sig/prototype/helpers.rbs +2 -0
  193. data/sig/resolver/type_name_resolver.rbs +0 -3
  194. data/sig/source.rbs +48 -0
  195. data/sig/type_param.rbs +13 -8
  196. data/sig/typename.rbs +0 -5
  197. data/sig/types.rbs +6 -7
  198. data/sig/unit_test/spy.rbs +0 -8
  199. data/sig/unit_test/type_assertions.rbs +11 -0
  200. data/src/ast.c +491 -143
  201. data/src/lexer.c +1552 -1314
  202. data/src/lexer.re +7 -0
  203. data/src/lexstate.c +8 -1
  204. data/src/location.c +8 -48
  205. data/src/parser.c +1107 -409
  206. data/src/util/rbs_constant_pool.c +0 -4
  207. data/stdlib/bigdecimal/0/big_decimal.rbs +16 -16
  208. data/stdlib/cgi-escape/0/escape.rbs +4 -4
  209. data/stdlib/coverage/0/coverage.rbs +4 -3
  210. data/stdlib/date/0/date.rbs +33 -28
  211. data/stdlib/date/0/date_time.rbs +24 -23
  212. data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
  213. data/stdlib/digest/0/digest.rbs +110 -0
  214. data/stdlib/erb/0/erb.rbs +64 -53
  215. data/stdlib/etc/0/etc.rbs +55 -50
  216. data/stdlib/fileutils/0/fileutils.rbs +140 -126
  217. data/stdlib/forwardable/0/forwardable.rbs +10 -10
  218. data/stdlib/io-console/0/io-console.rbs +2 -2
  219. data/stdlib/json/0/json.rbs +158 -131
  220. data/stdlib/monitor/0/monitor.rbs +3 -3
  221. data/stdlib/net-http/0/net-http.rbs +159 -134
  222. data/stdlib/objspace/0/objspace.rbs +8 -30
  223. data/stdlib/open-uri/0/open-uri.rbs +8 -8
  224. data/stdlib/open3/0/open3.rbs +469 -10
  225. data/stdlib/openssl/0/openssl.rbs +144 -129
  226. data/stdlib/optparse/0/optparse.rbs +23 -14
  227. data/stdlib/pathname/0/pathname.rbs +2 -2
  228. data/stdlib/pp/0/pp.rbs +9 -8
  229. data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
  230. data/stdlib/pstore/0/pstore.rbs +35 -30
  231. data/stdlib/psych/0/psych.rbs +62 -9
  232. data/stdlib/psych/0/store.rbs +2 -4
  233. data/stdlib/pty/0/pty.rbs +9 -6
  234. data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
  235. data/stdlib/rdoc/0/code_object.rbs +2 -1
  236. data/stdlib/rdoc/0/parser.rbs +1 -1
  237. data/stdlib/rdoc/0/store.rbs +1 -1
  238. data/stdlib/ripper/0/ripper.rbs +20 -17
  239. data/stdlib/securerandom/0/manifest.yaml +2 -0
  240. data/stdlib/securerandom/0/securerandom.rbs +7 -20
  241. data/stdlib/shellwords/0/shellwords.rbs +2 -2
  242. data/stdlib/socket/0/addrinfo.rbs +9 -9
  243. data/stdlib/socket/0/basic_socket.rbs +3 -3
  244. data/stdlib/socket/0/ip_socket.rbs +10 -8
  245. data/stdlib/socket/0/socket.rbs +10 -9
  246. data/stdlib/socket/0/tcp_server.rbs +1 -1
  247. data/stdlib/socket/0/tcp_socket.rbs +1 -1
  248. data/stdlib/socket/0/udp_socket.rbs +1 -1
  249. data/stdlib/socket/0/unix_server.rbs +1 -1
  250. data/stdlib/stringio/0/stringio.rbs +55 -54
  251. data/stdlib/strscan/0/string_scanner.rbs +46 -44
  252. data/stdlib/tempfile/0/tempfile.rbs +24 -20
  253. data/stdlib/time/0/time.rbs +7 -5
  254. data/stdlib/tsort/0/tsort.rbs +7 -6
  255. data/stdlib/uri/0/common.rbs +31 -18
  256. data/stdlib/uri/0/file.rbs +2 -2
  257. data/stdlib/uri/0/generic.rbs +9 -2
  258. data/stdlib/uri/0/http.rbs +2 -2
  259. data/stdlib/uri/0/ldap.rbs +2 -2
  260. data/stdlib/uri/0/mailto.rbs +3 -3
  261. data/stdlib/uri/0/rfc2396_parser.rbs +6 -5
  262. data/stdlib/zlib/0/deflate.rbs +4 -3
  263. data/stdlib/zlib/0/gzip_reader.rbs +6 -6
  264. data/stdlib/zlib/0/gzip_writer.rbs +14 -12
  265. data/stdlib/zlib/0/inflate.rbs +1 -1
  266. data/stdlib/zlib/0/need_dict.rbs +1 -1
  267. metadata +66 -3
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
 
@@ -175,10 +177,9 @@ EOB
175
177
 
176
178
  env = Environment.from_loader(loader).resolve_type_names
177
179
 
178
- decls = env.declarations.select do |decl|
179
- loc = decl.location or raise
180
+ decls = env.sources.select do |source|
180
181
  # @type var name: String
181
- name = loc.buffer.name
182
+ name = source.buffer.name.to_s
182
183
 
183
184
  patterns.empty? || patterns.any? do |pat|
184
185
  case pat
@@ -188,10 +189,12 @@ EOB
188
189
  name.end_with?(pat) || File.fnmatch(pat, name, File::FNM_EXTGLOB)
189
190
  end
190
191
  end
191
- end
192
+ end.flat_map { _1.declarations }
192
193
 
193
194
  stdout.print JSON.generate(decls)
194
195
  stdout.flush
196
+
197
+ 0
195
198
  end
196
199
 
197
200
  def run_list(args, options)
@@ -255,6 +258,8 @@ EOB
255
258
  stdout.puts "#{name} (interface)"
256
259
  end
257
260
  end
261
+
262
+ 0
258
263
  end
259
264
 
260
265
  def run_ancestors(args, options)
@@ -280,7 +285,7 @@ EOU
280
285
 
281
286
  unless args.size == 1
282
287
  stdout.puts "Expected one argument."
283
- return
288
+ return 1
284
289
  end
285
290
 
286
291
  loader = options.loader()
@@ -318,6 +323,8 @@ EOU
318
323
  else
319
324
  stdout.puts "Cannot find class: #{type_name}"
320
325
  end
326
+
327
+ 0
321
328
  end
322
329
 
323
330
  def run_methods(args, options)
@@ -345,7 +352,7 @@ EOU
345
352
 
346
353
  unless args.size == 1
347
354
  stdout.puts "Expected one argument."
348
- return
355
+ return 1
349
356
  end
350
357
 
351
358
  loader = options.loader()
@@ -374,6 +381,8 @@ EOU
374
381
  else
375
382
  stdout.puts "Cannot find class: #{type_name}"
376
383
  end
384
+
385
+ 0
377
386
  end
378
387
 
379
388
  def run_method(args, options)
@@ -399,7 +408,7 @@ EOU
399
408
 
400
409
  unless args.size == 2
401
410
  stdout.puts "Expected two arguments, but given #{args.size}."
402
- return
411
+ return 1
403
412
  end
404
413
 
405
414
  loader = options.loader()
@@ -411,7 +420,7 @@ EOU
411
420
 
412
421
  unless env.module_name?(type_name)
413
422
  stdout.puts "Cannot find class: #{type_name}"
414
- return
423
+ return 1
415
424
  end
416
425
 
417
426
  definition = case kind
@@ -427,7 +436,7 @@ EOU
427
436
 
428
437
  unless method
429
438
  stdout.puts "Cannot find method: #{method_name}"
430
- return
439
+ return 1
431
440
  end
432
441
 
433
442
  stdout.puts "#{type_name}#{kind == :instance ? "#" : "."}#{method_name}"
@@ -441,6 +450,8 @@ EOU
441
450
  stdout.puts format(" %s %-#{length_max}s at %s", separator, type, type.location)
442
451
  separator = "|"
443
452
  end
453
+
454
+ 0
444
455
  end
445
456
 
446
457
  def run_validate(args, options)
@@ -470,7 +481,7 @@ EOU
470
481
 
471
482
  unless args.size == 1
472
483
  stdout.puts "Expected one argument."
473
- return
484
+ return 1
474
485
  end
475
486
 
476
487
  loader = options.loader()
@@ -503,6 +514,8 @@ EOU
503
514
  else
504
515
  stdout.puts " => [no constant]"
505
516
  end
517
+
518
+ 0
506
519
  end
507
520
 
508
521
  def run_paths(args, options)
@@ -545,6 +558,8 @@ EOU
545
558
  stdout.puts "#{dir} (#{kind_of[dir]}, library, name=#{source.name})"
546
559
  end
547
560
  end
561
+
562
+ 0
548
563
  end
549
564
 
550
565
  def run_prototype(args, options)
@@ -648,6 +663,8 @@ EOU
648
663
 
649
664
  writer = Writer.new(out: stdout)
650
665
  writer.write decls
666
+
667
+ 0
651
668
  else
652
669
  stdout.puts <<EOU
653
670
  Usage: rbs prototype [generator...] [args...]
@@ -661,7 +678,7 @@ Examples:
661
678
  $ rbs prototype rbi foo.rbi
662
679
  $ rbs prototype runtime String
663
680
  EOU
664
- exit 1
681
+ 1
665
682
  end
666
683
  end
667
684
 
@@ -713,12 +730,12 @@ EOU
713
730
 
714
731
  unless has_parser?
715
732
  stdout.puts "Not supported on this interpreter (#{RUBY_ENGINE})."
716
- exit 1
733
+ return 1
717
734
  end
718
735
 
719
736
  if args.empty?
720
737
  stdout.puts opts
721
- return nil
738
+ return 1
722
739
  end
723
740
 
724
741
  new_parser = -> do
@@ -828,6 +845,8 @@ EOU
828
845
  writer = Writer.new(out: stdout)
829
846
  writer.write parser.decls
830
847
  end
848
+
849
+ 0
831
850
  end
832
851
 
833
852
  def run_vendor(args, options)
@@ -881,6 +900,8 @@ Options:
881
900
 
882
901
  stdout.puts " Copying RBS files..."
883
902
  vendorer.copy!
903
+
904
+ 0
884
905
  end
885
906
 
886
907
  def run_parse(args, options)
@@ -913,7 +934,7 @@ Options:
913
934
  Buffer.new(content: file_path.read, name: file_path)
914
935
  end
915
936
  end
916
- bufs << Buffer.new(content: e_code, name: '-e') if e_code
937
+ bufs << Buffer.new(content: e_code, name: Pathname('-e')) if e_code
917
938
 
918
939
  bufs.each do |buf|
919
940
  RBS.logger.info "Parsing #{buf.name}..."
@@ -928,7 +949,11 @@ Options:
928
949
  syntax_error = true
929
950
  end
930
951
 
931
- exit 1 if syntax_error
952
+ if syntax_error
953
+ 1
954
+ else
955
+ 0
956
+ end
932
957
  end
933
958
 
934
959
  def run_annotate(args, options)
@@ -976,6 +1001,8 @@ Options:
976
1001
  annotator.annotate_file(path, preserve: preserve)
977
1002
  end
978
1003
  end
1004
+
1005
+ 0
979
1006
  end
980
1007
 
981
1008
  def test_opt options
@@ -1029,7 +1056,7 @@ EOB
1029
1056
 
1030
1057
  if args.length.zero?
1031
1058
  stdout.puts opts.help
1032
- exit 1
1059
+ return 1
1033
1060
  end
1034
1061
 
1035
1062
  # @type var env_hash: Hash[String, String?]
@@ -1045,11 +1072,12 @@ EOB
1045
1072
 
1046
1073
  # @type var out: String
1047
1074
  # @type var err: String
1075
+ # @type var status: Process::Status
1048
1076
  out, err, status = __skip__ = Open3.capture3(env_hash, *args)
1049
1077
  stdout.print(out)
1050
1078
  stderr.print(err)
1051
1079
 
1052
- status
1080
+ status.to_i
1053
1081
  end
1054
1082
 
1055
1083
  def run_collection(args, options)
@@ -1074,7 +1102,7 @@ EOB
1074
1102
  when 'init'
1075
1103
  if config_path.exist?
1076
1104
  puts "#{config_path} already exists"
1077
- exit 1
1105
+ return 1
1078
1106
  end
1079
1107
 
1080
1108
  config_path.write(<<~'YAML')
@@ -1102,15 +1130,17 @@ EOB
1102
1130
  when 'clean'
1103
1131
  unless lock_path.exist?
1104
1132
  puts "#{lock_path} should exist to clean"
1105
- exit 1
1133
+ return 1
1106
1134
  end
1107
1135
  Collection::Cleaner.new(lockfile_path: lock_path)
1108
1136
  when 'help', 'hel', 'he', 'h'
1109
1137
  puts opts.help
1110
1138
  else
1111
1139
  puts opts.help
1112
- exit 1
1140
+ return 1
1113
1141
  end
1142
+
1143
+ 0
1114
1144
  end
1115
1145
 
1116
1146
  def collection_options(args)
@@ -1172,7 +1202,7 @@ EOB
1172
1202
  *minuend_paths, subtrahend_path = args
1173
1203
  unless subtrahend_path
1174
1204
  stdout.puts opts.help
1175
- exit 1
1205
+ return 1
1176
1206
  end
1177
1207
  subtrahend_paths << subtrahend_path
1178
1208
  else
@@ -1181,7 +1211,7 @@ EOB
1181
1211
 
1182
1212
  if minuend_paths.empty?
1183
1213
  stdout.puts opts.help
1184
- exit 1
1214
+ return 1
1185
1215
  end
1186
1216
 
1187
1217
  subtrahend = Environment.new.tap do |env|
@@ -1214,10 +1244,12 @@ EOB
1214
1244
  end
1215
1245
  end
1216
1246
  end
1247
+
1248
+ 0
1217
1249
  end
1218
1250
 
1219
1251
  def run_diff(argv, library_options)
1220
- Diff.new(argv: argv, library_options: library_options, stdout: stdout, stderr: stderr).run
1252
+ Diff.new(stdout: stdout, stderr: stderr).run(argv: argv, library_options: library_options)
1221
1253
  end
1222
1254
  end
1223
1255
  end
@@ -8,13 +8,17 @@ 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,
17
20
  "cgi" => nil,
21
+ "pstore" => nil,
18
22
  }
19
23
 
20
24
  class GemfileLockMismatchError < StandardError
@@ -172,8 +176,8 @@ module RBS
172
176
  return if lockfile.gems.key?(name)
173
177
 
174
178
  case name
175
- when 'bigdecimal-math'
176
- # The `bigdecimal-math` is never released as a gem.
179
+ when 'bigdecimal-math', 'kconv'
180
+ # These gems are never released as a gem.
177
181
  # Therefore, `assign_gem` should not be called.
178
182
  RBS.logger.info {
179
183
  from = from_gem || "rbs_collection.yaml"
@@ -184,8 +188,8 @@ module RBS
184
188
  lockfile.gems[name] = { name: name, version: "0", source: source }
185
189
  end
186
190
  return
187
- when 'set'
188
- # set is migrated to core from stdlib.
191
+ when 'set', 'pathname'
192
+ # set and pathname is migrated to core from stdlib.
189
193
  RBS.logger.info {
190
194
  from = from_gem || "rbs_collection.yaml"
191
195
  "`#{name}` is a part of the Ruby core library. The dependency to the library can be safely deleted from #{from}."
@@ -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
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'yaml'
4
- require 'fileutils'
5
4
 
6
5
  require_relative './cli/colored_io'
7
6
  require_relative './collection/sources'
@@ -62,7 +62,12 @@ module RBS
62
62
  end
63
63
 
64
64
  def comment
65
- member.comment
65
+ case member
66
+ when AST::Members::Base
67
+ member.comment
68
+ when AST::Ruby::Members::Base
69
+ member.leading_comment&.as_comment
70
+ end
66
71
  end
67
72
 
68
73
  def update(type: self.type, member: self.member, defined_in: self.defined_in, implemented_in: self.implemented_in)
@@ -173,12 +173,12 @@ module RBS
173
173
  end
174
174
 
175
175
  def validate_super_class!(type_name, entry)
176
- with_super_classes = entry.decls.select {|d| d.decl.super_class }
176
+ with_super_classes = entry.each_decl.select {|decl| decl.super_class }
177
177
 
178
178
  return if with_super_classes.size <= 1
179
179
 
180
- super_types = with_super_classes.map do |d|
181
- super_class = d.decl.super_class or raise
180
+ super_types = with_super_classes.map do |decl|
181
+ super_class = decl.super_class or raise
182
182
  Types::ClassInstance.new(name: super_class.name, args: super_class.args, location: nil)
183
183
  end
184
184
 
@@ -200,8 +200,8 @@ module RBS
200
200
  case entry
201
201
  when Environment::ClassEntry
202
202
  validate_super_class!(type_name, entry)
203
- primary = entry.primary
204
- super_class = primary.decl.super_class
203
+ primary = entry.primary_decl
204
+ super_class = primary.super_class
205
205
 
206
206
  if type_name != BuiltinNames::BasicObject.name
207
207
  if super_class
@@ -214,7 +214,7 @@ module RBS
214
214
 
215
215
  super_name = env.normalize_module_name(super_name)
216
216
 
217
- NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
217
+ NoSuperclassFoundError.check!(super_name, env: env, location: primary.location)
218
218
  if super_class
219
219
  InheritModuleError.check!(super_class, env: env)
220
220
  InvalidTypeApplicationError.check2!(type_name: super_class.name, args: super_class.args, env: env, location: super_class.location)
@@ -283,8 +283,8 @@ module RBS
283
283
  case entry
284
284
  when Environment::ClassEntry
285
285
  validate_super_class!(type_name, entry)
286
- primary = entry.primary
287
- super_class = primary.decl.super_class
286
+ primary = entry.primary_decl
287
+ super_class = primary.super_class
288
288
 
289
289
  if type_name != BuiltinNames::BasicObject.name
290
290
  if super_class
@@ -295,7 +295,7 @@ module RBS
295
295
 
296
296
  super_name = env.normalize_module_name(super_name)
297
297
 
298
- NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
298
+ NoSuperclassFoundError.check!(super_name, env: env, location: primary.location)
299
299
  if super_class
300
300
  InheritModuleError.check!(super_class, env: env)
301
301
  end
@@ -348,75 +348,131 @@ module RBS
348
348
  end
349
349
 
350
350
  def mixin_ancestors0(decl, type_name, align_params:, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
351
- decl.each_mixin do |member|
352
- case member
353
- when AST::Members::Include
354
- module_name = member.name
355
- module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
351
+ case decl
352
+ when AST::Declarations::Base
353
+ decl.each_mixin do |member|
354
+ case member
355
+ when AST::Members::Include
356
+ module_name = member.name
357
+ module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
356
358
 
357
- case
358
- when member.name.class? && included_modules
359
- MixinClassError.check!(type_name: type_name, env: env, member: member)
360
- NoMixinFoundError.check!(member.name, env: env, member: member)
359
+ case
360
+ when member.name.class? && included_modules
361
+ MixinClassError.check!(type_name: type_name, env: env, member: member)
362
+ NoMixinFoundError.check!(member.name, env: env, member: member)
361
363
 
362
- module_decl = env.module_entry(module_name, normalized: true) or raise
363
- module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
364
+ module_decl = env.module_entry(module_name, normalized: true) or raise
365
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
364
366
 
365
- module_name = env.normalize_module_name(module_name)
366
- included_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
367
- when member.name.interface? && included_interfaces
368
- NoMixinFoundError.check!(member.name, env: env, member: member)
367
+ module_name = env.normalize_module_name(module_name)
368
+ included_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
369
+ when member.name.interface? && included_interfaces
370
+ NoMixinFoundError.check!(member.name, env: env, member: member)
369
371
 
370
- interface_decl = env.interface_decls.fetch(module_name)
371
- module_args = AST::TypeParam.normalize_args(interface_decl.decl.type_params, module_args)
372
+ interface_decl = env.interface_decls.fetch(module_name)
373
+ module_args = AST::TypeParam.normalize_args(interface_decl.decl.type_params, module_args)
372
374
 
373
- included_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
374
- end
375
+ included_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
376
+ end
375
377
 
376
- when AST::Members::Prepend
377
- if prepended_modules
378
- MixinClassError.check!(type_name: type_name, env: env, member: member)
379
- NoMixinFoundError.check!(member.name, env: env, member: member)
378
+ when AST::Members::Prepend
379
+ if prepended_modules
380
+ MixinClassError.check!(type_name: type_name, env: env, member: member)
381
+ NoMixinFoundError.check!(member.name, env: env, member: member)
380
382
 
381
- module_decl = env.module_entry(member.name, normalized: true) or raise
382
- module_name = module_decl.name
383
+ module_decl = env.module_entry(member.name, normalized: true) or raise
384
+ module_name = module_decl.name
383
385
 
384
- module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
385
- module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
386
+ module_args = member.args.map {|type| align_params ? type.sub(align_params) : type }
387
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
386
388
 
387
- prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
388
- end
389
+ prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
390
+ end
389
391
 
390
- when AST::Members::Extend
391
- module_name = member.name
392
- module_args = member.args
392
+ when AST::Members::Extend
393
+ module_name = member.name
394
+ module_args = member.args
393
395
 
394
- case
395
- when member.name.class? && extended_modules
396
- MixinClassError.check!(type_name: type_name, env: env, member: member)
397
- NoMixinFoundError.check!(member.name, env: env, member: member)
396
+ case
397
+ when member.name.class? && extended_modules
398
+ MixinClassError.check!(type_name: type_name, env: env, member: member)
399
+ NoMixinFoundError.check!(member.name, env: env, member: member)
398
400
 
399
- module_decl = env.module_entry(module_name, normalized: true) or raise
400
- module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
401
+ module_decl = env.module_entry(module_name, normalized: true) or raise
402
+ module_args = AST::TypeParam.normalize_args(module_decl.type_params, module_args)
401
403
 
402
- module_name = env.normalize_module_name(module_name)
403
- extended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
404
- when member.name.interface? && extended_interfaces
405
- NoMixinFoundError.check!(member.name, env: env, member: member)
404
+ module_name = env.normalize_module_name(module_name)
405
+ extended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
406
+ when member.name.interface? && extended_interfaces
407
+ NoMixinFoundError.check!(member.name, env: env, member: member)
406
408
 
407
- interface_decl = env.interface_decls.fetch(module_name)
408
- module_args = AST::TypeParam.normalize_args(interface_decl.decl.type_params, module_args)
409
+ interface_decl = env.interface_decls.fetch(module_name)
410
+ module_args = AST::TypeParam.normalize_args(interface_decl.decl.type_params, module_args)
409
411
 
410
- extended_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
412
+ extended_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
413
+ end
414
+ end
415
+ end
416
+ when AST::Ruby::Declarations::Base
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
411
469
  end
412
470
  end
413
471
  end
414
472
  end
415
473
 
416
474
  def mixin_ancestors(entry, type_name, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
417
- entry.decls.each do |d|
418
- decl = d.decl
419
-
475
+ entry.each_decl do |decl|
420
476
  align_params = Substitution.build(
421
477
  decl.type_params.each.map(&:name),
422
478
  entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
@@ -445,7 +501,7 @@ module RBS
445
501
 
446
502
  RecursiveAncestorError.check!(self_ancestor,
447
503
  ancestors: building_ancestors,
448
- location: entry.primary.decl.location)
504
+ location: entry.primary_decl.location)
449
505
  building_ancestors.push self_ancestor
450
506
 
451
507
  one_ancestors = one_instance_ancestors(type_name)
@@ -462,7 +518,7 @@ module RBS
462
518
 
463
519
  super_ancestors =
464
520
  instance_ancestors(super_name, building_ancestors: building_ancestors)
465
- .apply(super_args, env: env, location: entry.primary.decl.super_class&.location)
521
+ .apply(super_args, env: env, location: entry.primary_decl.super_class&.location)
466
522
  super_ancestors.map! {|ancestor| fill_ancestor_source(ancestor, name: super_name, source: :super) }
467
523
  ancestors.unshift(*super_ancestors)
468
524
  end
@@ -481,7 +537,7 @@ module RBS
481
537
  included_modules.each do |mod|
482
538
  name = mod.name
483
539
  arg_types = mod.args
484
- 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
485
541
  mod_ancestors =
486
542
  instance_ancestors(name, building_ancestors: building_ancestors)
487
543
  .apply(arg_types, env: env, location: mod.source.location)
@@ -496,7 +552,7 @@ module RBS
496
552
  prepended_modules.each do |mod|
497
553
  name = mod.name
498
554
  arg_types = mod.args
499
- 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
500
556
  mod_ancestors =
501
557
  instance_ancestors(name, building_ancestors: building_ancestors)
502
558
  .apply(arg_types, env: env, location: mod.source.location)
@@ -522,7 +578,7 @@ module RBS
522
578
 
523
579
  RecursiveAncestorError.check!(self_ancestor,
524
580
  ancestors: building_ancestors,
525
- location: entry.primary.decl.location)
581
+ location: entry.primary_decl.location)
526
582
  building_ancestors.push self_ancestor
527
583
 
528
584
  one_ancestors = one_singleton_ancestors(type_name)
@@ -551,7 +607,7 @@ module RBS
551
607
  extended_modules.each do |mod|
552
608
  name = mod.name
553
609
  args = mod.args
554
- 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
555
611
  mod_ancestors =
556
612
  instance_ancestors(name, building_ancestors: building_ancestors)
557
613
  .apply(args, env: env, location: mod.source.location)