rbs 4.0.0.dev.4 → 4.0.0.dev.5
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 +11 -8
- data/.github/workflows/comments.yml +3 -3
- data/.github/workflows/dependabot.yml +1 -1
- data/.github/workflows/ruby.yml +17 -34
- data/.github/workflows/typecheck.yml +2 -2
- data/.github/workflows/valgrind.yml +42 -0
- data/.github/workflows/windows.yml +2 -2
- data/.rubocop.yml +1 -1
- data/README.md +1 -1
- data/Rakefile +32 -5
- data/config.yml +46 -0
- data/core/array.rbs +96 -46
- data/core/binding.rbs +0 -2
- data/core/builtin.rbs +2 -2
- data/core/comparable.rbs +13 -6
- data/core/complex.rbs +55 -41
- data/core/dir.rbs +4 -4
- data/core/encoding.rbs +7 -10
- data/core/enumerable.rbs +90 -3
- data/core/enumerator/arithmetic_sequence.rbs +70 -0
- data/core/enumerator.rbs +63 -1
- data/core/errno.rbs +8 -0
- data/core/errors.rbs +28 -1
- data/core/exception.rbs +2 -2
- data/core/fiber.rbs +40 -20
- data/core/file.rbs +108 -78
- data/core/file_test.rbs +1 -1
- data/core/float.rbs +225 -69
- data/core/gc.rbs +417 -281
- data/core/hash.rbs +1023 -727
- data/core/integer.rbs +104 -110
- data/core/io/buffer.rbs +21 -10
- data/core/io/wait.rbs +11 -33
- data/core/io.rbs +82 -19
- data/core/kernel.rbs +70 -59
- data/core/marshal.rbs +1 -1
- data/core/match_data.rbs +1 -1
- data/core/math.rbs +42 -3
- data/core/method.rbs +63 -27
- data/core/module.rbs +103 -26
- data/core/nil_class.rbs +3 -3
- data/core/numeric.rbs +43 -35
- data/core/object.rbs +3 -3
- data/core/object_space.rbs +21 -15
- data/core/pathname.rbs +1272 -0
- data/core/proc.rbs +30 -25
- data/core/process.rbs +4 -2
- data/core/ractor.rbs +361 -509
- data/core/random.rbs +17 -0
- data/core/range.rbs +113 -16
- data/core/rational.rbs +56 -85
- data/core/rbs/unnamed/argf.rbs +2 -2
- data/core/rbs/unnamed/env_class.rbs +1 -1
- data/core/rbs/unnamed/random.rbs +4 -113
- data/core/regexp.rbs +25 -20
- data/core/ruby.rbs +53 -0
- data/core/ruby_vm.rbs +6 -4
- data/core/rubygems/errors.rbs +3 -70
- data/core/rubygems/rubygems.rbs +11 -79
- data/core/rubygems/version.rbs +2 -3
- data/core/set.rbs +488 -359
- data/core/signal.rbs +24 -14
- data/core/string.rbs +3171 -1241
- data/core/struct.rbs +1 -1
- data/core/symbol.rbs +17 -11
- data/core/thread.rbs +95 -33
- data/core/time.rbs +35 -9
- data/core/trace_point.rbs +7 -4
- data/core/unbound_method.rbs +14 -6
- data/docs/aliases.md +79 -0
- data/docs/collection.md +2 -2
- data/docs/encoding.md +56 -0
- data/docs/gem.md +0 -1
- data/docs/inline.md +470 -0
- data/docs/sigs.md +3 -3
- data/docs/syntax.md +33 -4
- data/docs/type_fingerprint.md +21 -0
- data/exe/rbs +1 -1
- data/ext/rbs_extension/ast_translation.c +77 -3
- data/ext/rbs_extension/ast_translation.h +3 -0
- data/ext/rbs_extension/class_constants.c +8 -2
- data/ext/rbs_extension/class_constants.h +4 -0
- data/ext/rbs_extension/extconf.rb +5 -1
- data/ext/rbs_extension/legacy_location.c +5 -5
- data/ext/rbs_extension/main.c +37 -20
- data/include/rbs/ast.h +85 -38
- data/include/rbs/defines.h +27 -0
- data/include/rbs/lexer.h +30 -11
- data/include/rbs/parser.h +6 -6
- data/include/rbs/string.h +0 -2
- data/include/rbs/util/rbs_allocator.h +34 -13
- data/include/rbs/util/rbs_assert.h +12 -1
- data/include/rbs/util/rbs_encoding.h +2 -0
- data/include/rbs/util/rbs_unescape.h +2 -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 +137 -0
- data/lib/rbs/ast/ruby/comment_block.rb +24 -0
- data/lib/rbs/ast/ruby/declarations.rb +198 -3
- data/lib/rbs/ast/ruby/helpers/constant_helper.rb +4 -0
- data/lib/rbs/ast/ruby/members.rb +159 -1
- data/lib/rbs/ast/type_param.rb +24 -4
- data/lib/rbs/buffer.rb +20 -15
- data/lib/rbs/cli/diff.rb +16 -15
- data/lib/rbs/cli/validate.rb +38 -51
- data/lib/rbs/cli.rb +52 -19
- data/lib/rbs/collection/config/lockfile_generator.rb +8 -0
- data/lib/rbs/collection/sources/git.rb +1 -0
- data/lib/rbs/definition.rb +1 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +62 -9
- data/lib/rbs/definition_builder/method_builder.rb +20 -0
- data/lib/rbs/definition_builder.rb +91 -2
- data/lib/rbs/diff.rb +7 -1
- data/lib/rbs/environment.rb +227 -74
- data/lib/rbs/environment_loader.rb +0 -6
- data/lib/rbs/errors.rb +27 -7
- data/lib/rbs/inline_parser.rb +341 -5
- data/lib/rbs/location_aux.rb +1 -1
- data/lib/rbs/locator.rb +5 -1
- data/lib/rbs/method_type.rb +5 -3
- data/lib/rbs/parser_aux.rb +2 -2
- data/lib/rbs/prototype/rb.rb +2 -2
- data/lib/rbs/prototype/rbi.rb +2 -0
- data/lib/rbs/prototype/runtime.rb +8 -0
- data/lib/rbs/resolver/constant_resolver.rb +2 -2
- data/lib/rbs/resolver/type_name_resolver.rb +116 -38
- data/lib/rbs/subtractor.rb +3 -1
- data/lib/rbs/test/type_check.rb +16 -2
- data/lib/rbs/type_name.rb +1 -1
- data/lib/rbs/types.rb +27 -27
- data/lib/rbs/validator.rb +2 -2
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs.rb +1 -1
- data/lib/rdoc/discover.rb +1 -1
- data/lib/rdoc_plugin/parser.rb +1 -1
- data/rbs.gemspec +3 -2
- data/schema/typeParam.json +17 -1
- data/sig/ast/ruby/annotations.rbs +124 -0
- data/sig/ast/ruby/comment_block.rbs +8 -0
- data/sig/ast/ruby/declarations.rbs +102 -4
- data/sig/ast/ruby/members.rbs +87 -1
- data/sig/cli/diff.rbs +5 -11
- data/sig/cli/validate.rbs +13 -4
- data/sig/cli.rbs +18 -18
- data/sig/definition.rbs +6 -1
- data/sig/environment.rbs +70 -12
- data/sig/errors.rbs +13 -6
- data/sig/inline_parser.rbs +39 -2
- data/sig/locator.rbs +0 -2
- data/sig/manifest.yaml +0 -1
- data/sig/method_builder.rbs +3 -1
- data/sig/method_types.rbs +1 -1
- data/sig/parser.rbs +16 -2
- data/sig/resolver/type_name_resolver.rbs +35 -7
- data/sig/source.rbs +3 -3
- data/sig/type_param.rbs +13 -8
- data/sig/types.rbs +4 -4
- data/src/ast.c +80 -1
- data/src/lexer.c +1392 -1313
- data/src/lexer.re +3 -0
- data/src/lexstate.c +58 -37
- data/src/location.c +4 -4
- data/src/parser.c +412 -145
- data/src/string.c +0 -48
- data/src/util/rbs_allocator.c +89 -71
- data/src/util/rbs_assert.c +1 -1
- data/src/util/rbs_buffer.c +2 -2
- data/src/util/rbs_constant_pool.c +10 -10
- data/src/util/rbs_encoding.c +4 -8
- data/src/util/rbs_unescape.c +56 -20
- data/stdlib/bigdecimal/0/big_decimal.rbs +100 -82
- 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 +3 -1
- data/stdlib/date/0/date.rbs +67 -59
- data/stdlib/date/0/date_time.rbs +1 -1
- data/stdlib/delegate/0/delegator.rbs +10 -7
- data/stdlib/digest/0/digest.rbs +110 -0
- data/stdlib/erb/0/erb.rbs +737 -347
- data/stdlib/fileutils/0/fileutils.rbs +20 -14
- data/stdlib/forwardable/0/forwardable.rbs +3 -0
- data/stdlib/json/0/json.rbs +82 -28
- data/stdlib/net-http/0/net-http.rbs +3 -0
- data/stdlib/objspace/0/objspace.rbs +9 -27
- data/stdlib/open-uri/0/open-uri.rbs +40 -0
- data/stdlib/open3/0/open3.rbs +459 -1
- data/stdlib/openssl/0/openssl.rbs +331 -228
- data/stdlib/optparse/0/optparse.rbs +8 -3
- data/stdlib/pathname/0/pathname.rbs +9 -1379
- data/stdlib/psych/0/psych.rbs +4 -4
- data/stdlib/random-formatter/0/random-formatter.rbs +277 -0
- data/stdlib/rdoc/0/code_object.rbs +2 -1
- data/stdlib/rdoc/0/parser.rbs +1 -1
- data/stdlib/rdoc/0/rdoc.rbs +1 -1
- data/stdlib/rdoc/0/store.rbs +1 -1
- data/stdlib/resolv/0/resolv.rbs +25 -68
- data/stdlib/ripper/0/ripper.rbs +2 -2
- data/stdlib/securerandom/0/manifest.yaml +2 -0
- data/stdlib/securerandom/0/securerandom.rbs +6 -19
- data/stdlib/singleton/0/singleton.rbs +3 -0
- data/stdlib/socket/0/socket.rbs +13 -1
- data/stdlib/socket/0/tcp_socket.rbs +10 -2
- data/stdlib/stringio/0/stringio.rbs +1176 -85
- data/stdlib/strscan/0/string_scanner.rbs +31 -31
- data/stdlib/tempfile/0/tempfile.rbs +3 -3
- data/stdlib/time/0/time.rbs +1 -1
- data/stdlib/timeout/0/timeout.rbs +63 -7
- data/stdlib/tsort/0/cyclic.rbs +3 -0
- data/stdlib/uri/0/common.rbs +16 -2
- data/stdlib/uri/0/file.rbs +1 -1
- data/stdlib/uri/0/generic.rbs +24 -16
- data/stdlib/uri/0/rfc2396_parser.rbs +6 -7
- data/stdlib/zlib/0/gzip_reader.rbs +2 -2
- data/stdlib/zlib/0/gzip_writer.rbs +1 -1
- data/stdlib/zlib/0/zstream.rbs +1 -0
- metadata +30 -4
|
@@ -149,6 +149,8 @@ module RBS
|
|
|
149
149
|
member: member,
|
|
150
150
|
accessibility: :public
|
|
151
151
|
)
|
|
152
|
+
when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
|
|
153
|
+
build_ruby_attribute(methods, type, member: member, accessibility: :public)
|
|
152
154
|
end
|
|
153
155
|
end
|
|
154
156
|
end
|
|
@@ -227,6 +229,24 @@ module RBS
|
|
|
227
229
|
end
|
|
228
230
|
end
|
|
229
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
|
+
|
|
230
250
|
def build_method(methods, type, member:, accessibility:)
|
|
231
251
|
defn = methods.methods[member.name] ||= Methods::Definition.empty(type: type, name: member.name)
|
|
232
252
|
|
|
@@ -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,
|
|
@@ -551,6 +574,7 @@ module RBS
|
|
|
551
574
|
declared_in: type_name,
|
|
552
575
|
source: source
|
|
553
576
|
)
|
|
577
|
+
|
|
554
578
|
validate_variable(variables[name])
|
|
555
579
|
end
|
|
556
580
|
|
|
@@ -561,7 +585,15 @@ module RBS
|
|
|
561
585
|
variables = [] #: Array[Definition::Variable]
|
|
562
586
|
tmp_var = var
|
|
563
587
|
while tmp_var
|
|
564
|
-
|
|
588
|
+
case tmp_var.source
|
|
589
|
+
when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
|
|
590
|
+
# nop
|
|
591
|
+
when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
|
|
592
|
+
# nop
|
|
593
|
+
else
|
|
594
|
+
variables << tmp_var
|
|
595
|
+
end
|
|
596
|
+
|
|
565
597
|
tmp_var = tmp_var.parent_variable
|
|
566
598
|
end
|
|
567
599
|
|
|
@@ -579,6 +611,10 @@ module RBS
|
|
|
579
611
|
if r.source.instance_of?(AST::Members::ClassInstanceVariable) && l.declared_in == r.declared_in
|
|
580
612
|
raise ClassInstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
|
|
581
613
|
end
|
|
614
|
+
when AST::Ruby::Members::InstanceVariableMember
|
|
615
|
+
if l.declared_in == r.declared_in
|
|
616
|
+
raise InstanceVariableDuplicationError.new(type_name: l.declared_in, variable_name: l.source.name, location: l.source.location)
|
|
617
|
+
end
|
|
582
618
|
end
|
|
583
619
|
end
|
|
584
620
|
|
|
@@ -606,7 +642,7 @@ module RBS
|
|
|
606
642
|
|
|
607
643
|
methods.each do |method|
|
|
608
644
|
if interface_method_duplicates.include?(method.name)
|
|
609
|
-
member.is_a?(AST::Members::Include) || member.is_a?(AST::Members::Extend) or raise
|
|
645
|
+
(member.is_a?(AST::Members::Include) || member.is_a?(AST::Members::Extend)) or raise
|
|
610
646
|
|
|
611
647
|
raise DuplicatedInterfaceMethodDefinitionError.new(
|
|
612
648
|
type: definition.self_type,
|
|
@@ -766,6 +802,59 @@ module RBS
|
|
|
766
802
|
)
|
|
767
803
|
|
|
768
804
|
method_definition.annotations.replace(original.annotations)
|
|
805
|
+
when AST::Ruby::Members::AttrReaderMember, AST::Ruby::Members::AttrWriterMember, AST::Ruby::Members::AttrAccessorMember
|
|
806
|
+
if duplicated_method = methods[method.name]
|
|
807
|
+
raise DuplicatedMethodDefinitionError.new(
|
|
808
|
+
type: definition.self_type,
|
|
809
|
+
method_name: method.name,
|
|
810
|
+
members: [*duplicated_method.members, original]
|
|
811
|
+
)
|
|
812
|
+
end
|
|
813
|
+
|
|
814
|
+
attr_type = original.type || Types::Bases::Any.new(location: nil)
|
|
815
|
+
method_type =
|
|
816
|
+
if method.name.to_s.end_with?("=")
|
|
817
|
+
# setter
|
|
818
|
+
MethodType.new(
|
|
819
|
+
type_params: [],
|
|
820
|
+
type: Types::Function.empty(attr_type).update(
|
|
821
|
+
required_positionals: [
|
|
822
|
+
Types::Function::Param.new(type: attr_type, name: method.name.to_s.chomp("=").to_sym)
|
|
823
|
+
]
|
|
824
|
+
),
|
|
825
|
+
block: nil,
|
|
826
|
+
location: original.location
|
|
827
|
+
)
|
|
828
|
+
else
|
|
829
|
+
# getter
|
|
830
|
+
MethodType.new(
|
|
831
|
+
type_params: [],
|
|
832
|
+
type: Types::Function.empty(attr_type),
|
|
833
|
+
block: nil,
|
|
834
|
+
location: original.location
|
|
835
|
+
)
|
|
836
|
+
end
|
|
837
|
+
|
|
838
|
+
if implemented_in
|
|
839
|
+
super_method = existing_method
|
|
840
|
+
end
|
|
841
|
+
|
|
842
|
+
method_definition = Definition::Method.new(
|
|
843
|
+
super_method: super_method,
|
|
844
|
+
defs: [
|
|
845
|
+
Definition::Method::TypeDef.new(
|
|
846
|
+
type: method_type,
|
|
847
|
+
member: original,
|
|
848
|
+
defined_in: defined_in,
|
|
849
|
+
implemented_in: implemented_in
|
|
850
|
+
)
|
|
851
|
+
],
|
|
852
|
+
accessibility: method.accessibility,
|
|
853
|
+
alias_of: nil,
|
|
854
|
+
alias_member: nil
|
|
855
|
+
)
|
|
856
|
+
|
|
857
|
+
method_definition.annotations.replace([])
|
|
769
858
|
when AST::Ruby::Members::DefMember
|
|
770
859
|
if duplicated_method = methods[method.name]
|
|
771
860
|
raise DuplicatedMethodDefinitionError.new(
|
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
|
data/lib/rbs/environment.rb
CHANGED
|
@@ -122,21 +122,17 @@ module RBS
|
|
|
122
122
|
end
|
|
123
123
|
end
|
|
124
124
|
|
|
125
|
-
def class_entry(type_name)
|
|
126
|
-
case
|
|
127
|
-
when
|
|
128
|
-
|
|
129
|
-
when (class_alias = class_alias_decls[type_name]).is_a?(ClassAliasEntry)
|
|
130
|
-
class_alias
|
|
125
|
+
def class_entry(type_name, normalized: false)
|
|
126
|
+
case entry = constant_entry(type_name, normalized: normalized || false)
|
|
127
|
+
when ClassEntry, ClassAliasEntry
|
|
128
|
+
entry
|
|
131
129
|
end
|
|
132
130
|
end
|
|
133
131
|
|
|
134
|
-
def module_entry(type_name)
|
|
135
|
-
case
|
|
136
|
-
when
|
|
137
|
-
|
|
138
|
-
when (module_alias = class_alias_decls[type_name]).is_a?(ModuleAliasEntry)
|
|
139
|
-
module_alias
|
|
132
|
+
def module_entry(type_name, normalized: false)
|
|
133
|
+
case entry = constant_entry(type_name, normalized: normalized || false)
|
|
134
|
+
when ModuleEntry, ModuleAliasEntry
|
|
135
|
+
entry
|
|
140
136
|
end
|
|
141
137
|
end
|
|
142
138
|
|
|
@@ -152,26 +148,40 @@ module RBS
|
|
|
152
148
|
end
|
|
153
149
|
|
|
154
150
|
def normalized_module_entry(type_name)
|
|
155
|
-
|
|
156
|
-
case entry = module_entry(name)
|
|
157
|
-
when ModuleEntry, nil
|
|
158
|
-
entry
|
|
159
|
-
when ModuleAliasEntry
|
|
160
|
-
raise
|
|
161
|
-
end
|
|
162
|
-
end
|
|
151
|
+
module_entry(type_name, normalized: true)
|
|
163
152
|
end
|
|
164
153
|
|
|
165
|
-
def module_class_entry(type_name)
|
|
166
|
-
|
|
154
|
+
def module_class_entry(type_name, normalized: false)
|
|
155
|
+
entry = constant_entry(type_name, normalized: normalized || false)
|
|
156
|
+
if entry.is_a?(ConstantEntry)
|
|
157
|
+
nil
|
|
158
|
+
else
|
|
159
|
+
entry
|
|
160
|
+
end
|
|
167
161
|
end
|
|
168
162
|
|
|
169
163
|
def normalized_module_class_entry(type_name)
|
|
170
|
-
|
|
164
|
+
module_class_entry(type_name, normalized: true)
|
|
171
165
|
end
|
|
172
166
|
|
|
173
|
-
def constant_entry(type_name)
|
|
174
|
-
|
|
167
|
+
def constant_entry(type_name, normalized: false)
|
|
168
|
+
if normalized
|
|
169
|
+
if normalized_name = normalize_module_name?(type_name)
|
|
170
|
+
class_decls.fetch(normalized_name, nil)
|
|
171
|
+
else
|
|
172
|
+
# The type_name may be declared with constant declaration
|
|
173
|
+
unless type_name.namespace.empty?
|
|
174
|
+
parent = type_name.namespace.to_type_name
|
|
175
|
+
normalized_parent = normalize_module_name?(parent) or return
|
|
176
|
+
constant_name = TypeName.new(name: type_name.name, namespace: normalized_parent.to_namespace)
|
|
177
|
+
constant_decls.fetch(constant_name, nil)
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
else
|
|
181
|
+
class_decls.fetch(type_name, nil) ||
|
|
182
|
+
class_alias_decls.fetch(type_name, nil) ||
|
|
183
|
+
constant_decls.fetch(type_name, nil)
|
|
184
|
+
end
|
|
175
185
|
end
|
|
176
186
|
|
|
177
187
|
def normalize_type_name?(name)
|
|
@@ -206,6 +216,10 @@ module RBS
|
|
|
206
216
|
end
|
|
207
217
|
end
|
|
208
218
|
|
|
219
|
+
def normalize_type_name(name)
|
|
220
|
+
normalize_type_name?(name) || name
|
|
221
|
+
end
|
|
222
|
+
|
|
209
223
|
def normalized_type_name?(type_name)
|
|
210
224
|
case
|
|
211
225
|
when type_name.interface?
|
|
@@ -220,53 +234,44 @@ module RBS
|
|
|
220
234
|
end
|
|
221
235
|
|
|
222
236
|
def normalized_type_name!(name)
|
|
223
|
-
normalized_type_name?(name) or raise "Normalized type name is expected but given `#{name}
|
|
237
|
+
normalized_type_name?(name) or raise "Normalized type name is expected but given `#{name}`"
|
|
224
238
|
name
|
|
225
239
|
end
|
|
226
240
|
|
|
227
|
-
def normalize_type_name(name)
|
|
228
|
-
normalize_type_name?(name) || name
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
def normalize_module_name(name)
|
|
232
|
-
normalize_module_name?(name) or name
|
|
233
|
-
end
|
|
234
|
-
|
|
235
241
|
def normalize_module_name?(name)
|
|
236
242
|
raise "Class/module name is expected: #{name}" unless name.class?
|
|
237
243
|
name = name.absolute! unless name.absolute?
|
|
238
244
|
|
|
239
|
-
|
|
240
|
-
|
|
245
|
+
original_name = name
|
|
246
|
+
|
|
247
|
+
if @normalize_module_name_cache.key?(original_name)
|
|
248
|
+
return @normalize_module_name_cache[original_name]
|
|
241
249
|
end
|
|
242
250
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
251
|
+
if alias_entry = class_alias_decls.fetch(name, nil)
|
|
252
|
+
unless alias_entry.decl.old_name.absolute?
|
|
253
|
+
# Having relative old_name means the type name resolution was failed.
|
|
254
|
+
# Run TypeNameResolver for failure reason
|
|
255
|
+
resolver = Resolver::TypeNameResolver.build(self)
|
|
256
|
+
name = resolver.resolve_namespace(name, context: nil)
|
|
257
|
+
@normalize_module_name_cache[original_name] = name
|
|
258
|
+
return name
|
|
250
259
|
end
|
|
251
|
-
else
|
|
252
|
-
type_name = name
|
|
253
|
-
end
|
|
254
260
|
|
|
255
|
-
|
|
261
|
+
name = alias_entry.decl.old_name
|
|
262
|
+
end
|
|
256
263
|
|
|
257
|
-
|
|
264
|
+
if class_decls.key?(name)
|
|
265
|
+
@normalize_module_name_cache[original_name] = name
|
|
266
|
+
end
|
|
267
|
+
end
|
|
258
268
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
type_name
|
|
263
|
-
when ClassAliasEntry, ModuleAliasEntry
|
|
264
|
-
normalize_module_name?(entry.decl.old_name)
|
|
265
|
-
else
|
|
266
|
-
nil
|
|
267
|
-
end
|
|
269
|
+
def normalize_module_name(name)
|
|
270
|
+
normalize_module_name?(name) || name
|
|
271
|
+
end
|
|
268
272
|
|
|
269
|
-
|
|
273
|
+
def normalize_module_name!(name)
|
|
274
|
+
normalize_module_name?(name) or raise "Module name `#{name}` cannot be normalized"
|
|
270
275
|
end
|
|
271
276
|
|
|
272
277
|
def insert_rbs_decl(decl, context:, namespace:)
|
|
@@ -378,11 +383,10 @@ module RBS
|
|
|
378
383
|
if entry.is_a?(ModuleEntry)
|
|
379
384
|
raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
|
|
380
385
|
end
|
|
386
|
+
else
|
|
387
|
+
entry = class_decls[name] = ClassEntry.new(name)
|
|
381
388
|
end
|
|
382
389
|
|
|
383
|
-
entry = ClassEntry.new(name)
|
|
384
|
-
class_decls[name] = entry
|
|
385
|
-
|
|
386
390
|
entry << [context, decl]
|
|
387
391
|
|
|
388
392
|
inner_context = [context, name] #: Resolver::context
|
|
@@ -400,17 +404,51 @@ module RBS
|
|
|
400
404
|
if entry.is_a?(ClassEntry)
|
|
401
405
|
raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
|
|
402
406
|
end
|
|
407
|
+
else
|
|
408
|
+
entry = class_decls[name] = ModuleEntry.new(name)
|
|
403
409
|
end
|
|
404
410
|
|
|
405
|
-
entry = ModuleEntry.new(name)
|
|
406
|
-
class_decls[name] = entry
|
|
407
|
-
|
|
408
411
|
entry << [context, decl]
|
|
409
412
|
|
|
410
413
|
inner_context = [context, name] #: Resolver::context
|
|
411
414
|
decl.each_decl do |member|
|
|
412
415
|
insert_ruby_decl(member, context: inner_context, namespace: name.to_namespace)
|
|
413
416
|
end
|
|
417
|
+
|
|
418
|
+
when AST::Ruby::Declarations::ConstantDecl
|
|
419
|
+
name = decl.constant_name.with_prefix(namespace)
|
|
420
|
+
|
|
421
|
+
if entry = constant_entry(name)
|
|
422
|
+
case entry
|
|
423
|
+
when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
|
|
424
|
+
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
|
|
425
|
+
when ClassEntry, ModuleEntry
|
|
426
|
+
raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
|
|
427
|
+
end
|
|
428
|
+
end
|
|
429
|
+
|
|
430
|
+
constant_decls[name] = ConstantEntry.new(name: name, decl: decl, context: context)
|
|
431
|
+
|
|
432
|
+
when AST::Ruby::Declarations::ClassModuleAliasDecl
|
|
433
|
+
name = decl.new_name.with_prefix(namespace)
|
|
434
|
+
|
|
435
|
+
if entry = constant_entry(name)
|
|
436
|
+
case entry
|
|
437
|
+
when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
|
|
438
|
+
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
|
|
439
|
+
when ClassEntry, ModuleEntry
|
|
440
|
+
raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
|
|
441
|
+
end
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
case decl.annotation
|
|
445
|
+
when AST::Ruby::Annotations::ClassAliasAnnotation
|
|
446
|
+
class_alias_decls[name] = ClassAliasEntry.new(name: name, decl: decl, context: context)
|
|
447
|
+
when AST::Ruby::Annotations::ModuleAliasAnnotation
|
|
448
|
+
class_alias_decls[name] = ModuleAliasEntry.new(name: name, decl: decl, context: context)
|
|
449
|
+
end
|
|
450
|
+
else
|
|
451
|
+
raise "Unknown Ruby declaration type: #{decl.class}"
|
|
414
452
|
end
|
|
415
453
|
end
|
|
416
454
|
|
|
@@ -482,7 +520,7 @@ module RBS
|
|
|
482
520
|
end
|
|
483
521
|
|
|
484
522
|
def resolve_type_names(only: nil)
|
|
485
|
-
resolver = Resolver::TypeNameResolver.
|
|
523
|
+
resolver = Resolver::TypeNameResolver.build(self)
|
|
486
524
|
env = Environment.new
|
|
487
525
|
|
|
488
526
|
table = UseMap::Table.new()
|
|
@@ -495,7 +533,7 @@ module RBS
|
|
|
495
533
|
each_rbs_source do |source|
|
|
496
534
|
resolve = source.directives.find { _1.is_a?(AST::Directives::ResolveTypeNames) } #: AST::Directives::ResolveTypeNames?
|
|
497
535
|
if !resolve || resolve.value
|
|
498
|
-
_, decls = resolve_signature(resolver, table, source.directives, source.declarations)
|
|
536
|
+
_, decls = resolve_signature(resolver, table, source.directives, source.declarations, only: only)
|
|
499
537
|
else
|
|
500
538
|
decls = source.declarations
|
|
501
539
|
end
|
|
@@ -504,7 +542,15 @@ module RBS
|
|
|
504
542
|
|
|
505
543
|
each_ruby_source do |source|
|
|
506
544
|
decls = source.declarations.map do |decl|
|
|
507
|
-
|
|
545
|
+
if only
|
|
546
|
+
if only.include?(decl)
|
|
547
|
+
resolve_ruby_decl(resolver, decl, context: nil, prefix: Namespace.root)
|
|
548
|
+
else
|
|
549
|
+
decl
|
|
550
|
+
end
|
|
551
|
+
else
|
|
552
|
+
resolve_ruby_decl(resolver, decl, context: nil, prefix: Namespace.root)
|
|
553
|
+
end
|
|
508
554
|
end
|
|
509
555
|
|
|
510
556
|
env.add_source(Source::Ruby.new(source.buffer, source.prism_result, decls, source.diagnostics))
|
|
@@ -671,7 +717,16 @@ module RBS
|
|
|
671
717
|
inner_context = [context, full_name] #: Resolver::context
|
|
672
718
|
inner_prefix = full_name.to_namespace
|
|
673
719
|
|
|
674
|
-
|
|
720
|
+
super_class = decl.super_class&.yield_self do |super_class|
|
|
721
|
+
AST::Ruby::Declarations::ClassDecl::SuperClass.new(
|
|
722
|
+
super_class.type_name_location,
|
|
723
|
+
super_class.operator_location,
|
|
724
|
+
absolute_type_name(resolver, nil, super_class.name, context: context),
|
|
725
|
+
super_class.type_annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
|
|
726
|
+
)
|
|
727
|
+
end
|
|
728
|
+
|
|
729
|
+
AST::Ruby::Declarations::ClassDecl.new(decl.buffer, full_name, decl.node, super_class).tap do |resolved|
|
|
675
730
|
decl.members.each do |member|
|
|
676
731
|
case member
|
|
677
732
|
when AST::Ruby::Declarations::Base
|
|
@@ -694,12 +749,39 @@ module RBS
|
|
|
694
749
|
case member
|
|
695
750
|
when AST::Ruby::Declarations::Base
|
|
696
751
|
resolved.members << resolve_ruby_decl(resolver, member, context: inner_context, prefix: inner_prefix)
|
|
752
|
+
when AST::Ruby::Members::Base
|
|
753
|
+
resolved.members << resolve_ruby_member(resolver, member, context: inner_context)
|
|
697
754
|
else
|
|
698
755
|
raise "Unknown member type: #{member.class}"
|
|
699
756
|
end
|
|
700
757
|
end
|
|
701
758
|
end
|
|
702
759
|
|
|
760
|
+
when AST::Ruby::Declarations::ConstantDecl
|
|
761
|
+
full_name = decl.constant_name.with_prefix(prefix)
|
|
762
|
+
|
|
763
|
+
AST::Ruby::Declarations::ConstantDecl.new(
|
|
764
|
+
decl.buffer,
|
|
765
|
+
full_name,
|
|
766
|
+
decl.node,
|
|
767
|
+
decl.leading_comment,
|
|
768
|
+
decl.type_annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
|
|
769
|
+
)
|
|
770
|
+
|
|
771
|
+
when AST::Ruby::Declarations::ClassModuleAliasDecl
|
|
772
|
+
full_name = decl.new_name.with_prefix(prefix)
|
|
773
|
+
resolved_annotation = decl.annotation.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
|
|
774
|
+
resolved_infered_name = decl.infered_old_name&.yield_self {|name| absolute_type_name(resolver, nil, name, context: context) }
|
|
775
|
+
|
|
776
|
+
AST::Ruby::Declarations::ClassModuleAliasDecl.new(
|
|
777
|
+
decl.buffer,
|
|
778
|
+
decl.node,
|
|
779
|
+
full_name,
|
|
780
|
+
resolved_infered_name,
|
|
781
|
+
decl.leading_comment,
|
|
782
|
+
resolved_annotation
|
|
783
|
+
)
|
|
784
|
+
|
|
703
785
|
else
|
|
704
786
|
raise "Unknown declaration type: #{decl.class}"
|
|
705
787
|
end
|
|
@@ -712,7 +794,65 @@ module RBS
|
|
|
712
794
|
member.buffer,
|
|
713
795
|
member.name,
|
|
714
796
|
member.node,
|
|
715
|
-
member.method_type.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
|
|
797
|
+
member.method_type.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) },
|
|
798
|
+
member.leading_comment
|
|
799
|
+
)
|
|
800
|
+
when AST::Ruby::Members::IncludeMember
|
|
801
|
+
resolved_annotation = member.annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
|
|
802
|
+
AST::Ruby::Members::IncludeMember.new(
|
|
803
|
+
member.buffer,
|
|
804
|
+
member.node,
|
|
805
|
+
absolute_type_name(resolver, nil, member.module_name, context: context),
|
|
806
|
+
resolved_annotation
|
|
807
|
+
)
|
|
808
|
+
when AST::Ruby::Members::ExtendMember
|
|
809
|
+
resolved_annotation = member.annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
|
|
810
|
+
AST::Ruby::Members::ExtendMember.new(
|
|
811
|
+
member.buffer,
|
|
812
|
+
member.node,
|
|
813
|
+
absolute_type_name(resolver, nil, member.module_name, context: context),
|
|
814
|
+
resolved_annotation
|
|
815
|
+
)
|
|
816
|
+
when AST::Ruby::Members::PrependMember
|
|
817
|
+
resolved_annotation = member.annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
|
|
818
|
+
AST::Ruby::Members::PrependMember.new(
|
|
819
|
+
member.buffer,
|
|
820
|
+
member.node,
|
|
821
|
+
absolute_type_name(resolver, nil, member.module_name, context: context),
|
|
822
|
+
resolved_annotation
|
|
823
|
+
)
|
|
824
|
+
when AST::Ruby::Members::AttrReaderMember
|
|
825
|
+
resolved_type_annotation = member.type_annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
|
|
826
|
+
AST::Ruby::Members::AttrReaderMember.new(
|
|
827
|
+
member.buffer,
|
|
828
|
+
member.node,
|
|
829
|
+
member.name_nodes,
|
|
830
|
+
member.leading_comment,
|
|
831
|
+
resolved_type_annotation
|
|
832
|
+
)
|
|
833
|
+
when AST::Ruby::Members::AttrWriterMember
|
|
834
|
+
resolved_type_annotation = member.type_annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
|
|
835
|
+
AST::Ruby::Members::AttrWriterMember.new(
|
|
836
|
+
member.buffer,
|
|
837
|
+
member.node,
|
|
838
|
+
member.name_nodes,
|
|
839
|
+
member.leading_comment,
|
|
840
|
+
resolved_type_annotation
|
|
841
|
+
)
|
|
842
|
+
when AST::Ruby::Members::AttrAccessorMember
|
|
843
|
+
resolved_type_annotation = member.type_annotation&.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
|
|
844
|
+
AST::Ruby::Members::AttrAccessorMember.new(
|
|
845
|
+
member.buffer,
|
|
846
|
+
member.node,
|
|
847
|
+
member.name_nodes,
|
|
848
|
+
member.leading_comment,
|
|
849
|
+
resolved_type_annotation
|
|
850
|
+
)
|
|
851
|
+
when AST::Ruby::Members::InstanceVariableMember
|
|
852
|
+
resolved_annotation = member.annotation.map_type_name {|name| absolute_type_name(resolver, nil, name, context: context) }
|
|
853
|
+
AST::Ruby::Members::InstanceVariableMember.new(
|
|
854
|
+
member.buffer,
|
|
855
|
+
resolved_annotation
|
|
716
856
|
)
|
|
717
857
|
else
|
|
718
858
|
raise "Unknown member type: #{member.class}"
|
|
@@ -845,7 +985,7 @@ module RBS
|
|
|
845
985
|
end
|
|
846
986
|
|
|
847
987
|
def inspect
|
|
848
|
-
ivars = %i[@
|
|
988
|
+
ivars = %i[@sources @class_decls @class_alias_decls @interface_decls @type_alias_decls @constant_decls @global_decls]
|
|
849
989
|
"\#<RBS::Environment #{ivars.map { |iv| "#{iv}=(#{instance_variable_get(iv).size} items)"}.join(' ')}>"
|
|
850
990
|
end
|
|
851
991
|
|
|
@@ -853,12 +993,25 @@ module RBS
|
|
|
853
993
|
sources.map(&:buffer)
|
|
854
994
|
end
|
|
855
995
|
|
|
856
|
-
def unload(
|
|
857
|
-
|
|
858
|
-
|
|
996
|
+
def unload(paths)
|
|
997
|
+
ps = Set[]
|
|
998
|
+
paths.each do |path|
|
|
999
|
+
if path.is_a?(Buffer)
|
|
1000
|
+
ps << path.name
|
|
1001
|
+
else
|
|
1002
|
+
ps << path
|
|
1003
|
+
end
|
|
1004
|
+
end
|
|
1005
|
+
|
|
1006
|
+
env = Environment.new()
|
|
859
1007
|
|
|
860
1008
|
each_rbs_source do |source|
|
|
861
|
-
next if
|
|
1009
|
+
next if ps.include?(source.buffer.name)
|
|
1010
|
+
env.add_source(source)
|
|
1011
|
+
end
|
|
1012
|
+
|
|
1013
|
+
each_ruby_source do |source|
|
|
1014
|
+
next if ps.include?(source.buffer.name)
|
|
862
1015
|
env.add_source(source)
|
|
863
1016
|
end
|
|
864
1017
|
|
|
@@ -50,12 +50,6 @@ module RBS
|
|
|
50
50
|
when path
|
|
51
51
|
dirs << path
|
|
52
52
|
when library
|
|
53
|
-
case library
|
|
54
|
-
when 'rubygems', 'set'
|
|
55
|
-
RBS.logger.warn "`#{library}` has been moved to core library, so it is always loaded. Remove explicit loading `#{library}`"
|
|
56
|
-
return
|
|
57
|
-
end
|
|
58
|
-
|
|
59
53
|
if libs.add?(Library.new(name: library, version: version)) && resolve_dependencies
|
|
60
54
|
resolve_dependencies(library: library, version: version)
|
|
61
55
|
end
|