rbs 3.9.4 → 4.1.1
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 +75 -0
- data/.clangd +2 -0
- data/.dockerignore +37 -0
- data/.github/dependabot.yml +16 -14
- data/.github/workflows/bundle-update.yml +63 -0
- data/.github/workflows/c-check.yml +66 -0
- data/.github/workflows/comments.yml +5 -3
- data/.github/workflows/dependabot.yml +2 -2
- data/.github/workflows/jruby.yml +79 -0
- data/.github/workflows/release-gems.yml +164 -0
- data/.github/workflows/ruby.yml +84 -30
- data/.github/workflows/rust.yml +186 -0
- data/.github/workflows/truffleruby.yml +54 -0
- data/.github/workflows/typecheck.yml +5 -2
- data/.github/workflows/wasm.yml +55 -0
- data/.github/workflows/windows.yml +9 -3
- data/.gitignore +16 -0
- data/.rubocop.yml +2 -2
- data/CHANGELOG.md +430 -0
- data/Dockerfile.jruby +53 -0
- data/README.md +41 -4
- data/Rakefile +777 -60
- data/Steepfile +11 -0
- data/config.yml +660 -62
- data/core/array.rbs +541 -398
- 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 +297 -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 -116
- 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 +220 -154
- data/core/kernel.rbs +239 -163
- data/core/marshal.rbs +4 -4
- data/core/match_data.rbs +16 -14
- 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 +1312 -0
- data/core/proc.rbs +95 -58
- data/core/process.rbs +222 -202
- data/core/ractor.rbs +364 -518
- 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 +6 -70
- data/core/rubygems/requirement.rbs +5 -15
- data/core/rubygems/rubygems.rbs +18 -81
- data/core/rubygems/specification.rbs +8 -0
- data/core/rubygems/version.rbs +2 -163
- 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 +139 -83
- 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/release.md +151 -0
- 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 +1855 -0
- data/ext/rbs_extension/ast_translation.h +41 -0
- data/ext/rbs_extension/class_constants.c +187 -0
- data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +23 -1
- data/ext/rbs_extension/compat.h +10 -0
- data/ext/rbs_extension/extconf.rb +26 -1
- data/ext/rbs_extension/legacy_location.c +299 -0
- data/ext/rbs_extension/legacy_location.h +82 -0
- data/ext/rbs_extension/main.c +603 -23
- data/ext/rbs_extension/rbs_extension.h +6 -21
- data/ext/rbs_extension/rbs_string_bridging.c +9 -0
- data/ext/rbs_extension/rbs_string_bridging.h +24 -0
- data/include/rbs/ast.h +1047 -0
- data/include/rbs/defines.h +99 -0
- data/include/rbs/lexer.h +207 -0
- data/include/rbs/location.h +40 -0
- data/include/rbs/parser.h +153 -0
- data/include/rbs/serialize.h +39 -0
- data/include/rbs/string.h +47 -0
- data/include/rbs/util/rbs_allocator.h +59 -0
- data/include/rbs/util/rbs_assert.h +20 -0
- data/include/rbs/util/rbs_buffer.h +83 -0
- data/include/rbs/util/rbs_constant_pool.h +6 -70
- data/include/rbs/util/rbs_encoding.h +282 -0
- data/include/rbs/util/rbs_unescape.h +24 -0
- data/include/rbs.h +9 -2
- data/lib/rbs/annotate/formatter.rb +3 -13
- data/lib/rbs/annotate/rdoc_annotator.rb +30 -32
- data/lib/rbs/annotate/rdoc_source.rb +1 -1
- 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 +451 -0
- data/lib/rbs/ast/ruby/comment_block.rb +247 -0
- data/lib/rbs/ast/ruby/declarations.rb +291 -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 +762 -0
- data/lib/rbs/ast/type_param.rb +24 -4
- data/lib/rbs/buffer.rb +142 -20
- data/lib/rbs/cli/diff.rb +16 -15
- data/lib/rbs/cli/validate.rb +63 -126
- data/lib/rbs/cli.rb +59 -29
- data/lib/rbs/collection/config/lockfile_generator.rb +28 -3
- data/lib/rbs/collection/sources/git.rb +7 -0
- data/lib/rbs/definition.rb +6 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +121 -65
- data/lib/rbs/definition_builder/method_builder.rb +74 -33
- 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 +410 -215
- data/lib/rbs/environment_loader.rb +2 -8
- data/lib/rbs/errors.rb +31 -21
- data/lib/rbs/inline_parser/comment_association.rb +117 -0
- data/lib/rbs/inline_parser.rb +568 -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 +47 -18
- data/lib/rbs/parser_aux.rb +37 -7
- data/lib/rbs/prototype/helpers.rb +57 -0
- data/lib/rbs/prototype/rb.rb +3 -28
- data/lib/rbs/prototype/rbi.rb +196 -45
- data/lib/rbs/prototype/runtime.rb +12 -2
- 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/source.rb +99 -0
- data/lib/rbs/subtractor.rb +7 -4
- data/lib/rbs/test/type_check.rb +25 -3
- data/lib/rbs/type_name.rb +34 -21
- data/lib/rbs/types.rb +91 -79
- data/lib/rbs/unit_test/convertibles.rb +1 -0
- 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 +196 -0
- data/lib/rbs/wasm/serialization_schema.rb +110 -0
- data/lib/rbs.rb +25 -2
- data/lib/rbs_jars.rb +39 -0
- data/lib/rdoc/discover.rb +1 -1
- data/lib/rdoc_plugin/parser.rb +8 -3
- data/rbs.gemspec +37 -5
- data/schema/typeParam.json +17 -1
- data/sig/ancestor_builder.rbs +1 -1
- data/sig/annotate/formatter.rbs +2 -2
- data/sig/annotate/rdoc_annotater.rbs +13 -10
- data/sig/ast/ruby/annotations.rbs +470 -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 +198 -0
- data/sig/buffer.rbs +81 -5
- 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 -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 +94 -87
- data/sig/errors.rbs +26 -20
- data/sig/inline_parser/comment_association.rbs +71 -0
- data/sig/inline_parser.rbs +126 -0
- data/sig/location.rbs +32 -7
- data/sig/locator.rbs +0 -2
- data/sig/manifest.yaml +0 -2
- data/sig/method_builder.rbs +9 -4
- data/sig/namespace.rbs +20 -5
- data/sig/parser.rbs +77 -13
- data/sig/prototype/helpers.rbs +2 -0
- data/sig/prototype/rbi.rbs +33 -4
- data/sig/resolver/type_name_resolver.rbs +36 -10
- data/sig/rewriter.rbs +45 -0
- data/sig/source.rbs +48 -0
- data/sig/type_param.rbs +13 -8
- data/sig/typename.rbs +15 -5
- data/sig/types.rbs +10 -8
- 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 +1628 -0
- data/src/lexer.c +3221 -0
- data/src/lexer.re +155 -0
- data/src/lexstate.c +221 -0
- data/src/location.c +31 -0
- data/src/parser.c +4258 -0
- data/src/serialize.c +958 -0
- data/src/string.c +41 -0
- data/src/util/rbs_allocator.c +171 -0
- data/src/util/rbs_assert.c +19 -0
- data/src/util/rbs_buffer.c +54 -0
- data/src/util/rbs_constant_pool.c +18 -92
- data/src/util/rbs_encoding.c +21308 -0
- data/src/util/rbs_unescape.c +167 -0
- 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 +11 -7
- data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
- data/stdlib/digest/0/digest.rbs +117 -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/ipaddr/0/ipaddr.rbs +0 -5
- data/stdlib/json/0/json.rbs +232 -185
- data/stdlib/monitor/0/monitor.rbs +5 -5
- 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 +521 -397
- 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 +4 -3
- data/stdlib/rdoc/0/comment.rbs +2 -0
- data/stdlib/rdoc/0/options.rbs +76 -0
- data/stdlib/rdoc/0/parser.rbs +1 -1
- data/stdlib/rdoc/0/rdoc.rbs +7 -5
- data/stdlib/rdoc/0/store.rbs +2 -2
- data/stdlib/resolv/0/resolv.rbs +26 -69
- data/stdlib/ripper/0/ripper.rbs +25 -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 +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 +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/manifest.yaml +3 -0
- data/stdlib/tempfile/0/tempfile.rbs +25 -21
- data/stdlib/time/0/time.rbs +8 -6
- data/stdlib/timeout/0/timeout.rbs +58 -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 +21 -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/wasm/README.md +60 -0
- data/wasm/rbs_wasm.c +423 -0
- metadata +131 -19
- data/ext/rbs_extension/lexer.c +0 -2728
- data/ext/rbs_extension/lexer.h +0 -179
- data/ext/rbs_extension/lexer.re +0 -147
- data/ext/rbs_extension/lexstate.c +0 -175
- data/ext/rbs_extension/location.c +0 -325
- data/ext/rbs_extension/location.h +0 -85
- data/ext/rbs_extension/parser.c +0 -2982
- data/ext/rbs_extension/parser.h +0 -18
- data/ext/rbs_extension/parserstate.c +0 -411
- data/ext/rbs_extension/parserstate.h +0 -163
- data/ext/rbs_extension/unescape.c +0 -32
- data/include/rbs/ruby_objs.h +0 -72
- data/src/constants.c +0 -153
- data/src/ruby_objs.c +0 -799
data/lib/rbs/cli/validate.rb
CHANGED
|
@@ -4,36 +4,33 @@ module RBS
|
|
|
4
4
|
class CLI
|
|
5
5
|
class Validate
|
|
6
6
|
class Errors
|
|
7
|
-
def initialize(limit
|
|
7
|
+
def initialize(limit:)
|
|
8
8
|
@limit = limit
|
|
9
|
-
@exit_error = exit_error
|
|
10
9
|
@errors = []
|
|
11
|
-
@has_syntax_error = false
|
|
12
10
|
end
|
|
13
11
|
|
|
14
12
|
def add(error)
|
|
15
|
-
|
|
16
|
-
RBS.logger.warn(build_message(error))
|
|
17
|
-
@has_syntax_error = true
|
|
18
|
-
else
|
|
19
|
-
@errors << error
|
|
20
|
-
end
|
|
13
|
+
@errors << error
|
|
21
14
|
finish if @limit == 1
|
|
22
15
|
end
|
|
23
16
|
|
|
17
|
+
def try(&block)
|
|
18
|
+
catch(:finish) do |tag|
|
|
19
|
+
@tag = tag
|
|
20
|
+
yield
|
|
21
|
+
finish()
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
24
25
|
def finish
|
|
25
|
-
|
|
26
|
-
if @exit_error && @has_syntax_error
|
|
27
|
-
exit 1
|
|
28
|
-
else
|
|
29
|
-
# success
|
|
30
|
-
end
|
|
31
|
-
else
|
|
26
|
+
unless @errors.empty?
|
|
32
27
|
@errors.each do |error|
|
|
33
28
|
RBS.logger.error(build_message(error))
|
|
34
29
|
end
|
|
35
|
-
|
|
30
|
+
throw @tag, 1
|
|
36
31
|
end
|
|
32
|
+
|
|
33
|
+
0
|
|
37
34
|
end
|
|
38
35
|
|
|
39
36
|
private
|
|
@@ -53,7 +50,6 @@ module RBS
|
|
|
53
50
|
@env = Environment.from_loader(loader).resolve_type_names
|
|
54
51
|
@builder = DefinitionBuilder.new(env: @env)
|
|
55
52
|
@validator = Validator.new(env: @env)
|
|
56
|
-
exit_error = false
|
|
57
53
|
limit = nil #: Integer?
|
|
58
54
|
OptionParser.new do |opts|
|
|
59
55
|
opts.banner = <<EOU
|
|
@@ -70,25 +66,25 @@ EOU
|
|
|
70
66
|
RBS.print_warning { "`--silent` option is deprecated because it's silent by default. You can use --log-level option of rbs command to display more information." }
|
|
71
67
|
end
|
|
72
68
|
opts.on("--[no-]exit-error-on-syntax-error", "exit(1) if syntax error is detected") {|bool|
|
|
73
|
-
|
|
69
|
+
RBS.print_warning { "`--exit-error-on-syntax-error` option is deprecated because it's validated during parsing.." }
|
|
74
70
|
}
|
|
75
71
|
opts.on("--fail-fast", "Exit immediately as soon as a validation error is found.") do |arg|
|
|
76
72
|
limit = 1
|
|
77
73
|
end
|
|
78
74
|
end.parse!(args)
|
|
79
75
|
|
|
80
|
-
@errors = Errors.new(limit: limit
|
|
76
|
+
@errors = Errors.new(limit: limit)
|
|
81
77
|
end
|
|
82
78
|
|
|
83
79
|
def run
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
80
|
+
@errors.try do
|
|
81
|
+
validate_class_module_definition
|
|
82
|
+
validate_class_module_alias_definition
|
|
83
|
+
validate_interface
|
|
84
|
+
validate_constant
|
|
85
|
+
validate_global
|
|
86
|
+
validate_type_alias
|
|
87
|
+
end
|
|
92
88
|
end
|
|
93
89
|
|
|
94
90
|
private
|
|
@@ -109,29 +105,23 @@ EOU
|
|
|
109
105
|
|
|
110
106
|
case entry
|
|
111
107
|
when Environment::ClassEntry
|
|
112
|
-
entry.
|
|
113
|
-
if super_class = decl.
|
|
108
|
+
entry.each_decl do |decl|
|
|
109
|
+
if super_class = decl.super_class
|
|
114
110
|
super_class.args.each do |arg|
|
|
115
|
-
void_type_context_validator(arg, true)
|
|
116
|
-
no_self_type_validator(arg)
|
|
117
|
-
no_classish_type_validator(arg)
|
|
118
111
|
@validator.validate_type(arg, context: nil)
|
|
119
112
|
end
|
|
120
113
|
end
|
|
121
114
|
end
|
|
122
115
|
when Environment::ModuleEntry
|
|
123
|
-
entry.
|
|
124
|
-
decl.
|
|
116
|
+
entry.each_decl do |decl|
|
|
117
|
+
decl.self_types.each do |self_type|
|
|
125
118
|
self_type.args.each do |arg|
|
|
126
|
-
void_type_context_validator(arg, true)
|
|
127
|
-
no_self_type_validator(arg)
|
|
128
|
-
no_classish_type_validator(arg)
|
|
129
119
|
@validator.validate_type(arg, context: nil)
|
|
130
120
|
end
|
|
131
121
|
|
|
132
122
|
self_params =
|
|
133
123
|
if self_type.name.class?
|
|
134
|
-
@env.
|
|
124
|
+
@env.module_entry(self_type.name, normalized: true)&.type_params
|
|
135
125
|
else
|
|
136
126
|
@env.interface_decls[self_type.name]&.decl&.type_params
|
|
137
127
|
end
|
|
@@ -143,7 +133,7 @@ EOU
|
|
|
143
133
|
end
|
|
144
134
|
end
|
|
145
135
|
|
|
146
|
-
d = entry.
|
|
136
|
+
d = entry.primary_decl
|
|
147
137
|
|
|
148
138
|
@validator.validate_type_params(
|
|
149
139
|
d.type_params,
|
|
@@ -153,55 +143,43 @@ EOU
|
|
|
153
143
|
|
|
154
144
|
d.type_params.each do |param|
|
|
155
145
|
if ub = param.upper_bound_type
|
|
156
|
-
void_type_context_validator(ub)
|
|
157
|
-
no_self_type_validator(ub)
|
|
158
|
-
no_classish_type_validator(ub)
|
|
159
146
|
@validator.validate_type(ub, context: nil)
|
|
160
147
|
end
|
|
161
148
|
|
|
149
|
+
if lb = param.lower_bound_type
|
|
150
|
+
@validator.validate_type(lb, context: nil)
|
|
151
|
+
end
|
|
152
|
+
|
|
162
153
|
if dt = param.default_type
|
|
163
|
-
void_type_context_validator(dt, true)
|
|
164
|
-
no_self_type_validator(dt)
|
|
165
|
-
no_classish_type_validator(dt)
|
|
166
154
|
@validator.validate_type(dt, context: nil)
|
|
167
155
|
end
|
|
168
156
|
end
|
|
169
157
|
|
|
170
158
|
TypeParamDefaultReferenceError.check!(d.type_params)
|
|
171
159
|
|
|
172
|
-
entry.
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
module_decl = @env.normalized_module_entry(member.name) or raise
|
|
192
|
-
module_decl.type_params
|
|
193
|
-
else
|
|
194
|
-
interface_decl = @env.interface_decls.fetch(member.name)
|
|
195
|
-
interface_decl.decl.type_params
|
|
196
|
-
end
|
|
197
|
-
InvalidTypeApplicationError.check!(type_name: member.name, params: params, args: member.args, location: member.location)
|
|
198
|
-
when AST::Members::Var
|
|
199
|
-
@validator.validate_variable(member)
|
|
200
|
-
void_type_context_validator(member.type)
|
|
201
|
-
if member.is_a?(AST::Members::ClassVariable)
|
|
202
|
-
no_self_type_validator(member.type)
|
|
160
|
+
entry.each_decl do |decl|
|
|
161
|
+
case decl
|
|
162
|
+
when AST::Declarations::Base
|
|
163
|
+
decl.each_member do |member|
|
|
164
|
+
case member
|
|
165
|
+
when AST::Members::MethodDefinition
|
|
166
|
+
@validator.validate_method_definition(member, type_name: name)
|
|
167
|
+
when AST::Members::Mixin
|
|
168
|
+
params =
|
|
169
|
+
if member.name.class?
|
|
170
|
+
module_decl = @env.module_entry(member.name, normalized: true) or raise
|
|
171
|
+
module_decl.type_params
|
|
172
|
+
else
|
|
173
|
+
interface_decl = @env.interface_decls.fetch(member.name)
|
|
174
|
+
interface_decl.decl.type_params
|
|
175
|
+
end
|
|
176
|
+
InvalidTypeApplicationError.check!(type_name: member.name, params: params, args: member.args, location: member.location)
|
|
177
|
+
when AST::Members::Var
|
|
178
|
+
@validator.validate_variable(member)
|
|
203
179
|
end
|
|
204
180
|
end
|
|
181
|
+
else
|
|
182
|
+
raise "Unknown declaration: #{decl.class}"
|
|
205
183
|
end
|
|
206
184
|
end
|
|
207
185
|
rescue BaseError => error
|
|
@@ -233,16 +211,14 @@ EOU
|
|
|
233
211
|
|
|
234
212
|
decl.decl.type_params.each do |param|
|
|
235
213
|
if ub = param.upper_bound_type
|
|
236
|
-
void_type_context_validator(ub)
|
|
237
|
-
no_self_type_validator(ub)
|
|
238
|
-
no_classish_type_validator(ub)
|
|
239
214
|
@validator.validate_type(ub, context: nil)
|
|
240
215
|
end
|
|
241
216
|
|
|
217
|
+
if lb = param.lower_bound_type
|
|
218
|
+
@validator.validate_type(lb, context: nil)
|
|
219
|
+
end
|
|
220
|
+
|
|
242
221
|
if dt = param.default_type
|
|
243
|
-
void_type_context_validator(dt, true)
|
|
244
|
-
no_self_type_validator(dt)
|
|
245
|
-
no_classish_type_validator(dt)
|
|
246
222
|
@validator.validate_type(dt, context: nil)
|
|
247
223
|
end
|
|
248
224
|
end
|
|
@@ -253,10 +229,6 @@ EOU
|
|
|
253
229
|
case member
|
|
254
230
|
when AST::Members::MethodDefinition
|
|
255
231
|
@validator.validate_method_definition(member, type_name: name)
|
|
256
|
-
member.overloads.each do |ov|
|
|
257
|
-
void_type_context_validator(ov.method_type)
|
|
258
|
-
no_classish_type_validator(ov.method_type)
|
|
259
|
-
end
|
|
260
232
|
end
|
|
261
233
|
end
|
|
262
234
|
rescue BaseError => error
|
|
@@ -269,9 +241,6 @@ EOU
|
|
|
269
241
|
RBS.logger.info "Validating constant: `#{name}`..."
|
|
270
242
|
@validator.validate_type const.decl.type, context: const.context
|
|
271
243
|
@builder.ensure_namespace!(name.namespace, location: const.decl.location)
|
|
272
|
-
no_self_type_validator(const.decl.type)
|
|
273
|
-
no_classish_type_validator(const.decl.type)
|
|
274
|
-
void_type_context_validator(const.decl.type)
|
|
275
244
|
rescue BaseError => error
|
|
276
245
|
@errors.add(error)
|
|
277
246
|
end
|
|
@@ -281,9 +250,6 @@ EOU
|
|
|
281
250
|
@env.global_decls.each do |name, global|
|
|
282
251
|
RBS.logger.info "Validating global: `#{name}`..."
|
|
283
252
|
@validator.validate_type global.decl.type, context: nil
|
|
284
|
-
no_self_type_validator(global.decl.type)
|
|
285
|
-
no_classish_type_validator(global.decl.type)
|
|
286
|
-
void_type_context_validator(global.decl.type)
|
|
287
253
|
rescue BaseError => error
|
|
288
254
|
@errors.add(error)
|
|
289
255
|
end
|
|
@@ -306,52 +272,23 @@ EOU
|
|
|
306
272
|
|
|
307
273
|
decl.decl.type_params.each do |param|
|
|
308
274
|
if ub = param.upper_bound_type
|
|
309
|
-
void_type_context_validator(ub)
|
|
310
|
-
no_self_type_validator(ub)
|
|
311
|
-
no_classish_type_validator(ub)
|
|
312
275
|
@validator.validate_type(ub, context: nil)
|
|
313
276
|
end
|
|
314
277
|
|
|
278
|
+
if lb = param.lower_bound_type
|
|
279
|
+
@validator.validate_type(lb, context: nil)
|
|
280
|
+
end
|
|
281
|
+
|
|
315
282
|
if dt = param.default_type
|
|
316
|
-
void_type_context_validator(dt, true)
|
|
317
|
-
no_self_type_validator(dt)
|
|
318
|
-
no_classish_type_validator(dt)
|
|
319
283
|
@validator.validate_type(dt, context: nil)
|
|
320
284
|
end
|
|
321
285
|
end
|
|
322
286
|
|
|
323
287
|
TypeParamDefaultReferenceError.check!(decl.decl.type_params)
|
|
324
|
-
|
|
325
|
-
no_self_type_validator(decl.decl.type)
|
|
326
|
-
no_classish_type_validator(decl.decl.type)
|
|
327
|
-
void_type_context_validator(decl.decl.type)
|
|
328
288
|
rescue BaseError => error
|
|
329
289
|
@errors.add(error)
|
|
330
290
|
end
|
|
331
291
|
end
|
|
332
|
-
|
|
333
|
-
private
|
|
334
|
-
|
|
335
|
-
def no_self_type_validator(type)
|
|
336
|
-
if type.has_self_type?
|
|
337
|
-
@errors.add WillSyntaxError.new("`self` type is not allowed in this context", location: type.location)
|
|
338
|
-
end
|
|
339
|
-
end
|
|
340
|
-
|
|
341
|
-
def no_classish_type_validator(type)
|
|
342
|
-
if type.has_classish_type?
|
|
343
|
-
@errors.add WillSyntaxError.new("`instance` or `class` type is not allowed in this context", location: type.location)
|
|
344
|
-
end
|
|
345
|
-
end
|
|
346
|
-
|
|
347
|
-
def void_type_context_validator(type, allowed_here = false)
|
|
348
|
-
if allowed_here
|
|
349
|
-
return if type.is_a?(Types::Bases::Void)
|
|
350
|
-
end
|
|
351
|
-
if type.with_nonreturn_void?
|
|
352
|
-
@errors.add WillSyntaxError.new("`void` type is only allowed in return type or generics parameter", location: type.location)
|
|
353
|
-
end
|
|
354
|
-
end
|
|
355
292
|
end
|
|
356
293
|
end
|
|
357
294
|
end
|
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)
|
|
@@ -937,8 +962,6 @@ Options:
|
|
|
937
962
|
source = RBS::Annotate::RDocSource.new()
|
|
938
963
|
annotator = RBS::Annotate::RDocAnnotator.new(source: source)
|
|
939
964
|
|
|
940
|
-
preserve = true
|
|
941
|
-
|
|
942
965
|
OptionParser.new do |opts|
|
|
943
966
|
opts.banner = <<-EOB
|
|
944
967
|
Usage: rbs annotate [options...] [files...]
|
|
@@ -947,7 +970,7 @@ Import documents from RDoc and update RBS files.
|
|
|
947
970
|
|
|
948
971
|
Examples:
|
|
949
972
|
|
|
950
|
-
$ rbs annotate stdlib/
|
|
973
|
+
$ rbs annotate stdlib/logger/**/*.rbs
|
|
951
974
|
|
|
952
975
|
Options:
|
|
953
976
|
EOB
|
|
@@ -959,7 +982,7 @@ Options:
|
|
|
959
982
|
opts.on("-d", "--dir DIRNAME", "Load RDoc from DIRNAME") {|d| source.extra_dirs << Pathname(d) }
|
|
960
983
|
opts.on("--[no-]arglists", "Generate arglists section (defaults to true)") {|b| annotator.include_arg_lists = b }
|
|
961
984
|
opts.on("--[no-]filename", "Include source file name in the documentation (defaults to true)") {|b| annotator.include_filename = b }
|
|
962
|
-
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." }
|
|
963
986
|
end.parse!(args)
|
|
964
987
|
|
|
965
988
|
source.load()
|
|
@@ -969,13 +992,15 @@ Options:
|
|
|
969
992
|
if path.directory?
|
|
970
993
|
Pathname.glob((path + "**/*.rbs").to_s).each do |path|
|
|
971
994
|
stdout.puts "Processing #{path}..."
|
|
972
|
-
annotator.annotate_file(path
|
|
995
|
+
annotator.annotate_file(path)
|
|
973
996
|
end
|
|
974
997
|
else
|
|
975
998
|
stdout.puts "Processing #{path}..."
|
|
976
|
-
annotator.annotate_file(path
|
|
999
|
+
annotator.annotate_file(path)
|
|
977
1000
|
end
|
|
978
1001
|
end
|
|
1002
|
+
|
|
1003
|
+
0
|
|
979
1004
|
end
|
|
980
1005
|
|
|
981
1006
|
def test_opt options
|
|
@@ -1029,7 +1054,7 @@ EOB
|
|
|
1029
1054
|
|
|
1030
1055
|
if args.length.zero?
|
|
1031
1056
|
stdout.puts opts.help
|
|
1032
|
-
|
|
1057
|
+
return 1
|
|
1033
1058
|
end
|
|
1034
1059
|
|
|
1035
1060
|
# @type var env_hash: Hash[String, String?]
|
|
@@ -1045,11 +1070,12 @@ EOB
|
|
|
1045
1070
|
|
|
1046
1071
|
# @type var out: String
|
|
1047
1072
|
# @type var err: String
|
|
1073
|
+
# @type var status: Process::Status
|
|
1048
1074
|
out, err, status = __skip__ = Open3.capture3(env_hash, *args)
|
|
1049
1075
|
stdout.print(out)
|
|
1050
1076
|
stderr.print(err)
|
|
1051
1077
|
|
|
1052
|
-
status
|
|
1078
|
+
status.to_i
|
|
1053
1079
|
end
|
|
1054
1080
|
|
|
1055
1081
|
def run_collection(args, options)
|
|
@@ -1074,7 +1100,7 @@ EOB
|
|
|
1074
1100
|
when 'init'
|
|
1075
1101
|
if config_path.exist?
|
|
1076
1102
|
puts "#{config_path} already exists"
|
|
1077
|
-
|
|
1103
|
+
return 1
|
|
1078
1104
|
end
|
|
1079
1105
|
|
|
1080
1106
|
config_path.write(<<~'YAML')
|
|
@@ -1102,15 +1128,17 @@ EOB
|
|
|
1102
1128
|
when 'clean'
|
|
1103
1129
|
unless lock_path.exist?
|
|
1104
1130
|
puts "#{lock_path} should exist to clean"
|
|
1105
|
-
|
|
1131
|
+
return 1
|
|
1106
1132
|
end
|
|
1107
1133
|
Collection::Cleaner.new(lockfile_path: lock_path)
|
|
1108
1134
|
when 'help', 'hel', 'he', 'h'
|
|
1109
1135
|
puts opts.help
|
|
1110
1136
|
else
|
|
1111
1137
|
puts opts.help
|
|
1112
|
-
|
|
1138
|
+
return 1
|
|
1113
1139
|
end
|
|
1140
|
+
|
|
1141
|
+
0
|
|
1114
1142
|
end
|
|
1115
1143
|
|
|
1116
1144
|
def collection_options(args)
|
|
@@ -1172,7 +1200,7 @@ EOB
|
|
|
1172
1200
|
*minuend_paths, subtrahend_path = args
|
|
1173
1201
|
unless subtrahend_path
|
|
1174
1202
|
stdout.puts opts.help
|
|
1175
|
-
|
|
1203
|
+
return 1
|
|
1176
1204
|
end
|
|
1177
1205
|
subtrahend_paths << subtrahend_path
|
|
1178
1206
|
else
|
|
@@ -1181,7 +1209,7 @@ EOB
|
|
|
1181
1209
|
|
|
1182
1210
|
if minuend_paths.empty?
|
|
1183
1211
|
stdout.puts opts.help
|
|
1184
|
-
|
|
1212
|
+
return 1
|
|
1185
1213
|
end
|
|
1186
1214
|
|
|
1187
1215
|
subtrahend = Environment.new.tap do |env|
|
|
@@ -1214,10 +1242,12 @@ EOB
|
|
|
1214
1242
|
end
|
|
1215
1243
|
end
|
|
1216
1244
|
end
|
|
1245
|
+
|
|
1246
|
+
0
|
|
1217
1247
|
end
|
|
1218
1248
|
|
|
1219
1249
|
def run_diff(argv, library_options)
|
|
1220
|
-
Diff.new(
|
|
1250
|
+
Diff.new(stdout: stdout, stderr: stderr).run(argv: argv, library_options: library_options)
|
|
1221
1251
|
end
|
|
1222
1252
|
end
|
|
1223
1253
|
end
|