rbs 3.10.4 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +14 -14
- data/.github/workflows/bundle-update.yml +60 -0
- data/.github/workflows/c-check.yml +7 -5
- data/.github/workflows/comments.yml +2 -2
- data/.github/workflows/dependabot.yml +2 -2
- data/.github/workflows/ruby.yml +16 -26
- data/.github/workflows/rust.yml +95 -0
- data/.github/workflows/typecheck.yml +1 -1
- data/.github/workflows/windows.yml +2 -2
- data/.rubocop.yml +2 -2
- data/.vscode/extensions.json +5 -0
- data/.vscode/settings.json +19 -0
- data/CHANGELOG.md +202 -2
- data/Rakefile +9 -23
- data/Steepfile +2 -0
- data/config.yml +457 -13
- data/core/array.rbs +218 -188
- data/core/basic_object.rbs +9 -8
- data/core/binding.rbs +0 -2
- data/core/builtin.rbs +2 -2
- data/core/class.rbs +6 -5
- data/core/comparable.rbs +45 -31
- data/core/complex.rbs +66 -55
- data/core/dir.rbs +57 -45
- data/core/encoding.rbs +6 -6
- data/core/enumerable.rbs +105 -91
- data/core/enumerator/arithmetic_sequence.rbs +70 -0
- data/core/enumerator.rbs +24 -3
- data/core/errno.rbs +3 -2
- data/core/errors.rbs +31 -29
- data/core/exception.rbs +12 -12
- data/core/fiber.rbs +47 -36
- data/core/file.rbs +242 -169
- data/core/file_test.rbs +2 -2
- data/core/float.rbs +42 -68
- data/core/gc.rbs +78 -70
- data/core/hash.rbs +70 -60
- data/core/integer.rbs +32 -75
- data/core/io/buffer.rbs +36 -36
- data/core/io/wait.rbs +7 -7
- data/core/io.rbs +192 -146
- data/core/kernel.rbs +198 -147
- data/core/marshal.rbs +3 -3
- data/core/match_data.rbs +14 -12
- data/core/math.rbs +69 -67
- data/core/method.rbs +6 -8
- data/core/module.rbs +148 -88
- data/core/nil_class.rbs +4 -3
- data/core/numeric.rbs +53 -50
- data/core/object.rbs +6 -8
- data/core/object_space.rbs +11 -10
- data/core/pathname.rbs +131 -81
- data/core/proc.rbs +65 -34
- data/core/process.rbs +221 -201
- data/core/ractor.rbs +15 -11
- data/core/random.rbs +21 -3
- data/core/range.rbs +152 -49
- data/core/rational.rbs +5 -56
- data/core/rbs/unnamed/argf.rbs +58 -51
- data/core/rbs/unnamed/env_class.rbs +18 -13
- data/core/rbs/unnamed/main_class.rbs +123 -0
- data/core/rbs/unnamed/random.rbs +7 -116
- data/core/regexp.rbs +236 -197
- data/core/ruby.rbs +1 -1
- data/core/ruby_vm.rbs +32 -30
- data/core/rubygems/config_file.rbs +5 -5
- data/core/rubygems/errors.rbs +1 -1
- data/core/rubygems/requirement.rbs +5 -5
- data/core/rubygems/rubygems.rbs +5 -3
- data/core/set.rbs +17 -16
- data/core/signal.rbs +2 -2
- data/core/string.rbs +318 -298
- data/core/struct.rbs +26 -25
- data/core/symbol.rbs +25 -24
- data/core/thread.rbs +40 -41
- data/core/time.rbs +47 -42
- data/core/trace_point.rbs +34 -31
- data/core/true_class.rbs +2 -2
- data/core/unbound_method.rbs +10 -10
- data/core/warning.rbs +7 -7
- data/docs/collection.md +1 -1
- data/docs/config.md +171 -0
- data/docs/inline.md +576 -0
- data/docs/syntax.md +46 -16
- data/docs/type_fingerprint.md +21 -0
- data/exe/rbs +1 -1
- data/ext/rbs_extension/ast_translation.c +595 -98
- data/ext/rbs_extension/class_constants.c +30 -0
- data/ext/rbs_extension/class_constants.h +15 -0
- data/ext/rbs_extension/legacy_location.c +30 -53
- data/ext/rbs_extension/legacy_location.h +37 -0
- data/ext/rbs_extension/main.c +125 -24
- data/include/rbs/ast.h +485 -150
- data/include/rbs/lexer.h +11 -4
- data/include/rbs/location.h +25 -44
- data/include/rbs/parser.h +20 -2
- data/include/rbs/util/rbs_constant_pool.h +0 -3
- data/include/rbs.h +8 -0
- data/lib/rbs/ast/annotation.rb +1 -1
- data/lib/rbs/ast/comment.rb +1 -1
- data/lib/rbs/ast/declarations.rb +10 -10
- data/lib/rbs/ast/members.rb +14 -14
- data/lib/rbs/ast/ruby/annotations.rb +409 -0
- data/lib/rbs/ast/ruby/comment_block.rb +245 -0
- data/lib/rbs/ast/ruby/declarations.rb +281 -0
- data/lib/rbs/ast/ruby/helpers/constant_helper.rb +28 -0
- data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
- data/lib/rbs/ast/ruby/members.rb +723 -0
- data/lib/rbs/ast/type_param.rb +24 -4
- data/lib/rbs/buffer.rb +105 -20
- data/lib/rbs/cli/diff.rb +16 -15
- data/lib/rbs/cli/validate.rb +62 -125
- data/lib/rbs/cli.rb +55 -23
- data/lib/rbs/collection/config/lockfile_generator.rb +8 -4
- data/lib/rbs/collection/sources/git.rb +1 -0
- data/lib/rbs/collection.rb +0 -1
- data/lib/rbs/definition.rb +6 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +119 -63
- data/lib/rbs/definition_builder/method_builder.rb +65 -30
- data/lib/rbs/definition_builder.rb +177 -20
- data/lib/rbs/diff.rb +7 -1
- data/lib/rbs/environment/class_entry.rb +69 -0
- data/lib/rbs/environment/module_entry.rb +66 -0
- data/lib/rbs/environment.rb +338 -155
- data/lib/rbs/environment_loader.rb +2 -2
- data/lib/rbs/errors.rb +30 -20
- data/lib/rbs/inline_parser/comment_association.rb +117 -0
- data/lib/rbs/inline_parser.rb +542 -0
- data/lib/rbs/location_aux.rb +36 -4
- data/lib/rbs/locator.rb +5 -1
- data/lib/rbs/method_type.rb +5 -3
- data/lib/rbs/namespace.rb +0 -7
- data/lib/rbs/parser_aux.rb +31 -8
- data/lib/rbs/prototype/helpers.rb +57 -0
- data/lib/rbs/prototype/rb.rb +3 -28
- data/lib/rbs/prototype/rbi.rb +3 -20
- data/lib/rbs/prototype/runtime.rb +10 -2
- data/lib/rbs/resolver/type_name_resolver.rb +0 -8
- data/lib/rbs/source.rb +99 -0
- data/lib/rbs/subtractor.rb +4 -3
- data/lib/rbs/test/type_check.rb +5 -2
- data/lib/rbs/type_name.rb +1 -8
- data/lib/rbs/types.rb +88 -78
- data/lib/rbs/unit_test/convertibles.rb +1 -0
- data/lib/rbs/unit_test/type_assertions.rb +35 -8
- data/lib/rbs/validator.rb +2 -2
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs.rb +12 -1
- data/rbs.gemspec +3 -2
- data/rust/.gitignore +1 -0
- data/rust/Cargo.lock +378 -0
- data/rust/Cargo.toml +7 -0
- data/rust/ruby-rbs/Cargo.toml +22 -0
- data/rust/ruby-rbs/build.rs +764 -0
- data/rust/ruby-rbs/examples/locations.rs +60 -0
- data/rust/ruby-rbs/src/lib.rs +1 -0
- data/rust/ruby-rbs/src/node/mod.rs +742 -0
- data/rust/ruby-rbs/tests/sanity.rs +47 -0
- data/rust/ruby-rbs/vendor/rbs/config.yml +1 -0
- data/rust/ruby-rbs-sys/Cargo.toml +23 -0
- data/rust/ruby-rbs-sys/build.rs +204 -0
- data/rust/ruby-rbs-sys/src/lib.rs +50 -0
- data/rust/ruby-rbs-sys/vendor/rbs/include +1 -0
- data/rust/ruby-rbs-sys/vendor/rbs/src +1 -0
- data/rust/ruby-rbs-sys/wrapper.h +1 -0
- data/schema/typeParam.json +17 -1
- data/sig/ancestor_builder.rbs +1 -1
- data/sig/ast/ruby/annotations.rbs +421 -0
- data/sig/ast/ruby/comment_block.rbs +127 -0
- data/sig/ast/ruby/declarations.rbs +158 -0
- data/sig/ast/ruby/helpers/constant_helper.rbs +11 -0
- data/sig/ast/ruby/helpers/location_helper.rbs +15 -0
- data/sig/ast/ruby/members.rbs +178 -0
- data/sig/buffer.rbs +63 -5
- data/sig/cli/diff.rbs +5 -11
- data/sig/cli/validate.rbs +12 -8
- data/sig/cli.rbs +18 -18
- data/sig/definition.rbs +6 -0
- data/sig/definition_builder.rbs +3 -1
- data/sig/environment/class_entry.rbs +50 -0
- data/sig/environment/module_entry.rbs +50 -0
- data/sig/environment.rbs +37 -81
- data/sig/errors.rbs +26 -20
- data/sig/inline_parser/comment_association.rbs +71 -0
- data/sig/inline_parser.rbs +124 -0
- data/sig/location.rbs +32 -7
- data/sig/locator.rbs +0 -2
- data/sig/method_builder.rbs +9 -4
- data/sig/namespace.rbs +0 -5
- data/sig/parser.rbs +47 -13
- data/sig/prototype/helpers.rbs +2 -0
- data/sig/resolver/type_name_resolver.rbs +0 -3
- data/sig/source.rbs +48 -0
- data/sig/type_param.rbs +13 -8
- data/sig/typename.rbs +0 -5
- data/sig/types.rbs +6 -7
- data/sig/unit_test/spy.rbs +0 -8
- data/sig/unit_test/type_assertions.rbs +11 -0
- data/src/ast.c +491 -143
- data/src/lexer.c +1552 -1314
- data/src/lexer.re +7 -0
- data/src/lexstate.c +8 -1
- data/src/location.c +8 -48
- data/src/parser.c +1107 -409
- data/src/util/rbs_constant_pool.c +0 -4
- data/stdlib/bigdecimal/0/big_decimal.rbs +16 -16
- data/stdlib/cgi-escape/0/escape.rbs +4 -4
- data/stdlib/coverage/0/coverage.rbs +4 -3
- data/stdlib/date/0/date.rbs +33 -28
- data/stdlib/date/0/date_time.rbs +24 -23
- data/stdlib/did_you_mean/0/did_you_mean.rbs +17 -16
- data/stdlib/digest/0/digest.rbs +110 -0
- data/stdlib/erb/0/erb.rbs +64 -53
- data/stdlib/etc/0/etc.rbs +55 -50
- data/stdlib/fileutils/0/fileutils.rbs +140 -126
- data/stdlib/forwardable/0/forwardable.rbs +10 -10
- data/stdlib/io-console/0/io-console.rbs +2 -2
- data/stdlib/json/0/json.rbs +158 -131
- data/stdlib/monitor/0/monitor.rbs +3 -3
- data/stdlib/net-http/0/net-http.rbs +159 -134
- data/stdlib/objspace/0/objspace.rbs +8 -30
- data/stdlib/open-uri/0/open-uri.rbs +8 -8
- data/stdlib/open3/0/open3.rbs +469 -10
- data/stdlib/openssl/0/openssl.rbs +144 -129
- data/stdlib/optparse/0/optparse.rbs +23 -14
- data/stdlib/pathname/0/pathname.rbs +2 -2
- data/stdlib/pp/0/pp.rbs +9 -8
- data/stdlib/prettyprint/0/prettyprint.rbs +7 -7
- data/stdlib/pstore/0/pstore.rbs +35 -30
- data/stdlib/psych/0/psych.rbs +62 -9
- data/stdlib/psych/0/store.rbs +2 -4
- data/stdlib/pty/0/pty.rbs +9 -6
- data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
- data/stdlib/rdoc/0/code_object.rbs +2 -1
- data/stdlib/rdoc/0/parser.rbs +1 -1
- data/stdlib/rdoc/0/store.rbs +1 -1
- data/stdlib/ripper/0/ripper.rbs +20 -17
- data/stdlib/securerandom/0/manifest.yaml +2 -0
- data/stdlib/securerandom/0/securerandom.rbs +7 -20
- data/stdlib/shellwords/0/shellwords.rbs +2 -2
- data/stdlib/socket/0/addrinfo.rbs +9 -9
- data/stdlib/socket/0/basic_socket.rbs +3 -3
- data/stdlib/socket/0/ip_socket.rbs +10 -8
- data/stdlib/socket/0/socket.rbs +10 -9
- data/stdlib/socket/0/tcp_server.rbs +1 -1
- data/stdlib/socket/0/tcp_socket.rbs +1 -1
- data/stdlib/socket/0/udp_socket.rbs +1 -1
- data/stdlib/socket/0/unix_server.rbs +1 -1
- data/stdlib/stringio/0/stringio.rbs +55 -54
- data/stdlib/strscan/0/string_scanner.rbs +46 -44
- data/stdlib/tempfile/0/tempfile.rbs +24 -20
- data/stdlib/time/0/time.rbs +7 -5
- data/stdlib/tsort/0/tsort.rbs +7 -6
- data/stdlib/uri/0/common.rbs +31 -18
- data/stdlib/uri/0/file.rbs +2 -2
- data/stdlib/uri/0/generic.rbs +9 -2
- data/stdlib/uri/0/http.rbs +2 -2
- data/stdlib/uri/0/ldap.rbs +2 -2
- data/stdlib/uri/0/mailto.rbs +3 -3
- data/stdlib/uri/0/rfc2396_parser.rbs +6 -5
- data/stdlib/zlib/0/deflate.rbs +4 -3
- data/stdlib/zlib/0/gzip_reader.rbs +6 -6
- data/stdlib/zlib/0/gzip_writer.rbs +14 -12
- data/stdlib/zlib/0/inflate.rbs +1 -1
- data/stdlib/zlib/0/need_dict.rbs +1 -1
- metadata +66 -3
|
@@ -103,37 +103,54 @@ 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
|
-
|
|
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
|
|
140
|
+
end
|
|
141
|
+
end
|
|
142
|
+
when AST::Ruby::Declarations::Base
|
|
143
|
+
decl.members.each do |member|
|
|
144
|
+
case member
|
|
145
|
+
when AST::Ruby::Members::DefMember
|
|
120
146
|
build_method(
|
|
121
147
|
methods,
|
|
122
148
|
type,
|
|
123
|
-
member: member
|
|
124
|
-
accessibility: :
|
|
149
|
+
member: member,
|
|
150
|
+
accessibility: :public
|
|
125
151
|
)
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
if member.kind == :instance
|
|
129
|
-
build_attribute(methods,
|
|
130
|
-
type,
|
|
131
|
-
member: member.update(type: member.type.sub(subst)),
|
|
132
|
-
accessibility: member.visibility || accessibility)
|
|
133
|
-
end
|
|
134
|
-
when AST::Members::Alias
|
|
135
|
-
if member.kind == :instance
|
|
136
|
-
build_alias(methods, type, member: member)
|
|
152
|
+
when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
|
|
153
|
+
build_ruby_attribute(methods, type, member: member, accessibility: :public)
|
|
137
154
|
end
|
|
138
155
|
end
|
|
139
156
|
end
|
|
@@ -149,8 +166,8 @@ module RBS
|
|
|
149
166
|
type = Types::ClassSingleton.new(name: type_name, location: nil)
|
|
150
167
|
|
|
151
168
|
Methods.new(type: type).tap do |methods|
|
|
152
|
-
entry.
|
|
153
|
-
|
|
169
|
+
entry.each_decl do |decl|
|
|
170
|
+
decl.members.each do |member|
|
|
154
171
|
case member
|
|
155
172
|
when AST::Members::MethodDefinition
|
|
156
173
|
if member.singleton?
|
|
@@ -212,6 +229,24 @@ module RBS
|
|
|
212
229
|
end
|
|
213
230
|
end
|
|
214
231
|
|
|
232
|
+
def build_ruby_attribute(methods, type, member:, accessibility:)
|
|
233
|
+
member.names.each do |name|
|
|
234
|
+
if member.is_a?(AST::Ruby::Members::AttrReaderMember) || member.is_a?(AST::Ruby::Members::AttrAccessorMember)
|
|
235
|
+
defn = methods.methods[name] ||= Methods::Definition.empty(type: type, name: name)
|
|
236
|
+
|
|
237
|
+
defn.accessibilities << accessibility
|
|
238
|
+
defn.originals << member
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
if member.is_a?(AST::Ruby::Members::AttrWriterMember) || member.is_a?(AST::Ruby::Members::AttrAccessorMember)
|
|
242
|
+
defn = methods.methods[:"#{name}="] ||= Methods::Definition.empty(type: type, name: :"#{name}=")
|
|
243
|
+
|
|
244
|
+
defn.accessibilities << accessibility
|
|
245
|
+
defn.originals << member
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
|
|
215
250
|
def build_method(methods, type, member:, accessibility:)
|
|
216
251
|
defn = methods.methods[member.name] ||= Methods::Definition.empty(type: type, name: member.name)
|
|
217
252
|
|
|
@@ -223,7 +258,7 @@ module RBS
|
|
|
223
258
|
end
|
|
224
259
|
end
|
|
225
260
|
|
|
226
|
-
def
|
|
261
|
+
def each_rbs_member_with_accessibility(members, accessibility: :public)
|
|
227
262
|
members.each do |member|
|
|
228
263
|
case member
|
|
229
264
|
when AST::Members::Public
|
|
@@ -126,10 +126,10 @@ module RBS
|
|
|
126
126
|
entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
|
|
127
127
|
args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
|
|
128
128
|
|
|
129
|
-
entry.
|
|
130
|
-
subst_ = subst + Substitution.build(
|
|
129
|
+
entry.each_decl do |decl|
|
|
130
|
+
subst_ = subst + Substitution.build(decl.type_params.each.map(&:name), args)
|
|
131
131
|
|
|
132
|
-
|
|
132
|
+
decl.members.each do |member|
|
|
133
133
|
case member
|
|
134
134
|
when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
|
|
135
135
|
if member.kind == :instance
|
|
@@ -151,6 +151,29 @@ module RBS
|
|
|
151
151
|
end
|
|
152
152
|
end
|
|
153
153
|
|
|
154
|
+
when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
|
|
155
|
+
member.names.each do |name|
|
|
156
|
+
ivar_name = :"@#{name}"
|
|
157
|
+
attr_type = member.type || Types::Bases::Any.new(location: nil)
|
|
158
|
+
|
|
159
|
+
insert_variable(
|
|
160
|
+
type_name,
|
|
161
|
+
definition.instance_variables,
|
|
162
|
+
name: ivar_name,
|
|
163
|
+
type: attr_type,
|
|
164
|
+
source: member
|
|
165
|
+
)
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
when AST::Ruby::Members::InstanceVariableMember
|
|
169
|
+
insert_variable(
|
|
170
|
+
type_name,
|
|
171
|
+
definition.instance_variables,
|
|
172
|
+
name: member.name,
|
|
173
|
+
type: member.type,
|
|
174
|
+
source: member
|
|
175
|
+
)
|
|
176
|
+
|
|
154
177
|
when AST::Members::InstanceVariable
|
|
155
178
|
insert_variable(
|
|
156
179
|
type_name,
|
|
@@ -174,7 +197,7 @@ module RBS
|
|
|
174
197
|
|
|
175
198
|
try_cache(type_name, cache: instance_cache) do
|
|
176
199
|
entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
|
|
177
|
-
ensure_namespace!(type_name.namespace, location: entry.
|
|
200
|
+
ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
|
|
178
201
|
|
|
179
202
|
ancestors = ancestor_builder.instance_ancestors(type_name)
|
|
180
203
|
args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
|
|
@@ -234,7 +257,7 @@ module RBS
|
|
|
234
257
|
def build_singleton0(type_name)
|
|
235
258
|
try_cache type_name, cache: singleton0_cache do
|
|
236
259
|
entry = env.class_decls[type_name] or raise "Unknown name for build_singleton0: #{type_name}"
|
|
237
|
-
ensure_namespace!(type_name.namespace, location: entry.
|
|
260
|
+
ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
|
|
238
261
|
|
|
239
262
|
ancestors = ancestor_builder.singleton_ancestors(type_name)
|
|
240
263
|
self_type = Types::ClassSingleton.new(name: type_name, location: nil)
|
|
@@ -272,8 +295,8 @@ module RBS
|
|
|
272
295
|
interface_methods = interface_methods(all_interfaces)
|
|
273
296
|
import_methods(definition, type_name, methods, interface_methods, Substitution.new, nil)
|
|
274
297
|
|
|
275
|
-
entry.
|
|
276
|
-
|
|
298
|
+
entry.each_decl do |decl|
|
|
299
|
+
decl.members.each do |member|
|
|
277
300
|
case member
|
|
278
301
|
when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
|
|
279
302
|
if member.kind == :singleton
|
|
@@ -306,7 +329,7 @@ module RBS
|
|
|
306
329
|
|
|
307
330
|
try_cache type_name, cache: singleton_cache do
|
|
308
331
|
entry = env.class_decls[type_name] or raise "Unknown name for build_singleton: #{type_name}"
|
|
309
|
-
ensure_namespace!(type_name.namespace, location: entry.
|
|
332
|
+
ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
|
|
310
333
|
|
|
311
334
|
ancestors = ancestor_builder.singleton_ancestors(type_name)
|
|
312
335
|
self_type = Types::ClassSingleton.new(name: type_name, location: nil)
|
|
@@ -375,6 +398,19 @@ module RBS
|
|
|
375
398
|
.update(type_params: class_params + method_type.type_params)
|
|
376
399
|
end
|
|
377
400
|
|
|
401
|
+
method_type = method_type.map_type do |type|
|
|
402
|
+
case type
|
|
403
|
+
when Types::Bases::Self
|
|
404
|
+
Types::ClassInstance.new(
|
|
405
|
+
name: type_name,
|
|
406
|
+
args: entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) },
|
|
407
|
+
location: nil
|
|
408
|
+
)
|
|
409
|
+
else
|
|
410
|
+
type
|
|
411
|
+
end
|
|
412
|
+
end
|
|
413
|
+
|
|
378
414
|
method_type = method_type.update(
|
|
379
415
|
type: method_type.type.with_return_type(
|
|
380
416
|
Types::ClassInstance.new(
|
|
@@ -452,6 +488,10 @@ module RBS
|
|
|
452
488
|
case decl
|
|
453
489
|
when AST::Declarations::Class
|
|
454
490
|
decl.super_class&.location
|
|
491
|
+
when AST::Ruby::Declarations::ClassDecl
|
|
492
|
+
nil
|
|
493
|
+
else
|
|
494
|
+
raise "Unexpected `:super` source location with #{decl.class}"
|
|
455
495
|
end
|
|
456
496
|
else
|
|
457
497
|
source.location
|
|
@@ -471,7 +511,7 @@ module RBS
|
|
|
471
511
|
validate_params_with(type_params, result: result) do |param|
|
|
472
512
|
decl = case entry = definition.entry
|
|
473
513
|
when Environment::ModuleEntry, Environment::ClassEntry
|
|
474
|
-
entry.
|
|
514
|
+
entry.primary_decl
|
|
475
515
|
when Environment::SingleEntry
|
|
476
516
|
entry.decl
|
|
477
517
|
end
|
|
@@ -547,6 +587,7 @@ module RBS
|
|
|
547
587
|
declared_in: type_name,
|
|
548
588
|
source: source
|
|
549
589
|
)
|
|
590
|
+
|
|
550
591
|
validate_variable(variables[name])
|
|
551
592
|
end
|
|
552
593
|
|
|
@@ -557,7 +598,15 @@ module RBS
|
|
|
557
598
|
variables = [] #: Array[Definition::Variable]
|
|
558
599
|
tmp_var = var
|
|
559
600
|
while tmp_var
|
|
560
|
-
|
|
601
|
+
case tmp_var.source
|
|
602
|
+
when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
|
|
603
|
+
# nop
|
|
604
|
+
when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
|
|
605
|
+
# nop
|
|
606
|
+
else
|
|
607
|
+
variables << tmp_var
|
|
608
|
+
end
|
|
609
|
+
|
|
561
610
|
tmp_var = tmp_var.parent_variable
|
|
562
611
|
end
|
|
563
612
|
|
|
@@ -575,6 +624,10 @@ module RBS
|
|
|
575
624
|
if r.source.instance_of?(AST::Members::ClassInstanceVariable) && l.declared_in == r.declared_in
|
|
576
625
|
raise ClassInstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
|
|
577
626
|
end
|
|
627
|
+
when AST::Ruby::Members::InstanceVariableMember
|
|
628
|
+
if l.declared_in == r.declared_in
|
|
629
|
+
raise InstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
|
|
630
|
+
end
|
|
578
631
|
end
|
|
579
632
|
end
|
|
580
633
|
|
|
@@ -602,7 +655,7 @@ module RBS
|
|
|
602
655
|
|
|
603
656
|
methods.each do |method|
|
|
604
657
|
if interface_method_duplicates.include?(method.name)
|
|
605
|
-
member.is_a?(AST::Members::Include) || member.is_a?(AST::Members::Extend) or raise
|
|
658
|
+
(member.is_a?(AST::Members::Include) || member.is_a?(AST::Members::Extend)) or raise
|
|
606
659
|
|
|
607
660
|
raise DuplicatedInterfaceMethodDefinitionError.new(
|
|
608
661
|
type: definition.self_type,
|
|
@@ -655,12 +708,14 @@ module RBS
|
|
|
655
708
|
)
|
|
656
709
|
end
|
|
657
710
|
|
|
711
|
+
accessibility = special_accessibility(original.instance?, original.new_name) || original_method.accessibility
|
|
712
|
+
|
|
658
713
|
method_definition = Definition::Method.new(
|
|
659
714
|
super_method: existing_method,
|
|
660
715
|
defs: original_method.defs.map do |defn|
|
|
661
716
|
defn.update(defined_in: defined_in, implemented_in: implemented_in)
|
|
662
717
|
end,
|
|
663
|
-
accessibility:
|
|
718
|
+
accessibility: accessibility,
|
|
664
719
|
alias_of: original_method,
|
|
665
720
|
alias_member: original
|
|
666
721
|
)
|
|
@@ -687,13 +742,9 @@ module RBS
|
|
|
687
742
|
end
|
|
688
743
|
end
|
|
689
744
|
|
|
690
|
-
#
|
|
691
|
-
accessibility =
|
|
692
|
-
|
|
693
|
-
:private
|
|
694
|
-
else
|
|
695
|
-
method.accessibility
|
|
696
|
-
end
|
|
745
|
+
# Respect the visibility of the original method definition.
|
|
746
|
+
accessibility = original.visibility || special_accessibility(original.instance?, method.name) || method.accessibility
|
|
747
|
+
|
|
697
748
|
# Skip setting up `super_method` if `implemented_in` is `nil`, that means the type doesn't have implementation.
|
|
698
749
|
# This typically happens if the type is an interface.
|
|
699
750
|
if implemented_in
|
|
@@ -746,6 +797,9 @@ module RBS
|
|
|
746
797
|
super_method = existing_method
|
|
747
798
|
end
|
|
748
799
|
|
|
800
|
+
# Respect the visibility of the original method definition.
|
|
801
|
+
accessibility = original.visibility || special_accessibility(original.kind == :instance, method.name) || method.accessibility
|
|
802
|
+
|
|
749
803
|
method_definition = Definition::Method.new(
|
|
750
804
|
super_method: super_method,
|
|
751
805
|
defs: [
|
|
@@ -756,12 +810,109 @@ module RBS
|
|
|
756
810
|
implemented_in: implemented_in
|
|
757
811
|
)
|
|
758
812
|
],
|
|
759
|
-
accessibility:
|
|
813
|
+
accessibility: accessibility,
|
|
760
814
|
alias_of: nil,
|
|
761
815
|
alias_member: nil
|
|
762
816
|
)
|
|
763
817
|
|
|
764
818
|
method_definition.annotations.replace(original.annotations)
|
|
819
|
+
when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
|
|
820
|
+
if duplicated_method = methods[method.name]
|
|
821
|
+
raise DuplicatedMethodDefinitionError.new(
|
|
822
|
+
type: definition.self_type,
|
|
823
|
+
method_name: method.name,
|
|
824
|
+
members: [*duplicated_method.members, original]
|
|
825
|
+
)
|
|
826
|
+
end
|
|
827
|
+
|
|
828
|
+
attr_type = original.type || Types::Bases::Any.new(location: nil)
|
|
829
|
+
method_type =
|
|
830
|
+
if method.name.to_s.end_with?("=")
|
|
831
|
+
# setter
|
|
832
|
+
MethodType.new(
|
|
833
|
+
type_params: [],
|
|
834
|
+
type: Types::Function.empty(attr_type).update(
|
|
835
|
+
required_positionals: [
|
|
836
|
+
Types::Function::Param.new(type: attr_type, name: method.name.to_s.chomp("=").to_sym)
|
|
837
|
+
]
|
|
838
|
+
),
|
|
839
|
+
block: nil,
|
|
840
|
+
location: original.location
|
|
841
|
+
)
|
|
842
|
+
else
|
|
843
|
+
# getter
|
|
844
|
+
MethodType.new(
|
|
845
|
+
type_params: [],
|
|
846
|
+
type: Types::Function.empty(attr_type),
|
|
847
|
+
block: nil,
|
|
848
|
+
location: original.location
|
|
849
|
+
)
|
|
850
|
+
end
|
|
851
|
+
|
|
852
|
+
if implemented_in
|
|
853
|
+
super_method = existing_method
|
|
854
|
+
end
|
|
855
|
+
|
|
856
|
+
method_definition = Definition::Method.new(
|
|
857
|
+
super_method: super_method,
|
|
858
|
+
defs: [
|
|
859
|
+
Definition::Method::TypeDef.new(
|
|
860
|
+
type: method_type,
|
|
861
|
+
member: original,
|
|
862
|
+
defined_in: defined_in,
|
|
863
|
+
implemented_in: implemented_in
|
|
864
|
+
)
|
|
865
|
+
],
|
|
866
|
+
accessibility: method.accessibility,
|
|
867
|
+
alias_of: nil,
|
|
868
|
+
alias_member: nil
|
|
869
|
+
)
|
|
870
|
+
|
|
871
|
+
method_definition.annotations.replace([])
|
|
872
|
+
when AST::Ruby::Members::DefMember
|
|
873
|
+
if duplicated_method = methods[method.name]
|
|
874
|
+
raise DuplicatedMethodDefinitionError.new(
|
|
875
|
+
type: definition.self_type,
|
|
876
|
+
method_name: method.name,
|
|
877
|
+
members: [original, *duplicated_method.members]
|
|
878
|
+
)
|
|
879
|
+
end
|
|
880
|
+
|
|
881
|
+
if original.method_type.empty? && existing_method
|
|
882
|
+
# Unannotated method with a parent definition → inherit from the parent, like @rbs ...
|
|
883
|
+
method_definition = Definition::Method.new(
|
|
884
|
+
super_method: existing_method,
|
|
885
|
+
defs: existing_method.defs.map { |defn| defn.update(implemented_in: implemented_in) },
|
|
886
|
+
accessibility: :public,
|
|
887
|
+
alias_of: existing_method.alias_of,
|
|
888
|
+
alias_member: nil
|
|
889
|
+
)
|
|
890
|
+
|
|
891
|
+
method_definition.annotations.replace(existing_method.annotations)
|
|
892
|
+
else
|
|
893
|
+
defs = original.overloads.map do |overload|
|
|
894
|
+
Definition::Method::TypeDef.new(
|
|
895
|
+
type: subst.empty? ? overload.method_type : overload.method_type.sub(subst),
|
|
896
|
+
member: original,
|
|
897
|
+
defined_in: defined_in,
|
|
898
|
+
implemented_in: implemented_in
|
|
899
|
+
).tap do |type_def|
|
|
900
|
+
# Keep the original annotations given to overloads.
|
|
901
|
+
type_def.overload_annotations.replace(overload.annotations)
|
|
902
|
+
end
|
|
903
|
+
end
|
|
904
|
+
|
|
905
|
+
method_definition = Definition::Method.new(
|
|
906
|
+
super_method: existing_method,
|
|
907
|
+
defs: defs,
|
|
908
|
+
accessibility: :public,
|
|
909
|
+
alias_of: nil,
|
|
910
|
+
alias_member: nil
|
|
911
|
+
)
|
|
912
|
+
|
|
913
|
+
method_definition.annotations.replace([])
|
|
914
|
+
end
|
|
915
|
+
|
|
765
916
|
when nil
|
|
766
917
|
# Overloading method definition only
|
|
767
918
|
|
|
@@ -819,6 +970,12 @@ module RBS
|
|
|
819
970
|
methods[method.name] = method_definition
|
|
820
971
|
end
|
|
821
972
|
|
|
973
|
+
def special_accessibility(is_instance, method_name)
|
|
974
|
+
if is_instance && [:initialize, :initialize_copy, :initialize_clone, :initialize_dup, :respond_to_missing?].include?(method_name)
|
|
975
|
+
:private
|
|
976
|
+
end
|
|
977
|
+
end
|
|
978
|
+
|
|
822
979
|
def try_cache(type_name, cache:)
|
|
823
980
|
cache[type_name] ||= yield
|
|
824
981
|
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,69 @@
|
|
|
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
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
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
|
+
decl.self_types
|
|
46
|
+
end.uniq
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def validate_type_params
|
|
50
|
+
unless context_decls.empty?
|
|
51
|
+
first_decl, *rest_decls = each_decl.to_a
|
|
52
|
+
first_decl or raise
|
|
53
|
+
|
|
54
|
+
first_params = first_decl.type_params
|
|
55
|
+
first_names = first_params.map(&:name)
|
|
56
|
+
rest_decls.each do |other_decl|
|
|
57
|
+
other_params = other_decl.type_params
|
|
58
|
+
unless first_names.size == other_params.size && first_params == AST::TypeParam.rename(other_params, new_names: first_names)
|
|
59
|
+
raise GenericParameterMismatchError.new(name: name, decl: other_decl)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|