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
|
@@ -8,14 +8,30 @@ module RBS
|
|
|
8
8
|
"mutex_m" => ">= 0.3.0",
|
|
9
9
|
"abbrev" => nil,
|
|
10
10
|
"base64" => nil,
|
|
11
|
+
"benchmark" => nil,
|
|
11
12
|
"bigdecimal" => nil,
|
|
12
13
|
"csv" => nil,
|
|
14
|
+
"kconv" => nil,
|
|
15
|
+
"logger" => nil,
|
|
13
16
|
"minitest" => nil,
|
|
14
17
|
"net-smtp" => nil,
|
|
15
18
|
"nkf" => nil,
|
|
16
19
|
"observer" => nil,
|
|
20
|
+
"cgi" => nil,
|
|
21
|
+
"pstore" => nil,
|
|
17
22
|
}
|
|
18
23
|
|
|
24
|
+
NONGEM_STDLIBS = Set[
|
|
25
|
+
"cgi-escape",
|
|
26
|
+
"coverage",
|
|
27
|
+
"monitor",
|
|
28
|
+
"objspace",
|
|
29
|
+
"pathname",
|
|
30
|
+
"pty",
|
|
31
|
+
"ripper",
|
|
32
|
+
"socket",
|
|
33
|
+
]
|
|
34
|
+
|
|
19
35
|
class GemfileLockMismatchError < StandardError
|
|
20
36
|
def initialize(expected:, actual:)
|
|
21
37
|
@expected = expected
|
|
@@ -163,7 +179,9 @@ module RBS
|
|
|
163
179
|
end
|
|
164
180
|
end
|
|
165
181
|
else
|
|
166
|
-
|
|
182
|
+
unless NONGEM_STDLIBS.include?(name)
|
|
183
|
+
RBS.logger.warn "Cannot find `#{name}` gem. Using incorrect Bundler context? (#{definition.lockfile})"
|
|
184
|
+
end
|
|
167
185
|
end
|
|
168
186
|
end
|
|
169
187
|
|
|
@@ -171,8 +189,8 @@ module RBS
|
|
|
171
189
|
return if lockfile.gems.key?(name)
|
|
172
190
|
|
|
173
191
|
case name
|
|
174
|
-
when 'bigdecimal-math'
|
|
175
|
-
#
|
|
192
|
+
when 'bigdecimal-math', 'kconv'
|
|
193
|
+
# These gems are never released as a gem.
|
|
176
194
|
# Therefore, `assign_gem` should not be called.
|
|
177
195
|
RBS.logger.info {
|
|
178
196
|
from = from_gem || "rbs_collection.yaml"
|
|
@@ -183,6 +201,13 @@ module RBS
|
|
|
183
201
|
lockfile.gems[name] = { name: name, version: "0", source: source }
|
|
184
202
|
end
|
|
185
203
|
return
|
|
204
|
+
when 'set'
|
|
205
|
+
# set is migrated to core from stdlib.
|
|
206
|
+
RBS.logger.info {
|
|
207
|
+
from = from_gem || "rbs_collection.yaml"
|
|
208
|
+
"`#{name}` is a part of the Ruby core library. The dependency to the library can be safely deleted from #{from}."
|
|
209
|
+
}
|
|
210
|
+
return
|
|
186
211
|
when *ALUMNI_STDLIBS.keys
|
|
187
212
|
version = ALUMNI_STDLIBS.fetch(name)
|
|
188
213
|
if from_gem
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
require 'digest/sha2'
|
|
4
4
|
require 'open3'
|
|
5
5
|
require 'find'
|
|
6
|
+
require 'fileutils'
|
|
6
7
|
|
|
7
8
|
module RBS
|
|
8
9
|
module Collection
|
|
@@ -139,6 +140,12 @@ module RBS
|
|
|
139
140
|
# git v2.27.0 or greater
|
|
140
141
|
git 'clone', '--filter=blob:none', remote, git_dir.to_s, chdir: nil
|
|
141
142
|
rescue CommandError
|
|
143
|
+
# The failed `--filter=blob:none` clone may leave behind a
|
|
144
|
+
# partial repository (e.g. when the server returned an error
|
|
145
|
+
# mid-clone), which would cause the fallback `git clone` to
|
|
146
|
+
# fail with "destination path ... already exists and is not
|
|
147
|
+
# an empty directory". Clean it up before retrying.
|
|
148
|
+
FileUtils.rm_rf(git_dir)
|
|
142
149
|
git 'clone', remote, git_dir.to_s, chdir: nil
|
|
143
150
|
end
|
|
144
151
|
end
|
data/lib/rbs/definition.rb
CHANGED
|
@@ -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,13 +214,13 @@ 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)
|
|
221
221
|
end
|
|
222
222
|
|
|
223
|
-
super_entry = env.
|
|
223
|
+
super_entry = env.class_entry(super_name, normalized: true) or raise
|
|
224
224
|
super_args = AST::TypeParam.normalize_args(super_entry.type_params, super_args)
|
|
225
225
|
|
|
226
226
|
ancestors = OneAncestors.class_instance(
|
|
@@ -248,7 +248,7 @@ module RBS
|
|
|
248
248
|
|
|
249
249
|
module_name = module_self.name
|
|
250
250
|
if module_name.class?
|
|
251
|
-
module_entry = env.
|
|
251
|
+
module_entry = env.module_class_entry(module_name, normalized: true) or raise
|
|
252
252
|
module_name = module_entry.name
|
|
253
253
|
self_args = AST::TypeParam.normalize_args(module_entry.type_params, module_self.args)
|
|
254
254
|
end
|
|
@@ -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)
|
|
@@ -103,37 +103,56 @@ module RBS
|
|
|
103
103
|
args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
|
|
104
104
|
type = Types::ClassInstance.new(name: type_name, args: args, location: nil)
|
|
105
105
|
Methods.new(type: type).tap do |methods|
|
|
106
|
-
entry.
|
|
107
|
-
subst = Substitution.build(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
case member
|
|
112
|
-
when
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
106
|
+
entry.each_decl do |decl|
|
|
107
|
+
subst = Substitution.build(decl.type_params.each.map(&:name), args)
|
|
108
|
+
case decl
|
|
109
|
+
when AST::Declarations::Base
|
|
110
|
+
each_rbs_member_with_accessibility(decl.members) do |member, accessibility|
|
|
111
|
+
case member
|
|
112
|
+
when AST::Members::MethodDefinition
|
|
113
|
+
case member.kind
|
|
114
|
+
when :instance
|
|
115
|
+
build_method(
|
|
116
|
+
methods,
|
|
117
|
+
type,
|
|
118
|
+
member: member.update(overloads: member.overloads.map {|overload| overload.sub(subst) }),
|
|
119
|
+
accessibility: member.visibility || accessibility
|
|
120
|
+
)
|
|
121
|
+
when :singleton_instance
|
|
122
|
+
build_method(
|
|
123
|
+
methods,
|
|
124
|
+
type,
|
|
125
|
+
member: member.update(overloads: member.overloads.map {|overload| overload.sub(subst) }),
|
|
126
|
+
accessibility: :private
|
|
127
|
+
)
|
|
128
|
+
end
|
|
129
|
+
when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
|
|
130
|
+
if member.kind == :instance
|
|
131
|
+
build_attribute(methods,
|
|
132
|
+
type,
|
|
133
|
+
member: member.update(type: member.type.sub(subst)),
|
|
134
|
+
accessibility: member.visibility || accessibility)
|
|
135
|
+
end
|
|
136
|
+
when AST::Members::Alias
|
|
137
|
+
if member.kind == :instance
|
|
138
|
+
build_alias(methods, type, member: member)
|
|
139
|
+
end
|
|
126
140
|
end
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
141
|
+
end
|
|
142
|
+
when AST::Ruby::Declarations::Base
|
|
143
|
+
decl.members.each do |member|
|
|
144
|
+
case member
|
|
145
|
+
when AST::Ruby::Members::DefMember
|
|
146
|
+
if member.instance?
|
|
147
|
+
build_method(
|
|
148
|
+
methods,
|
|
149
|
+
type,
|
|
150
|
+
member: member,
|
|
151
|
+
accessibility: :public
|
|
152
|
+
)
|
|
153
|
+
end
|
|
154
|
+
when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
|
|
155
|
+
build_ruby_attribute(methods, type, member: member, accessibility: :public)
|
|
137
156
|
end
|
|
138
157
|
end
|
|
139
158
|
end
|
|
@@ -149,8 +168,8 @@ module RBS
|
|
|
149
168
|
type = Types::ClassSingleton.new(name: type_name, location: nil)
|
|
150
169
|
|
|
151
170
|
Methods.new(type: type).tap do |methods|
|
|
152
|
-
entry.
|
|
153
|
-
|
|
171
|
+
entry.each_decl do |decl|
|
|
172
|
+
decl.members.each do |member|
|
|
154
173
|
case member
|
|
155
174
|
when AST::Members::MethodDefinition
|
|
156
175
|
if member.singleton?
|
|
@@ -164,6 +183,10 @@ module RBS
|
|
|
164
183
|
if member.kind == :singleton
|
|
165
184
|
build_alias(methods, type, member: member)
|
|
166
185
|
end
|
|
186
|
+
when AST::Ruby::Members::DefMember
|
|
187
|
+
if member.singleton?
|
|
188
|
+
build_method(methods, type, member: member, accessibility: :public)
|
|
189
|
+
end
|
|
167
190
|
end
|
|
168
191
|
end
|
|
169
192
|
end
|
|
@@ -212,6 +235,24 @@ module RBS
|
|
|
212
235
|
end
|
|
213
236
|
end
|
|
214
237
|
|
|
238
|
+
def build_ruby_attribute(methods, type, member:, accessibility:)
|
|
239
|
+
member.names.each do |name|
|
|
240
|
+
if member.is_a?(AST::Ruby::Members::AttrReaderMember) || member.is_a?(AST::Ruby::Members::AttrAccessorMember)
|
|
241
|
+
defn = methods.methods[name] ||= Methods::Definition.empty(type: type, name: name)
|
|
242
|
+
|
|
243
|
+
defn.accessibilities << accessibility
|
|
244
|
+
defn.originals << member
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
if member.is_a?(AST::Ruby::Members::AttrWriterMember) || member.is_a?(AST::Ruby::Members::AttrAccessorMember)
|
|
248
|
+
defn = methods.methods[:"#{name}="] ||= Methods::Definition.empty(type: type, name: :"#{name}=")
|
|
249
|
+
|
|
250
|
+
defn.accessibilities << accessibility
|
|
251
|
+
defn.originals << member
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
|
|
215
256
|
def build_method(methods, type, member:, accessibility:)
|
|
216
257
|
defn = methods.methods[member.name] ||= Methods::Definition.empty(type: type, name: member.name)
|
|
217
258
|
|
|
@@ -223,7 +264,7 @@ module RBS
|
|
|
223
264
|
end
|
|
224
265
|
end
|
|
225
266
|
|
|
226
|
-
def
|
|
267
|
+
def each_rbs_member_with_accessibility(members, accessibility: :public)
|
|
227
268
|
members.each do |member|
|
|
228
269
|
case member
|
|
229
270
|
when AST::Members::Public
|