Class: Rigor::TypeNode::ResolverChain
- Inherits:
-
Object
- Object
- Rigor::TypeNode::ResolverChain
- Defined in:
- lib/rigor/type_node/resolver_chain.rb
Overview
Walks an ordered list of Plugin::TypeNodeResolver
instances, returning the first non-nil resolve(node, scope)
answer. ADR-13 § "Plugin::TypeNodeResolver shape" — first
non-nil wins; registration order is the user's lever for
shadowing per WD3 / WD5.
The chain is itself a TypeNodeResolver-shaped object
(#resolve(node, scope)) so it slots into a NameScope as
the resolver: field without further indirection: a plugin
resolver that wants to recursively resolve a nested argument
calls scope.resolver.resolve(arg, scope) and reaches every
resolver in the chain plus the built-in registry through the
same entry point.
Constructed once per Analysis::Runner.run from
Plugin::Registry#type_node_resolvers. The chain is
immutable and re-entrant; the parser may consult it many
times for the same node.
Constant Summary collapse
- EMPTY =
Shared empty chain — a
NameScopeconstructed without any plugin-supplied resolvers can use this to satisfy theresponds_to?(:resolve)contract without a per-call allocation. new([]).freeze
Instance Attribute Summary collapse
-
#resolvers ⇒ Array<Rigor::Plugin::TypeNodeResolver>
readonly
Ordered resolver instances, in plugin-registration order.
Instance Method Summary collapse
-
#initialize(resolvers) ⇒ ResolverChain
constructor
A new instance of ResolverChain.
-
#resolve(node, scope) ⇒ Object
First non-nil
resolve(node, scope)answer from the chain;nilwhen every resolver declined.
Constructor Details
#initialize(resolvers) ⇒ ResolverChain
Returns a new instance of ResolverChain.
24 25 26 27 28 29 30 31 32 33 |
# File 'lib/rigor/type_node/resolver_chain.rb', line 24 def initialize(resolvers) unless resolvers.is_a?(Array) && resolvers.all? { |r| r.respond_to?(:resolve) } raise ArgumentError, "TypeNode::ResolverChain expects an Array of resolvers " \ "responding to #resolve(node, scope), got #{resolvers.inspect}" end @resolvers = resolvers.dup.freeze freeze end |
Instance Attribute Details
#resolvers ⇒ Array<Rigor::Plugin::TypeNodeResolver> (readonly)
Returns ordered resolver instances, in plugin-registration order.
37 38 39 |
# File 'lib/rigor/type_node/resolver_chain.rb', line 37 def resolvers @resolvers end |
Instance Method Details
#resolve(node, scope) ⇒ Object
First non-nil resolve(node, scope) answer from the chain;
nil when every resolver declined.
41 42 43 44 45 46 47 |
# File 'lib/rigor/type_node/resolver_chain.rb', line 41 def resolve(node, scope) @resolvers.each do |resolver| result = resolver.resolve(node, scope) return result unless result.nil? end nil end |