rbs 3.8.1 → 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.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/dependabot.yml +1 -1
  3. data/.github/workflows/typecheck.yml +2 -0
  4. data/.github/workflows/windows.yml +15 -0
  5. data/.rubocop.yml +13 -1
  6. data/Rakefile +5 -2
  7. data/config.yml +6 -0
  8. data/core/data.rbs +1 -1
  9. data/core/enumerator.rbs +14 -2
  10. data/core/exception.rbs +1 -1
  11. data/core/gc.rbs +1 -1
  12. data/core/io.rbs +7 -3
  13. data/core/kernel.rbs +2 -2
  14. data/core/method.rbs +2 -2
  15. data/core/module.rbs +3 -3
  16. data/core/proc.rbs +2 -2
  17. data/core/rbs/unnamed/argf.rbs +3 -3
  18. data/core/rubygems/version.rbs +2 -2
  19. data/core/string.rbs +1 -1
  20. data/core/unbound_method.rbs +1 -1
  21. data/docs/syntax.md +10 -5
  22. data/ext/rbs_extension/extconf.rb +2 -1
  23. data/ext/rbs_extension/location.c +32 -10
  24. data/ext/rbs_extension/location.h +4 -3
  25. data/ext/rbs_extension/main.c +22 -1
  26. data/ext/rbs_extension/parser.c +144 -136
  27. data/ext/rbs_extension/parserstate.c +40 -9
  28. data/ext/rbs_extension/parserstate.h +6 -4
  29. data/include/rbs/ruby_objs.h +6 -6
  30. data/include/rbs/util/rbs_constant_pool.h +219 -0
  31. data/lib/rbs/ast/declarations.rb +9 -4
  32. data/lib/rbs/ast/directives.rb +10 -0
  33. data/lib/rbs/ast/members.rb +2 -0
  34. data/lib/rbs/ast/type_param.rb +2 -2
  35. data/lib/rbs/cli/validate.rb +1 -0
  36. data/lib/rbs/cli.rb +3 -3
  37. data/lib/rbs/collection/config/lockfile_generator.rb +28 -7
  38. data/lib/rbs/collection/sources/rubygems.rb +1 -1
  39. data/lib/rbs/definition.rb +46 -31
  40. data/lib/rbs/definition_builder/ancestor_builder.rb +2 -0
  41. data/lib/rbs/definition_builder.rb +86 -30
  42. data/lib/rbs/environment.rb +33 -18
  43. data/lib/rbs/errors.rb +23 -0
  44. data/lib/rbs/locator.rb +2 -0
  45. data/lib/rbs/method_type.rb +2 -0
  46. data/lib/rbs/parser_aux.rb +38 -1
  47. data/lib/rbs/subtractor.rb +3 -3
  48. data/lib/rbs/test/hook.rb +2 -2
  49. data/lib/rbs/test/type_check.rb +7 -5
  50. data/lib/rbs/types.rb +44 -5
  51. data/lib/rbs/unit_test/spy.rb +4 -2
  52. data/lib/rbs/unit_test/type_assertions.rb +17 -11
  53. data/lib/rbs/validator.rb +4 -0
  54. data/lib/rbs/version.rb +1 -1
  55. data/lib/rbs/writer.rb +10 -5
  56. data/lib/rbs.rb +1 -0
  57. data/rbs.gemspec +1 -1
  58. data/sig/collection/config/lockfile_generator.rbs +1 -1
  59. data/sig/declarations.rbs +10 -3
  60. data/sig/definition.rbs +67 -14
  61. data/sig/definition_builder.rbs +17 -3
  62. data/sig/directives.rbs +17 -1
  63. data/sig/environment.rbs +2 -0
  64. data/sig/errors.rbs +16 -0
  65. data/sig/parser.rbs +5 -1
  66. data/sig/subtractor.rbs +1 -1
  67. data/sig/test/type_check.rbs +2 -2
  68. data/sig/type_param.rbs +1 -1
  69. data/sig/types.rbs +3 -0
  70. data/sig/unit_test/spy.rbs +2 -0
  71. data/sig/unit_test/type_assertions.rbs +2 -0
  72. data/sig/validator.rbs +4 -0
  73. data/sig/writer.rbs +1 -1
  74. data/src/ruby_objs.c +12 -6
  75. data/src/util/rbs_constant_pool.c +342 -0
  76. data/stdlib/cgi/0/core.rbs +10 -0
  77. data/stdlib/json/0/json.rbs +52 -50
  78. data/stdlib/net-http/0/net-http.rbs +2 -2
  79. data/stdlib/openssl/0/openssl.rbs +73 -73
  80. data/stdlib/resolv/0/resolv.rbs +8 -8
  81. data/stdlib/socket/0/addrinfo.rbs +1 -1
  82. data/stdlib/socket/0/unix_socket.rbs +4 -2
  83. data/stdlib/stringio/0/stringio.rbs +1 -1
  84. data/stdlib/uri/0/common.rbs +17 -0
  85. metadata +4 -7
  86. data/templates/include/rbs/constants.h.erb +0 -20
  87. data/templates/include/rbs/ruby_objs.h.erb +0 -10
  88. data/templates/src/constants.c.erb +0 -36
  89. data/templates/src/ruby_objs.c.erb +0 -27
  90. data/templates/template.rb +0 -122
@@ -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 = member.annotations
41
- @overload_annotations = overload_annotations
42
- @annotations = member.annotations + overload_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, overload_annotations: overload_annotations)
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.class.new(
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
- self.class.new(
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
- self.class.new(
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
- self.class.new(
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
- annotations: annotations
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
- insert_variable(type_name, definition.class_variables, name: member.name, type: member.type)
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
- overload_annotations: initialize_def.overload_annotations
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
- overload_annotations: overload.annotations
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
@@ -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
- map = UseMap.new(table: table)
502
- dirs.each do |dir|
503
- dir.clauses.each do |clause|
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
@@ -40,6 +40,8 @@ module RBS
40
40
  end
41
41
 
42
42
  def find_in_directive(pos, dir, array)
43
+ return false unless dir.is_a?(AST::Directives::Use)
44
+
43
45
  if test_loc(pos, location: dir.location)
44
46
  array.unshift(dir)
45
47
 
@@ -33,6 +33,8 @@ module RBS
33
33
  def sub(s)
34
34
  sub = s.without(*type_param_names)
35
35
 
36
+ return self if sub.empty?
37
+
36
38
  self.class.new(
37
39
  type_params: type_params.map do |param|
38
40
  param.map_type do |bound|
@@ -17,11 +17,48 @@ module RBS
17
17
 
18
18
  def self.parse_signature(source)
19
19
  buf = buffer(source)
20
- dirs, decls = _parse_signature(buf, buf.last_position)
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)
@@ -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 "unknwon decl: #{(_ = decl).class}"
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 = filter_redundunt_access_modifiers(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 filter_redundunt_access_modifiers(decls)
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|
data/lib/rbs/test/hook.rb CHANGED
@@ -27,8 +27,8 @@ module RBS
27
27
  :! => "not",
28
28
  :<< => "lshift",
29
29
  :>> => "rshift",
30
- :~ => "tilda",
31
- :=~ => "eqtilda",
30
+ :~ => "tilde",
31
+ :=~ => "eqtilde",
32
32
  :% => "percent",
33
33
  :+@ => "unary_plus",
34
34
  :-@ => "unary_minus"