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.
- checksums.yaml +4 -4
- data/.clang-format +1 -0
- data/.github/dependabot.yml +16 -14
- data/.github/workflows/bundle-update.yml +63 -0
- data/.github/workflows/c-check.yml +21 -11
- data/.github/workflows/comments.yml +5 -3
- data/.github/workflows/dependabot.yml +2 -2
- data/.github/workflows/jruby.yml +67 -0
- data/.github/workflows/milestone.yml +83 -0
- data/.github/workflows/ruby.yml +63 -24
- data/.github/workflows/rust.yml +184 -0
- data/.github/workflows/truffleruby.yml +54 -0
- data/.github/workflows/typecheck.yml +5 -2
- data/.github/workflows/wasm.yml +53 -0
- data/.github/workflows/windows.yml +8 -2
- data/.gitignore +11 -0
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +357 -0
- data/README.md +4 -4
- data/Rakefile +365 -33
- data/Steepfile +8 -0
- data/config.yml +450 -24
- data/core/array.rbs +443 -363
- data/core/basic_object.rbs +9 -8
- data/core/binding.rbs +0 -2
- data/core/builtin.rbs +9 -8
- data/core/class.rbs +11 -8
- data/core/comparable.rbs +55 -34
- data/core/complex.rbs +104 -78
- data/core/dir.rbs +61 -49
- data/core/encoding.rbs +12 -15
- data/core/enumerable.rbs +288 -196
- data/core/enumerator/arithmetic_sequence.rbs +70 -0
- data/core/enumerator/product.rbs +5 -5
- data/core/enumerator.rbs +91 -28
- data/core/errno.rbs +11 -2
- data/core/errors.rbs +58 -29
- data/core/exception.rbs +13 -13
- data/core/fiber.rbs +74 -54
- data/core/file.rbs +260 -1151
- data/core/file_constants.rbs +463 -0
- data/core/file_stat.rbs +534 -0
- data/core/file_test.rbs +3 -3
- data/core/float.rbs +257 -92
- data/core/gc.rbs +425 -281
- data/core/hash.rbs +1151 -829
- data/core/integer.rbs +156 -195
- data/core/io/buffer.rbs +53 -42
- data/core/io/wait.rbs +13 -35
- data/core/io.rbs +216 -150
- data/core/kernel.rbs +239 -163
- data/core/marshal.rbs +4 -4
- data/core/match_data.rbs +15 -13
- data/core/math.rbs +107 -66
- data/core/method.rbs +69 -33
- data/core/module.rbs +302 -150
- data/core/nil_class.rbs +7 -6
- data/core/numeric.rbs +77 -63
- data/core/object.rbs +9 -11
- data/core/object_space/weak_key_map.rbs +7 -7
- data/core/object_space.rbs +30 -23
- data/core/pathname.rbs +1322 -0
- data/core/proc.rbs +95 -58
- data/core/process.rbs +222 -202
- data/core/ractor.rbs +371 -515
- data/core/random.rbs +21 -3
- data/core/range.rbs +181 -79
- data/core/rational.rbs +60 -89
- data/core/rbs/ops.rbs +154 -0
- data/core/rbs/unnamed/argf.rbs +63 -56
- data/core/rbs/unnamed/env_class.rbs +19 -14
- data/core/rbs/unnamed/main_class.rbs +123 -0
- data/core/rbs/unnamed/random.rbs +11 -118
- data/core/regexp.rbs +258 -214
- data/core/ruby.rbs +53 -0
- data/core/ruby_vm.rbs +78 -34
- data/core/rubygems/config_file.rbs +5 -5
- data/core/rubygems/errors.rbs +4 -71
- data/core/rubygems/requirement.rbs +5 -5
- data/core/rubygems/rubygems.rbs +16 -82
- data/core/rubygems/version.rbs +2 -3
- data/core/set.rbs +493 -363
- data/core/signal.rbs +26 -16
- data/core/string.rbs +3234 -1285
- data/core/struct.rbs +43 -42
- data/core/symbol.rbs +41 -34
- data/core/thread.rbs +141 -73
- data/core/time.rbs +81 -50
- data/core/trace_point.rbs +41 -35
- data/core/true_class.rbs +2 -2
- data/core/unbound_method.rbs +24 -16
- data/core/warning.rbs +7 -7
- data/docs/CONTRIBUTING.md +2 -1
- data/docs/aliases.md +79 -0
- data/docs/collection.md +3 -3
- data/docs/config.md +171 -0
- data/docs/encoding.md +56 -0
- data/docs/gem.md +0 -1
- data/docs/inline.md +634 -0
- data/docs/rbs_by_example.md +20 -20
- data/docs/rust.md +96 -0
- data/docs/sigs.md +3 -3
- data/docs/syntax.md +48 -18
- data/docs/type_fingerprint.md +21 -0
- data/docs/wasm_serialization.md +80 -0
- data/exe/rbs +1 -1
- data/ext/rbs_extension/ast_translation.c +1441 -671
- data/ext/rbs_extension/ast_translation.h +7 -0
- data/ext/rbs_extension/class_constants.c +18 -2
- data/ext/rbs_extension/class_constants.h +9 -0
- data/ext/rbs_extension/extconf.rb +6 -1
- data/ext/rbs_extension/legacy_location.c +33 -56
- data/ext/rbs_extension/legacy_location.h +37 -0
- data/ext/rbs_extension/main.c +183 -39
- data/include/rbs/ast.h +597 -297
- data/include/rbs/defines.h +40 -0
- data/include/rbs/lexer.h +31 -11
- data/include/rbs/location.h +25 -44
- data/include/rbs/parser.h +6 -6
- data/include/rbs/serialize.h +39 -0
- data/include/rbs/string.h +0 -2
- data/include/rbs/util/rbs_allocator.h +34 -13
- data/include/rbs/util/rbs_assert.h +12 -1
- data/include/rbs/util/rbs_constant_pool.h +0 -3
- data/include/rbs/util/rbs_encoding.h +2 -0
- data/include/rbs/util/rbs_unescape.h +2 -1
- data/include/rbs.h +8 -0
- data/lib/rbs/annotate/rdoc_annotator.rb +27 -31
- data/lib/rbs/ast/annotation.rb +1 -1
- data/lib/rbs/ast/comment.rb +1 -1
- data/lib/rbs/ast/declarations.rb +10 -10
- data/lib/rbs/ast/members.rb +14 -14
- data/lib/rbs/ast/ruby/annotations.rb +335 -3
- data/lib/rbs/ast/ruby/comment_block.rb +30 -4
- data/lib/rbs/ast/ruby/declarations.rb +209 -4
- data/lib/rbs/ast/ruby/helpers/constant_helper.rb +4 -0
- data/lib/rbs/ast/ruby/helpers/location_helper.rb +1 -1
- data/lib/rbs/ast/ruby/members.rb +571 -22
- data/lib/rbs/ast/type_param.rb +24 -4
- data/lib/rbs/buffer.rb +66 -24
- data/lib/rbs/cli/diff.rb +16 -15
- data/lib/rbs/cli/validate.rb +38 -106
- data/lib/rbs/cli.rb +55 -24
- data/lib/rbs/collection/config/lockfile_generator.rb +28 -3
- data/lib/rbs/collection/sources/git.rb +7 -0
- data/lib/rbs/definition.rb +1 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +62 -9
- data/lib/rbs/definition_builder/method_builder.rb +32 -6
- data/lib/rbs/definition_builder.rb +147 -25
- data/lib/rbs/diff.rb +7 -1
- data/lib/rbs/environment.rb +235 -75
- data/lib/rbs/environment_loader.rb +0 -6
- data/lib/rbs/errors.rb +27 -18
- data/lib/rbs/inline_parser.rb +377 -15
- data/lib/rbs/location_aux.rb +1 -1
- data/lib/rbs/locator.rb +5 -1
- data/lib/rbs/method_type.rb +5 -3
- data/lib/rbs/namespace.rb +47 -11
- data/lib/rbs/parser_aux.rb +20 -7
- data/lib/rbs/prototype/helpers.rb +57 -0
- data/lib/rbs/prototype/rb.rb +3 -28
- data/lib/rbs/prototype/rbi.rb +3 -20
- data/lib/rbs/prototype/runtime.rb +10 -0
- data/lib/rbs/resolver/constant_resolver.rb +2 -2
- data/lib/rbs/resolver/type_name_resolver.rb +120 -44
- data/lib/rbs/rewriter.rb +70 -0
- data/lib/rbs/subtractor.rb +3 -1
- data/lib/rbs/test/type_check.rb +25 -3
- data/lib/rbs/type_name.rb +34 -14
- data/lib/rbs/types.rb +88 -78
- data/lib/rbs/unit_test/type_assertions.rb +44 -8
- data/lib/rbs/validator.rb +2 -2
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/wasm/deserializer.rb +213 -0
- data/lib/rbs/wasm/location.rb +61 -0
- data/lib/rbs/wasm/parser.rb +137 -0
- data/lib/rbs/wasm/runtime.rb +217 -0
- data/lib/rbs/wasm/serialization_schema.rb +110 -0
- data/lib/rbs.rb +13 -2
- data/lib/rdoc/discover.rb +1 -1
- data/lib/rdoc_plugin/parser.rb +1 -1
- data/rbs.gemspec +24 -6
- data/schema/typeParam.json +17 -1
- data/sig/annotate/rdoc_annotater.rbs +12 -9
- data/sig/ast/ruby/annotations.rbs +364 -4
- data/sig/ast/ruby/comment_block.rbs +8 -0
- data/sig/ast/ruby/declarations.rbs +102 -4
- data/sig/ast/ruby/members.rbs +128 -2
- data/sig/buffer.rbs +19 -1
- data/sig/cli/diff.rbs +5 -11
- data/sig/cli/validate.rbs +12 -8
- data/sig/cli.rbs +18 -18
- data/sig/collection/config/lockfile_generator.rbs +2 -0
- data/sig/definition.rbs +6 -1
- data/sig/definition_builder.rbs +2 -0
- data/sig/environment.rbs +70 -12
- data/sig/errors.rbs +13 -14
- data/sig/inline_parser.rbs +41 -2
- data/sig/locator.rbs +0 -2
- data/sig/manifest.yaml +0 -2
- data/sig/method_builder.rbs +3 -1
- data/sig/namespace.rbs +20 -0
- data/sig/parser.rbs +41 -13
- data/sig/prototype/helpers.rbs +2 -0
- data/sig/resolver/type_name_resolver.rbs +36 -10
- data/sig/rewriter.rbs +45 -0
- data/sig/source.rbs +3 -3
- data/sig/type_param.rbs +13 -8
- data/sig/typename.rbs +15 -0
- data/sig/types.rbs +6 -7
- data/sig/unit_test/spy.rbs +0 -8
- data/sig/unit_test/type_assertions.rbs +15 -0
- data/sig/wasm/deserializer.rbs +66 -0
- data/sig/wasm/serialization_schema.rbs +13 -0
- data/src/ast.c +443 -162
- data/src/lexer.c +1415 -1313
- data/src/lexer.re +4 -0
- data/src/lexstate.c +63 -37
- data/src/location.c +7 -47
- data/src/parser.c +1032 -521
- data/src/serialize.c +958 -0
- data/src/string.c +0 -48
- data/src/util/rbs_allocator.c +89 -74
- data/src/util/rbs_assert.c +1 -1
- data/src/util/rbs_buffer.c +2 -2
- data/src/util/rbs_constant_pool.c +10 -14
- data/src/util/rbs_encoding.c +4 -8
- data/src/util/rbs_unescape.c +56 -20
- data/stdlib/abbrev/0/array.rbs +1 -1
- data/stdlib/bigdecimal/0/big_decimal.rbs +116 -98
- data/stdlib/bigdecimal-math/0/big_math.rbs +169 -8
- data/stdlib/cgi/0/core.rbs +9 -393
- data/stdlib/cgi/0/manifest.yaml +1 -0
- data/stdlib/cgi-escape/0/escape.rbs +171 -0
- data/stdlib/coverage/0/coverage.rbs +7 -4
- data/stdlib/csv/0/csv.rbs +5 -5
- data/stdlib/date/0/date.rbs +92 -79
- data/stdlib/date/0/date_time.rbs +25 -24
- data/stdlib/delegate/0/delegator.rbs +10 -7
- data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
- data/stdlib/digest/0/digest.rbs +111 -1
- data/stdlib/erb/0/erb.rbs +748 -347
- data/stdlib/etc/0/etc.rbs +73 -54
- data/stdlib/fileutils/0/fileutils.rbs +179 -160
- data/stdlib/forwardable/0/forwardable.rbs +13 -10
- data/stdlib/io-console/0/io-console.rbs +2 -2
- data/stdlib/json/0/json.rbs +223 -142
- data/stdlib/monitor/0/monitor.rbs +3 -3
- data/stdlib/net-http/0/net-http.rbs +162 -134
- data/stdlib/objspace/0/objspace.rbs +17 -34
- data/stdlib/open-uri/0/open-uri.rbs +48 -8
- data/stdlib/open3/0/open3.rbs +469 -10
- data/stdlib/openssl/0/openssl.rbs +482 -364
- data/stdlib/optparse/0/optparse.rbs +26 -17
- data/stdlib/pathname/0/pathname.rbs +11 -1381
- data/stdlib/pp/0/pp.rbs +9 -8
- data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
- data/stdlib/pstore/0/pstore.rbs +35 -30
- data/stdlib/psych/0/psych.rbs +65 -12
- data/stdlib/psych/0/store.rbs +2 -4
- data/stdlib/pty/0/pty.rbs +9 -6
- data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
- data/stdlib/rdoc/0/code_object.rbs +2 -1
- data/stdlib/rdoc/0/parser.rbs +1 -1
- data/stdlib/rdoc/0/rdoc.rbs +1 -1
- data/stdlib/rdoc/0/store.rbs +1 -1
- data/stdlib/resolv/0/resolv.rbs +26 -69
- data/stdlib/ripper/0/ripper.rbs +22 -19
- data/stdlib/securerandom/0/manifest.yaml +2 -0
- data/stdlib/securerandom/0/securerandom.rbs +7 -20
- data/stdlib/shellwords/0/shellwords.rbs +3 -3
- data/stdlib/singleton/0/singleton.rbs +3 -0
- data/stdlib/socket/0/addrinfo.rbs +7 -7
- data/stdlib/socket/0/basic_socket.rbs +3 -3
- data/stdlib/socket/0/ip_socket.rbs +10 -8
- data/stdlib/socket/0/socket.rbs +23 -10
- data/stdlib/socket/0/tcp_server.rbs +1 -1
- data/stdlib/socket/0/tcp_socket.rbs +11 -3
- data/stdlib/socket/0/udp_socket.rbs +1 -1
- data/stdlib/socket/0/unix_server.rbs +1 -1
- data/stdlib/stringio/0/stringio.rbs +1209 -95
- data/stdlib/strscan/0/string_scanner.rbs +101 -80
- data/stdlib/tempfile/0/tempfile.rbs +25 -21
- data/stdlib/time/0/time.rbs +8 -6
- data/stdlib/timeout/0/timeout.rbs +63 -7
- data/stdlib/tsort/0/cyclic.rbs +4 -1
- data/stdlib/tsort/0/interfaces.rbs +8 -8
- data/stdlib/tsort/0/tsort.rbs +16 -15
- data/stdlib/uri/0/common.rbs +42 -20
- data/stdlib/uri/0/file.rbs +3 -3
- data/stdlib/uri/0/generic.rbs +26 -18
- data/stdlib/uri/0/http.rbs +2 -2
- data/stdlib/uri/0/ldap.rbs +2 -2
- data/stdlib/uri/0/mailto.rbs +3 -3
- data/stdlib/uri/0/rfc2396_parser.rbs +12 -12
- data/stdlib/zlib/0/deflate.rbs +4 -3
- data/stdlib/zlib/0/gzip_reader.rbs +8 -8
- data/stdlib/zlib/0/gzip_writer.rbs +14 -12
- data/stdlib/zlib/0/inflate.rbs +1 -1
- data/stdlib/zlib/0/need_dict.rbs +1 -1
- data/stdlib/zlib/0/zstream.rbs +1 -0
- data/wasm/README.md +59 -0
- data/wasm/rbs_wasm.c +411 -0
- metadata +56 -8
- data/.vscode/extensions.json +0 -5
- 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
|
-
|
|
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
|
-
|
|
733
|
+
return 1
|
|
716
734
|
end
|
|
717
735
|
|
|
718
736
|
if args.empty?
|
|
719
737
|
stdout.puts opts
|
|
720
|
-
return
|
|
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
|
-
|
|
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/
|
|
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", "
|
|
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
|
|
995
|
+
annotator.annotate_file(path)
|
|
972
996
|
end
|
|
973
997
|
else
|
|
974
998
|
stdout.puts "Processing #{path}..."
|
|
975
|
-
annotator.annotate_file(path
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
#
|
|
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
|
data/lib/rbs/definition.rb
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
|