Class: Lagoon::Analyzer::MethodReferenceVisitor

Inherits:
Prism::Visitor
  • Object
show all
Defined in:
lib/lagoon/analyzer/ast/method_reference_visitor.rb

Instance Method Summary collapse

Constructor Details

#initialize(methods:, model_names:, associations:, helper_models:) ⇒ MethodReferenceVisitor

Returns a new instance of MethodReferenceVisitor.



6
7
8
9
10
11
12
# File 'lib/lagoon/analyzer/ast/method_reference_visitor.rb', line 6

def initialize(methods:, model_names:, associations:, helper_models:)
  super()
  @methods = methods
  @model_names = model_names.to_set(&:to_s)
  @associations = normalize_associations(associations)
  @helper_models = helper_models.to_h.transform_keys(&:to_s).transform_values(&:to_s)
end

Instance Method Details

#models_for(action, callbacks: []) ⇒ Object



14
15
16
17
18
19
20
21
22
# File 'lib/lagoon/analyzer/ast/method_reference_visitor.rb', line 14

def models_for(action, callbacks: [])
  @models = Set.new
  @instance_variables = {}
  @method_stack = []

  callbacks.each { |callback| analyze_method(callback.to_s) }
  analyze_method(action.to_s)
  @models
end

#visit_call_node(node) ⇒ Object



46
47
48
49
50
51
52
53
# File 'lib/lagoon/analyzer/ast/method_reference_visitor.rb', line 46

def visit_call_node(node)
  node.receiver&.accept(self)
  node.arguments&.accept(self)

  returned_models = infer_call(node)
  returned_models.each { |model| record_model(model) }
  visit_block(node.block, returned_models) if node.block
end

#visit_constant_path_node(node) ⇒ Object



32
33
34
# File 'lib/lagoon/analyzer/ast/method_reference_visitor.rb', line 32

def visit_constant_path_node(node)
  record_model(constant_path_name(node))
end

#visit_constant_read_node(node) ⇒ Object



28
29
30
# File 'lib/lagoon/analyzer/ast/method_reference_visitor.rb', line 28

def visit_constant_read_node(node)
  record_model(node.name.to_s)
end

#visit_def_node(_node) ⇒ Object



24
25
26
# File 'lib/lagoon/analyzer/ast/method_reference_visitor.rb', line 24

def visit_def_node(_node)
  # Nested method definitions have an independent scope.
end

#visit_instance_variable_write_node(node) ⇒ Object



41
42
43
44
# File 'lib/lagoon/analyzer/ast/method_reference_visitor.rb', line 41

def visit_instance_variable_write_node(node)
  node.value&.accept(self)
  @instance_variables[node.name.to_s] = infer_value(node.value)
end

#visit_local_variable_write_node(node) ⇒ Object



36
37
38
39
# File 'lib/lagoon/analyzer/ast/method_reference_visitor.rb', line 36

def visit_local_variable_write_node(node)
  node.value&.accept(self)
  @local_variables[node.name.to_s] = infer_value(node.value)
end