rbs 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce3b2807a94277727870ef841bdb1e3a96567098948930ab6885e9fba2fc3ccf
4
- data.tar.gz: 5d4a01b26887124240ec757b8a0374c79d56c3daf8b32431a571a3ba401112cc
3
+ metadata.gz: d175f17e9f1226e0cb0d37c2167b3b52b0e736661d1406937922194c68adfd54
4
+ data.tar.gz: 204d38937da751f3ea15dfd64370e379689e54f264b63be54e6c4843c4827579
5
5
  SHA512:
6
- metadata.gz: 7978edfd75f809eb604edb58e0c35ff9a1e85b0e34f7462399f76deb36c5a6a0c61030d1fc3a3bb42d689395a0372995e03e41dd47223063084703dc207294d6
7
- data.tar.gz: e1216599f496cd883e8b301d1040f395984d3fc3029ba65fa6c2f63ab3e431a96bc8369ff06bd3f97390dd78e0a10279e1e556ba2c25ac4ef5af6dfaf9aafa77
6
+ metadata.gz: 242ffa432db2a94a59636be87e261411c0bf465ac170b6f5b52955cb671d2c70e6eaed7dc74b489868117fcaa360df33c16ed6e2e472edd96663491c1211d793
7
+ data.tar.gz: 6ccb639e3a73a7e4794f906e9e125dd173d0406198a11511592e3c3492126c31a5ff1798010087fb19d4eb053ba46140e42f869b913ae3b7aaee20303ef3f92c
@@ -2,6 +2,13 @@
2
2
 
3
3
  ## master
4
4
 
