@@ -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
0 commit comments