Class: Kumi::Core::Analyzer::Passes::DependencyResolver

Inherits:
PassBase
  • Object
show all
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)
  input_meta = 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, input_meta, 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