Class: SyntaxTree::ERB::MutationVisitor

Inherits:
Object
  • Object
show all
Defined in:
lib/syntax_tree/erb/mutation_visitor.rb

Overview

A base ERB Visitor class that returns a deep copy of the AST. It can be subclassed to mutate some parts of the AST and keep everything else as it was.

Ideally this class (or equivalent) would exist within SyntaxTree::ERB gem.

Direct Known Subclasses

Tailwindcss::ErbMutationVisitor

Instance Method Summary collapse

Instance Method Details

#copy_and_visit_children(node) ⇒ Object Also known as: visit_attribute, visit_block, visit_char_data, visit_closing_tag, visit_doctype, visit_document, visit_erb, visit_erb_block, visit_erb_case, visit_erb_case_when, visit_erb_close, visit_erb_comment, visit_erb_content, visit_erb_do_close, visit_erb_else, visit_erb_end, visit_erb_if, visit_erb_yield, visit_html, visit_html_comment, visit_html_string, visit_new_line, visit_opening_tag, visit_token



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/syntax_tree/erb/mutation_visitor.rb', line 15

def copy_and_visit_children(node)
  node.dup.tap do |clone|
    clone.instance_variables.each do |name|
      var = clone.instance_variable_get(name)
      clone.instance_variable_set(
        name,
        case var
        when Array
          var.map { |child| visit(child) }
        when SyntaxTree::ERB::Node
          visit(var)
        else
          var
        end
      )
    end
  end
end

#visit(node) ⇒ Object



11
12
13
# File 'lib/syntax_tree/erb/mutation_visitor.rb', line 11

def visit(node)
  node&.accept(self)
end