Skip to content

Commit e5c79df

Browse files
committed
Move class_entry.rb and module_entry.rb
1 parent 4b49b6c commit e5c79df

File tree

16 files changed

+299
-181
lines changed

16 files changed

+299
-181
lines changed

lib/rbs.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
require "rbs/ast/visitor"
2727
require "rbs/environment"
2828
require "rbs/environment/use_map"
29+
require "rbs/environment/class_entry"
30+
require "rbs/environment/module_entry"
2931
require "rbs/environment_loader"
3032
require "rbs/builtin_names"
3133
require "rbs/definition"

lib/rbs/cli/validate.rb

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@ def validate_class_module_definition
109109

110110
case entry
111111
when Environment::ClassEntry
112-
entry.decls.each do |decl|
113-
if super_class = decl.decl.super_class
112+
entry.each_decl do |decl|
113+
if super_class = decl.super_class
114114
super_class.args.each do |arg|
115115
void_type_context_validator(arg, true)
116116
no_self_type_validator(arg)
@@ -120,8 +120,8 @@ def validate_class_module_definition
120120
end
121121
end
122122
when Environment::ModuleEntry
123-
entry.decls.each do |decl|
124-
decl.decl.self_types.each do |self_type|
123+
entry.each_decl do |decl|
124+
decl.self_types.each do |self_type|
125125
self_type.args.each do |arg|
126126
void_type_context_validator(arg, true)
127127
no_self_type_validator(arg)
@@ -143,7 +143,7 @@ def validate_class_module_definition
143143
end
144144
end
145145

146-
d = entry.primary.decl
146+
d = entry.primary_decl
147147

