rbs 3.8.0 → 3.9.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/dependabot.yml +1 -1
- data/.github/workflows/ruby.yml +7 -7
- data/.github/workflows/typecheck.yml +2 -0
- data/.github/workflows/windows.yml +15 -0
- data/.rubocop.yml +20 -1
- data/CHANGELOG.md +14 -0
- data/Rakefile +5 -2
- data/config.yml +6 -0
- data/core/data.rbs +1 -1
- data/core/enumerator.rbs +14 -2
- data/core/exception.rbs +148 -39
- data/core/gc.rbs +2 -2
- data/core/io.rbs +7 -3
- data/core/kernel.rbs +58 -16
- data/core/method.rbs +2 -2
- data/core/module.rbs +3 -3
- data/core/proc.rbs +2 -2
- data/core/ractor.rbs +4 -1
- data/core/rbs/unnamed/argf.rbs +3 -3
- data/core/regexp.rbs +4 -2
- data/core/ruby_vm.rbs +8 -8
- data/core/rubygems/version.rbs +2 -2
- data/core/string.rbs +1 -1
- data/core/time.rbs +1 -1
- data/core/unbound_method.rbs +1 -1
- data/docs/syntax.md +10 -5
- data/ext/rbs_extension/extconf.rb +2 -1
- data/ext/rbs_extension/location.c +32 -10
- data/ext/rbs_extension/location.h +4 -3
- data/ext/rbs_extension/main.c +22 -1
- data/ext/rbs_extension/parser.c +144 -136
- data/ext/rbs_extension/parserstate.c +40 -9
- data/ext/rbs_extension/parserstate.h +6 -4
- data/include/rbs/ruby_objs.h +6 -6
- data/include/rbs/util/rbs_constant_pool.h +219 -0
- data/lib/rbs/ast/declarations.rb +9 -4
- data/lib/rbs/ast/directives.rb +10 -0
- data/lib/rbs/ast/members.rb +2 -0
- data/lib/rbs/ast/type_param.rb +2 -2
- data/lib/rbs/cli/validate.rb +1 -0
- data/lib/rbs/cli.rb +3 -3
- data/lib/rbs/collection/config/lockfile_generator.rb +28 -7
- data/lib/rbs/collection/sources/rubygems.rb +1 -1
- data/lib/rbs/definition.rb +46 -31
- data/lib/rbs/definition_builder/ancestor_builder.rb +2 -0
- data/lib/rbs/definition_builder.rb +86 -30
- data/lib/rbs/environment.rb +33 -18
- data/lib/rbs/errors.rb +23 -0
- data/lib/rbs/locator.rb +2 -0
- data/lib/rbs/method_type.rb +2 -0
- data/lib/rbs/parser_aux.rb +38 -1
- data/lib/rbs/subtractor.rb +3 -3
- data/lib/rbs/test/hook.rb +2 -2
- data/lib/rbs/test/type_check.rb +7 -5
- data/lib/rbs/types.rb +44 -5
- data/lib/rbs/unit_test/spy.rb +4 -2
- data/lib/rbs/unit_test/type_assertions.rb +17 -11
- data/lib/rbs/validator.rb +4 -0
- data/lib/rbs/version.rb +1 -1
- data/lib/rbs/writer.rb +10 -5
- data/lib/rbs.rb +1 -0
- data/rbs.gemspec +1 -1
- data/sig/collection/config/lockfile_generator.rbs +1 -1
- data/sig/declarations.rbs +10 -3
- data/sig/definition.rbs +67 -14
- data/sig/definition_builder.rbs +17 -3
- data/sig/directives.rbs +17 -1
- data/sig/environment.rbs +2 -0
- data/sig/errors.rbs +16 -0
- data/sig/parser.rbs +5 -1
- data/sig/subtractor.rbs +1 -1
- data/sig/test/type_check.rbs +2 -2
- data/sig/type_param.rbs +1 -1
- data/sig/types.rbs +3 -0
- data/sig/unit_test/spy.rbs +2 -0
- data/sig/unit_test/type_assertions.rbs +2 -0
- data/sig/validator.rbs +4 -0
- data/sig/writer.rbs +1 -1
- data/src/ruby_objs.c +12 -6
- data/src/util/rbs_constant_pool.c +342 -0
- data/stdlib/cgi/0/core.rbs +10 -0
- data/stdlib/json/0/json.rbs +52 -50
- data/stdlib/monitor/0/monitor.rbs +13 -4
- data/stdlib/net-http/0/net-http.rbs +2 -2
- data/stdlib/openssl/0/openssl.rbs +73 -73
- data/stdlib/resolv/0/resolv.rbs +8 -8
- data/stdlib/socket/0/addrinfo.rbs +1 -1
- data/stdlib/socket/0/unix_socket.rbs +4 -2
- data/stdlib/stringio/0/stringio.rbs +1 -1
- data/stdlib/uri/0/common.rbs +17 -0
- metadata +4 -7
- data/templates/include/rbs/constants.h.erb +0 -20
- data/templates/include/rbs/ruby_objs.h.erb +0 -10
- data/templates/src/constants.c.erb +0 -36
- data/templates/src/ruby_objs.c.erb +0 -27
- data/templates/template.rb +0 -122
data/lib/rbs/definition.rb
CHANGED
@@ -6,18 +6,23 @@ module RBS
|
|
6
6
|
attr_reader :parent_variable
|
7
7
|
attr_reader :type
|
8
8
|
attr_reader :declared_in
|
9
|
+
attr_reader :source
|
9
10
|
|
10
|
-
def initialize(parent_variable:, type:, declared_in:)
|
11
|
+
def initialize(parent_variable:, type:, declared_in:, source:)
|
11
12
|
@parent_variable = parent_variable
|
12
13
|
@type = type
|
13
14
|
@declared_in = declared_in
|
15
|
+
@source = source
|
14
16
|
end
|
15
17
|
|
16
18
|
def sub(s)
|
19
|
+
return self if s.empty?
|
20
|
+
|
17
21
|
self.class.new(
|
18
22
|
parent_variable: parent_variable,
|
19
23
|
type: type.sub(s),
|
20
|
-
declared_in: declared_in
|
24
|
+
declared_in: declared_in,
|
25
|
+
source: source
|
21
26
|
)
|
22
27
|
end
|
23
28
|
end
|
@@ -37,9 +42,9 @@ module RBS
|
|
37
42
|
@member = member
|
38
43
|
@defined_in = defined_in
|
39
44
|
@implemented_in = implemented_in
|
40
|
-
@member_annotations =
|
41
|
-
@overload_annotations =
|
42
|
-
@annotations =
|
45
|
+
@member_annotations = []
|
46
|
+
@overload_annotations = []
|
47
|
+
@annotations = []
|
43
48
|
end
|
44
49
|
|
45
50
|
def ==(other)
|
@@ -61,7 +66,10 @@ module RBS
|
|
61
66
|
end
|
62
67
|
|
63
68
|
def update(type: self.type, member: self.member, defined_in: self.defined_in, implemented_in: self.implemented_in)
|
64
|
-
TypeDef.new(type: type, member: member, defined_in: defined_in, implemented_in: implemented_in
|
69
|
+
TypeDef.new(type: type, member: member, defined_in: defined_in, implemented_in: implemented_in).tap do |type_def|
|
70
|
+
type_def.overload_annotations.replace(self.overload_annotations)
|
71
|
+
type_def.member_annotations.replace(self.member_annotations)
|
72
|
+
end
|
65
73
|
end
|
66
74
|
|
67
75
|
def overload?
|
@@ -72,20 +80,33 @@ module RBS
|
|
72
80
|
false
|
73
81
|
end
|
74
82
|
end
|
83
|
+
|
84
|
+
def each_annotation(&block)
|
85
|
+
if block
|
86
|
+
member_annotations.each(&block)
|
87
|
+
overload_annotations.each(&block)
|
88
|
+
else
|
89
|
+
enum_for :each_annotation
|
90
|
+
end
|
91
|
+
end
|
75
92
|
end
|
76
93
|
|
77
94
|
attr_reader :super_method
|
78
95
|
attr_reader :defs
|
79
96
|
attr_reader :accessibility
|
80
97
|
attr_reader :extra_annotations
|
98
|
+
attr_reader :annotations
|
81
99
|
attr_reader :alias_of
|
100
|
+
attr_reader :alias_member
|
82
101
|
|
83
|
-
def initialize(super_method:, defs:, accessibility:, annotations: [], alias_of:)
|
102
|
+
def initialize(super_method:, defs:, accessibility:, annotations: [], alias_of:, alias_member: nil)
|
84
103
|
@super_method = super_method
|
85
104
|
@defs = defs
|
86
105
|
@accessibility = accessibility
|
87
106
|
@extra_annotations = []
|
107
|
+
@annotations = []
|
88
108
|
@alias_of = alias_of
|
109
|
+
@alias_member = alias_member
|
89
110
|
end
|
90
111
|
|
91
112
|
def ==(other)
|
@@ -94,7 +115,8 @@ module RBS
|
|
94
115
|
other.defs == defs &&
|
95
116
|
other.accessibility == accessibility &&
|
96
117
|
other.annotations == annotations &&
|
97
|
-
other.alias_of == alias_of
|
118
|
+
other.alias_of == alias_of &&
|
119
|
+
other.alias_member == alias_member
|
98
120
|
end
|
99
121
|
|
100
122
|
alias eql? ==
|
@@ -125,10 +147,6 @@ module RBS
|
|
125
147
|
@comments ||= defs.map(&:comment).compact.uniq
|
126
148
|
end
|
127
149
|
|
128
|
-
def annotations
|
129
|
-
@annotations ||= defs.flat_map {|d| d.member_annotations }
|
130
|
-
end
|
131
|
-
|
132
150
|
def members
|
133
151
|
@members ||= defs.map(&:member).uniq
|
134
152
|
end
|
@@ -142,49 +160,44 @@ module RBS
|
|
142
160
|
end
|
143
161
|
|
144
162
|
def sub(s)
|
145
|
-
self.
|
163
|
+
return self if s.empty?
|
164
|
+
|
165
|
+
update(
|
146
166
|
super_method: super_method&.sub(s),
|
147
|
-
defs: defs.map {|defn| defn.update(type: defn.type.sub(s)) }
|
148
|
-
accessibility: @accessibility,
|
149
|
-
alias_of: alias_of
|
167
|
+
defs: defs.map {|defn| defn.update(type: defn.type.sub(s)) }
|
150
168
|
)
|
151
169
|
end
|
152
170
|
|
153
171
|
def map_type(&block)
|
154
|
-
|
172
|
+
update(
|
155
173
|
super_method: super_method&.map_type(&block),
|
156
|
-
defs: defs.map {|defn| defn.update(type: defn.type.map_type(&block)) }
|
157
|
-
accessibility: @accessibility,
|
158
|
-
alias_of: alias_of
|
174
|
+
defs: defs.map {|defn| defn.update(type: defn.type.map_type(&block)) }
|
159
175
|
)
|
160
176
|
end
|
161
177
|
|
162
178
|
def map_type_bound(&block)
|
163
|
-
|
179
|
+
update(
|
164
180
|
super_method: super_method&.map_type_bound(&block),
|
165
|
-
defs: defs.map {|defn| defn.update(type: defn.type.map_type_bound(&block)) }
|
166
|
-
accessibility: @accessibility,
|
167
|
-
alias_of: alias_of
|
181
|
+
defs: defs.map {|defn| defn.update(type: defn.type.map_type_bound(&block)) }
|
168
182
|
)
|
169
183
|
end
|
170
184
|
|
171
185
|
def map_method_type(&block)
|
172
|
-
|
173
|
-
super_method: super_method,
|
186
|
+
update(
|
174
187
|
defs: defs.map {|defn| defn.update(type: yield(defn.type)) },
|
175
|
-
accessibility: @accessibility,
|
176
|
-
alias_of: alias_of
|
177
188
|
)
|
178
189
|
end
|
179
190
|
|
180
|
-
def update(super_method: self.super_method, defs: self.defs, accessibility: self.accessibility, alias_of: self.alias_of, annotations: self.annotations)
|
191
|
+
def update(super_method: self.super_method, defs: self.defs, accessibility: self.accessibility, alias_of: self.alias_of, annotations: self.annotations, alias_member: self.alias_member)
|
181
192
|
self.class.new(
|
182
193
|
super_method: super_method,
|
183
194
|
defs: defs,
|
184
195
|
accessibility: accessibility,
|
185
196
|
alias_of: alias_of,
|
186
|
-
|
187
|
-
)
|
197
|
+
alias_member: alias_member
|
198
|
+
).tap do |method|
|
199
|
+
method.annotations.replace(annotations)
|
200
|
+
end
|
188
201
|
end
|
189
202
|
end
|
190
203
|
|
@@ -347,6 +360,8 @@ module RBS
|
|
347
360
|
end
|
348
361
|
|
349
362
|
def sub(s)
|
363
|
+
return self if s.empty?
|
364
|
+
|
350
365
|
definition = self.class.new(type_name: type_name, self_type: _ = self_type.sub(s), ancestors: ancestors, entry: entry)
|
351
366
|
|
352
367
|
definition.methods.merge!(methods.transform_values {|method| method.sub(s) })
|
@@ -217,6 +217,7 @@ module RBS
|
|
217
217
|
NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
|
218
218
|
if super_class
|
219
219
|
InheritModuleError.check!(super_class, env: env)
|
220
|
+
InvalidTypeApplicationError.check2!(type_name: super_class.name, args: super_class.args, env: env, location: super_class.location)
|
220
221
|
end
|
221
222
|
|
222
223
|
super_entry = env.normalized_class_entry(super_name) or raise
|
@@ -243,6 +244,7 @@ module RBS
|
|
243
244
|
else
|
244
245
|
entry.self_types.each do |module_self|
|
245
246
|
NoSelfTypeFoundError.check!(module_self, env: env)
|
247
|
+
InvalidTypeApplicationError.check2!(type_name: module_self.name, args: module_self.args, env: env, location: module_self.location)
|
246
248
|
|
247
249
|
module_name = module_self.name
|
248
250
|
if module_name.class?
|
@@ -82,7 +82,7 @@ module RBS
|
|
82
82
|
AST::TypeParam.application(params, args) || Substitution.new()
|
83
83
|
end
|
84
84
|
|
85
|
-
def define_instance(definition, type_name, subst)
|
85
|
+
def define_instance(definition, type_name, subst, define_class_vars:)
|
86
86
|
one_ancestors = ancestor_builder.one_instance_ancestors(type_name)
|
87
87
|
methods = method_builder.build_instance(type_name)
|
88
88
|
|
@@ -104,7 +104,7 @@ module RBS
|
|
104
104
|
validate_type_presence(arg)
|
105
105
|
end
|
106
106
|
|
107
|
-
define_instance(definition, mod.name, subst + tapp_subst(mod.name, mod.args))
|
107
|
+
define_instance(definition, mod.name, subst + tapp_subst(mod.name, mod.args), define_class_vars: define_class_vars)
|
108
108
|
end
|
109
109
|
|
110
110
|
all_interfaces = one_ancestors.each_included_interface.flat_map do |interface|
|
@@ -120,7 +120,7 @@ module RBS
|
|
120
120
|
validate_type_presence(arg)
|
121
121
|
end
|
122
122
|
|
123
|
-
define_instance(definition, mod.name, subst + tapp_subst(mod.name, mod.args))
|
123
|
+
define_instance(definition, mod.name, subst + tapp_subst(mod.name, mod.args), define_class_vars: define_class_vars)
|
124
124
|
end
|
125
125
|
|
126
126
|
entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
|
@@ -145,7 +145,8 @@ module RBS
|
|
145
145
|
type_name,
|
146
146
|
definition.instance_variables,
|
147
147
|
name: ivar_name,
|
148
|
-
type: member.type.sub(subst_)
|
148
|
+
type: member.type.sub(subst_),
|
149
|
+
source: member
|
149
150
|
)
|
150
151
|
end
|
151
152
|
end
|
@@ -155,11 +156,14 @@ module RBS
|
|
155
156
|
type_name,
|
156
157
|
definition.instance_variables,
|
157
158
|
name: member.name,
|
158
|
-
type: member.type.sub(subst_)
|
159
|
+
type: member.type.sub(subst_),
|
160
|
+
source: member
|
159
161
|
)
|
160
162
|
|
161
163
|
when AST::Members::ClassVariable
|
162
|
-
|
164
|
+
if define_class_vars
|
165
|
+
insert_variable(type_name, definition.class_variables, name: member.name, type: member.type, source: member)
|
166
|
+
end
|
163
167
|
end
|
164
168
|
end
|
165
169
|
end
|
@@ -214,13 +218,13 @@ module RBS
|
|
214
218
|
if ans.name.interface?
|
215
219
|
define_interface(definition, ans.name, subst)
|
216
220
|
else
|
217
|
-
define_instance(definition, ans.name, subst)
|
221
|
+
define_instance(definition, ans.name, subst, define_class_vars: true)
|
218
222
|
end
|
219
223
|
end
|
220
224
|
end
|
221
225
|
end
|
222
226
|
|
223
|
-
define_instance(definition, type_name, Substitution.new)
|
227
|
+
define_instance(definition, type_name, Substitution.new, define_class_vars: true)
|
224
228
|
end
|
225
229
|
end
|
226
230
|
end
|
@@ -249,7 +253,6 @@ module RBS
|
|
249
253
|
|
250
254
|
definition.methods.merge!(defn.methods)
|
251
255
|
definition.instance_variables.merge!(defn.instance_variables)
|
252
|
-
definition.class_variables.merge!(defn.class_variables)
|
253
256
|
end
|
254
257
|
|
255
258
|
one_ancestors.each_extended_module do |mod|
|
@@ -258,7 +261,7 @@ module RBS
|
|
258
261
|
end
|
259
262
|
|
260
263
|
subst = tapp_subst(mod.name, mod.args)
|
261
|
-
define_instance(definition, mod.name, subst)
|
264
|
+
define_instance(definition, mod.name, subst, define_class_vars: false)
|
262
265
|
end
|
263
266
|
|
264
267
|
all_interfaces = one_ancestors.each_extended_interface.flat_map do |interface|
|
@@ -282,18 +285,18 @@ module RBS
|
|
282
285
|
end
|
283
286
|
|
284
287
|
if ivar_name
|
285
|
-
insert_variable(type_name, definition.instance_variables, name: ivar_name, type: member.type)
|
288
|
+
insert_variable(type_name, definition.instance_variables, name: ivar_name, type: member.type, source: member)
|
286
289
|
end
|
287
290
|
end
|
288
291
|
|
289
292
|
when AST::Members::ClassInstanceVariable
|
290
|
-
insert_variable(type_name, definition.instance_variables, name: member.name, type: member.type)
|
291
|
-
|
292
|
-
when AST::Members::ClassVariable
|
293
|
-
insert_variable(type_name, definition.class_variables, name: member.name, type: member.type)
|
293
|
+
insert_variable(type_name, definition.instance_variables, name: member.name, type: member.type, source: member)
|
294
294
|
end
|
295
295
|
end
|
296
296
|
end
|
297
|
+
|
298
|
+
instance_definition = build_instance(type_name)
|
299
|
+
definition.class_variables.replace(instance_definition.class_variables)
|
297
300
|
end
|
298
301
|
end
|
299
302
|
end
|
@@ -386,12 +389,14 @@ module RBS
|
|
386
389
|
type: method_type,
|
387
390
|
member: initialize_def.member,
|
388
391
|
defined_in: initialize_def.defined_in,
|
389
|
-
implemented_in: initialize_def.implemented_in
|
390
|
-
|
391
|
-
|
392
|
+
implemented_in: initialize_def.implemented_in
|
393
|
+
).tap do |type_def|
|
394
|
+
type_def.overload_annotations.replace(initialize_def.overload_annotations)
|
395
|
+
end
|
392
396
|
end,
|
393
397
|
accessibility: :public,
|
394
|
-
alias_of: nil
|
398
|
+
alias_of: nil,
|
399
|
+
alias_member: nil
|
395
400
|
)
|
396
401
|
|
397
402
|
definition.methods[:new] = typed_new
|
@@ -535,12 +540,42 @@ module RBS
|
|
535
540
|
end
|
536
541
|
end
|
537
542
|
|
538
|
-
def insert_variable(type_name, variables, name:, type:)
|
543
|
+
def insert_variable(type_name, variables, name:, type:, source:)
|
539
544
|
variables[name] = Definition::Variable.new(
|
540
545
|
parent_variable: variables[name],
|
541
546
|
type: type,
|
542
|
-
declared_in: type_name
|
547
|
+
declared_in: type_name,
|
548
|
+
source: source
|
543
549
|
)
|
550
|
+
validate_variable(variables[name])
|
551
|
+
end
|
552
|
+
|
553
|
+
def validate_variable(var)
|
554
|
+
return unless var.parent_variable
|
555
|
+
|
556
|
+
# Ignore attrs
|
557
|
+
variables = [] #: Array[Definition::Variable]
|
558
|
+
tmp_var = var
|
559
|
+
while tmp_var
|
560
|
+
variables << tmp_var if tmp_var.source.is_a?(AST::Members::Var)
|
561
|
+
tmp_var = tmp_var.parent_variable
|
562
|
+
end
|
563
|
+
|
564
|
+
# Duplicates should be eliminated, so there can't be more than 3.
|
565
|
+
return unless variables.length == 2
|
566
|
+
|
567
|
+
l, r = variables #: [Definition::Variable, Definition::Variable]
|
568
|
+
|
569
|
+
case l.source
|
570
|
+
when AST::Members::InstanceVariable
|
571
|
+
if r.source.instance_of?(AST::Members::InstanceVariable) && l.declared_in == r.declared_in
|
572
|
+
raise InstanceVariableDuplicationError.new(member: l.source)
|
573
|
+
end
|
574
|
+
when AST::Members::ClassInstanceVariable
|
575
|
+
if r.source.instance_of?(AST::Members::ClassInstanceVariable) && l.declared_in == r.declared_in
|
576
|
+
raise ClassInstanceVariableDuplicationError.new(member: l.source)
|
577
|
+
end
|
578
|
+
end
|
544
579
|
end
|
545
580
|
|
546
581
|
def import_methods(definition, module_name, module_methods, interfaces_methods, subst, self_type_methods)
|
@@ -626,8 +661,11 @@ module RBS
|
|
626
661
|
defn.update(defined_in: defined_in, implemented_in: implemented_in)
|
627
662
|
end,
|
628
663
|
accessibility: original_method.accessibility,
|
629
|
-
alias_of: original_method
|
664
|
+
alias_of: original_method,
|
665
|
+
alias_member: original
|
630
666
|
)
|
667
|
+
|
668
|
+
method_definition.annotations.replace(original.annotations)
|
631
669
|
when AST::Members::MethodDefinition
|
632
670
|
if duplicated_method = methods[method.name]
|
633
671
|
raise DuplicatedMethodDefinitionError.new(
|
@@ -642,9 +680,11 @@ module RBS
|
|
642
680
|
type: subst.empty? ? overload.method_type : overload.method_type.sub(subst),
|
643
681
|
member: original,
|
644
682
|
defined_in: defined_in,
|
645
|
-
implemented_in: implemented_in
|
646
|
-
|
647
|
-
|
683
|
+
implemented_in: implemented_in
|
684
|
+
).tap do |type_def|
|
685
|
+
# Keep the original annotations given to overloads.
|
686
|
+
type_def.overload_annotations.replace(overload.annotations)
|
687
|
+
end
|
648
688
|
end
|
649
689
|
|
650
690
|
# @type var accessibility: RBS::Definition::accessibility
|
@@ -664,8 +704,11 @@ module RBS
|
|
664
704
|
super_method: super_method,
|
665
705
|
defs: defs,
|
666
706
|
accessibility: accessibility,
|
667
|
-
alias_of: nil
|
707
|
+
alias_of: nil,
|
708
|
+
alias_member: nil
|
668
709
|
)
|
710
|
+
|
711
|
+
method_definition.annotations.replace(original.annotations)
|
669
712
|
when AST::Members::AttrReader, AST::Members::AttrWriter, AST::Members::AttrAccessor
|
670
713
|
if duplicated_method = methods[method.name]
|
671
714
|
raise DuplicatedMethodDefinitionError.new(
|
@@ -714,8 +757,11 @@ module RBS
|
|
714
757
|
)
|
715
758
|
],
|
716
759
|
accessibility: method.accessibility,
|
717
|
-
alias_of: nil
|
760
|
+
alias_of: nil,
|
761
|
+
alias_member: nil
|
718
762
|
)
|
763
|
+
|
764
|
+
method_definition.annotations.replace(original.annotations)
|
719
765
|
when nil
|
720
766
|
# Overloading method definition only
|
721
767
|
|
@@ -742,8 +788,11 @@ module RBS
|
|
742
788
|
defn.update(implemented_in: implemented_in)
|
743
789
|
end,
|
744
790
|
accessibility: existing_method.accessibility,
|
745
|
-
alias_of: existing_method.alias_of
|
791
|
+
alias_of: existing_method.alias_of,
|
792
|
+
alias_member: nil
|
746
793
|
)
|
794
|
+
|
795
|
+
method_definition.annotations.replace(existing_method.annotations)
|
747
796
|
end
|
748
797
|
|
749
798
|
method.overloads.each do |overloading_def|
|
@@ -752,12 +801,19 @@ module RBS
|
|
752
801
|
type: subst.empty? ? overload.method_type : overload.method_type.sub(subst),
|
753
802
|
member: overloading_def,
|
754
803
|
defined_in: defined_in,
|
755
|
-
implemented_in: implemented_in
|
756
|
-
overload_annotations: overload.annotations
|
804
|
+
implemented_in: implemented_in
|
757
805
|
)
|
758
806
|
|
807
|
+
type_def.overload_annotations.replace(overload.annotations)
|
808
|
+
|
759
809
|
method_definition.defs.unshift(type_def)
|
760
810
|
end
|
811
|
+
|
812
|
+
method_definition.annotations.concat(overloading_def.annotations)
|
813
|
+
end
|
814
|
+
|
815
|
+
method_definition.defs.each do |type_def|
|
816
|
+
type_def.member_annotations.replace(method_definition.annotations)
|
761
817
|
end
|
762
818
|
|
763
819
|
methods[method.name] = method_definition
|
data/lib/rbs/environment.rb
CHANGED
@@ -486,6 +486,28 @@ module RBS
|
|
486
486
|
end
|
487
487
|
end
|
488
488
|
|
489
|
+
def resolve_signature(resolver, table, dirs, decls, only: nil)
|
490
|
+
map = UseMap.new(table: table)
|
491
|
+
dirs.each do |dir|
|
492
|
+
case dir
|
493
|
+
when AST::Directives::Use
|
494
|
+
dir.clauses.each do |clause|
|
495
|
+
map.build_map(clause)
|
496
|
+
end
|
497
|
+
end
|
498
|
+
end
|
499
|
+
|
500
|
+
decls = decls.map do |decl|
|
501
|
+
if only && !only.member?(decl)
|
502
|
+
decl
|
503
|
+
else
|
504
|
+
resolve_declaration(resolver, map, decl, outer: [], prefix: Namespace.root)
|
505
|
+
end
|
506
|
+
end
|
507
|
+
|
508
|
+
[dirs, decls]
|
509
|
+
end
|
510
|
+
|
489
511
|
def resolve_type_names(only: nil)
|
490
512
|
resolver = Resolver::TypeNameResolver.new(self)
|
491
513
|
env = Environment.new
|
@@ -498,21 +520,10 @@ module RBS
|
|
498
520
|
table.compute_children
|
499
521
|
|
500
522
|
signatures.each do |buffer, (dirs, decls)|
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
map.build_map(clause)
|
505
|
-
end
|
506
|
-
end
|
507
|
-
|
508
|
-
decls = decls.map do |decl|
|
509
|
-
if only && !only.member?(decl)
|
510
|
-
decl
|
511
|
-
else
|
512
|
-
resolve_declaration(resolver, map, decl, outer: [], prefix: Namespace.root)
|
513
|
-
end
|
523
|
+
resolve = dirs.find { _1.is_a?(AST::Directives::ResolveTypeNames) } #: AST::Directives::ResolveTypeNames?
|
524
|
+
if !resolve || resolve.value
|
525
|
+
_, decls = resolve_signature(resolver, table, dirs, decls)
|
514
526
|
end
|
515
|
-
|
516
527
|
env.add_signature(buffer: buffer, directives: dirs, decls: decls)
|
517
528
|
end
|
518
529
|
|
@@ -541,7 +552,8 @@ module RBS
|
|
541
552
|
name: decl.name,
|
542
553
|
type: absolute_type(resolver, map, decl.type, context: nil),
|
543
554
|
location: decl.location,
|
544
|
-
comment: decl.comment
|
555
|
+
comment: decl.comment,
|
556
|
+
annotations: decl.annotations
|
545
557
|
)
|
546
558
|
end
|
547
559
|
|
@@ -649,7 +661,8 @@ module RBS
|
|
649
661
|
name: decl.name.with_prefix(prefix),
|
650
662
|
type: absolute_type(resolver, map, decl.type, context: context),
|
651
663
|
location: decl.location,
|
652
|
-
comment: decl.comment
|
664
|
+
comment: decl.comment,
|
665
|
+
annotations: decl.annotations
|
653
666
|
)
|
654
667
|
|
655
668
|
when AST::Declarations::ClassAlias
|
@@ -657,7 +670,8 @@ module RBS
|
|
657
670
|
new_name: decl.new_name.with_prefix(prefix),
|
658
671
|
old_name: absolute_type_name(resolver, map, decl.old_name, context: context),
|
659
672
|
location: decl.location,
|
660
|
-
comment: decl.comment
|
673
|
+
comment: decl.comment,
|
674
|
+
annotations: decl.annotations
|
661
675
|
)
|
662
676
|
|
663
677
|
when AST::Declarations::ModuleAlias
|
@@ -665,7 +679,8 @@ module RBS
|
|
665
679
|
new_name: decl.new_name.with_prefix(prefix),
|
666
680
|
old_name: absolute_type_name(resolver, map, decl.old_name, context: context),
|
667
681
|
location: decl.location,
|
668
|
-
comment: decl.comment
|
682
|
+
comment: decl.comment,
|
683
|
+
annotations: decl.annotations
|
669
684
|
)
|
670
685
|
end
|
671
686
|
end
|
data/lib/rbs/errors.rb
CHANGED
@@ -322,6 +322,29 @@ module RBS
|
|
322
322
|
end
|
323
323
|
end
|
324
324
|
|
325
|
+
class VariableDuplicationError < DefinitionError
|
326
|
+
include DetailedMessageable
|
327
|
+
|
328
|
+
attr_reader :member
|
329
|
+
|
330
|
+
def initialize(member:)
|
331
|
+
@member = member
|
332
|
+
|
333
|
+
super "#{Location.to_string location}: Duplicated variable name #{member.name}"
|
334
|
+
end
|
335
|
+
|
336
|
+
def location
|
337
|
+
loc = @member.location or raise
|
338
|
+
loc[:name]
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
class InstanceVariableDuplicationError < VariableDuplicationError
|
343
|
+
end
|
344
|
+
|
345
|
+
class ClassInstanceVariableDuplicationError < VariableDuplicationError
|
346
|
+
end
|
347
|
+
|
325
348
|
class UnknownMethodAliasError < DefinitionError
|
326
349
|
include DetailedMessageable
|
327
350
|
|
data/lib/rbs/locator.rb
CHANGED
data/lib/rbs/method_type.rb
CHANGED
data/lib/rbs/parser_aux.rb
CHANGED
@@ -17,11 +17,48 @@ module RBS
|
|
17
17
|
|
18
18
|
def self.parse_signature(source)
|
19
19
|
buf = buffer(source)
|
20
|
-
|
20
|
+
|
21
|
+
resolved = magic_comment(buf)
|
22
|
+
start_pos =
|
23
|
+
if resolved
|
24
|
+
(resolved.location || raise).end_pos
|
25
|
+
else
|
26
|
+
0
|
27
|
+
end
|
28
|
+
dirs, decls = _parse_signature(buf, start_pos, buf.last_position)
|
29
|
+
|
30
|
+
if resolved
|
31
|
+
dirs = dirs.dup if dirs.frozen?
|
32
|
+
dirs.unshift(resolved)
|
33
|
+
end
|
21
34
|
|
22
35
|
[buf, dirs, decls]
|
23
36
|
end
|
24
37
|
|
38
|
+
def self.magic_comment(buf)
|
39
|
+
start_pos = 0
|
40
|
+
|
41
|
+
while true
|
42
|
+
case
|
43
|
+
when match = /\A#\s*(?<keyword>resolve-type-names)\s*(?<colon>:)\s+(?<value>true|false)$/.match(buf.content, start_pos)
|
44
|
+
value = match[:value] or raise
|
45
|
+
|
46
|
+
kw_offset = match.offset(:keyword) #: [Integer, Integer]
|
47
|
+
colon_offset = match.offset(:colon) #: [Integer, Integer]
|
48
|
+
value_offset = match.offset(:value) #: [Integer, Integer]
|
49
|
+
|
50
|
+
location = Location.new(buf, kw_offset[0], value_offset[1])
|
51
|
+
location.add_required_child(:keyword, kw_offset[0]...kw_offset[1])
|
52
|
+
location.add_required_child(:colon, colon_offset[0]...colon_offset[1])
|
53
|
+
location.add_required_child(:value, value_offset[0]...value_offset[1])
|
54
|
+
|
55
|
+
return AST::Directives::ResolveTypeNames.new(value: value == "true", location: location)
|
56
|
+
else
|
57
|
+
return
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
25
62
|
def self.lex(source)
|
26
63
|
buf = buffer(source)
|
27
64
|
list = _lex(buf, buf.last_position)
|
data/lib/rbs/subtractor.rb
CHANGED
@@ -40,7 +40,7 @@ module RBS
|
|
40
40
|
name = absolute_typename(decl.new_name, context: context)
|
41
41
|
decl unless @subtrahend.module_alias?(name) || @subtrahend.module_decl?(name)
|
42
42
|
else
|
43
|
-
raise "
|
43
|
+
raise "unknown decl: #{(_ = decl).class}"
|
44
44
|
end
|
45
45
|
end.compact
|
46
46
|
end
|
@@ -51,7 +51,7 @@ module RBS
|
|
51
51
|
context = _ = [context, decl.name]
|
52
52
|
children = call(decl.each_decl.to_a, context: context) +
|
53
53
|
decl.each_member.reject { |m| member_exist?(owner, m, context: context) }
|
54
|
-
children =
|
54
|
+
children = filter_redundant_access_modifiers(children)
|
55
55
|
return nil if children.empty?
|
56
56
|
|
57
57
|
update_decl(decl, members: children)
|
@@ -145,7 +145,7 @@ module RBS
|
|
145
145
|
end
|
146
146
|
end
|
147
147
|
|
148
|
-
private def
|
148
|
+
private def filter_redundant_access_modifiers(decls)
|
149
149
|
decls = decls.dup
|
150
150
|
decls.pop while access_modifier?(decls.last)
|
151
151
|
decls = decls.map.with_index do |decl, i|
|