Skip to content

Commit a8ce18e

Browse files
committed
Let environment use Resolver::context directly
1 parent 30bb62a commit a8ce18e

File tree

3 files changed

+36
-106
lines changed

3 files changed

+36
-106
lines changed

lib/rbs/environment.rb

Lines changed: 23 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -13,29 +13,8 @@ class Environment
1313

1414
attr_reader :signatures
1515

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-
2916
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
17+
D = _ = Struct.new(:decl, :context, keyword_init: true)
3918

4019
attr_reader :name
4120
attr_reader :decls
@@ -45,8 +24,8 @@ def initialize(name:)
4524
@decls = []
4625
end
4726

48-
def insert(decl:, outer:)
49-
decls << D.new(decl: decl, outer: outer)
27+
def insert(decl:, context:)
28+
decls << D.new(decl: decl, context: context)
5029
@primary = nil
5130
end
5231

@@ -108,19 +87,13 @@ def primary
10887

10988
class SingleEntry
11089
attr_reader :name
111-
attr_reader :outer
90+
attr_reader :context
11291
attr_reader :decl
11392

114-
def initialize(name:, decl:, outer:)
93+
def initialize(name:, decl:, context:)
11594
@name = name
11695
@decl = decl
117-
@outer = outer
118-
end
119-
120-
include ContextUtil
121-
122-
def context
123-
@context ||= calculate_context(outer)
96+
@context = context
12497
end
12598
end
12699

@@ -370,7 +343,7 @@ def normalize_module_name?(name)
370343
@normalize_module_name_cache[name] = normalized_type_name
371344
end
372345

373-
def insert_decl(decl, outer:, namespace:)
346+
def insert_decl(decl, context:, namespace:)
374347
case decl
375348
when AST::Declarations::Class, AST::Declarations::Module
376349
name = decl.name.with_prefix(namespace)
@@ -394,17 +367,17 @@ def insert_decl(decl, outer:, namespace:)
394367

395368
case
396369
when decl.is_a?(AST::Declarations::Module) && existing_entry.is_a?(ModuleEntry)
397-
existing_entry.insert(decl: decl, outer: outer)
370+
existing_entry.insert(decl: decl, context: context)
398371
when decl.is_a?(AST::Declarations::Class) && existing_entry.is_a?(ClassEntry)
399-
existing_entry.insert(decl: decl, outer: outer)
372+
existing_entry.insert(decl: decl, context: context)
400373
else
401374
raise DuplicatedDeclarationError.new(name, decl, existing_entry.decls[0].decl)
402375
end
403376

404-
prefix = outer + [decl]
405-
ns = name.to_namespace
377+
inner_context = [context, name] #: Resolver::context
378+
inner_namespace = name.to_namespace
406379
decl.each_decl do |d|
407-
insert_decl(d, outer: prefix, namespace: ns)
380+
insert_decl(d, context: inner_context, namespace: inner_namespace)
408381
end
409382

410383
when AST::Declarations::Interface
@@ -414,7 +387,7 @@ def insert_decl(decl, outer:, namespace:)
414387
raise DuplicatedDeclarationError.new(name, decl, interface_entry.decl)
415388
end
416389

417-
interface_decls[name] = InterfaceEntry.new(name: name, decl: decl, outer: outer)
390+
interface_decls[name] = InterfaceEntry.new(name: name, decl: decl, context: context)
418391

419392
when AST::Declarations::TypeAlias
420393
name = decl.name.with_prefix(namespace)
@@ -423,7 +396,7 @@ def insert_decl(decl, outer:, namespace:)
423396
raise DuplicatedDeclarationError.new(name, decl, entry.decl)
424397
end
425398

426-
type_alias_decls[name] = TypeAliasEntry.new(name: name, decl: decl, outer: outer)
399+
type_alias_decls[name] = TypeAliasEntry.new(name: name, decl: decl, context: context)
427400

428401
when AST::Declarations::Constant
429402
name = decl.name.with_prefix(namespace)
@@ -437,14 +410,14 @@ def insert_decl(decl, outer:, namespace:)
437410
end
438411
end
439412

440-
constant_decls[name] = ConstantEntry.new(name: name, decl: decl, outer: outer)
413+
constant_decls[name] = ConstantEntry.new(name: name, decl: decl, context: context)
441414

442415
when AST::Declarations::Global
443416
if entry = global_decls[decl.name]
444417
raise DuplicatedDeclarationError.new(decl.name, decl, entry.decl)
445418
end
446419

