Class: Kumi::Core::Analyzer::Passes::DependencyResolver
- Includes:
- Syntax
- Defined in:
- lib/kumi/core/analyzer/passes/dependency_resolver.rb
Overview
RESPONSIBILITY: Build dependency graph and detect conditional dependencies in cascades DEPENDENCIES: :declarations from NameIndexer, :inputs from InputCollector PRODUCES: :dependencies, :dependents, :leaves - Dependency analysis results INTERFACE: new(schema, state).run(errors)
Defined Under Namespace
Classes: DependencyEdge
Instance Method Summary collapse
Methods inherited from PassBase
#debug, #debug_enabled?, #initialize
Methods included from ErrorReporting
#inferred_location, #raise_localized_error, #raise_syntax_error, #raise_type_error, #report_enhanced_error, #report_error, #report_semantic_error, #report_syntax_error, #report_type_error
Constructor Details
This class inherits a constructor from Kumi::Core::Analyzer::Passes::PassBase
Instance Method Details
#run(errors) ⇒ Object
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/kumi/core/analyzer/passes/dependency_resolver.rb', line 27 def run(errors) definitions = get_state(:declarations) = get_state(:input_metadata) dependency_graph = Hash.new { |h, k| h[k] = [] } reverse_dependencies = Hash.new { |h, k| h[k] = [] } leaf_map = Hash.new { |h, k| h[k] = Set.new } each_decl do |decl| # Traverse the expression for each declaration, passing context down visit_with_context(decl.expression, { decl_name: decl.name }) do |node, context| process_node(node, decl, dependency_graph, reverse_dependencies, leaf_map, definitions, , errors, context) end end # Compute transitive closure of reverse dependencies transitive_dependents = compute_transitive_closure(reverse_dependencies) state.with(:dependencies, dependency_graph.transform_values(&:freeze).freeze) .with(:dependents, transitive_dependents.freeze) .with(:leaves, leaf_map.transform_values(&:freeze).freeze) end |