5
+ ## 0.7.0 (2020-07-20)
6
+
7
+ * Add `DefinitionBuilder#one_instance_ancestors` and `DefinitionBuilder#one_singleton_ancestors` [#341](https://github.com/ruby/rbs/pull/341)
8
+ * Bug fix in ConstantTable [#340](https://github.com/ruby/rbs/pull/340)
9
+ * Make `rbs validate` faster [#338](https://github.com/ruby/rbs/pull/338)
10
+ * Dedup methods generated by `rbs prototype rb` [#334](https://github.com/ruby/rbs/pull/334)
11
+
5
12
  ## 0.6.0 (2020-07-12)
6
13
 
7
14
  * Signature update for `Logger`.
@@ -152,7 +152,7 @@ module RBS
152
152
  constant_scopes_module name, scopes: scopes
153
153
 
154
154
  else
155
- raise "Unexpected declaration: #{name} (#{decl.class})"
155
+ raise "Unexpected declaration: #{name} (#{entry.class})"
156
156
  end
157
157
 
158
158
  scopes
@@ -13,6 +13,77 @@ module RBS
13
13
  attr_reader :instance_ancestors_cache
14
14
  attr_reader :singleton_ancestor_cache
15
15
 
16
+ attr_reader :one_instance_ancestors_cache
17
+ attr_reader :one_singleton_ancestors_cache
18
+
19
+ class OneAncestors
20
+ attr_reader :type_name
21
+ attr_reader :params
22
+ attr_reader :super_class
23
+ attr_reader :self_types
24
+ attr_reader :included_modules
25
+ attr_reader :prepended_modules
26
+ attr_reader :extended_modules
27
+
28
+ def initialize(type_name:, params:, super_class:, self_types:, included_modules:, prepended_modules:, extended_modules:)
29
+ @type_name = type_name
30
+ @params = params
31
+ @super_class = super_class
32
+ @self_types = self_types
33
+ @included_modules = included_modules
34
+ @prepended_modules = prepended_modules
35
+ @extended_modules = extended_modules
36
+ end
37
+
38
+ def each_ancestor(&block)
39
+ if block_given?
40
+ yield super_class if super_class
41
+ self_types&.each(&block)
42
+ included_modules&.each(&block)
43
+ prepended_modules&.each(&block)
44
+ extended_modules&.each(&block)
45
+ else
46
+ enum_for :each_ancestor
47
+ end
48
+ end
49
+
50
+ def self.class_instance(type_name:, params:, super_class:)
51
+ new(
52
+ type_name: type_name,
53
+ params: params,
54
+ super_class: super_class,
55
+ self_types: nil,
56
+ included_modules: [],
57
+ prepended_modules: [],
58
+ extended_modules: nil
59
+ )
60
+ end
61
+
62
+ def self.singleton(type_name:, super_class:)
63
+ new(
64
+ type_name: type_name,
65
+ params: nil,
66
+ super_class: super_class,
67
+ self_types: nil,
68
+ included_modules: nil,
69
+ prepended_modules: nil,
70
+ extended_modules: []
71
+ )
72
+ end
73
+
74
+ def self.module_instance(type_name:, params:)
75
+ new(
76
+ type_name: type_name,
77
+ params: params,
78
+ self_types: [],
79
+ included_modules: [],
80
+ prepended_modules: [],
81
+ super_class: nil,
82
+ extended_modules: nil
83
+ )
84
+ end
85
+ end
86
+
16
87
  def initialize(env:)
17
88
  @env = env
18
89
  @type_name_resolver = TypeNameResolver.from_env(env)
@@ -26,6 +97,9 @@ module RBS
26
97
 
27
98
  @instance_ancestors_cache = {}
28
99
  @singleton_ancestor_cache = {}
100
+
101
+ @one_instance_ancestors_cache = {}
102
+ @one_singleton_ancestors_cache = {}
29
103
  end
30
104
 
31
105
  def validate_super_class!(type_name, entry)
@@ -45,30 +119,19 @@ module RBS
45
119
  raise SuperclassMismatchError.new(name: type_name, super_classes: super_types, entry: entry)
46
120
  end
47
121
 
48
- def instance_ancestors(type_name, building_ancestors: [])
49
- as = instance_ancestors_cache[type_name] and return as
122
+ def one_instance_ancestors(type_name)
123
+ as = one_instance_ancestors_cache[type_name] and return as
50
124
 
51
- entry = env.class_decls[type_name] or raise "Unknown name for instance_ancestors: #{type_name}"
125
+ entry = env.class_decls[type_name] or raise "Unknown name for one_instance_ancestors: #{type_name}"
52
126
  params = entry.type_params.each.map(&:name)
53
- args = Types::Variable.build(params)
54
- self_ancestor = Definition::Ancestor::Instance.new(name: type_name, args: args)
55
-
56
- RecursiveAncestorError.check!(self_ancestor,
57
- ancestors: building_ancestors,
58
- location: entry.primary.decl.location)
59
- building_ancestors.push self_ancestor
60
-
61
- ancestors = []
62
127
 
63
128
  case entry
64
129
  when Environment::ClassEntry
65
130
  validate_super_class!(type_name, entry)
131
+ primary = entry.primary
132
+ super_class = primary.decl.super_class
66
133
 
67
- # Super class comes last
68
- if self_ancestor.name != BuiltinNames::BasicObject.name
69
- primary = entry.primary
70
- super_class = primary.decl.super_class
71
-
134
+ if type_name != BuiltinNames::BasicObject.name
72
135
  if super_class
73
136
  super_name = super_class.name
74
137
  super_args = super_class.args
@@ -79,46 +142,49 @@ module RBS
79
142
 
80
143
  NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
81
144
 
82
- super_ancestors = instance_ancestors(super_name, building_ancestors: building_ancestors)
83
- ancestors.unshift(*super_ancestors.apply(super_args, location: primary.decl.location))
145
+ ancestors = OneAncestors.class_instance(
146
+ type_name: type_name,
147
+ params: params,
148
+ super_class: Definition::Ancestor::Instance.new(name: super_name, args: super_args)
149
+ )
150
+ else
151
+ ancestors = OneAncestors.class_instance(
152
+ type_name: type_name,
153
+ params: params,
154
+ super_class: nil
155
+ )
84
156
  end
85
-
86
- build_ancestors_mixin_self(self_ancestor, entry, ancestors: ancestors, building_ancestors: building_ancestors)
87
-
88
157
  when Environment::ModuleEntry
89
- build_ancestors_mixin_self(self_ancestor, entry, ancestors: ancestors, building_ancestors: building_ancestors)
158
+ ancestors = OneAncestors.module_instance(type_name: type_name, params: params)
90
159
 
160
+ entry.self_types.each do |module_self|
161
+ NoSelfTypeFoundError.check!(module_self, env: env)
162
+ ancestors.self_types.push Definition::Ancestor::Instance.new(name: module_self.name, args: module_self.args)
163
+ end
164
+ else
165
+ raise "Unexpected entry for: #{type_name}"
91
166
  end
92
167
 
93
- building_ancestors.pop
168
+ mixin_ancestors(entry,
169
+ included_modules: ancestors.included_modules,
170
+ prepended_modules: ancestors.prepended_modules,
171
+ extended_modules: nil)
94
172
 
95
- instance_ancestors_cache[type_name] = Definition::InstanceAncestors.new(
96
- type_name: type_name,
97
- params: params,
98
- ancestors: ancestors
99
- )
173
+ one_instance_ancestors_cache[type_name] = ancestors
100
174
  end
101
175
 
102
- def singleton_ancestors(type_name, building_ancestors: [])
103
- as = singleton_ancestor_cache[type_name] and return as
104
-
105
- entry = env.class_decls[type_name] or raise "Unknown name for singleton_ancestors: #{type_name}"
106
- self_ancestor = Definition::Ancestor::Singleton.new(name: type_name)
107
-
108
- RecursiveAncestorError.check!(self_ancestor,
109
- ancestors: building_ancestors,
110
- location: entry.primary.decl.location)
111
- building_ancestors.push self_ancestor
176
+ def one_singleton_ancestors(type_name)
177
+ as = one_singleton_ancestors_cache[type_name] and return as
112
178
 
113
- ancestors = []
179
+ entry = env.class_decls[type_name] or raise "Unknown name for one_singleton_ancestors: #{type_name}"
114
180
 
115
181
  case entry
116
182
  when Environment::ClassEntry
117
- # Super class comes last
118
- if self_ancestor.name != BuiltinNames::BasicObject.name
119
- primary = entry.primary
120
- super_class = primary.decl.super_class
183
+ validate_super_class!(type_name, entry)
184
+ primary = entry.primary
185
+ super_class = primary.decl.super_class
121
186
 
187
+ if type_name != BuiltinNames::BasicObject.name
122
188
  if super_class
123
189
  super_name = super_class.name
124
190
  else
@@ -127,47 +193,35 @@ module RBS
127
193
 
128
194
  NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
129
195
 
130
- super_ancestors = singleton_ancestors(super_name, building_ancestors: building_ancestors)
131
- ancestors.unshift(*super_ancestors.ancestors)
196
+ ancestors = OneAncestors.singleton(
197
+ type_name: type_name,
198
+ super_class: Definition::Ancestor::Singleton.new(name: super_name)
199
+ )
132
200
  else
133
- as = instance_ancestors(BuiltinNames::Class.name, building_ancestors: building_ancestors)
134
- ancestors.unshift(*as.apply([], location: entry.primary.decl.location))
201
+ ancestors = OneAncestors.singleton(
202
+ type_name: type_name,
203
+ super_class: Definition::Ancestor::Instance.new(name: BuiltinNames::Class.name, args: [])
204
+ )
135
205
  end
136
-
137
206
  when Environment::ModuleEntry
138
- as = instance_ancestors(BuiltinNames::Module.name, building_ancestors: building_ancestors)
139
- ancestors.unshift(*as.apply([], location: entry.primary.decl.location))
140
- end
141
-
142
- # Extend comes next
143
- entry.decls.each do |d|
144
- decl = d.decl
145
-
146
- decl.each_mixin do |member|
147
- case member
148
- when AST::Members::Extend
149
- if member.name.class?
150
- NoMixinFoundError.check!(member.name, env: env, member: member)
207
+ ancestors = OneAncestors.singleton(
208
+ type_name: type_name,
209
+ super_class: Definition::Ancestor::Instance.new(name: BuiltinNames::Module.name, args: [])
210
+ )
151
211
 
152
- module_ancestors = instance_ancestors(member.name, building_ancestors: building_ancestors)
153
- ancestors.unshift(*module_ancestors.apply(member.args, location: member.location))
154
- end
155
- end
156
- end
212
+ else
213
+ raise "Unexpected entry for: #{type_name}"
157
214
  end
158
215
 
159
- ancestors.unshift self_ancestor
216
+ mixin_ancestors(entry,
217
+ included_modules: nil,
218
+ prepended_modules: nil,
219
+ extended_modules: ancestors.extended_modules)
160
220
 
161
- building_ancestors.pop
162
-
163
- singleton_ancestor_cache[type_name] = Definition::SingletonAncestors.new(
164
- type_name: type_name,
165
- ancestors: ancestors
166
- )
221
+ one_singleton_ancestors_cache[type_name] = ancestors
167
222
  end
168
223
 
169
- def build_ancestors_mixin_self(self_ancestor, entry, ancestors:, building_ancestors:)
170
- # Include comes next
224
+ def mixin_ancestors(entry, included_modules:, extended_modules:, prepended_modules:)
171
225
  entry.decls.each do |d|
172
226
  decl = d.decl
173
227
 
@@ -179,42 +233,143 @@ module RBS
179
233
  decl.each_mixin do |member|
180
234
  case member
181
235
  when AST::Members::Include
182
- if member.name.class?
236
+ if included_modules
237
+ NoMixinFoundError.check!(member.name, env: env, member: member)
238
+
239
+ module_name = member.name
240
+ module_args = member.args.map {|type| type.sub(align_params) }
241
+
242
+ included_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args)
243
+ end
244
+
245
+ when AST::Members::Prepend
246
+ if prepended_modules
183
247
  NoMixinFoundError.check!(member.name, env: env, member: member)
184
248
 
185
249
  module_name = member.name
186
250
  module_args = member.args.map {|type| type.sub(align_params) }
187
251
 
188
- module_ancestors = instance_ancestors(module_name, building_ancestors: building_ancestors)
189
- ancestors.unshift(*module_ancestors.apply(module_args, location: member.location))
252
+ prepended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args)
253
+ end
254
+
255
+ when AST::Members::Extend
256
+ if extended_modules
257
+ NoMixinFoundError.check!(member.name, env: env, member: member)
258
+
259
+ module_name = member.name
260
+ module_args = member.args
261
+
262
+ extended_modules << Definition::Ancestor::Instance.new(name: module_name, args: module_args)
190
263
  end
191
264
  end
192
265
  end
193
266
  end
267
+ end
268
+
269
+ def instance_ancestors(type_name, building_ancestors: [])
270
+ as = instance_ancestors_cache[type_name] and return as
271
+
272
+ entry = env.class_decls[type_name] or raise "Unknown name for instance_ancestors: #{type_name}"
273
+ params = entry.type_params.each.map(&:name)
274
+ args = Types::Variable.build(params)
275
+ self_ancestor = Definition::Ancestor::Instance.new(name: type_name, args: args)
276
+
277
+ RecursiveAncestorError.check!(self_ancestor,
278
+ ancestors: building_ancestors,
279
+ location: entry.primary.decl.location)
280
+ building_ancestors.push self_ancestor
281
+
282
+ one_ancestors = one_instance_ancestors(type_name)
283
+
284
+ ancestors = []
285
+
286
+ case entry
287
+ when Environment::ClassEntry
288
+ if one_ancestors.super_class
289
+ super_name = one_ancestors.super_class.name
290
+ super_args = one_ancestors.super_class.args
291
+
292
+ super_ancestors = instance_ancestors(super_name, building_ancestors: building_ancestors)
293
+ ancestors.unshift(*super_ancestors.apply(super_args, location: entry.primary.decl.location))
294
+ end
295
+ end
296
+
297
+ one_ancestors.included_modules.each do |mod|
298
+ if mod.name.class?
299
+ name = mod.name
300
+ args = mod.args
301
+ mod_ancestors = instance_ancestors(name, building_ancestors: building_ancestors)
302
+ ancestors.unshift(*mod_ancestors.apply(args, location: entry.primary.decl.location))
303
+ end
304
+ end
194
305
 
195
- # Self
196
306
  ancestors.unshift(self_ancestor)
197
307
 
198
- # Prepends
199
- entry.decls.each do |d|
200
- decl = d.decl
308
+ one_ancestors.prepended_modules.each do |mod|
309
+ if mod.name.class?
310
+ name = mod.name
311
+ args = mod.args
312
+ mod_ancestors = instance_ancestors(name, building_ancestors: building_ancestors)
313
+ ancestors.unshift(*mod_ancestors.apply(args, location: entry.primary.decl.location))
314
+ end
315
+ end
201
316
 
202
- align_params = Substitution.build(decl.type_params.each.map(&:name),
203
- Types::Variable.build(entry.type_params.each.map(&:name)))
317
+ building_ancestors.pop
204
318
 
205
- decl.each_mixin do |member|
206
- case member
207
- when AST::Members::Prepend
208
- NoMixinFoundError.check!(member.name, env: env, member: member)
319
+ instance_ancestors_cache[type_name] = Definition::InstanceAncestors.new(
320
+ type_name: type_name,
321
+ params: params,
322
+ ancestors: ancestors
323
+ )
324
+ end
209
325
 
210
- module_name = member.name
211
- module_args = member.args.map {|type| type.sub(align_params) }
326
+ def singleton_ancestors(type_name, building_ancestors: [])
327
+ as = singleton_ancestor_cache[type_name] and return as
212
328
 
213
- module_ancestors = instance_ancestors(module_name, building_ancestors: building_ancestors)
214
- ancestors.unshift(*module_ancestors.apply(module_args))
215
- end
329
+ entry = env.class_decls[type_name] or raise "Unknown name for singleton_ancestors: #{type_name}"
330
+ self_ancestor = Definition::Ancestor::Singleton.new(name: type_name)
331
+
332
+ RecursiveAncestorError.check!(self_ancestor,
333
+ ancestors: building_ancestors,
334
+ location: entry.primary.decl.location)
335
+ building_ancestors.push self_ancestor
336
+
337
+ one_ancestors = one_singleton_ancestors(type_name)
338
+
339
+ ancestors = []
340
+
341
+ case one_ancestors.super_class
342
+ when Definition::Ancestor::Instance
343
+ super_name = one_ancestors.super_class.name
344
+ super_args = one_ancestors.super_class.args
345
+
346
+ super_ancestors = instance_ancestors(super_name, building_ancestors: building_ancestors)
347
+ ancestors.unshift(*super_ancestors.apply(super_args, location: entry.primary.decl.location))
348
+
349
+ when Definition::Ancestor::Singleton
350
+ super_name = one_ancestors.super_class.name
351
+
352
+ super_ancestors = singleton_ancestors(super_name, building_ancestors: [])
353
+ ancestors.unshift(*super_ancestors.ancestors)
354
+ end
355
+
356
+ one_ancestors.extended_modules.each do |mod|
357
+ if mod.name.class?
358
+ name = mod.name
359
+ args = mod.args
360
+ mod_ancestors = instance_ancestors(name, building_ancestors: building_ancestors)
361
+ ancestors.unshift(*mod_ancestors.apply(args, location: entry.primary.decl.location))
216
362
  end
217
363
  end
364
+
365
+ ancestors.unshift(self_ancestor)
366
+
367
+ building_ancestors.pop
368
+
369
+ singleton_ancestor_cache[type_name] = Definition::SingletonAncestors.new(
370
+ type_name: type_name,
371
+ ancestors: ancestors
372
+ )
218
373
  end
219
374
 
220
375
  def each_member_with_accessibility(members, accessibility: :public)
@@ -838,7 +993,7 @@ module RBS
838
993
  methods[name] = Definition::Method.new(
839
994
  super_method: super_method,
840
995
  accessibility: method.accessibility,
841
- defs: method.defs.map {|defn| defn.update(type: defn.type.sub(sub)) }
996
+ defs: sub.mapping.empty? ? method.defs : method.defs.map {|defn| defn.update(type: defn.type.sub(sub)) }
842
997
  )
843
998
  end
844
999
 
@@ -126,7 +126,7 @@ module RBS
126
126
 
127
127
  def cache_name(cache, name:, decl:, outer:)
128
128
  if cache.key?(name)
129
- raise DuplicatedDeclarationError.new(name, decl, cache[name])
129
+ raise DuplicatedDeclarationError.new(name, decl, cache[name].decl)
130
130
  end
131
131
 
132
132
  cache[name] = SingleEntry.new(name: name, decl: decl, outer: outer)
@@ -141,6 +141,31 @@ module RBS
141
141
  end
142
142
  end
143
143
 
144
+ class NoSelfTypeFoundError < StandardError
145
+ attr_reader :type_name
146
+ attr_reader :location
147
+
148
+ def initialize(type_name:, location:)
149
+ @type_name = type_name
150
+ @location = location
151
+
152
+ super "#{Location.to_string location}: Could not find self type: #{type_name}"
153
+ end
154
+
155
+ def self.check!(self_type, env:)
156
+ type_name = self_type.name
157
+
158
+ dic = case
159
+ when type_name.class?
160
+ env.class_decls
161
+ when type_name.interface?
162
+ env.interface_decls
163
+ end
164
+
165
+ dic.key?(type_name) or raise new(type_name: type_name, location: self_type.location)
166
+ end
167
+ end
168
+
144
169
  class NoMixinFoundError < StandardError
145
170
  attr_reader :type_name
146
171
  attr_reader :member
@@ -520,7 +520,7 @@ rule
520
520
 
521
521
  method_name:
522
522
  tOPERATOR
523
- | kAMP | kHAT | kSTAR | kLT | kEXCLAMATION | kSTAR2 | kBAR | kOUT | kIN
523
+ | kAMP | kHAT | kSTAR | kLT | kEXCLAMATION | kSTAR2 | kBAR
524
524
  | method_name0
525
525
  | method_name0 kQUESTION {
526
526
  unless val[0].location.pred?(val[1].location)
@@ -134,7 +134,7 @@ module RBS
134
134
  overload: false
135
135
  )
136
136
 
137
- decls.push member
137
+ decls.push member unless decls.include?(member)
138
138
 
139
139
  when :FCALL
140
140
  # Inside method definition cannot reach here.
@@ -11,7 +11,7 @@ module RBS
11
11
  mapping[from] = to
12
12
  end
13
13
 
14
- def self.build(variables, types, instance_type: Types::Bases::Instance.new(location: nil), &block)
14
+ def self.build(variables, types, instance_type: nil, &block)
15
15
  unless variables.size == types.size
16
16
  raise "Broken substitution: variables=#{variables}, types=#{types}"
17
17
  end
@@ -33,7 +33,11 @@ module RBS
33
33
  when Types::Variable
34
34
  mapping[ty.name] || ty
35
35
  when Types::Bases::Instance
36
- instance_type
36
+ if instance_type
37
+ instance_type
38
+ else
39
+ ty
40
+ end
37
41
  else
38
42
  ty
39
43
  end
@@ -1,3 +1,3 @@
1
1
  module RBS
2
- VERSION = "0.6.0"
2
+ VERSION = "0.7.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Soutaro Matsumoto
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-07-12 00:00:00.000000000 Z
11
+ date: 2020-07-20 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: RBS is the language for type signatures for Ruby and standard library
14
14
  definitions.