rbs 3.10.0 → 4.0.0.dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/comments.yml +3 -3
- data/.github/workflows/ruby.yml +24 -35
- data/.github/workflows/typecheck.yml +3 -1
- data/.github/workflows/windows.yml +2 -2
- data/.gitignore +0 -4
- data/CHANGELOG.md +0 -88
- data/README.md +1 -38
- data/Rakefile +20 -142
- data/Steepfile +1 -0
- data/config.yml +43 -1
- data/core/array.rbs +46 -100
- data/core/complex.rbs +21 -32
- data/core/dir.rbs +2 -2
- data/core/encoding.rbs +9 -6
- data/core/enumerable.rbs +3 -90
- data/core/enumerator.rbs +1 -18
- data/core/errno.rbs +0 -8
- data/core/errors.rbs +1 -28
- data/core/exception.rbs +2 -2
- data/core/fiber.rbs +4 -5
- data/core/file.rbs +12 -27
- data/core/file_test.rbs +1 -1
- data/core/float.rbs +22 -209
- data/core/gc.rbs +281 -417
- data/core/hash.rbs +727 -1024
- data/core/integer.rbs +38 -78
- data/core/io/buffer.rbs +7 -18
- data/core/io/wait.rbs +33 -11
- data/core/io.rbs +12 -14
- data/core/kernel.rbs +51 -57
- data/core/marshal.rbs +1 -1
- data/core/match_data.rbs +1 -1
- data/core/math.rbs +3 -42
- data/core/method.rbs +6 -14
- data/core/module.rbs +17 -88
- data/core/nil_class.rbs +3 -3
- data/core/numeric.rbs +16 -16
- data/core/object.rbs +3 -3
- data/core/object_space.rbs +15 -21
- data/core/proc.rbs +8 -15
- data/core/process.rbs +2 -2
- data/core/ractor.rbs +437 -278
- data/core/range.rbs +8 -7
- data/core/rational.rbs +24 -37
- data/core/rbs/unnamed/argf.rbs +2 -2
- data/core/rbs/unnamed/env_class.rbs +1 -1
- data/core/rbs/unnamed/random.rbs +2 -4
- data/core/regexp.rbs +20 -25
- data/core/ruby_vm.rbs +4 -6
- data/core/rubygems/errors.rbs +70 -3
- data/core/rubygems/rubygems.rbs +79 -11
- data/core/rubygems/version.rbs +3 -2
- data/core/set.rbs +359 -488
- data/core/string.rbs +1228 -3153
- data/core/struct.rbs +1 -1
- data/core/symbol.rbs +4 -4
- data/core/thread.rbs +29 -92
- data/core/time.rbs +9 -35
- data/core/trace_point.rbs +4 -7
- data/core/unbound_method.rbs +6 -14
- data/docs/collection.md +2 -2
- data/docs/gem.md +1 -0
- data/docs/sigs.md +3 -3
- data/ext/rbs_extension/ast_translation.c +1077 -944
- data/ext/rbs_extension/ast_translation.h +0 -7
- data/ext/rbs_extension/class_constants.c +83 -71
- data/ext/rbs_extension/class_constants.h +7 -4
- data/ext/rbs_extension/extconf.rb +2 -24
- data/ext/rbs_extension/legacy_location.c +172 -173
- data/ext/rbs_extension/legacy_location.h +3 -8
- data/ext/rbs_extension/main.c +289 -239
- data/ext/rbs_extension/rbs_extension.h +0 -3
- data/ext/rbs_extension/rbs_string_bridging.h +0 -4
- data/include/rbs/ast.h +98 -37
- data/include/rbs/defines.h +12 -38
- data/include/rbs/lexer.h +114 -126
- data/include/rbs/location.h +14 -14
- data/include/rbs/parser.h +37 -21
- data/include/rbs/string.h +5 -3
- data/include/rbs/util/rbs_allocator.h +19 -40
- data/include/rbs/util/rbs_assert.h +1 -12
- data/include/rbs/util/rbs_constant_pool.h +3 -3
- data/include/rbs/util/rbs_encoding.h +1 -3
- data/include/rbs/util/rbs_unescape.h +1 -2
- data/lib/rbs/ast/ruby/annotations.rb +119 -0
- data/lib/rbs/ast/ruby/comment_block.rb +221 -0
- data/lib/rbs/ast/ruby/declarations.rb +86 -0
- data/lib/rbs/ast/ruby/helpers/constant_helper.rb +24 -0
- data/lib/rbs/ast/ruby/helpers/location_helper.rb +15 -0
- data/lib/rbs/ast/ruby/members.rb +213 -0
- data/lib/rbs/buffer.rb +104 -24
- data/lib/rbs/cli/validate.rb +40 -35
- data/lib/rbs/cli.rb +5 -6
- data/lib/rbs/collection/config/lockfile_generator.rb +0 -1
- data/lib/rbs/collection.rb +0 -1
- data/lib/rbs/definition.rb +6 -1
- data/lib/rbs/definition_builder/ancestor_builder.rb +65 -62
- data/lib/rbs/definition_builder/method_builder.rb +45 -30
- data/lib/rbs/definition_builder.rb +44 -9
- data/lib/rbs/environment/class_entry.rb +69 -0
- data/lib/rbs/environment/module_entry.rb +66 -0
- data/lib/rbs/environment.rb +244 -218
- data/lib/rbs/environment_loader.rb +3 -3
- data/lib/rbs/errors.rb +5 -4
- data/lib/rbs/inline_parser/comment_association.rb +117 -0
- data/lib/rbs/inline_parser.rb +206 -0
- data/lib/rbs/location_aux.rb +35 -3
- data/lib/rbs/parser_aux.rb +11 -6
- data/lib/rbs/prototype/runtime.rb +2 -2
- data/lib/rbs/resolver/constant_resolver.rb +2 -2
- data/lib/rbs/resolver/type_name_resolver.rb +38 -124
- data/lib/rbs/source.rb +99 -0
- data/lib/rbs/subtractor.rb +4 -3
- data/lib/rbs/test/type_check.rb +0 -14
- data/lib/rbs/types.rb +1 -3
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs.rb +13 -1
- data/lib/rdoc/discover.rb +1 -1
- data/lib/rdoc_plugin/parser.rb +1 -1
- data/rbs.gemspec +1 -0
- data/sig/ancestor_builder.rbs +1 -1
- data/sig/ast/ruby/annotations.rbs +110 -0
- data/sig/ast/ruby/comment_block.rbs +119 -0
- data/sig/ast/ruby/declarations.rbs +60 -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 +72 -0
- data/sig/buffer.rbs +63 -5
- data/sig/definition.rbs +1 -0
- data/sig/definition_builder.rbs +1 -1
- data/sig/environment/class_entry.rbs +50 -0
- data/sig/environment/module_entry.rbs +50 -0
- data/sig/environment.rbs +28 -133
- data/sig/errors.rbs +13 -6
- data/sig/inline_parser/comment_association.rbs +71 -0
- data/sig/inline_parser.rbs +87 -0
- data/sig/location.rbs +32 -7
- data/sig/manifest.yaml +1 -0
- data/sig/method_builder.rbs +7 -4
- data/sig/parser.rbs +16 -20
- data/sig/resolver/type_name_resolver.rbs +7 -38
- data/sig/source.rbs +48 -0
- data/sig/types.rbs +1 -4
- data/src/ast.c +290 -201
- data/src/lexer.c +2813 -2902
- data/src/lexer.re +4 -0
- data/src/lexstate.c +155 -169
- data/src/location.c +40 -40
- data/src/parser.c +2665 -2433
- data/src/string.c +48 -0
- data/src/util/rbs_allocator.c +77 -80
- data/src/util/rbs_assert.c +10 -10
- data/src/util/rbs_buffer.c +2 -2
- data/src/util/rbs_constant_pool.c +15 -13
- data/src/util/rbs_encoding.c +4062 -20097
- data/src/util/rbs_unescape.c +48 -85
- data/stdlib/bigdecimal/0/big_decimal.rbs +82 -100
- data/stdlib/bigdecimal-math/0/big_math.rbs +8 -169
- data/stdlib/cgi/0/core.rbs +396 -2
- data/stdlib/cgi/0/manifest.yaml +0 -1
- data/stdlib/coverage/0/coverage.rbs +1 -3
- data/stdlib/date/0/date.rbs +59 -67
- data/stdlib/date/0/date_time.rbs +1 -1
- data/stdlib/delegate/0/delegator.rbs +7 -10
- data/stdlib/erb/0/erb.rbs +347 -737
- data/stdlib/fileutils/0/fileutils.rbs +13 -18
- data/stdlib/forwardable/0/forwardable.rbs +0 -3
- data/stdlib/json/0/json.rbs +48 -68
- data/stdlib/net-http/0/net-http.rbs +0 -3
- data/stdlib/objspace/0/objspace.rbs +4 -9
- data/stdlib/open-uri/0/open-uri.rbs +0 -40
- data/stdlib/openssl/0/openssl.rbs +228 -331
- data/stdlib/optparse/0/optparse.rbs +3 -3
- data/{core → stdlib/pathname/0}/pathname.rbs +355 -255
- data/stdlib/psych/0/psych.rbs +3 -3
- data/stdlib/rdoc/0/rdoc.rbs +1 -1
- data/stdlib/resolv/0/resolv.rbs +68 -25
- data/stdlib/ripper/0/ripper.rbs +2 -5
- data/stdlib/singleton/0/singleton.rbs +0 -3
- data/stdlib/socket/0/socket.rbs +1 -13
- data/stdlib/socket/0/tcp_socket.rbs +2 -10
- data/stdlib/stringio/0/stringio.rbs +85 -1176
- 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 +7 -63
- data/stdlib/tsort/0/cyclic.rbs +0 -3
- data/stdlib/uri/0/common.rbs +2 -11
- data/stdlib/uri/0/file.rbs +1 -1
- data/stdlib/uri/0/generic.rbs +16 -17
- data/stdlib/uri/0/rfc2396_parser.rbs +7 -6
- data/stdlib/zlib/0/zstream.rbs +0 -1
- metadata +40 -12
- data/.clang-format +0 -74
- data/.clangd +0 -2
- data/.github/workflows/c-check.yml +0 -54
- data/core/ruby.rbs +0 -53
- data/docs/aliases.md +0 -79
- data/docs/encoding.md +0 -56
- data/ext/rbs_extension/compat.h +0 -10
- data/stdlib/cgi-escape/0/escape.rbs +0 -153
data/lib/rbs/environment.rb
CHANGED
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
module RBS
|
|
4
4
|
class Environment
|
|
5
|
-
attr_reader :declarations
|
|
6
|
-
|
|
7
5
|
attr_reader :class_decls
|
|
8
6
|
attr_reader :interface_decls
|
|
9
7
|
attr_reader :type_alias_decls
|
|
@@ -11,116 +9,17 @@ module RBS
|
|
|
11
9
|
attr_reader :global_decls
|
|
12
10
|
attr_reader :class_alias_decls
|
|
13
11
|
|
|
14
|
-
attr_reader :
|
|
15
|
-
|
|
16
|
-
module ContextUtil
|
|
17
|
-
def calculate_context(decls)
|
|
18
|
-
decls.inject(nil) do |context, decl| #$ Resolver::context
|
|
19
|
-
if (_, last = context)
|
|
20
|
-
last or raise
|
|
21
|
-
[context, last + decl.name]
|
|
22
|
-
else
|
|
23
|
-
[nil, decl.name.absolute!]
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
class MultiEntry
|
|
30
|
-
D = _ = Struct.new(:decl, :outer, keyword_init: true) do
|
|
31
|
-
# @implements D[M]
|
|
32
|
-
|
|
33
|
-
include ContextUtil
|
|
34
|
-
|
|
35
|
-
def context
|
|
36
|
-
@context ||= calculate_context(outer + [decl])
|
|
37
|
-
end
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
attr_reader :name
|
|
41
|
-
attr_reader :decls
|
|
42
|
-
|
|
43
|
-
def initialize(name:)
|
|
44
|
-
@name = name
|
|
45
|
-
@decls = []
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def insert(decl:, outer:)
|
|
49
|
-
decls << D.new(decl: decl, outer: outer)
|
|
50
|
-
@primary = nil
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def validate_type_params
|
|
54
|
-
unless decls.empty?
|
|
55
|
-
hd_decl, *tl_decls = decls
|
|
56
|
-
raise unless hd_decl
|
|
57
|
-
|
|
58
|
-
hd_params = hd_decl.decl.type_params
|
|
59
|
-
|
|
60
|
-
tl_decls.each do |tl_decl|
|
|
61
|
-
tl_params = tl_decl.decl.type_params
|
|
62
|
-
|
|
63
|
-
unless compatible_params?(hd_params, tl_params)
|
|
64
|
-
raise GenericParameterMismatchError.new(name: name, decl: _ = tl_decl.decl)
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def compatible_params?(ps1, ps2)
|
|
71
|
-
if ps1.size == ps2.size
|
|
72
|
-
ps1 == AST::TypeParam.rename(ps2, new_names: ps1.map(&:name))
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
def type_params
|
|
77
|
-
primary.decl.type_params
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def primary
|
|
81
|
-
raise "Not implemented"
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
class ModuleEntry < MultiEntry
|
|
86
|
-
def self_types
|
|
87
|
-
decls.flat_map do |d|
|
|
88
|
-
d.decl.self_types
|
|
89
|
-
end.uniq
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def primary
|
|
93
|
-
@primary ||= begin
|
|
94
|
-
validate_type_params
|
|
95
|
-
decls.first or raise("decls cannot be empty")
|
|
96
|
-
end
|
|
97
|
-
end
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
class ClassEntry < MultiEntry
|
|
101
|
-
def primary
|
|
102
|
-
@primary ||= begin
|
|
103
|
-
validate_type_params
|
|
104
|
-
decls.find {|d| d.decl.super_class } || decls.first or raise("decls cannot be empty")
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
end
|
|
12
|
+
attr_reader :sources
|
|
108
13
|
|
|
109
14
|
class SingleEntry
|
|
110
15
|
attr_reader :name
|
|
111
|
-
attr_reader :
|
|
16
|
+
attr_reader :context
|
|
112
17
|
attr_reader :decl
|
|
113
18
|
|
|
114
|
-
def initialize(name:, decl:,
|
|
19
|
+
def initialize(name:, decl:, context:)
|
|
115
20
|
@name = name
|
|
116
21
|
@decl = decl
|
|
117
|
-
@
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
include ContextUtil
|
|
121
|
-
|
|
122
|
-
def context
|
|
123
|
-
@context ||= calculate_context(outer)
|
|
22
|
+
@context = context
|
|
124
23
|
end
|
|
125
24
|
end
|
|
126
25
|
|
|
@@ -143,9 +42,7 @@ module RBS
|
|
|
143
42
|
end
|
|
144
43
|
|
|
145
44
|
def initialize
|
|
146
|
-
@
|
|
147
|
-
@declarations = []
|
|
148
|
-
|
|
45
|
+
@sources = []
|
|
149
46
|
@class_decls = {}
|
|
150
47
|
@interface_decls = {}
|
|
151
48
|
@type_alias_decls = {}
|
|
@@ -156,9 +53,7 @@ module RBS
|
|
|
156
53
|
end
|
|
157
54
|
|
|
158
55
|
def initialize_copy(other)
|
|
159
|
-
@
|
|
160
|
-
@declarations = other.declarations.dup
|
|
161
|
-
|
|
56
|
+
@sources = other.sources.dup
|
|
162
57
|
@class_decls = other.class_decls.dup
|
|
163
58
|
@interface_decls = other.interface_decls.dup
|
|
164
59
|
@type_alias_decls = other.type_alias_decls.dup
|
|
@@ -223,17 +118,21 @@ module RBS
|
|
|
223
118
|
end
|
|
224
119
|
end
|
|
225
120
|
|
|
226
|
-
def class_entry(type_name
|
|
227
|
-
case
|
|
228
|
-
when ClassEntry
|
|
229
|
-
|
|
121
|
+
def class_entry(type_name)
|
|
122
|
+
case
|
|
123
|
+
when (class_entry = class_decls[type_name]).is_a?(ClassEntry)
|
|
124
|
+
class_entry
|
|
125
|
+
when (class_alias = class_alias_decls[type_name]).is_a?(ClassAliasEntry)
|
|
126
|
+
class_alias
|
|
230
127
|
end
|
|
231
128
|
end
|
|
232
129
|
|
|
233
|
-
def module_entry(type_name
|
|
234
|
-
case
|
|
235
|
-
when ModuleEntry
|
|
236
|
-
|
|
130
|
+
def module_entry(type_name)
|
|
131
|
+
case
|
|
132
|
+
when (module_entry = class_decls[type_name]).is_a?(ModuleEntry)
|
|
133
|
+
module_entry
|
|
134
|
+
when (module_alias = class_alias_decls[type_name]).is_a?(ModuleAliasEntry)
|
|
135
|
+
module_alias
|
|
237
136
|
end
|
|
238
137
|
end
|
|
239
138
|
|
|
@@ -249,40 +148,26 @@ module RBS
|
|
|
249
148
|
end
|
|
250
149
|
|
|
251
150
|
def normalized_module_entry(type_name)
|
|
252
|
-
|
|
151
|
+
if name = normalize_module_name?(type_name)
|
|
152
|
+
case entry = module_entry(name)
|
|
153
|
+
when ModuleEntry, nil
|
|
154
|
+
entry
|
|
155
|
+
when ModuleAliasEntry
|
|
156
|
+
raise
|
|
157
|
+
end
|
|
158
|
+
end
|
|
253
159
|
end
|
|
254
160
|
|
|
255
|
-
def module_class_entry(type_name
|
|
256
|
-
|
|
257
|
-
if entry.is_a?(ConstantEntry)
|
|
258
|
-
nil
|
|
259
|
-
else
|
|
260
|
-
entry
|
|
261
|
-
end
|
|
161
|
+
def module_class_entry(type_name)
|
|
162
|
+
class_entry(type_name) || module_entry(type_name)
|
|
262
163
|
end
|
|
263
164
|
|
|
264
165
|
def normalized_module_class_entry(type_name)
|
|
265
|
-
|
|
166
|
+
normalized_class_entry(type_name) || normalized_module_entry(type_name)
|
|
266
167
|
end
|
|
267
168
|
|
|
268
|
-
def constant_entry(type_name
|
|
269
|
-
|
|
270
|
-
if normalized_name = normalize_module_name?(type_name)
|
|
271
|
-
class_decls.fetch(normalized_name, nil)
|
|
272
|
-
else
|
|
273
|
-
# The type_name may be declared with constant declaration
|
|
274
|
-
unless type_name.namespace.empty?
|
|
275
|
-
parent = type_name.namespace.to_type_name
|
|
276
|
-
normalized_parent = normalize_module_name?(parent) or return
|
|
277
|
-
constant_name = TypeName.new(name: type_name.name, namespace: normalized_parent.to_namespace)
|
|
278
|
-
constant_decls.fetch(constant_name, nil)
|
|
279
|
-
end
|
|
280
|
-
end
|
|
281
|
-
else
|
|
282
|
-
class_decls.fetch(type_name, nil) ||
|
|
283
|
-
class_alias_decls.fetch(type_name, nil) ||
|
|
284
|
-
constant_decls.fetch(type_name, nil)
|
|
285
|
-
end
|
|
169
|
+
def constant_entry(type_name)
|
|
170
|
+
class_entry(type_name) || module_entry(type_name) || constant_decls[type_name]
|
|
286
171
|
end
|
|
287
172
|
|
|
288
173
|
def normalize_type_name?(name)
|
|
@@ -317,10 +202,6 @@ module RBS
|
|
|
317
202
|
end
|
|
318
203
|
end
|
|
319
204
|
|
|
320
|
-
def normalize_type_name(name)
|
|
321
|
-
normalize_type_name?(name) || name
|
|
322
|
-
end
|
|
323
|
-
|
|
324
205
|
def normalized_type_name?(type_name)
|
|
325
206
|
case
|
|
326
207
|
when type_name.interface?
|
|
@@ -335,47 +216,56 @@ module RBS
|
|
|
335
216
|
end
|
|
336
217
|
|
|
337
218
|
def normalized_type_name!(name)
|
|
338
|
-
normalized_type_name?(name) or raise "Normalized type name is expected but given `#{name}`"
|
|
219
|
+
normalized_type_name?(name) or raise "Normalized type name is expected but given `#{name}`, which is normalized to `#{normalize_type_name?(name)}`"
|
|
339
220
|
name
|
|
340
221
|
end
|
|
341
222
|
|
|
223
|
+
def normalize_type_name(name)
|
|
224
|
+
normalize_type_name?(name) || name
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def normalize_module_name(name)
|
|
228
|
+
normalize_module_name?(name) or name
|
|
229
|
+
end
|
|
230
|
+
|
|
342
231
|
def normalize_module_name?(name)
|
|
343
232
|
raise "Class/module name is expected: #{name}" unless name.class?
|
|
344
233
|
name = name.absolute! unless name.absolute?
|
|
345
234
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
if @normalize_module_name_cache.key?(original_name)
|
|
349
|
-
return @normalize_module_name_cache[original_name]
|
|
235
|
+
if @normalize_module_name_cache.key?(name)
|
|
236
|
+
return @normalize_module_name_cache[name]
|
|
350
237
|
end
|
|
351
238
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
name =
|
|
358
|
-
|
|
359
|
-
return name
|
|
239
|
+
unless name.namespace.empty?
|
|
240
|
+
parent = name.namespace.to_type_name
|
|
241
|
+
if normalized_parent = normalize_module_name?(parent)
|
|
242
|
+
type_name = TypeName.new(namespace: normalized_parent.to_namespace, name: name.name)
|
|
243
|
+
else
|
|
244
|
+
@normalize_module_name_cache[name] = nil
|
|
245
|
+
return
|
|
360
246
|
end
|
|
361
|
-
|
|
362
|
-
|
|
247
|
+
else
|
|
248
|
+
type_name = name
|
|
363
249
|
end
|
|
364
250
|
|
|
365
|
-
|
|
366
|
-
@normalize_module_name_cache[original_name] = name
|
|
367
|
-
end
|
|
368
|
-
end
|
|
251
|
+
@normalize_module_name_cache[name] = false
|
|
369
252
|
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
253
|
+
entry = constant_entry(type_name)
|
|
254
|
+
|
|
255
|
+
normalized_type_name =
|
|
256
|
+
case entry
|
|
257
|
+
when ClassEntry, ModuleEntry
|
|
258
|
+
type_name
|
|
259
|
+
when ClassAliasEntry, ModuleAliasEntry
|
|
260
|
+
normalize_module_name?(entry.decl.old_name)
|
|
261
|
+
else
|
|
262
|
+
nil
|
|
263
|
+
end
|
|
373
264
|
|
|
374
|
-
|
|
375
|
-
normalize_module_name?(name) or raise "Module name `#{name}` cannot be normalized"
|
|
265
|
+
@normalize_module_name_cache[name] = normalized_type_name
|
|
376
266
|
end
|
|
377
267
|
|
|
378
|
-
def
|
|
268
|
+
def insert_rbs_decl(decl, context:, namespace:)
|
|
379
269
|
case decl
|
|
380
270
|
when AST::Declarations::Class, AST::Declarations::Module
|
|
381
271
|
name = decl.name.with_prefix(namespace)
|
|
@@ -389,9 +279,9 @@ module RBS
|
|
|
389
279
|
unless class_decls.key?(name)
|
|
390
280
|
case decl
|
|
391
281
|
when AST::Declarations::Class
|
|
392
|
-
class_decls[name] ||= ClassEntry.new(name
|
|
282
|
+
class_decls[name] ||= ClassEntry.new(name)
|
|
393
283
|
when AST::Declarations::Module
|
|
394
|
-
class_decls[name] ||= ModuleEntry.new(name
|
|
284
|
+
class_decls[name] ||= ModuleEntry.new(name)
|
|
395
285
|
end
|
|
396
286
|
end
|
|
397
287
|
|
|
@@ -399,17 +289,17 @@ module RBS
|
|
|
399
289
|
|
|
400
290
|
case
|
|
401
291
|
when decl.is_a?(AST::Declarations::Module) && existing_entry.is_a?(ModuleEntry)
|
|
402
|
-
existing_entry
|
|
292
|
+
existing_entry << [context, decl]
|
|
403
293
|
when decl.is_a?(AST::Declarations::Class) && existing_entry.is_a?(ClassEntry)
|
|
404
|
-
existing_entry
|
|
294
|
+
existing_entry << [context, decl]
|
|
405
295
|
else
|
|
406
|
-
raise DuplicatedDeclarationError.new(name, decl, existing_entry.
|
|
296
|
+
raise DuplicatedDeclarationError.new(name, decl, existing_entry.primary_decl)
|
|
407
297
|
end
|
|
408
298
|
|
|
409
|
-
|
|
410
|
-
|
|
299
|
+
inner_context = [context, name] #: Resolver::context
|
|
300
|
+
inner_namespace = name.to_namespace
|
|
411
301
|
decl.each_decl do |d|
|
|
412
|
-
|
|
302
|
+
insert_rbs_decl(d, context: inner_context, namespace: inner_namespace)
|
|
413
303
|
end
|
|
414
304
|
|
|
415
305
|
when AST::Declarations::Interface
|
|
@@ -419,7 +309,7 @@ module RBS
|
|
|
419
309
|
raise DuplicatedDeclarationError.new(name, decl, interface_entry.decl)
|
|
420
310
|
end
|
|
421
311
|
|
|
422
|
-
interface_decls[name] = InterfaceEntry.new(name: name, decl: decl,
|
|
312
|
+
interface_decls[name] = InterfaceEntry.new(name: name, decl: decl, context: context)
|
|
423
313
|
|
|
424
314
|
when AST::Declarations::TypeAlias
|
|
425
315
|
name = decl.name.with_prefix(namespace)
|
|
@@ -428,7 +318,7 @@ module RBS
|
|
|
428
318
|
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
|
|
429
319
|
end
|
|
430
320
|
|
|
431
|
-
type_alias_decls[name] = TypeAliasEntry.new(name: name, decl: decl,
|
|
321
|
+
type_alias_decls[name] = TypeAliasEntry.new(name: name, decl: decl, context: context)
|
|
432
322
|
|
|
433
323
|
when AST::Declarations::Constant
|
|
434
324
|
name = decl.name.with_prefix(namespace)
|
|
@@ -438,18 +328,18 @@ module RBS
|
|
|
438
328
|
when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
|
|
439
329
|
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
|
|
440
330
|
when ClassEntry, ModuleEntry
|
|
441
|
-
raise DuplicatedDeclarationError.new(name, decl, *entry.
|
|
331
|
+
raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
|
|
442
332
|
end
|
|
443
333
|
end
|
|
444
334
|
|
|
445
|
-
constant_decls[name] = ConstantEntry.new(name: name, decl: decl,
|
|
335
|
+
constant_decls[name] = ConstantEntry.new(name: name, decl: decl, context: context)
|
|
446
336
|
|
|
447
337
|
when AST::Declarations::Global
|
|
448
338
|
if entry = global_decls[decl.name]
|
|
449
339
|
raise DuplicatedDeclarationError.new(decl.name, decl, entry.decl)
|
|
450
340
|
end
|
|
451
341
|
|
|
452
|
-
global_decls[decl.name] = GlobalEntry.new(name: decl.name, decl: decl,
|
|
342
|
+
global_decls[decl.name] = GlobalEntry.new(name: decl.name, decl: decl, context: context)
|
|
453
343
|
|
|
454
344
|
when AST::Declarations::ClassAlias, AST::Declarations::ModuleAlias
|
|
455
345
|
name = decl.new_name.with_prefix(namespace)
|
|
@@ -459,35 +349,109 @@ module RBS
|
|
|
459
349
|
when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
|
|
460
350
|
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
|
|
461
351
|
when ClassEntry, ModuleEntry
|
|
462
|
-
raise DuplicatedDeclarationError.new(name, decl, *entry.
|
|
352
|
+
raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
|
|
463
353
|
end
|
|
464
354
|
end
|
|
465
355
|
|
|
466
356
|
case decl
|
|
467
357
|
when AST::Declarations::ClassAlias
|
|
468
|
-
class_alias_decls[name] = ClassAliasEntry.new(name: name, decl: decl,
|
|
358
|
+
class_alias_decls[name] = ClassAliasEntry.new(name: name, decl: decl, context: context)
|
|
469
359
|
when AST::Declarations::ModuleAlias
|
|
470
|
-
class_alias_decls[name] = ModuleAliasEntry.new(name: name, decl: decl,
|
|
360
|
+
class_alias_decls[name] = ModuleAliasEntry.new(name: name, decl: decl, context: context)
|
|
361
|
+
end
|
|
362
|
+
end
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
def insert_ruby_decl(decl, context:, namespace:)
|
|
366
|
+
case decl
|
|
367
|
+
when AST::Ruby::Declarations::ClassDecl
|
|
368
|
+
name = decl.class_name.with_prefix(namespace)
|
|
369
|
+
|
|
370
|
+
if entry = constant_entry(name)
|
|
371
|
+
if entry.is_a?(ConstantEntry) || entry.is_a?(ModuleAliasEntry) || entry.is_a?(ClassAliasEntry)
|
|
372
|
+
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
|
|
373
|
+
end
|
|
374
|
+
if entry.is_a?(ModuleEntry)
|
|
375
|
+
raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
|
|
376
|
+
end
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
entry = ClassEntry.new(name)
|
|
380
|
+
class_decls[name] = entry
|
|
381
|
+
|
|
382
|
+
entry << [context, decl]
|
|
383
|
+
|
|
384
|
+
inner_context = [context, name] #: Resolver::context
|
|
385
|
+
decl.each_decl do |member|
|
|
386
|
+
insert_ruby_decl(member, context: inner_context, namespace: name.to_namespace)
|
|
387
|
+
end
|
|
388
|
+
|
|
389
|
+
when AST::Ruby::Declarations::ModuleDecl
|
|
390
|
+
name = decl.module_name.with_prefix(namespace)
|
|
391
|
+
|
|
392
|
+
if entry = constant_entry(name)
|
|
393
|
+
if entry.is_a?(ConstantEntry) || entry.is_a?(ModuleAliasEntry) || entry.is_a?(ClassAliasEntry)
|
|
394
|
+
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
|
|
395
|
+
end
|
|
396
|
+
if entry.is_a?(ClassEntry)
|
|
397
|
+
raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
|
|
398
|
+
end
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
entry = ModuleEntry.new(name)
|
|
402
|
+
class_decls[name] = entry
|
|
403
|
+
|
|
404
|
+
entry << [context, decl]
|
|
405
|
+
|
|
406
|
+
inner_context = [context, name] #: Resolver::context
|
|
407
|
+
decl.each_decl do |member|
|
|
408
|
+
insert_ruby_decl(member, context: inner_context, namespace: name.to_namespace)
|
|
409
|
+
end
|
|
410
|
+
end
|
|
411
|
+
end
|
|
412
|
+
|
|
413
|
+
def add_source(source)
|
|
414
|
+
sources << source
|
|
415
|
+
|
|
416
|
+
case source
|
|
417
|
+
when Source::RBS
|
|
418
|
+
source.declarations.each do |decl|
|
|
419
|
+
insert_rbs_decl(decl, context: nil, namespace: Namespace.root)
|
|
420
|
+
end
|
|
421
|
+
when Source::Ruby
|
|
422
|
+
source.declarations.each do |dir|
|
|
423
|
+
insert_ruby_decl(dir, context: nil, namespace: Namespace.root)
|
|
471
424
|
end
|
|
472
425
|
end
|
|
473
426
|
end
|
|
474
427
|
|
|
475
|
-
def
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
428
|
+
def each_rbs_source(&block)
|
|
429
|
+
if block
|
|
430
|
+
sources.each do |source|
|
|
431
|
+
if source.is_a?(Source::RBS)
|
|
432
|
+
yield source
|
|
433
|
+
end
|
|
434
|
+
end
|
|
435
|
+
else
|
|
436
|
+
enum_for(:each_rbs_source)
|
|
437
|
+
end
|
|
479
438
|
end
|
|
480
439
|
|
|
481
|
-
def
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
440
|
+
def each_ruby_source(&block)
|
|
441
|
+
if block
|
|
442
|
+
sources.each do |source|
|
|
443
|
+
if source.is_a?(Source::Ruby)
|
|
444
|
+
yield source
|
|
445
|
+
end
|
|
446
|
+
end
|
|
447
|
+
else
|
|
448
|
+
enum_for(:each_ruby_source)
|
|
485
449
|
end
|
|
486
450
|
end
|
|
487
451
|
|
|
488
452
|
def validate_type_params
|
|
489
453
|
class_decls.each_value do |decl|
|
|
490
|
-
decl.
|
|
454
|
+
decl.validate_type_params
|
|
491
455
|
end
|
|
492
456
|
end
|
|
493
457
|
|
|
@@ -506,7 +470,7 @@ module RBS
|
|
|
506
470
|
if only && !only.member?(decl)
|
|
507
471
|
decl
|
|
508
472
|
else
|
|
509
|
-
resolve_declaration(resolver, map, decl,
|
|
473
|
+
resolve_declaration(resolver, map, decl, context: nil, prefix: Namespace.root)
|
|
510
474
|
end
|
|
511
475
|
end
|
|
512
476
|
|
|
@@ -514,7 +478,7 @@ module RBS
|
|
|
514
478
|
end
|
|
515
479
|
|
|
516
480
|
def resolve_type_names(only: nil)
|
|
517
|
-
resolver = Resolver::TypeNameResolver.
|
|
481
|
+
resolver = Resolver::TypeNameResolver.new(self)
|
|
518
482
|
env = Environment.new
|
|
519
483
|
|
|
520
484
|
table = UseMap::Table.new()
|
|
@@ -524,12 +488,22 @@ module RBS
|
|
|
524
488
|
table.known_types.merge(interface_decls.keys)
|
|
525
489
|
table.compute_children
|
|
526
490
|
|
|
527
|
-
|
|
528
|
-
resolve =
|
|
491
|
+
each_rbs_source do |source|
|
|
492
|
+
resolve = source.directives.find { _1.is_a?(AST::Directives::ResolveTypeNames) } #: AST::Directives::ResolveTypeNames?
|
|
529
493
|
if !resolve || resolve.value
|
|
530
|
-
_, decls = resolve_signature(resolver, table,
|
|
494
|
+
_, decls = resolve_signature(resolver, table, source.directives, source.declarations)
|
|
495
|
+
else
|
|
496
|
+
decls = source.declarations
|
|
531
497
|
end
|
|
532
|
-
env.
|
|
498
|
+
env.add_source(Source::RBS.new(source.buffer, source.directives, decls))
|
|
499
|
+
end
|
|
500
|
+
|
|
501
|
+
each_ruby_source do |source|
|
|
502
|
+
decls = source.declarations.map do |decl|
|
|
503
|
+
resolve_ruby_decl(resolver, decl, context: nil, prefix: Namespace.root)
|
|
504
|
+
end
|
|
505
|
+
|
|
506
|
+
env.add_source(Source::Ruby.new(source.buffer, source.prism_result, decls, source.diagnostics))
|
|
533
507
|
end
|
|
534
508
|
|
|
535
509
|
env
|
|
@@ -550,7 +524,7 @@ module RBS
|
|
|
550
524
|
end
|
|
551
525
|
end
|
|
552
526
|
|
|
553
|
-
def resolve_declaration(resolver, map, decl,
|
|
527
|
+
def resolve_declaration(resolver, map, decl, context:, prefix:)
|
|
554
528
|
if decl.is_a?(AST::Declarations::Global)
|
|
555
529
|
# @type var decl: AST::Declarations::Global
|
|
556
530
|
return AST::Declarations::Global.new(
|
|
@@ -562,14 +536,11 @@ module RBS
|
|
|
562
536
|
)
|
|
563
537
|
end
|
|
564
538
|
|
|
565
|
-
context = resolver_context(*outer)
|
|
566
|
-
|
|
567
539
|
case decl
|
|
568
540
|
when AST::Declarations::Class
|
|
569
541
|
outer_context = context
|
|
570
542
|
inner_context = append_context(outer_context, decl)
|
|
571
543
|
|
|
572
|
-
outer_ = outer + [decl]
|
|
573
544
|
prefix_ = prefix + decl.name.to_namespace
|
|
574
545
|
AST::Declarations::Class.new(
|
|
575
546
|
name: decl.name.with_prefix(prefix),
|
|
@@ -590,7 +561,7 @@ module RBS
|
|
|
590
561
|
resolver,
|
|
591
562
|
map,
|
|
592
563
|
member,
|
|
593
|
-
|
|
564
|
+
context: inner_context,
|
|
594
565
|
prefix: prefix_
|
|
595
566
|
)
|
|
596
567
|
else
|
|
@@ -606,7 +577,6 @@ module RBS
|
|
|
606
577
|
outer_context = context
|
|
607
578
|
inner_context = append_context(outer_context, decl)
|
|
608
579
|
|
|
609
|
-
outer_ = outer + [decl]
|
|
610
580
|
prefix_ = prefix + decl.name.to_namespace
|
|
611
581
|
AST::Declarations::Module.new(
|
|
612
582
|
name: decl.name.with_prefix(prefix),
|
|
@@ -627,7 +597,7 @@ module RBS
|
|
|
627
597
|
resolver,
|
|
628
598
|
map,
|
|
629
599
|
member,
|
|
630
|
-
|
|
600
|
+
context: inner_context,
|
|
631
601
|
prefix: prefix_
|
|
632
602
|
)
|
|
633
603
|
else
|
|
@@ -690,6 +660,61 @@ module RBS
|
|
|
690
660
|
end
|
|
691
661
|
end
|
|
692
662
|
|
|
663
|
+
def resolve_ruby_decl(resolver, decl, context:, prefix:)
|
|
664
|
+
case decl
|
|
665
|
+
when AST::Ruby::Declarations::ClassDecl
|
|
666
|
+
full_name = decl.class_name.with_prefix(prefix)
|
|
667
|
+
inner_context = [context, full_name] #: Resolver::context
|
|
668
|
+
inner_prefix = full_name.to_namespace
|
|
669
|
+
|
|
670
|
+
AST::Ruby::Declarations::ClassDecl.new(decl.buffer, full_name, decl.node).tap do |resolved|
|
|
671
|
+
decl.members.each do |member|
|
|
672
|
+
case member
|
|
673
|
+
when AST::Ruby::Declarations::Base
|
|
674
|
+
resolved.members << resolve_ruby_decl(resolver, member, context: inner_context, prefix: inner_prefix)
|
|
675
|
+
when AST::Ruby::Members::Base
|
|
676
|
+
resolved.members << resolve_ruby_member(resolver, member, context: inner_context)
|
|
677
|
+
else
|
|
678
|
+
raise "Unknown member type: #{member.class}"
|
|
679
|
+
end
|
|
680
|
+
end
|
|
681
|
+
end
|
|
682
|
+
|
|
683
|
+
when AST::Ruby::Declarations::ModuleDecl
|
|
684
|
+
full_name = decl.module_name.with_prefix(prefix)
|
|
685
|
+
inner_context = [context, full_name] #: Resolver::context
|
|
686
|
+
inner_prefix = full_name.to_namespace
|
|
687
|
+
|
|
688
|
+
AST::Ruby::Declarations::ModuleDecl.new(decl.buffer, full_name, decl.node).tap do |resolved|
|
|
689
|
+
decl.members.each do |member|
|
|
690
|
+
case member
|
|
691
|
+
when AST::Ruby::Declarations::Base
|
|
692
|
+
resolved.members << resolve_ruby_decl(resolver, member, context: inner_context, prefix: inner_prefix)
|
|
693
|
+
else
|
|
694
|
+
raise "Unknown member type: #{member.class}"
|
|
695
|
+
end
|
|
696
|
+
end
|
|
697
|
+
end
|
|
698
|
+
|
|
699
|
+
else
|
|
700
|
+
raise "Unknown declaration type: #{decl.class}"
|
|
701
|
+
end
|
|
702
|
+
end
|
|
703
|
+
|
|
704
|
+
def resolve_ruby_member(resolver, member, context:)
|
|
705
|
+
case member
|
|
706
|
+
when AST::Ruby::Members::DefMember
|
|
707
|
+
AST::Ruby::Members::DefMember.new(
|
|
708
|
+
member.buffer,
|
|
709
|
+
member.name,
|
|
710
|
+
member.node,
|
|
711
|
+
member.method_type.map_type_name {|name, _, _| absolute_type_name(resolver, nil, name, context: context) }
|
|
712
|
+
)
|
|
713
|
+
else
|
|
714
|
+
raise "Unknown member type: #{member.class}"
|
|
715
|
+
end
|
|
716
|
+
end
|
|
717
|
+
|
|
693
718
|
def resolve_member(resolver, map, member, context:)
|
|
694
719
|
case member
|
|
695
720
|
when AST::Members::MethodDefinition
|
|
@@ -805,7 +830,7 @@ module RBS
|
|
|
805
830
|
end
|
|
806
831
|
|
|
807
832
|
def absolute_type_name(resolver, map, type_name, context:)
|
|
808
|
-
type_name = map.resolve(type_name)
|
|
833
|
+
type_name = map.resolve(type_name) if map
|
|
809
834
|
resolver.resolve(type_name, context: context) || type_name
|
|
810
835
|
end
|
|
811
836
|
|
|
@@ -821,15 +846,16 @@ module RBS
|
|
|
821
846
|
end
|
|
822
847
|
|
|
823
848
|
def buffers
|
|
824
|
-
|
|
849
|
+
sources.map(&:buffer)
|
|
825
850
|
end
|
|
826
851
|
|
|
827
852
|
def unload(buffers)
|
|
828
853
|
env = Environment.new
|
|
854
|
+
bufs = buffers.to_set
|
|
829
855
|
|
|
830
|
-
|
|
831
|
-
next if
|
|
832
|
-
env.
|
|
856
|
+
each_rbs_source do |source|
|
|
857
|
+
next if bufs.include?(source.buffer)
|
|
858
|
+
env.add_source(source)
|
|
833
859
|
end
|
|
834
860
|
|
|
835
861
|
env
|