447-
global_decls[decl.name] = GlobalEntry.new(name: decl.name, decl: decl, outer: outer)
420+
global_decls[decl.name] = GlobalEntry.new(name: decl.name, decl: decl, context: context)
448421

449422
when AST::Declarations::ClassAlias, AST::Declarations::ModuleAlias
450423
name = decl.new_name.with_prefix(namespace)
@@ -460,16 +433,16 @@ def insert_decl(decl, outer:, namespace:)
460433

461434
case decl
462435
when AST::Declarations::ClassAlias
463-
class_alias_decls[name] = ClassAliasEntry.new(name: name, decl: decl, outer: outer)
436+
class_alias_decls[name] = ClassAliasEntry.new(name: name, decl: decl, context: context)
464437
when AST::Declarations::ModuleAlias
465-
class_alias_decls[name] = ModuleAliasEntry.new(name: name, decl: decl, outer: outer)
438+
class_alias_decls[name] = ModuleAliasEntry.new(name: name, decl: decl, context: context)
466439
end
467440
end
468441
end
469442

470443
def <<(decl)
471444
declarations << decl
472-
insert_decl(decl, outer: [], namespace: Namespace.root)
445+
insert_decl(decl, context: nil, namespace: Namespace.root)
473446
self
474447
end
475448

@@ -501,7 +474,7 @@ def resolve_signature(resolver, table, dirs, decls, only: nil)
501474
if only && !only.member?(decl)
502475
decl
503476
else
504-
resolve_declaration(resolver, map, decl, outer: [], prefix: Namespace.root)
477+
resolve_declaration(resolver, map, decl, context: nil, prefix: Namespace.root)
505478
end
506479
end
507480

@@ -545,7 +518,7 @@ def append_context(context, decl)
545518
end
546519
end
547520

548-
def resolve_declaration(resolver, map, decl, outer:, prefix:)
521+
def resolve_declaration(resolver, map, decl, context:, prefix:)
549522
if decl.is_a?(AST::Declarations::Global)
550523
# @type var decl: AST::Declarations::Global
551524
return AST::Declarations::Global.new(
@@ -557,14 +530,11 @@ def resolve_declaration(resolver, map, decl, outer:, prefix:)
557530
)
558531
end
559532

560-
context = resolver_context(*outer)
561-
562533
case decl
563534
when AST::Declarations::Class
564535
outer_context = context
565536
inner_context = append_context(outer_context, decl)
566537

567-
outer_ = outer + [decl]
568538
prefix_ = prefix + decl.name.to_namespace
569539
AST::Declarations::Class.new(
570540
name: decl.name.with_prefix(prefix),
@@ -585,7 +555,7 @@ def resolve_declaration(resolver, map, decl, outer:, prefix:)
585555
resolver,
586556
map,
587557
member,
588-
outer: outer_,
558+
context: inner_context,
589559
prefix: prefix_
590560
)
591561
else
@@ -601,7 +571,6 @@ def resolve_declaration(resolver, map, decl, outer:, prefix:)
601571
outer_context = context
602572
inner_context = append_context(outer_context, decl)
603573

604-
outer_ = outer + [decl]
605574
prefix_ = prefix + decl.name.to_namespace
606575
AST::Declarations::Module.new(
607576
name: decl.name.with_prefix(prefix),
@@ -622,7 +591,7 @@ def resolve_declaration(resolver, map, decl, outer:, prefix:)
622591
resolver,
623592
map,
624593
member,
625-
outer: outer_,
594+
context: inner_context,
626595
prefix: prefix_
627596
)
628597
else

sig/environment.rbs

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,14 @@ module RBS
1212
def name: () -> TypeName
1313
end
1414

15-
module ContextUtil
16-
def calculate_context: (Array[_NamedDecl]) -> Resolver::context
17-
end
18-
1915
# Name of object, it's (multiple) declarations with the outer module declarations
2016
#
2117
class MultiEntry[M < _ModuleOrClass]
2218
class D[M < _ModuleOrClass]
2319
attr_reader decl: M
24-
attr_reader outer: Array[module_decl]
25-
26-
def initialize: (decl: M, outer: Array[module_decl]) -> void
27-
28-
include ContextUtil
20+
attr_reader context: Resolver::context
2921

30-
@context: Resolver::context
31-
32-
def context: () -> Resolver::context
22+
def initialize: (decl: M, context: Resolver::context) -> void
3323
end
3424

3525
attr_reader name: TypeName
@@ -39,7 +29,7 @@ module RBS
3929