148148
@validator.validate_type_params(
149149
d.type_params,
@@ -169,8 +169,8 @@ def validate_class_module_definition
169169

170170
TypeParamDefaultReferenceError.check!(d.type_params)
171171

172-
entry.decls.each do |d|
173-
d.decl.each_member do |member|
172+
entry.each_decl do |decl|
173+
decl.each_member do |member|
174174
case member
175175
when AST::Members::MethodDefinition
176176
@validator.validate_method_definition(member, type_name: name)

lib/rbs/definition_builder.rb

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -126,10 +126,10 @@ def define_instance(definition, type_name, subst, define_class_vars:)
126126
entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
127127
args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
128128

129-
entry.decls.each do |d|
130-
subst_ = subst + Substitution.build(d.decl.type_params.each.map(&:name), args)
129+
entry.each_decl do |decl|
130+
subst_ = subst + Substitution.build(decl.type_params.each.map(&:name), args)
131131

132-
d.decl.members.each do |member|
132+
decl.members.each do |member|
133133
case member
134134
when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
135135
if member.kind == :instance
@@ -174,7 +174,7 @@ def build_instance(type_name)
174174

175175
try_cache(type_name, cache: instance_cache) do
176176
entry = env.class_decls[type_name] or raise "Unknown name for build_instance: #{type_name}"
177-
ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
177+
ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
178178

179179
ancestors = ancestor_builder.instance_ancestors(type_name)
180180
args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
@@ -234,7 +234,7 @@ def build_instance(type_name)
234234
def build_singleton0(type_name)
235235
try_cache type_name, cache: singleton0_cache do
236236
entry = env.class_decls[type_name] or raise "Unknown name for build_singleton0: #{type_name}"
237-
ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
237+
ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
238238

239239
ancestors = ancestor_builder.singleton_ancestors(type_name)
240240
self_type = Types::ClassSingleton.new(name: type_name, location: nil)
@@ -272,8 +272,8 @@ def build_singleton0(type_name)
272272
interface_methods = interface_methods(all_interfaces)
273273
import_methods(definition, type_name, methods, interface_methods, Substitution.new, nil)
274274

275-
entry.decls.each do |d|
276-
d.decl.members.each do |member|
275+
entry.each_decl do |decl|
276+
decl.members.each do |member|
277277
case member
278278
when AST::Members::AttrReader, AST::Members::AttrAccessor, AST::Members::AttrWriter
279279
if member.kind == :singleton
@@ -306,7 +306,7 @@ def build_singleton(type_name)
306306

307307
try_cache type_name, cache: singleton_cache do
308308
entry = env.class_decls[type_name] or raise "Unknown name for build_singleton: #{type_name}"
309-
ensure_namespace!(type_name.namespace, location: entry.decls[0].decl.location)
309+
ensure_namespace!(type_name.namespace, location: entry.primary_decl.location)
310310

311311
ancestors = ancestor_builder.singleton_ancestors(type_name)
312312
self_type = Types::ClassSingleton.new(name: type_name, location: nil)
@@ -471,7 +471,7 @@ def validate_type_params(definition, ancestors:, methods:)
471471
validate_params_with(type_params, result: result) do |param|
472472
decl = case entry = definition.entry
473473
when Environment::ModuleEntry, Environment::ClassEntry
474-
entry.primary.decl
474+
entry.primary_decl
475475
when Environment::SingleEntry
476476
entry.decl
477477
end

lib/rbs/definition_builder/ancestor_builder.rb

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -173,12 +173,12 @@ def initialize(env:)
173173
end
174174

175175
def validate_super_class!(type_name, entry)
176-
with_super_classes = entry.decls.select {|d| d.decl.super_class }
176+
with_super_classes = entry.each_decl.select {|decl| decl.super_class }
177177

178178
return if with_super_classes.size <= 1
179179

180-
super_types = with_super_classes.map do |d|
181-
super_class = d.decl.super_class or raise
180+
super_types = with_super_classes.map do |decl|
181+
super_class = decl.super_class or raise
182182
Types::ClassInstance.new(name: super_class.name, args: super_class.args, location: nil)
183183
end
184184

@@ -200,8 +200,8 @@ def one_instance_ancestors(type_name)
200200
case entry
201201
when Environment::ClassEntry
202202
validate_super_class!(type_name, entry)
203-
primary = entry.primary
204-
super_class = primary.decl.super_class
203+
primary = entry.primary_decl
204+
super_class = primary.super_class
205205

206206
if type_name != BuiltinNames::BasicObject.name
207207
if super_class
@@ -214,7 +214,7 @@ def one_instance_ancestors(type_name)
214214

215215
super_name = env.normalize_module_name(super_name)
216216

217-
NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
217+
NoSuperclassFoundError.check!(super_name, env: env, location: primary.location)
218218
if super_class
219219
InheritModuleError.check!(super_class, env: env)
220220
InvalidTypeApplicationError.check2!(type_name: super_class.name, args: super_class.args, env: env, location: super_class.location)
@@ -283,8 +283,8 @@ def one_singleton_ancestors(type_name)
283283
case entry
284284
when Environment::ClassEntry
285285
validate_super_class!(type_name, entry)
286-
primary = entry.primary
287-
super_class = primary.decl.super_class
286+
primary = entry.primary_decl
287+
super_class = primary.super_class
288288

289289
if type_name != BuiltinNames::BasicObject.name
290290
if super_class
@@ -295,7 +295,7 @@ def one_singleton_ancestors(type_name)
295295

296296
super_name = env.normalize_module_name(super_name)
297297

298-
NoSuperclassFoundError.check!(super_name, env: env, location: primary.decl.location)
298+
NoSuperclassFoundError.check!(super_name, env: env, location: primary.location)
299299
if super_class
300300
InheritModuleError.check!(super_class, env: env)
301301
end
@@ -414,9 +414,7 @@ def mixin_ancestors0(decl, type_name, align_params:, included_modules:, included
414414
end
415415

416416
def mixin_ancestors(entry, type_name, included_modules:, included_interfaces:, extended_modules:, prepended_modules:, extended_interfaces:)
417-
entry.decls.each do |d|
418-
decl = d.decl
419-
417+
entry.each_decl do |decl|
420418
align_params = Substitution.build(
421419
decl.type_params.each.map(&:name),
422420
entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
@@ -445,7 +443,7 @@ def instance_ancestors(type_name, building_ancestors: [])
445443

446444
RecursiveAncestorError.check!(self_ancestor,
447445
ancestors: building_ancestors,
448-
location: entry.primary.decl.location)
446+
location: entry.primary_decl.location)
449447
building_ancestors.push self_ancestor
450448

451449
one_ancestors = one_instance_ancestors(type_name)
@@ -462,7 +460,7 @@ def instance_ancestors(type_name, building_ancestors: [])
462460

463461
super_ancestors =
464462
instance_ancestors(super_name, building_ancestors: building_ancestors)
465-
.apply(super_args, env: env, location: entry.primary.decl.super_class&.location)
463+
.apply(super_args, env: env, location: entry.primary_decl.super_class&.location)
466464
super_ancestors.map! {|ancestor| fill_ancestor_source(ancestor, name: super_name, source: :super) }
467465
ancestors.unshift(*super_ancestors)
468466
end
@@ -522,7 +520,7 @@ def singleton_ancestors(type_name, building_ancestors: [])
522520

523521
RecursiveAncestorError.check!(self_ancestor,
524522
ancestors: building_ancestors,
525-
location: entry.primary.decl.location)
523+
location: entry.primary_decl.location)
526524
building_ancestors.push self_ancestor
527525

528526
one_ancestors = one_singleton_ancestors(type_name)

lib/rbs/definition_builder/method_builder.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,9 @@ def build_instance(type_name)
103103
args = entry.type_params.map {|param| Types::Variable.new(name: param.name, location: param.location) }
104104
type = Types::ClassInstance.new(name: type_name, args: args, location: nil)
105105
Methods.new(type: type).tap do |methods|
106-
entry.decls.each do |d|
107-
subst = Substitution.build(d.decl.type_params.each.map(&:name), args)
108-
each_member_with_accessibility(d.decl.members) do |member, accessibility|
106+
entry.each_decl do |decl|
107+
subst = Substitution.build(decl.type_params.each.map(&:name), args)
108+
each_member_with_accessibility(decl.members) do |member, accessibility|
109109
case member
110110
when AST::Members::MethodDefinition
111111
case member.kind
@@ -149,8 +149,8 @@ def build_singleton(type_name)
149149
type = Types::ClassSingleton.new(name: type_name, location: nil)
150150

151151
Methods.new(type: type).tap do |methods|
152-
entry.decls.each do |d|
153-
d.decl.members.each do |member|
152+
entry.each_decl do |decl|
153+
decl.members.each do |member|
154154
case member
155155
when AST::Members::MethodDefinition
156156
if member.singleton?

lib/rbs/environment.rb

Lines changed: 8 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -13,78 +13,6 @@ class Environment
1313

1414
attr_reader :signatures
1515

16-
class MultiEntry
17-
D = _ = Struct.new(:decl, :context, keyword_init: true)
18-
19-
attr_reader :name
20-
attr_reader :decls
21-
22-
def initialize(name:)
23-
@name = name
24-
@decls = []
25-
end
26-
27-
def insert(decl:, context:)
28-
decls << D.new(decl: decl, context: context)
29-
@primary = nil
30-
end
31-
32-
def validate_type_params
33-
unless decls.empty?
34-
hd_decl, *tl_decls = decls
35-
raise unless hd_decl
36-
37-
hd_params = hd_decl.decl.type_params
38-
39-
tl_decls.each do |tl_decl|
40-
tl_params = tl_decl.decl.type_params
41-
42-
unless compatible_params?(hd_params, tl_params)
43-
raise GenericParameterMismatchError.new(name: name, decl: _ = tl_decl.decl)
44-
end
45-
end
46-
end
47-
end
48-
49-
def compatible_params?(ps1, ps2)
50-
if ps1.size == ps2.size
51-
ps1 == AST::TypeParam.rename(ps2, new_names: ps1.map(&:name))
52-
end
53-
end
54-
55-
def type_params
56-
primary.decl.type_params
57-
end
58-
59-
def primary
60-
raise "Not implemented"
61-
end
62-
end
63-
64-
class ModuleEntry < MultiEntry
65-
def self_types
66-
decls.flat_map do |d|
67-
d.decl.self_types
68-
end.uniq
69-
end
70-
71-
def primary
72-
@primary ||= begin
73-
validate_type_params
74-
decls.first or raise("decls cannot be empty")
75-
end
76-
end
77-
end
78-
79-
class ClassEntry < MultiEntry
80-
def primary
81-
@primary ||= begin
82-
validate_type_params
83-
decls.find {|d| d.decl.super_class } || decls.first or raise("decls cannot be empty")
84-
end
85-
end
86-
end
87-
8816
class SingleEntry
8917
attr_reader :name
9018
attr_reader :context
@@ -357,21 +285,21 @@ def insert_decl(decl, context:, namespace:)
357285
unless class_decls.key?(name)
358286
case decl
359287
when AST::Declarations::Class
360-
class_decls[name] ||= ClassEntry.new(name: name)
288+
class_decls[name] ||= ClassEntry.new(name)
361289
when AST::Declarations::Module
362-
class_decls[name] ||= ModuleEntry.new(name: name)
290+
class_decls[name] ||= ModuleEntry.new(name)
363291
end
364292
end
365293

366294
existing_entry = class_decls[name]
367295

368296
case
369297
when decl.is_a?(AST::Declarations::Module) && existing_entry.is_a?(ModuleEntry)
370-
existing_entry.insert(decl: decl, context: context)
298+
existing_entry << [context, decl]
371299
when decl.is_a?(AST::Declarations::Class) && existing_entry.is_a?(ClassEntry)
372-
existing_entry.insert(decl: decl, context: context)
300+
existing_entry << [context, decl]
373301
else
374-
raise DuplicatedDeclarationError.new(name, decl, existing_entry.decls[0].decl)
302+
raise DuplicatedDeclarationError.new(name, decl, existing_entry.primary_decl)
375303
end
376304

377305
inner_context = [context, name] #: Resolver::context
@@ -406,7 +334,7 @@ def insert_decl(decl, context:, namespace:)
406334
when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
407335
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
408336
when ClassEntry, ModuleEntry
409-
raise DuplicatedDeclarationError.new(name, decl, *entry.decls.map(&:decl))
337+
raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
410338
end
411339
end
412340

@@ -427,7 +355,7 @@ def insert_decl(decl, context:, namespace:)
427355
when ClassAliasEntry, ModuleAliasEntry, ConstantEntry
428356
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
429357
when ClassEntry, ModuleEntry
430-
raise DuplicatedDeclarationError.new(name, decl, *entry.decls.map(&:decl))
358+
raise DuplicatedDeclarationError.new(name, decl, *entry.each_decl.to_a)
431359
end
432360
end
433361

@@ -455,7 +383,7 @@ def add_signature(buffer:, directives:, decls:)
455383

456384
def validate_type_params
457385
class_decls.each_value do |decl|
458-
decl.primary
386+
decl.validate_type_params
459387
end
460388
end
461389

0 commit comments

Comments
 (0)