rbs 3.9.4 → 4.2.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/.clang-format +75 -0
- data/.clangd +2 -0
- data/.dockerignore +37 -0
- data/.gitattributes +1 -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/changelog.yml +121 -0
- data/.github/workflows/comments.yml +6 -4
- data/.github/workflows/dependabot.yml +2 -2
- data/.github/workflows/jruby.yml +74 -0
- data/.github/workflows/release-gems.yml +234 -0
- data/.github/workflows/ruby.yml +86 -32
- data/.github/workflows/rust.yml +186 -0
- data/.github/workflows/truffleruby.yml +54 -0
- data/.github/workflows/typecheck.yml +6 -3
- data/.github/workflows/wasm.yml +55 -0
- data/.github/workflows/windows.yml +10 -4
- data/.gitignore +16 -0
- data/.rubocop.yml +1 -2
- data/CHANGELOG.md +502 -0
- data/Dockerfile.jruby +53 -0
- data/README.md +42 -5
- data/Rakefile +892 -111
- data/Steepfile +11 -0
- data/config.yml +665 -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 +222 -155
- 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 +3 -2
- 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 +303 -0
- data/docs/rust.md +96 -0
- data/docs/sigs.md +3 -3
- data/docs/stdlib.md +8 -0
- data/docs/syntax.md +60 -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 +1870 -0
- data/ext/rbs_extension/ast_translation.h +41 -0
- data/ext/rbs_extension/class_constants.c +189 -0
- data/{include/rbs/constants.h → ext/rbs_extension/class_constants.h} +24 -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 +639 -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 +1055 -0
- data/include/rbs/defines.h +104 -0
- data/include/rbs/lexer.h +208 -0
- data/include/rbs/location.h +40 -0
- data/include/rbs/parser.h +187 -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 +11 -11
- 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 +25 -5
- 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 +129 -70
- data/lib/rbs/definition_builder/method_builder.rb +74 -33
- data/lib/rbs/definition_builder.rb +181 -21
- data/lib/rbs/diff.rb +7 -1
- data/lib/rbs/environment/class_entry.rb +81 -0
- data/lib/rbs/environment/module_entry.rb +91 -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 +24 -0
- data/lib/rbs/prototype/rb.rb +3 -28
- data/lib/rbs/prototype/rbi.rb +196 -45
- data/lib/rbs/prototype/runtime/value_object_generator.rb +0 -1
- data/lib/rbs/prototype/runtime.rb +13 -3
- 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 +135 -81
- data/lib/rbs/unit_test/convertibles.rb +1 -0
- data/lib/rbs/unit_test/type_assertions.rb +47 -11
- 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 +174 -0
- data/lib/rbs/wasm/runtime.rb +211 -0
- data/lib/rbs/wasm/serialization_schema.rb +111 -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 +34 -6
- data/schema/function.json +12 -1
- 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 +56 -0
- data/sig/environment/module_entry.rbs +65 -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 +79 -15
- 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 +21 -9
- data/sig/unit_test/spy.rbs +0 -8
- data/sig/unit_test/type_assertions.rbs +17 -2
- data/sig/wasm/deserializer.rbs +66 -0
- data/sig/wasm/serialization_schema.rbs +13 -0
- data/src/ast.c +1644 -0
- data/src/lexer.c +3223 -0
- data/src/lexer.re +187 -0
- data/src/lexstate.c +222 -0
- data/src/location.c +31 -0
- data/src/parser.c +4318 -0
- data/src/serialize.c +965 -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 +21454 -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 +754 -353
- 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 +9 -9
- 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 +6 -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 +1211 -96
- 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_file.rbs +1 -1
- data/stdlib/zlib/0/gzip_reader.rbs +8 -8
- data/stdlib/zlib/0/gzip_writer.rbs +16 -13
- data/stdlib/zlib/0/inflate.rbs +1 -1
- data/stdlib/zlib/0/need_dict.rbs +1 -1
- data/wasm/README.md +109 -0
- data/wasm/rbs_wasm.c +479 -0
- metadata +133 -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
|
@@ -124,12 +124,15 @@ module RBS
|
|
|
124
124
|
end
|
|
125
125
|
|
|
126
126
|
entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
|
|
127
|
-
args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
|
|
128
127
|
|
|
129
|
-
entry.
|
|
130
|
-
|
|
128
|
+
entry.each_decl do |decl|
|
|
129
|
+
if align_params = entry.align_params(decl)
|
|
130
|
+
subst_ = subst + align_params
|
|
131
|
+
else
|
|
132
|
+
subst_ = subst
|
|
133
|
+
end
|
|
131
134
|
|
|
132
|
-
|
|
135
|
+
decl.members.each do |member|
|
|
133
136
|
case member
|
|
134
137
|
when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
|
|
135
138
|
if member.kind == :instance
|
|
@@ -151,6 +154,29 @@ module RBS
|
|
|
151
154
|
end
|
|
152
155
|
end
|
|
153
156
|
|
|
157
|
+
when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
|
|
158
|
+
member.names.each do |name|
|
|
159
|
+
ivar_name = :"@#{name}"
|
|
160
|
+
attr_type = member.type || Types::Bases::Any.new(location: nil)
|
|
161
|
+
|
|
162
|
+
insert_variable(
|
|
163
|
+
type_name,
|
|
164
|
+
definition.instance_variables,
|
|
165
|
+
name: ivar_name,
|
|
166
|
+
type: attr_type,
|
|
167
|
+
source: member
|
|
168
|
+
)
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
when AST::Ruby::Members::InstanceVariableMember
|
|
172
|
+
insert_variable(
|
|
173
|
+
type_name,
|
|
174
|
+
definition.instance_variables,
|
|
175
|
+
name: member.name,
|
|
176
|
+
type: member.type,
|
|
177
|
+
source: member
|
|
178
|
+
)
|
|
179
|
+
|
|
154
180
|
when AST::Members::InstanceVariable
|
|
155
181
|
insert_variable(
|
|
156
182
|
type_name,
|
|
@@ -174,7 +200,7 @@ module RBS
|
|
|
174
200
|
|
|
175
201
|
try_cache(type_name, cache: instance_cache) do
|
|
176
202
|
entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
|
|
177
|
-
ensure_namespace!(type_name.namespace, location: entry.
|
|
203
|
+
ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
|
|
178
204
|
|
|
179
205
|
ancestors = ancestor_builder.instance_ancestors(type_name)
|
|
180
206
|
args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
|
|
@@ -234,7 +260,7 @@ module RBS
|
|
|
234
260
|
def build_singleton0(type_name)
|
|
235
261
|
try_cache type_name, cache: singleton0_cache do
|
|
236
262
|
entry = env.class_decls[type_name] or raise "Unknown name for build_singleton0: #{type_name}"
|
|
237
|
-
ensure_namespace!(type_name.namespace, location: entry.
|
|
263
|
+
ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
|
|
238
264
|
|
|
239
265
|
ancestors = ancestor_builder.singleton_ancestors(type_name)
|
|
240
266
|
self_type = Types::ClassSingleton.new(name: type_name, location: nil)
|
|
@@ -272,8 +298,8 @@ module RBS
|
|
|
272
298
|
interface_methods = interface_methods(all_interfaces)
|
|
273
299
|
import_methods(definition, type_name, methods, interface_methods, Substitution.new, nil)
|
|
274
300
|
|
|
275
|
-
entry.
|
|
276
|
-
|
|
301
|
+
entry.each_decl do |decl|
|
|
302
|
+
decl.members.each do |member|
|
|
277
303
|
case member
|
|
278
304
|
when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
|
|
279
305
|
if member.kind == :singleton
|
|
@@ -306,7 +332,7 @@ module RBS
|
|
|
306
332
|
|
|
307
333
|
try_cache type_name, cache: singleton_cache do
|
|
308
334
|
entry = env.class_decls[type_name] or raise "Unknown name for build_singleton: #{type_name}"
|
|
309
|
-
ensure_namespace!(type_name.namespace, location: entry.
|
|
335
|
+
ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
|
|
310
336
|
|
|
311
337
|
ancestors = ancestor_builder.singleton_ancestors(type_name)
|
|
312
338
|
self_type = Types::ClassSingleton.new(name: type_name, location: nil)
|
|
@@ -375,6 +401,19 @@ module RBS
|
|
|
375
401
|
.update(type_params: class_params + method_type.type_params)
|
|
376
402
|
end
|
|
377
403
|
|
|
404
|
+
method_type = method_type.map_type do |type|
|
|
405
|
+
case type
|
|
406
|
+
when Types::Bases::Self
|
|
407
|
+
Types::ClassInstance.new(
|
|
408
|
+
name: type_name,
|
|
409
|
+
args: entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) },
|
|
410
|
+
location: nil
|
|
411
|
+
)
|
|
412
|
+
else
|
|
413
|
+
type
|
|
414
|
+
end
|
|
415
|
+
end
|
|
416
|
+
|
|
378
417
|
method_type = method_type.update(
|
|
379
418
|
type: method_type.type.with_return_type(
|
|
380
419
|
Types::ClassInstance.new(
|
|
@@ -452,6 +491,10 @@ module RBS
|
|
|
452
491
|
case decl
|
|
453
492
|
when AST::Declarations::Class
|
|
454
493
|
decl.super_class&.location
|
|
494
|
+
when AST::Ruby::Declarations::ClassDecl
|
|
495
|
+
nil
|
|
496
|
+
else
|
|
497
|
+
raise "Unexpected `:super` source location with #{decl.class}"
|
|
455
498
|
end
|
|
456
499
|
else
|
|
457
500
|
source.location
|
|
@@ -471,7 +514,7 @@ module RBS
|
|
|
471
514
|
validate_params_with(type_params, result: result) do |param|
|
|
472
515
|
decl = case entry = definition.entry
|
|
473
516
|
when Environment::ModuleEntry, Environment::ClassEntry
|
|
474
|
-
entry.
|
|
517
|
+
entry.primary_decl
|
|
475
518
|
when Environment::SingleEntry
|
|
476
519
|
entry.decl
|
|
477
520
|
end
|
|
@@ -547,6 +590,7 @@ module RBS
|
|
|
547
590
|
declared_in: type_name,
|
|
548
591
|
source: source
|
|
549
592
|
)
|
|
593
|
+
|
|
550
594
|
validate_variable(variables[name])
|
|
551
595
|
end
|
|
552
596
|
|
|
@@ -557,7 +601,15 @@ module RBS
|
|
|
557
601
|
variables = [] #: Array[Definition::Variable]
|
|
558
602
|
tmp_var = var
|
|
559
603
|
while tmp_var
|
|
560
|
-
|
|
604
|
+
case tmp_var.source
|
|
605
|
+
when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
|
|
606
|
+
# nop
|
|
607
|
+
when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
|
|
608
|
+
# nop
|
|
609
|
+
else
|
|
610
|
+
variables << tmp_var
|
|
611
|
+
end
|
|
612
|
+
|
|
561
613
|
tmp_var = tmp_var.parent_variable
|
|
562
614
|
end
|
|
563
615
|
|
|
@@ -575,6 +627,10 @@ module RBS
|
|
|
575
627
|
if r.source.instance_of?(AST::Members::ClassInstanceVariable) && l.declared_in == r.declared_in
|
|
576
628
|
raise ClassInstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
|
|
577
629
|
end
|
|
630
|
+
when AST::Ruby::Members::InstanceVariableMember
|
|
631
|
+
if l.declared_in == r.declared_in
|
|
632
|
+
raise InstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
|
|
633
|
+
end
|
|
578
634
|
end
|
|
579
635
|
end
|
|
580
636
|
|
|
@@ -602,7 +658,7 @@ module RBS
|
|
|
602
658
|
|
|
603
659
|
methods.each do |method|
|
|
604
660
|
if interface_method_duplicates.include?(method.name)
|
|
605
|
-
member.is_a?(AST::Members::Include) || member.is_a?(AST::Members::Extend) or raise
|
|
661
|
+
(member.is_a?(AST::Members::Include) || member.is_a?(AST::Members::Extend)) or raise
|
|
606
662
|
|
|
607
663
|
raise DuplicatedInterfaceMethodDefinitionError.new(
|
|
608
664
|
type: definition.self_type,
|
|
@@ -655,12 +711,14 @@ module RBS
|
|
|
655
711
|
)
|
|
656
712
|
end
|
|
657
713
|
|
|
714
|
+
accessibility = special_accessibility(original.instance?, original.new_name) || original_method.accessibility
|
|
715
|
+
|
|
658
716
|
method_definition = Definition::Method.new(
|
|
659
717
|
super_method: existing_method,
|
|
660
718
|
defs: original_method.defs.map do |defn|
|
|
661
719
|
defn.update(defined_in: defined_in, implemented_in: implemented_in)
|
|
662
720
|
end,
|
|
663
|
-
accessibility:
|
|
721
|
+
accessibility: accessibility,
|
|
664
722
|
alias_of: original_method,
|
|
665
723
|
alias_member: original
|
|
666
724
|
)
|
|
@@ -687,13 +745,9 @@ module RBS
|
|
|
687
745
|
end
|
|
688
746
|
end
|
|
689
747
|
|
|
690
|
-
#
|
|
691
|
-
accessibility =
|
|
692
|
-
|
|
693
|
-
:private
|
|
694
|
-
else
|
|
695
|
-
method.accessibility
|
|
696
|
-
end
|
|
748
|
+
# Respect the visibility of the original method definition.
|
|
749
|
+
accessibility = original.visibility || special_accessibility(original.instance?, method.name) || method.accessibility
|
|
750
|
+
|
|
697
751
|
# Skip setting up `super_method` if `implemented_in` is `nil`, that means the type doesn't have implementation.
|
|
698
752
|
# This typically happens if the type is an interface.
|
|
699
753
|
if implemented_in
|
|
@@ -746,6 +800,9 @@ module RBS
|
|
|
746
800
|
super_method = existing_method
|
|
747
801
|
end
|
|
748
802
|
|
|
803
|
+
# Respect the visibility of the original method definition.
|
|
804
|
+
accessibility = original.visibility || special_accessibility(original.kind == :instance, method.name) || method.accessibility
|
|
805
|
+
|
|
749
806
|
method_definition = Definition::Method.new(
|
|
750
807
|
super_method: super_method,
|
|
751
808
|
defs: [
|
|
@@ -756,12 +813,109 @@ module RBS
|
|
|
756
813
|
implemented_in: implemented_in
|
|
757
814
|
)
|
|
758
815
|
],
|
|
759
|
-
accessibility:
|
|
816
|
+
accessibility: accessibility,
|
|
760
817
|
alias_of: nil,
|
|
761
818
|
alias_member: nil
|
|
762
819
|
)
|
|
763
820
|
|
|
764
821
|
method_definition.annotations.replace(original.annotations)
|
|
822
|
+
when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
|
|
823
|
+
if duplicated_method = methods[method.name]
|
|
824
|
+
raise DuplicatedMethodDefinitionError.new(
|
|
825
|
+
type: definition.self_type,
|
|
826
|
+
method_name: method.name,
|
|
827
|
+
members: [*duplicated_method.members, original]
|
|
828
|
+
)
|
|
829
|
+
end
|
|
830
|
+
|
|
831
|
+
attr_type = original.type || Types::Bases::Any.new(location: nil)
|
|
832
|
+
method_type =
|
|
833
|
+
if method.name.to_s.end_with?("=")
|
|
834
|
+
# setter
|
|
835
|
+
MethodType.new(
|
|
836
|
+
type_params: [],
|
|
837
|
+
type: Types::Function.empty(attr_type).update(
|
|
838
|
+
required_positionals: [
|
|
839
|
+
Types::Function::Param.new(type: attr_type, name: method.name.to_s.chomp("=").to_sym)
|
|
840
|
+
]
|
|
841
|
+
),
|
|
842
|
+
block: nil,
|
|
843
|
+
location: original.location
|
|
844
|
+
)
|
|
845
|
+
else
|
|
846
|
+
# getter
|
|
847
|
+
MethodType.new(
|
|
848
|
+
type_params: [],
|
|
849
|
+
type: Types::Function.empty(attr_type),
|
|
850
|
+
block: nil,
|
|
851
|
+
location: original.location
|
|
852
|
+
)
|
|
853
|
+
end
|
|
854
|
+
|
|
855
|
+
if implemented_in
|
|
856
|
+
super_method = existing_method
|
|
857
|
+
end
|
|
858
|
+
|
|
859
|
+
method_definition = Definition::Method.new(
|
|
860
|
+
super_method: super_method,
|
|
861
|
+
defs: [
|
|
862
|
+
Definition::Method::TypeDef.new(
|
|
863
|
+
type: method_type,
|
|
864
|
+
member: original,
|
|
865
|
+
defined_in: defined_in,
|
|
866
|
+
implemented_in: implemented_in
|
|
867
|
+
)
|
|
868
|
+
],
|
|
869
|
+
accessibility: method.accessibility,
|
|
870
|
+
alias_of: nil,
|
|
871
|
+
alias_member: nil
|
|
872
|
+
)
|
|
873
|
+
|
|
874
|
+
method_definition.annotations.replace([])
|
|
875
|
+
when AST::Ruby::Members::DefMember
|
|
876
|
+
if duplicated_method = methods[method.name]
|
|
877
|
+
raise DuplicatedMethodDefinitionError.new(
|
|
878
|
+
type: definition.self_type,
|
|
879
|
+
method_name: method.name,
|
|
880
|
+
members: [original, *duplicated_method.members]
|
|
881
|
+
)
|
|
882
|
+
end
|
|
883
|
+
|
|
884
|
+
if original.method_type.empty? && existing_method
|
|
885
|
+
# Unannotated method with a parent definition → inherit from the parent, like @rbs ...
|
|
886
|
+
method_definition = Definition::Method.new(
|
|
887
|
+
super_method: existing_method,
|
|
888
|
+
defs: existing_method.defs.map { |defn| defn.update(implemented_in: implemented_in) },
|
|
889
|
+
accessibility: :public,
|
|
890
|
+
alias_of: existing_method.alias_of,
|
|
891
|
+
alias_member: nil
|
|
892
|
+
)
|
|
893
|
+
|
|
894
|
+
method_definition.annotations.replace(existing_method.annotations)
|
|
895
|
+
else
|
|
896
|
+
defs = original.overloads.map do |overload|
|
|
897
|
+
Definition::Method::TypeDef.new(
|
|
898
|
+
type: subst.empty? ? overload.method_type : overload.method_type.sub(subst),
|
|
899
|
+
member: original,
|
|
900
|
+
defined_in: defined_in,
|
|
901
|
+
implemented_in: implemented_in
|
|
902
|
+
).tap do |type_def|
|
|
903
|
+
# Keep the original annotations given to overloads.
|
|
904
|
+
type_def.overload_annotations.replace(overload.annotations)
|
|
905
|
+
end
|
|
906
|
+
end
|
|
907
|
+
|
|
908
|
+
method_definition = Definition::Method.new(
|
|
909
|
+
super_method: existing_method,
|
|
910
|
+
defs: defs,
|
|
911
|
+
accessibility: :public,
|
|
912
|
+
alias_of: nil,
|
|
913
|
+
alias_member: nil
|
|
914
|
+
)
|
|
915
|
+
|
|
916
|
+
method_definition.annotations.replace([])
|
|
917
|
+
end
|
|
918
|
+
|
|
765
919
|
when nil
|
|
766
920
|
# Overloading method definition only
|
|
767
921
|
|
|
@@ -819,6 +973,12 @@ module RBS
|
|
|
819
973
|
methods[method.name] = method_definition
|
|
820
974
|
end
|
|
821
975
|
|
|
976
|
+
def special_accessibility(is_instance, method_name)
|
|
977
|
+
if is_instance && [:initialize, :initialize_copy, :initialize_clone, :initialize_dup, :respond_to_missing?].include?(method_name)
|
|
978
|
+
:private
|
|
979
|
+
end
|
|
980
|
+
end
|
|
981
|
+
|
|
822
982
|
def try_cache(type_name, cache:)
|
|
823
983
|
cache[type_name] ||= yield
|
|
824
984
|
end
|
data/lib/rbs/diff.rb
CHANGED
|
@@ -104,7 +104,13 @@ module RBS
|
|
|
104
104
|
detail_to_s = @detail ? "[#{definition_method.defined_in} #{definition_method.accessibility}] " : ""
|
|
105
105
|
if definition_method.alias_of
|
|
106
106
|
first_def = definition_method.alias_of.defs.first #: Definition::Method::TypeDef
|
|
107
|
-
|
|
107
|
+
member_name = case first_def.member
|
|
108
|
+
when AST::Members::Base
|
|
109
|
+
first_def.member.name
|
|
110
|
+
else
|
|
111
|
+
raise
|
|
112
|
+
end
|
|
113
|
+
"#{detail_to_s}alias #{prefix}#{key} #{prefix}#{member_name}"
|
|
108
114
|
else
|
|
109
115
|
"#{detail_to_s}def #{prefix}#{key}: #{definition_method.method_types.join(" | ")}"
|
|
110
116
|
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RBS
|
|
4
|
+
class Environment
|
|
5
|
+
class ClassEntry
|
|
6
|
+
attr_reader :name
|
|
7
|
+
|
|
8
|
+
attr_reader :context_decls
|
|
9
|
+
|
|
10
|
+
def initialize(name)
|
|
11
|
+
@name = name
|
|
12
|
+
@context_decls = []
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def <<(context_decl)
|
|
16
|
+
context_decls << context_decl
|
|
17
|
+
@primary_decl = nil
|
|
18
|
+
self
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def each_decl(&block)
|
|
22
|
+
if block
|
|
23
|
+
context_decls.each do |_, decl|
|
|
24
|
+
yield decl
|
|
25
|
+
end
|
|
26
|
+
else
|
|
27
|
+
enum_for(__method__ || raise)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def empty?
|
|
32
|
+
context_decls.empty?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def primary_decl
|
|
36
|
+
@primary_decl ||= nil.tap do
|
|
37
|
+
# @type break: declaration
|
|
38
|
+
|
|
39
|
+
decl = each_decl.find {|decl| decl.super_class }
|
|
40
|
+
break decl if decl
|
|
41
|
+
|
|
42
|
+
decl = each_decl.first
|
|
43
|
+
break decl if decl
|
|
44
|
+
end || raise("Cannot find primary declaration for #{name}")
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def type_params
|
|
48
|
+
validate_type_params
|
|
49
|
+
primary_decl.type_params
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def validate_type_params
|
|
53
|
+
unless context_decls.empty?
|
|
54
|
+
first_decl, *rest_decls = each_decl.to_a
|
|
55
|
+
first_decl or raise
|
|
56
|
+
|
|
57
|
+
first_params = first_decl.type_params
|
|
58
|
+
first_names = first_params.map(&:name)
|
|
59
|
+
rest_decls.each do |other_decl|
|
|
60
|
+
other_params = other_decl.type_params
|
|
61
|
+
unless first_names.size == other_params.size && first_params == AST::TypeParam.rename(other_params, new_names: first_names)
|
|
62
|
+
raise GenericParameterMismatchError.new(name: name, decl: other_decl)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def align_params(decl)
|
|
69
|
+
entry_params = type_params
|
|
70
|
+
decl_param_names = decl.type_params.map(&:name)
|
|
71
|
+
|
|
72
|
+
return nil if decl_param_names == entry_params.map(&:name)
|
|
73
|
+
|
|
74
|
+
Substitution.build(
|
|
75
|
+
decl_param_names,
|
|
76
|
+
entry_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
|
|
77
|
+
)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RBS
|
|
4
|
+
class Environment
|
|
5
|
+
class ModuleEntry
|
|
6
|
+
attr_reader :name
|
|
7
|
+
|
|
8
|
+
attr_reader :context_decls
|
|
9
|
+
|
|
10
|
+
def initialize(name)
|
|
11
|
+
@name = name
|
|
12
|
+
@context_decls = []
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def <<(context_decl)
|
|
16
|
+
context_decls << context_decl
|
|
17
|
+
self
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def each_decl(&block)
|
|
21
|
+
if block
|
|
22
|
+
context_decls.each do |_, decl|
|
|
23
|
+
yield decl
|
|
24
|
+
end
|
|
25
|
+
else
|
|
26
|
+
enum_for(__method__ || raise)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def empty?
|
|
31
|
+
context_decls.empty?
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def primary_decl
|
|
35
|
+
each_decl.first or raise
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def type_params
|
|
39
|
+
validate_type_params
|
|
40
|
+
primary_decl.type_params
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def self_types
|
|
44
|
+
each_decl.flat_map do |decl|
|
|
45
|
+
self_types = decl.self_types
|
|
46
|
+
subst = align_params(decl)
|
|
47
|
+
|
|
48
|
+
if self_types.empty? || subst.nil?
|
|
49
|
+
self_types
|
|
50
|
+
else
|
|
51
|
+
self_types.map do |self_type|
|
|
52
|
+
AST::Declarations::Module::Self.new(
|
|
53
|
+
name: self_type.name,
|
|
54
|
+
args: self_type.args.map {|type| type.sub(subst) },
|
|
55
|
+
location: self_type.location
|
|
56
|
+
)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end.uniq
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def align_params(decl)
|
|
63
|
+
entry_params = type_params
|
|
64
|
+
decl_param_names = decl.type_params.map(&:name)
|
|
65
|
+
|
|
66
|
+
return nil if decl_param_names == entry_params.map(&:name)
|
|
67
|
+
|
|
68
|
+
Substitution.build(
|
|
69
|
+
decl_param_names,
|
|
70
|
+
entry_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
|
|
71
|
+
)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def validate_type_params
|
|
75
|
+
unless context_decls.empty?
|
|
76
|
+
first_decl, *rest_decls = each_decl.to_a
|
|
77
|
+
first_decl or raise
|
|
78
|
+
|
|
79
|
+
first_params = first_decl.type_params
|
|
80
|
+
first_names = first_params.map(&:name)
|
|
81
|
+
rest_decls.each do |other_decl|
|
|
82
|
+
other_params = other_decl.type_params
|
|
83
|
+
unless first_names.size == other_params.size && first_params == AST::TypeParam.rename(other_params, new_names: first_names)
|
|
84
|
+
raise GenericParameterMismatchError.new(name: name, decl: other_decl)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|