4030
def initialize: (name: TypeName) -> void
4131

42-
def insert: (decl: M, outer: Array[module_decl]) -> void
32+
def insert: (decl: M, context: Resolver::context) -> void
4333

4434
def validate_type_params: () -> void
4535

@@ -62,15 +52,9 @@ module RBS
6252
class SingleEntry[N, D]
6353
attr_reader name: N
6454
attr_reader decl: D
65-
attr_reader outer: Array[module_decl]
66-
67-
def initialize: (name: N, decl: D, outer: Array[module_decl]) -> void
68-
69-
include ContextUtil
70-
71-
@context: Resolver::context
55+
attr_reader context: Resolver::context
7256

73-
def context: () -> Resolver::context
57+
def initialize: (name: N, decl: D, context: Resolver::context) -> void
7458
end
7559

7660
class ModuleAliasEntry < SingleEntry[TypeName, AST::Declarations::ModuleAlias]
@@ -131,7 +115,7 @@ module RBS
131115

132116
# Insert a declaration into the environment
133117
#
134-
private def insert_decl: (AST::Declarations::t, outer: Array[module_decl], namespace: Namespace) -> void
118+
private def insert_decl: (AST::Declarations::t, context: Resolver::context, namespace: Namespace) -> void
135119

136120
# Resolve all type names in the environment to absolute type names.
137121
# Relative type name will be left if absolute type name cannot be found.
@@ -264,7 +248,7 @@ module RBS
264248

265249
def append_context: (Resolver::context, module_decl) -> Resolver::context
266250

267-
def resolve_declaration: (Resolver::TypeNameResolver resolver, UseMap map, AST::Declarations::t decl, outer: Array[module_decl], prefix: Namespace) -> AST::Declarations::t
251+
def resolve_declaration: (Resolver::TypeNameResolver resolver, UseMap map, AST::Declarations::t decl, context: Resolver::context, prefix: Namespace) -> AST::Declarations::t
268252

269253
def resolve_member: (Resolver::TypeNameResolver, UseMap map, AST::Members::t, context: Resolver::context) -> AST::Members::t
270254

test/rbs/environment_test.rb

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,29 +7,6 @@ class RBS::EnvironmentTest < Test::Unit::TestCase
77
Namespace = RBS::Namespace
88
InvalidTypeApplicationError = RBS::InvalidTypeApplicationError
99

10-
def test_entry_context
11-
_, _, decls = RBS::Parser.parse_signature(<<EOF)
12-
class Foo
13-
module Bar
14-
module Baz
15-
end
16-
end
17-
end
18-
EOF
19-
20-
entry = Environment::SingleEntry.new(
21-
name: type_name("::Foo::Bar::Baz"),
22-
decl: decls[0].members[0].members[0],
23-
outer: [
24-
decls[0],
25-
decls[0].members[0],
26-
]
27-
)
28-
29-
assert_equal [[nil, type_name("::Foo")], type_name("::Foo::Bar")],
30-
entry.context
31-
end
32-
3310
def test_insert_decl_nested_modules
3411
env = Environment.new
3512

@@ -248,24 +225,24 @@ module Foo[X, in Y]
248225
EOF
249226

250227
Environment::ModuleEntry.new(name: type_name("::Foo")).tap do |entry|
251-
entry.insert(decl: decls[0], outer: [])
252-
entry.insert(decl: decls[1], outer: [])
228+
entry.insert(decl: decls[0], context: nil)
229+
entry.insert(decl: decls[1], context: nil)
253230

254231
assert_instance_of Array, entry.type_params
255232
end
256233

257234
Environment::ModuleEntry.new(name: type_name("::Foo")).tap do |entry|
258-
entry.insert(decl: decls[0], outer: [])
259-
entry.insert(decl: decls[2], outer: [])
235+
entry.insert(decl: decls[0], context: nil)
236+
entry.insert(decl: decls[2], context: nil)
260237

261238
assert_raises RBS::GenericParameterMismatchError do
262239
entry.type_params
263240
end
264241
end
265242

266243
Environment::ModuleEntry.new(name: type_name("::Foo")).tap do |entry|
267-
entry.insert(decl: decls[0], outer: [])
268-
entry.insert(decl: decls[3], outer: [])
244+
entry.insert(decl: decls[0], context: nil)
245+
entry.insert(decl: decls[3], context: nil)
269246

270247
assert_raises RBS::GenericParameterMismatchError do
271248
entry.type_params

0 commit comments

Comments
 (0)