Module: Foxtail::Syntax::Visitor

Defined in:
lib/foxtail/syntax/visitor.rb

Overview

Visitor module for traversing AST nodes

Include this module and override the visit_* methods you need. By default, all visit_* methods traverse children automatically. Override a method and omit ‘super` to stop traversal at that node.

Examples:

Collecting message IDs

class MessageIdCollector
  include Foxtail::Syntax::Visitor

  def initialize
    @ids = []
  end

  attr_reader :ids

  def visit_message(node)
    @ids << node.id.name
    super  # continue traversal
  end
end

collector = MessageIdCollector.new
resource.accept(collector)
collector.ids # => ["hello", "goodbye", ...]

Instance Method Summary collapse

Instance Method Details

#visit_annotation(node) ⇒ Object



53
# File 'lib/foxtail/syntax/visitor.rb', line 53

def visit_annotation(node) = visit_children(node)

#visit_attribute(node) ⇒ Object



34
# File 'lib/foxtail/syntax/visitor.rb', line 34

def visit_attribute(node) = visit_children(node)

#visit_call_arguments(node) ⇒ Object



39
# File 'lib/foxtail/syntax/visitor.rb', line 39

def visit_call_arguments(node) = visit_children(node)

#visit_children(node) ⇒ Object



56
57
58
# File 'lib/foxtail/syntax/visitor.rb', line 56

def visit_children(node)
  node.children.each {|child| child&.accept(self) }
end

#visit_comment(node) ⇒ Object



49
# File 'lib/foxtail/syntax/visitor.rb', line 49

def visit_comment(node) = visit_children(node)

#visit_function_reference(node) ⇒ Object



43
# File 'lib/foxtail/syntax/visitor.rb', line 43

def visit_function_reference(node) = visit_children(node)

#visit_group_comment(node) ⇒ Object



50
# File 'lib/foxtail/syntax/visitor.rb', line 50

def visit_group_comment(node) = visit_children(node)

#visit_identifier(node) ⇒ Object



48
# File 'lib/foxtail/syntax/visitor.rb', line 48

def visit_identifier(node) = visit_children(node)

#visit_junk(node) ⇒ Object



52
# File 'lib/foxtail/syntax/visitor.rb', line 52

def visit_junk(node) = visit_children(node)

#visit_message(node) ⇒ Object



32
# File 'lib/foxtail/syntax/visitor.rb', line 32

def visit_message(node) = visit_children(node)

#visit_message_reference(node) ⇒ Object



41
# File 'lib/foxtail/syntax/visitor.rb', line 41

def visit_message_reference(node) = visit_children(node)

#visit_named_argument(node) ⇒ Object



40
# File 'lib/foxtail/syntax/visitor.rb', line 40

def visit_named_argument(node) = visit_children(node)

#visit_number_literal(node) ⇒ Object



46
# File 'lib/foxtail/syntax/visitor.rb', line 46

def visit_number_literal(node) = visit_children(node)

#visit_pattern(node) ⇒ Object



35
# File 'lib/foxtail/syntax/visitor.rb', line 35

def visit_pattern(node) = visit_children(node)

#visit_placeable(node) ⇒ Object



36
# File 'lib/foxtail/syntax/visitor.rb', line 36

def visit_placeable(node) = visit_children(node)

#visit_resource(node) ⇒ Object



31
# File 'lib/foxtail/syntax/visitor.rb', line 31

def visit_resource(node) = visit_children(node)

#visit_resource_comment(node) ⇒ Object



51
# File 'lib/foxtail/syntax/visitor.rb', line 51

def visit_resource_comment(node) = visit_children(node)

#visit_select_expression(node) ⇒ Object



37
# File 'lib/foxtail/syntax/visitor.rb', line 37

def visit_select_expression(node) = visit_children(node)

#visit_span(node) ⇒ Object



54
# File 'lib/foxtail/syntax/visitor.rb', line 54

def visit_span(node) = visit_children(node)

#visit_string_literal(node) ⇒ Object



45
# File 'lib/foxtail/syntax/visitor.rb', line 45

def visit_string_literal(node) = visit_children(node)

#visit_term(node) ⇒ Object



33
# File 'lib/foxtail/syntax/visitor.rb', line 33

def visit_term(node) = visit_children(node)

#visit_term_reference(node) ⇒ Object



42
# File 'lib/foxtail/syntax/visitor.rb', line 42

def visit_term_reference(node) = visit_children(node)

#visit_text_element(node) ⇒ Object



47
# File 'lib/foxtail/syntax/visitor.rb', line 47

def visit_text_element(node) = visit_children(node)

#visit_variable_reference(node) ⇒ Object



44
# File 'lib/foxtail/syntax/visitor.rb', line 44

def visit_variable_reference(node) = visit_children(node)

#visit_variant(node) ⇒ Object



38
# File 'lib/foxtail/syntax/visitor.rb', line 38

def visit_variant(node) = visit_children(node)