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.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +14 -14
- data/.github/workflows/bundle-update.yml +60 -0
- data/.github/workflows/c-check.yml +7 -5
- data/.github/workflows/comments.yml +2 -2
- data/.github/workflows/dependabot.yml +2 -2
- data/.github/workflows/ruby.yml +16 -26
- data/.github/workflows/rust.yml +95 -0
- data/.github/workflows/typecheck.yml +1 -1
- data/.github/workflows/windows.yml +2 -2
- data/.rubocop.yml +2 -2
- data/.vscode/extensions.json +5 -0
- data/.vscode/settings.json +19 -0
- data/CHANGELOG.md +202 -2
- data/Rakefile +9 -23
- data/Steepfile +2 -0
- data/config.yml +457 -13
- data/core/array.rbs +218 -188
- data/core/basic_object.rbs +9 -8
- data/core/binding.rbs +0 -2
- data/core/builtin.rbs +2 -2
- data/core/class.rbs +6 -5
- data/core/comparable.rbs +45 -31
- data/core/complex.rbs +66 -55
- data/core/dir.rbs +57 -45
- data/core/encoding.rbs +6 -6
- data/core/enumerable.rbs +105 -91
- data/core/enumerator/arithmetic_sequence.rbs +70 -0
- data/core/enumerator.rbs +24 -3
- data/core/errno.rbs +3 -2
- data/core/errors.rbs +31 -29
- data/core/exception.rbs +12 -12
- data/core/fiber.rbs +47 -36
- data/core/file.rbs +242 -169
- data/core/file_test.rbs +2 -2
- data/core/float.rbs +42 -68
- data/core/gc.rbs +78 -70
- data/core/hash.rbs +70 -60
- data/core/integer.rbs +32 -75
- data/core/io/buffer.rbs +36 -36
- data/core/io/wait.rbs +7 -7
- data/core/io.rbs +192 -146
- data/core/kernel.rbs +198 -147
- data/core/marshal.rbs +3 -3
- data/core/match_data.rbs +14 -12
- data/core/math.rbs +69 -67
- data/core/method.rbs +6 -8
- data/core/module.rbs +148 -88
- data/core/nil_class.rbs +4 -3
- data/core/numeric.rbs +53 -50
- data/core/object.rbs +6 -8
- data/core/object_space.rbs +11 -10
- data/core/pathname.rbs +131 -81
- data/core/proc.rbs +65 -34
- data/core/process.rbs +221 -201
- data/core/ractor.rbs +15 -11
- data/core/random.rbs +21 -3
- data/core/range.rbs +152 -49
- data/core/rational.rbs +5 -56
- data/core/rbs/unnamed/argf.rbs +58 -51
- data/core/rbs/unnamed/env_class.rbs +18 -13
- data/core/rbs/unnamed/main_class.rbs +123 -0
- data/core/rbs/unnamed/random.rbs +7 -116
- data/core/regexp.rbs +236 -197
- data/core/ruby.rbs +1 -1
- data/core/ruby_vm.rbs +32 -30
- data/core/rubygems/config_file.rbs +5 -5
- data/core/rubygems/errors.rbs +1 -1
- data/core/rubygems/requirement.rbs +5 -5
- data/core/rubygems/rubygems.rbs +5 -3
- data/core/set.rbs +17 -16
- data/core/signal.rbs +2 -2
- data/core/string.rbs +318 -298
- data/core/struct.rbs +26 -25
- data/core/symbol.rbs +25 -24
- data/core/thread.rbs +40 -41
- data/core/time.rbs +47 -42
- data/core/trace_point.rbs +34 -31
- data/core/true_class.rbs +2 -2
- data/core/unbound_method.rbs +10 -10
- data/core/warning.rbs +7 -7
- data/docs/collection.md +1 -1
- data/docs/config.md +171 -0
- data/docs/inline.md +576 -0
- data/docs/syntax.md +46 -16
- data/docs/type_fingerprint.md +21 -0
- data/exe/rbs +1 -1
- data/ext/rbs_extension/ast_translation.c +595 -98
- data/ext/rbs_extension/class_constants.c +30 -0
- data/ext/rbs_extension/class_constants.h +15 -0
- data/ext/rbs_extension/legacy_location.c +30 -53
- data/ext/rbs_extension/legacy_location.h +37 -0
- data/ext/rbs_extension/main.c +125 -24
- data/include/rbs/ast.h +485 -150
- data/include/rbs/lexer.h +11 -4
- data/include/rbs/location.h +25 -44
- data/include/rbs/parser.h +20 -2
- data/include/rbs/util/rbs_constant_pool.h +0 -3
- data/include/rbs.h +8 -0
- 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 +409 -0
- data/lib/rbs/ast/ruby/comment_block.rb +245 -0
- data/lib/rbs/ast/ruby/declarations.rb +281 -0
- data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
- data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
- data/lib/rbs/ast/ruby/members.rb +723 -0
- data/lib/rbs/ast/type_param.rb +24 -4
- data/lib/rbs/buffer.rb +105 -20
- data/lib/rbs/cli/diff.rb +16 -15
- data/lib/rbs/cli/validate.rb +62 -125
- data/lib/rbs/cli.rb +55 -23
- data/lib/rbs/collection/config/lockfile_generator.rb +8 -4
- data/lib/rbs/collection/sources/git.rb +1 -0
- data/lib/rbs/collection.rb +0 -1
- data/lib/rbs/definition.rb +6 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +119 -63
- data/lib/rbs/definition_builder/method_builder.rb +65 -30
- data/lib/rbs/definition_builder.rb +177 -20
- data/lib/rbs/diff.rb +7 -1
- data/lib/rbs/environment/class_entry.rb +69 -0
- data/lib/rbs/environment/module_entry.rb +66 -0
- data/lib/rbs/environment.rb +338 -155
- data/lib/rbs/environment_loader.rb +2 -2
- data/lib/rbs/errors.rb +30 -20
- data/lib/rbs/inline_parser/comment_association.rb +117 -0
- data/lib/rbs/inline_parser.rb +542 -0
- data/lib/rbs/location_aux.rb +36 -4
- data/lib/rbs/locator.rb +5 -1
- data/lib/rbs/method_type.rb +5 -3
- data/lib/rbs/namespace.rb +0 -7
- data/lib/rbs/parser_aux.rb +31 -8
- 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 -2
- data/lib/rbs/resolver/type_name_resolver.rb +0 -8
- data/lib/rbs/source.rb +99 -0
- data/lib/rbs/subtractor.rb +4 -3
- data/lib/rbs/test/type_check.rb +5 -2
- data/lib/rbs/type_name.rb +1 -8
- data/lib/rbs/types.rb +88 -78
- data/lib/rbs/unit_test/convertibles.rb +1 -0
- data/lib/rbs/unit_test/type_assertions.rb +35 -8
- data/lib/rbs/validator.rb +2 -2
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs.rb +12 -1
- data/rbs.gemspec +3 -2
- data/rust/.gitignore +1 -0
- data/rust/Cargo.lock +378 -0
- data/rust/Cargo.toml +7 -0
- data/rust/ruby-rbs/Cargo.toml +22 -0
- data/rust/ruby-rbs/build.rs +764 -0
- data/rust/ruby-rbs/examples/locations.rs +60 -0
- data/rust/ruby-rbs/src/lib.rs +1 -0
- data/rust/ruby-rbs/src/node/mod.rs +742 -0
- data/rust/ruby-rbs/tests/sanity.rs +47 -0
- data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
- data/rust/ruby-rbs-sys/Cargo.toml +23 -0
- data/rust/ruby-rbs-sys/build.rs +204 -0
- data/rust/ruby-rbs-sys/src/lib.rs +50 -0
- data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
- data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
- data/rust/ruby-rbs-sys/wrapper.h +1 -0
- data/schema/typeParam.json +17 -1
- data/sig/ancestor_builder.rbs +1 -1
- data/sig/ast/ruby/annotations.rbs +421 -0
- data/sig/ast/ruby/comment_block.rbs +127 -0
- data/sig/ast/ruby/declarations.rbs +158 -0
- data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
- data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
- data/sig/ast/ruby/members.rbs +178 -0
- data/sig/buffer.rbs +63 -5
- data/sig/cli/diff.rbs +5 -11
- data/sig/cli/validate.rbs +12 -8
- data/sig/cli.rbs +18 -18
- data/sig/definition.rbs +6 -0
- data/sig/definition_builder.rbs +3 -1
- data/sig/environment/class_entry.rbs +50 -0
- data/sig/environment/module_entry.rbs +50 -0
- data/sig/environment.rbs +37 -81
- data/sig/errors.rbs +26 -20
- data/sig/inline_parser/comment_association.rbs +71 -0
- data/sig/inline_parser.rbs +124 -0
- data/sig/location.rbs +32 -7
- data/sig/locator.rbs +0 -2
- data/sig/method_builder.rbs +9 -4
- data/sig/namespace.rbs +0 -5
- data/sig/parser.rbs +47 -13
- data/sig/prototype/helpers.rbs +2 -0
- data/sig/resolver/type_name_resolver.rbs +0 -3
- data/sig/source.rbs +48 -0
- data/sig/type_param.rbs +13 -8
- data/sig/typename.rbs +0 -5
- data/sig/types.rbs +6 -7
- data/sig/unit_test/spy.rbs +0 -8
- data/sig/unit_test/type_assertions.rbs +11 -0
- data/src/ast.c +491 -143
- data/src/lexer.c +1552 -1314
- data/src/lexer.re +7 -0
- data/src/lexstate.c +8 -1
- data/src/location.c +8 -48
- data/src/parser.c +1107 -409
- data/src/util/rbs_constant_pool.c +0 -4
- data/stdlib/bigdecimal/0/big_decimal.rbs +16 -16
- data/stdlib/cgi-escape/0/escape.rbs +4 -4
- data/stdlib/coverage/0/coverage.rbs +4 -3
- data/stdlib/date/0/date.rbs +33 -28
- data/stdlib/date/0/date_time.rbs +24 -23
- data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
- data/stdlib/digest/0/digest.rbs +110 -0
- data/stdlib/erb/0/erb.rbs +64 -53
- data/stdlib/etc/0/etc.rbs +55 -50
- data/stdlib/fileutils/0/fileutils.rbs +140 -126
- data/stdlib/forwardable/0/forwardable.rbs +10 -10
- data/stdlib/io-console/0/io-console.rbs +2 -2
- data/stdlib/json/0/json.rbs +158 -131
- data/stdlib/monitor/0/monitor.rbs +3 -3
- data/stdlib/net-http/0/net-http.rbs +159 -134
- data/stdlib/objspace/0/objspace.rbs +8 -30
- data/stdlib/open-uri/0/open-uri.rbs +8 -8
- data/stdlib/open3/0/open3.rbs +469 -10
- data/stdlib/openssl/0/openssl.rbs +144 -129
- data/stdlib/optparse/0/optparse.rbs +23 -14
- data/stdlib/pathname/0/pathname.rbs +2 -2
- 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 +62 -9
- 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/store.rbs +1 -1
- data/stdlib/ripper/0/ripper.rbs +20 -17
- data/stdlib/securerandom/0/manifest.yaml +2 -0
- data/stdlib/securerandom/0/securerandom.rbs +7 -20
- data/stdlib/shellwords/0/shellwords.rbs +2 -2
- data/stdlib/socket/0/addrinfo.rbs +9 -9
- data/stdlib/socket/0/basic_socket.rbs +3 -3
- data/stdlib/socket/0/ip_socket.rbs +10 -8
- data/stdlib/socket/0/socket.rbs +10 -9
- data/stdlib/socket/0/tcp_server.rbs +1 -1
- data/stdlib/socket/0/tcp_socket.rbs +1 -1
- data/stdlib/socket/0/udp_socket.rbs +1 -1
- data/stdlib/socket/0/unix_server.rbs +1 -1
- data/stdlib/stringio/0/stringio.rbs +55 -54
- data/stdlib/strscan/0/string_scanner.rbs +46 -44
- data/stdlib/tempfile/0/tempfile.rbs +24 -20
- data/stdlib/time/0/time.rbs +7 -5
- data/stdlib/tsort/0/tsort.rbs +7 -6
- data/stdlib/uri/0/common.rbs +31 -18
- data/stdlib/uri/0/file.rbs +2 -2
- data/stdlib/uri/0/generic.rbs +9 -2
- 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 +6 -5
- data/stdlib/zlib/0/deflate.rbs +4 -3
- data/stdlib/zlib/0/gzip_reader.rbs +6 -6
- 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
- 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.
|
|
179
|
-
loc = decl.location or raise
|
|
180
|
+
decls = env.sources.select do |source|
|
|
180
181
|
# @type var name: String
|
|
181
|
-
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
|
-
|
|
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
|
-
|
|
733
|
+
return 1
|
|
717
734
|
end
|
|
718
735
|
|
|
719
736
|
if args.empty?
|
|
720
737
|
stdout.puts opts
|
|
721
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
#
|
|
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}."
|
data/lib/rbs/collection.rb
CHANGED
data/lib/rbs/definition.rb
CHANGED
|
@@ -62,7 +62,12 @@ module RBS
|
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
def comment
|
|
65
|
-
member
|
|
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.
|
|
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 |
|
|
181
|
-
super_class =
|
|
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.
|
|
204
|
-
super_class = primary.
|
|
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.
|
|
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.
|
|
287
|
-
super_class = primary.
|
|
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.
|
|
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
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
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
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
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
|
-
|
|
363
|
-
|
|
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
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
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
|
-
|
|
371
|
-
|
|
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
|
-
|
|
374
|
-
|
|
375
|
+
included_interfaces << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
|
|
376
|
+
end
|
|
375
377
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
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
|
-
|
|
382
|
-
|
|
383
|
+
module_decl = env.module_entry(member.name, normalized: true) or raise
|
|
384
|
+
module_name = module_decl.name
|
|
383
385
|
|
|
384
|
-
|
|
385
|
-
|
|
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
|
-
|
|
388
|
-
|
|
389
|
+
prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args, source: member)
|
|
390
|
+
end
|
|
389
391
|
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
392
|
+
when AST::Members::Extend
|
|
393
|
+
module_name = member.name
|
|
394
|
+
module_args = member.args
|
|
393
395
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
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
|
-
|
|
400
|
-
|
|
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
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
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
|
-
|
|
408
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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)
|