rbs 4.0.0.dev.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 +18 -11
- data/.github/workflows/comments.yml +5 -3
- data/.github/workflows/dependabot.yml +2 -2
- data/.github/workflows/ruby.yml +27 -34
- data/.github/workflows/rust.yml +95 -0
- data/.github/workflows/typecheck.yml +2 -2
- data/.github/workflows/windows.yml +2 -2
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +323 -0
- data/README.md +1 -1
- data/Rakefile +43 -33
- data/Steepfile +1 -0
- data/config.yml +426 -24
- data/core/array.rbs +307 -227
- 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 +55 -34
- data/core/complex.rbs +104 -78
- data/core/dir.rbs +61 -49
- data/core/encoding.rbs +12 -15
- data/core/enumerable.rbs +179 -87
- data/core/enumerator/arithmetic_sequence.rbs +70 -0
- data/core/enumerator.rbs +65 -2
- 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 +280 -177
- data/core/file_test.rbs +3 -3
- data/core/float.rbs +257 -92
- data/core/gc.rbs +425 -281
- data/core/hash.rbs +1045 -739
- data/core/integer.rbs +135 -137
- data/core/io/buffer.rbs +53 -42
- data/core/io/wait.rbs +13 -35
- data/core/io.rbs +192 -144
- data/core/kernel.rbs +216 -155
- 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 +244 -106
- data/core/nil_class.rbs +7 -6
- data/core/numeric.rbs +74 -63
- data/core/object.rbs +9 -11
- 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 +159 -57
- data/core/rational.rbs +60 -89
- data/core/rbs/unnamed/argf.rbs +60 -53
- 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 +38 -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 +490 -360
- data/core/signal.rbs +26 -16
- data/core/string.rbs +3234 -1285
- data/core/struct.rbs +27 -26
- data/core/symbol.rbs +41 -34
- data/core/thread.rbs +135 -67
- 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/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 +576 -0
- data/docs/sigs.md +3 -3
- 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 +544 -116
- data/ext/rbs_extension/ast_translation.h +3 -0
- data/ext/rbs_extension/class_constants.c +16 -2
- data/ext/rbs_extension/class_constants.h +8 -0
- data/ext/rbs_extension/extconf.rb +5 -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 +44 -35
- data/include/rbs/ast.h +448 -173
- data/include/rbs/defines.h +27 -0
- data/include/rbs/lexer.h +30 -11
- data/include/rbs/location.h +25 -44
- data/include/rbs/parser.h +6 -6
- 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/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 +293 -3
- data/lib/rbs/ast/ruby/comment_block.rb +24 -0
- data/lib/rbs/ast/ruby/declarations.rb +198 -3
- data/lib/rbs/ast/ruby/helpers/constant_helper.rb +4 -0
- data/lib/rbs/ast/ruby/members.rb +532 -22
- data/lib/rbs/ast/type_param.rb +24 -4
- data/lib/rbs/buffer.rb +20 -15
- data/lib/rbs/cli/diff.rb +16 -15
- data/lib/rbs/cli/validate.rb +38 -106
- data/lib/rbs/cli.rb +52 -19
- data/lib/rbs/collection/config/lockfile_generator.rb +14 -2
- data/lib/rbs/collection/sources/git.rb +1 -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 +20 -0
- data/lib/rbs/definition_builder.rb +147 -25
- data/lib/rbs/diff.rb +7 -1
- data/lib/rbs/environment.rb +227 -74
- data/lib/rbs/environment_loader.rb +0 -6
- data/lib/rbs/errors.rb +27 -18
- data/lib/rbs/inline_parser.rb +342 -6
- 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/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 +8 -0
- data/lib/rbs/resolver/constant_resolver.rb +2 -2
- data/lib/rbs/resolver/type_name_resolver.rb +116 -38
- data/lib/rbs/subtractor.rb +3 -1
- data/lib/rbs/test/type_check.rb +19 -2
- data/lib/rbs/type_name.rb +1 -1
- data/lib/rbs/types.rb +88 -78
- 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 +1 -2
- data/lib/rdoc/discover.rb +1 -1
- data/lib/rdoc_plugin/parser.rb +1 -1
- data/rbs.gemspec +4 -3
- 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/ast/ruby/annotations.rbs +315 -4
- data/sig/ast/ruby/comment_block.rbs +8 -0
- data/sig/ast/ruby/declarations.rbs +102 -4
- data/sig/ast/ruby/members.rbs +108 -2
- 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 -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 +39 -2
- data/sig/locator.rbs +0 -2
- data/sig/manifest.yaml +0 -1
- data/sig/method_builder.rbs +3 -1
- data/sig/parser.rbs +31 -13
- data/sig/prototype/helpers.rbs +2 -0
- data/sig/resolver/type_name_resolver.rbs +35 -7
- data/sig/source.rbs +3 -3
- data/sig/type_param.rbs +13 -8
- 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 +410 -153
- data/src/lexer.c +1392 -1313
- data/src/lexer.re +3 -0
- data/src/lexstate.c +58 -37
- data/src/location.c +8 -48
- data/src/parser.c +977 -516
- data/src/string.c +0 -48
- data/src/util/rbs_allocator.c +89 -71
- 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/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/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 +110 -0
- data/stdlib/erb/0/erb.rbs +748 -347
- data/stdlib/etc/0/etc.rbs +55 -50
- data/stdlib/fileutils/0/fileutils.rbs +158 -139
- data/stdlib/forwardable/0/forwardable.rbs +13 -10
- data/stdlib/io-console/0/io-console.rbs +2 -2
- data/stdlib/json/0/json.rbs +217 -136
- 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 +475 -357
- 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 +25 -68
- 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 +2 -2
- 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 +1177 -85
- data/stdlib/strscan/0/string_scanner.rbs +27 -25
- 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 +3 -0
- data/stdlib/tsort/0/tsort.rbs +7 -6
- 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 +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
- data/stdlib/zlib/0/zstream.rbs +1 -0
- metadata +50 -6
data/lib/rbs/ast/type_param.rb
CHANGED
|
@@ -3,12 +3,13 @@
|
|
|
3
3
|
module RBS
|
|
4
4
|
module AST
|
|
5
5
|
class TypeParam
|
|
6
|
-
attr_reader :name, :variance, :location, :upper_bound_type, :default_type
|
|
6
|
+
attr_reader :name, :variance, :location, :upper_bound_type, :lower_bound_type, :default_type
|
|
7
7
|
|
|
8
|
-
def initialize(name:, variance:, upper_bound:, location:, default_type: nil, unchecked: false)
|
|
8
|
+
def initialize(name:, variance:, upper_bound:, lower_bound:, location:, default_type: nil, unchecked: false)
|
|
9
9
|
@name = name
|
|
10
10
|
@variance = variance
|
|
11
11
|
@upper_bound_type = upper_bound
|
|
12
|
+
@lower_bound_type = lower_bound
|
|
12
13
|
@location = location
|
|
13
14
|
@default_type = default_type
|
|
14
15
|
@unchecked = unchecked
|
|
@@ -21,6 +22,13 @@ module RBS
|
|
|
21
22
|
end
|
|
22
23
|
end
|
|
23
24
|
|
|
25
|
+
def lower_bound
|
|
26
|
+
case lower_bound_type
|
|
27
|
+
when Types::ClassInstance, Types::ClassSingleton, Types::Interface
|
|
28
|
+
lower_bound_type
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
24
32
|
def unchecked!(value = true)
|
|
25
33
|
@unchecked = value ? true : false
|
|
26
34
|
self
|
|
@@ -35,6 +43,7 @@ module RBS
|
|
|
35
43
|
other.name == name &&
|
|
36
44
|
other.variance == variance &&
|
|
37
45
|
other.upper_bound_type == upper_bound_type &&
|
|
46
|
+
other.lower_bound_type == lower_bound_type &&
|
|
38
47
|
other.default_type == default_type &&
|
|
39
48
|
other.unchecked? == unchecked?
|
|
40
49
|
end
|
|
@@ -42,7 +51,7 @@ module RBS
|
|
|
42
51
|
alias eql? ==
|
|
43
52
|
|
|
44
53
|
def hash
|
|
45
|
-
self.class.hash ^ name.hash ^ variance.hash ^ upper_bound_type.hash ^ unchecked?.hash ^ default_type.hash
|
|
54
|
+
self.class.hash ^ name.hash ^ variance.hash ^ upper_bound_type.hash ^ lower_bound_type.hash ^ unchecked?.hash ^ default_type.hash
|
|
46
55
|
end
|
|
47
56
|
|
|
48
57
|
def to_json(state = JSON::State.new)
|
|
@@ -52,6 +61,7 @@ module RBS
|
|
|
52
61
|
unchecked: unchecked?,
|
|
53
62
|
location: location,
|
|
54
63
|
upper_bound: upper_bound_type,
|
|
64
|
+
lower_bound: lower_bound_type,
|
|
55
65
|
default_type: default_type
|
|
56
66
|
}.to_json(state)
|
|
57
67
|
end
|
|
@@ -61,6 +71,10 @@ module RBS
|
|
|
61
71
|
_upper_bound_type = yield(b)
|
|
62
72
|
end
|
|
63
73
|
|
|
74
|
+
if b = lower_bound_type
|
|
75
|
+
_lower_bound_type = yield(b)
|
|
76
|
+
end
|
|
77
|
+
|
|
64
78
|
if dt = default_type
|
|
65
79
|
_default_type = yield(dt)
|
|
66
80
|
end
|
|
@@ -69,6 +83,7 @@ module RBS
|
|
|
69
83
|
name: name,
|
|
70
84
|
variance: variance,
|
|
71
85
|
upper_bound: _upper_bound_type,
|
|
86
|
+
lower_bound: _lower_bound_type,
|
|
72
87
|
location: location,
|
|
73
88
|
default_type: _default_type
|
|
74
89
|
).unchecked!(unchecked?)
|
|
@@ -108,6 +123,7 @@ module RBS
|
|
|
108
123
|
name: new_name,
|
|
109
124
|
variance: param.variance,
|
|
110
125
|
upper_bound: param.upper_bound_type&.map_type {|type| type.sub(subst) },
|
|
126
|
+
lower_bound: param.lower_bound_type&.map_type {|type| type.sub(subst) },
|
|
111
127
|
location: param.location,
|
|
112
128
|
default_type: param.default_type&.map_type {|type| type.sub(subst) }
|
|
113
129
|
).unchecked!(param.unchecked?)
|
|
@@ -136,6 +152,10 @@ module RBS
|
|
|
136
152
|
s << " < #{type}"
|
|
137
153
|
end
|
|
138
154
|
|
|
155
|
+
if type = lower_bound_type
|
|
156
|
+
s << " > #{type}"
|
|
157
|
+
end
|
|
158
|
+
|
|
139
159
|
if dt = default_type
|
|
140
160
|
s << " = #{dt}"
|
|
141
161
|
end
|
|
@@ -176,7 +196,7 @@ module RBS
|
|
|
176
196
|
end
|
|
177
197
|
|
|
178
198
|
def self.normalize_args(params, args)
|
|
179
|
-
app = application(params, args) or return
|
|
199
|
+
app = application(params, args) or return args
|
|
180
200
|
|
|
181
201
|
min_count = params.count { _1.default_type.nil? }
|
|
182
202
|
unless min_count <= args.size && args.size <= params.size
|
data/lib/rbs/buffer.rb
CHANGED
|
@@ -29,19 +29,24 @@ module RBS
|
|
|
29
29
|
|
|
30
30
|
def ranges
|
|
31
31
|
@ranges ||= begin
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
32
|
+
if content.empty?
|
|
33
|
+
ranges = [0...0] #: Array[Range[Integer]]
|
|
34
|
+
lines = [""]
|
|
35
|
+
else
|
|
36
|
+
lines = content.lines
|
|
37
|
+
lines << "" if content.end_with?("\n")
|
|
38
|
+
|
|
39
|
+
ranges = [] #: Array[Range[Integer]]
|
|
40
|
+
offset = 0
|
|
41
|
+
|
|
42
|
+
lines.each do |line|
|
|
43
|
+
size0 = line.size
|
|
44
|
+
line = line.chomp
|
|
45
|
+
range = offset...(offset+line.size)
|
|
46
|
+
ranges << range
|
|
47
|
+
|
|
48
|
+
offset += size0
|
|
49
|
+
end
|
|
45
50
|
end
|
|
46
51
|
|
|
47
52
|
ranges
|
|
@@ -84,9 +89,9 @@ module RBS
|
|
|
84
89
|
|
|
85
90
|
def rbs_location(location, loc2=nil)
|
|
86
91
|
if loc2
|
|
87
|
-
Location.new(self, location.start_character_offset, loc2.end_character_offset)
|
|
92
|
+
Location.new(self.top_buffer, location.start_character_offset, loc2.end_character_offset)
|
|
88
93
|
else
|
|
89
|
-
Location.new(self, location.start_character_offset, location.end_character_offset)
|
|
94
|
+
Location.new(self.top_buffer, location.start_character_offset, location.end_character_offset)
|
|
90
95
|
end
|
|
91
96
|
end
|
|
92
97
|
|
data/lib/rbs/cli/diff.rb
CHANGED
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
module RBS
|
|
4
4
|
class CLI
|
|
5
5
|
class Diff
|
|
6
|
-
def initialize(
|
|
7
|
-
@format = nil
|
|
6
|
+
def initialize(stdout: $stdout, stderr: $stderr)
|
|
8
7
|
@stdout = stdout
|
|
9
8
|
@stderr = stderr
|
|
9
|
+
end
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
def run(argv:, library_options:)
|
|
12
|
+
format = nil #: String?
|
|
13
|
+
type_name = nil #: String?
|
|
13
14
|
library_options = library_options
|
|
14
15
|
before_path = [] #: Array[String]
|
|
15
16
|
after_path = [] #: Array[String]
|
|
@@ -32,7 +33,7 @@ module RBS
|
|
|
32
33
|
# Confirmation of methods related to Time class added by including stdlib/time
|
|
33
34
|
$ rbs diff --format diff --type-name Time --after stdlib/time
|
|
34
35
|
HELP
|
|
35
|
-
o.on("--format NAME") { |arg|
|
|
36
|
+
o.on("--format NAME") { |arg| format = arg }
|
|
36
37
|
o.on("--type-name NAME") { |arg| type_name = arg }
|
|
37
38
|
o.on("--before DIR") { |arg| before_path << arg }
|
|
38
39
|
o.on("--after DIR") { |arg| after_path << arg }
|
|
@@ -40,28 +41,28 @@ module RBS
|
|
|
40
41
|
end
|
|
41
42
|
opt.parse!(argv)
|
|
42
43
|
|
|
43
|
-
unless
|
|
44
|
+
unless format && type_name && ["markdown", "diff"].include?(format)
|
|
44
45
|
@stderr.puts opt.banner
|
|
45
|
-
|
|
46
|
+
return 1
|
|
46
47
|
end
|
|
47
48
|
|
|
48
|
-
|
|
49
|
+
diff = RBS::Diff.new(
|
|
49
50
|
type_name: TypeName.parse(type_name).absolute!,
|
|
50
51
|
library_options: library_options,
|
|
51
52
|
after_path: after_path,
|
|
52
53
|
before_path: before_path,
|
|
53
54
|
detail: detail,
|
|
54
55
|
)
|
|
55
|
-
end
|
|
56
56
|
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
public_send("run_#{format}", diff)
|
|
58
|
+
|
|
59
|
+
0
|
|
59
60
|
end
|
|
60
61
|
|
|
61
|
-
def run_diff
|
|
62
|
+
def run_diff(diff)
|
|
62
63
|
first = true
|
|
63
64
|
io = RBS::CLI::ColoredIO.new(stdout: @stdout)
|
|
64
|
-
|
|
65
|
+
diff.each_diff do |before, after|
|
|
65
66
|
io.puts if !first
|
|
66
67
|
io.puts_red "- #{before}"
|
|
67
68
|
io.puts_green "+ #{after}"
|
|
@@ -69,10 +70,10 @@ module RBS
|
|
|
69
70
|
end
|
|
70
71
|
end
|
|
71
72
|
|
|
72
|
-
def run_markdown
|
|
73
|
+
def run_markdown(diff)
|
|
73
74
|
@stdout.puts "| before | after |"
|
|
74
75
|
@stdout.puts "| --- | --- |"
|
|
75
|
-
|
|
76
|
+
diff.each_diff do |before, after|
|
|
76
77
|
before.gsub!("|", "\\|")
|
|
77
78
|
after.gsub!("|", "\\|")
|
|
78
79
|
@stdout.puts "| `#{before}` | `#{after}` |"
|
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
|
|
@@ -112,9 +108,6 @@ EOU
|
|
|
112
108
|
entry.each_decl do |decl|
|
|
113
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
|
|
@@ -123,15 +116,12 @@ EOU
|
|
|
123
116
|
entry.each_decl do |decl|
|
|
124
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
|
|
@@ -153,16 +143,14 @@ 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
|
|
@@ -176,21 +164,10 @@ EOU
|
|
|
176
164
|
case member
|
|
177
165
|
when AST::Members::MethodDefinition
|
|
178
166
|
@validator.validate_method_definition(member, type_name: name)
|
|
179
|
-
member.overloads.each do |ov|
|
|
180
|
-
void_type_context_validator(ov.method_type)
|
|
181
|
-
end
|
|
182
|
-
when AST::Members::Attribute
|
|
183
|
-
void_type_context_validator(member.type)
|
|
184
167
|
when AST::Members::Mixin
|
|
185
|
-
member.args.each do |arg|
|
|
186
|
-
no_self_type_validator(arg)
|
|
187
|
-
unless arg.is_a?(Types::Bases::Void)
|
|
188
|
-
void_type_context_validator(arg, true)
|
|
189
|
-
end
|
|
190
|
-
end
|
|
191
168
|
params =
|
|
192
169
|
if member.name.class?
|
|
193
|
-
module_decl = @env.
|
|
170
|
+
module_decl = @env.module_entry(member.name, normalized: true) or raise
|
|
194
171
|
module_decl.type_params
|
|
195
172
|
else
|
|
196
173
|
interface_decl = @env.interface_decls.fetch(member.name)
|
|
@@ -199,10 +176,6 @@ EOU
|
|
|
199
176
|
InvalidTypeApplicationError.check!(type_name: member.name, params: params, args: member.args, location: member.location)
|
|
200
177
|
when AST::Members::Var
|
|
201
178
|
@validator.validate_variable(member)
|
|
202
|
-
void_type_context_validator(member.type)
|
|
203
|
-
if member.is_a?(AST::Members::ClassVariable)
|
|
204
|
-
no_self_type_validator(member.type)
|
|
205
|
-
end
|
|
206
179
|
end
|
|
207
180
|
end
|
|
208
181
|
else
|
|
@@ -238,16 +211,14 @@ EOU
|
|
|
238
211
|
|
|
239
212
|
decl.decl.type_params.each do |param|
|
|
240
213
|
if ub = param.upper_bound_type
|
|
241
|
-
void_type_context_validator(ub)
|
|
242
|
-
no_self_type_validator(ub)
|
|
243
|
-
no_classish_type_validator(ub)
|
|
244
214
|
@validator.validate_type(ub, context: nil)
|
|
245
215
|
end
|
|
246
216
|
|
|
217
|
+
if lb = param.lower_bound_type
|
|
218
|
+
@validator.validate_type(lb, context: nil)
|
|
219
|
+
end
|
|
220
|
+
|
|
247
221
|
if dt = param.default_type
|
|
248
|
-
void_type_context_validator(dt, true)
|
|
249
|
-
no_self_type_validator(dt)
|
|
250
|
-
no_classish_type_validator(dt)
|
|
251
222
|
@validator.validate_type(dt, context: nil)
|
|
252
223
|
end
|
|
253
224
|
end
|
|
@@ -258,10 +229,6 @@ EOU
|
|
|
258
229
|
case member
|
|
259
230
|
when AST::Members::MethodDefinition
|
|
260
231
|
@validator.validate_method_definition(member, type_name: name)
|
|
261
|
-
member.overloads.each do |ov|
|
|
262
|
-
void_type_context_validator(ov.method_type)
|
|
263
|
-
no_classish_type_validator(ov.method_type)
|
|
264
|
-
end
|
|
265
232
|
end
|
|
266
233
|
end
|
|
267
234
|
rescue BaseError => error
|
|
@@ -274,9 +241,6 @@ EOU
|
|
|
274
241
|
RBS.logger.info "Validating constant: `#{name}`..."
|
|
275
242
|
@validator.validate_type const.decl.type, context: const.context
|
|
276
243
|
@builder.ensure_namespace!(name.namespace, location: const.decl.location)
|
|
277
|
-
no_self_type_validator(const.decl.type)
|
|
278
|
-
no_classish_type_validator(const.decl.type)
|
|
279
|
-
void_type_context_validator(const.decl.type)
|
|
280
244
|
rescue BaseError => error
|
|
281
245
|
@errors.add(error)
|
|
282
246
|
end
|
|
@@ -286,9 +250,6 @@ EOU
|
|
|
286
250
|
@env.global_decls.each do |name, global|
|
|
287
251
|
RBS.logger.info "Validating global: `#{name}`..."
|
|
288
252
|
@validator.validate_type global.decl.type, context: nil
|
|
289
|
-
no_self_type_validator(global.decl.type)
|
|
290
|
-
no_classish_type_validator(global.decl.type)
|
|
291
|
-
void_type_context_validator(global.decl.type)
|
|
292
253
|
rescue BaseError => error
|
|
293
254
|
@errors.add(error)
|
|
294
255
|
end
|
|
@@ -311,52 +272,23 @@ EOU
|
|
|
311
272
|
|
|
312
273
|
decl.decl.type_params.each do |param|
|
|
313
274
|
if ub = param.upper_bound_type
|
|
314
|
-
void_type_context_validator(ub)
|
|
315
|
-
no_self_type_validator(ub)
|
|
316
|
-
no_classish_type_validator(ub)
|
|
317
275
|
@validator.validate_type(ub, context: nil)
|
|
318
276
|
end
|
|
319
277
|
|
|
278
|
+
if lb = param.lower_bound_type
|
|
279
|
+
@validator.validate_type(lb, context: nil)
|
|
280
|
+
end
|
|
281
|
+
|
|
320
282
|
if dt = param.default_type
|
|
321
|
-
void_type_context_validator(dt, true)
|
|
322
|
-
no_self_type_validator(dt)
|
|
323
|
-
no_classish_type_validator(dt)
|
|
324
283
|
@validator.validate_type(dt, context: nil)
|
|
325
284
|
end
|
|
326
285
|
end
|
|
327
286
|
|
|
328
287
|
TypeParamDefaultReferenceError.check!(decl.decl.type_params)
|
|
329
|
-
|
|
330
|
-
no_self_type_validator(decl.decl.type)
|
|
331
|
-
no_classish_type_validator(decl.decl.type)
|
|
332
|
-
void_type_context_validator(decl.decl.type)
|
|
333
288
|
rescue BaseError => error
|
|
334
289
|
@errors.add(error)
|
|
335
290
|
end
|
|
336
291
|
end
|
|
337
|
-
|
|
338
|
-
private
|
|
339
|
-
|
|
340
|
-
def no_self_type_validator(type)
|
|
341
|
-
if type.has_self_type?
|
|
342
|
-
@errors.add WillSyntaxError.new("`self` type is not allowed in this context", location: type.location)
|
|
343
|
-
end
|
|
344
|
-
end
|
|
345
|
-
|
|
346
|
-
def no_classish_type_validator(type)
|
|
347
|
-
if type.has_classish_type?
|
|
348
|
-
@errors.add WillSyntaxError.new("`instance` or `class` type is not allowed in this context", location: type.location)
|
|
349
|
-
end
|
|
350
|
-
end
|
|
351
|
-
|
|
352
|
-
def void_type_context_validator(type, allowed_here = false)
|
|
353
|
-
if allowed_here
|
|
354
|
-
return if type.is_a?(Types::Bases::Void)
|
|
355
|
-
end
|
|
356
|
-
if type.with_nonreturn_void?
|
|
357
|
-
@errors.add WillSyntaxError.new("`void` type is only allowed in return type or generics parameter", location: type.location)
|
|
358
|
-
end
|
|
359
|
-
end
|
|
360
292
|
end
|
|
361
293
|
end
|
|
362
294
|
end
|