Class: SyntaxTree::CompleteMutationVisitor

Inherits:
BasicVisitor
  • Object
show all
Defined in:
lib/syntax_tree/complete_mutation_visitor.rb

Overview

This is a fix for SyntaxTree::MutationVisitor not traversing the entire tree

Direct Known Subclasses

Tailwindcss::RubyMutationVisitor

Instance Method Summary collapse

Constructor Details

#initializeCompleteMutationVisitor

Returns a new instance of CompleteMutationVisitor.



6
7
8
9
# File 'lib/syntax_tree/complete_mutation_visitor.rb', line 6

def initialize
  super
  @mutations = []
end

Instance Method Details

#copy_and_visit_children(node) ⇒ Object Also known as: visit_aref, visit_aref_field, visit_alias, visit_arg_block, visit_arg_paren, visit_arg_star, visit_args, visit_args_forward, visit_array, visit_aryptn, visit_assign, visit_assoc, visit_assoc_splat, visit_backref, visit_backtick, visit_bare_assoc_hash, visit_BEGIN, visit_begin, visit_binary, visit_block, visit_blockarg, visit_block_var, visit_bodystmt, visit_break, visit_call, visit_case, visit_CHAR, visit_class, visit_comma, visit_command, visit_command_call, visit_comment, visit_const, visit_const_path_field, visit_const_path_ref, visit_const_ref, visit_cvar, visit_def, visit_defined, visit_dyna_symbol, visit_END, visit_else, visit_elsif, visit_embdoc, visit_embexpr_beg, visit_embexpr_end, visit_embvar, visit_ensure, visit_excessed_comma, visit_field, visit_float, visit_fndptn, visit_for, visit_gvar, visit_hash, visit_heredoc, visit_heredoc_beg, visit_heredoc_end, visit_hshptn, visit_ident, visit_if, visit_if_op, visit_imaginary, visit_in, visit_int, visit_ivar, visit_kw, visit_kwrest_param, visit_label, visit_label_end, visit_lambda, visit_lambda_var, visit_lbrace, visit_lbracket, visit_lparen, visit_massign, visit_method_add_block, visit_mlhs, visit_mlhs_paren, visit_module, visit_mrhs, visit_next, visit_not, visit_op, visit_opassign, visit_params, visit_paren, visit_period, visit_pinned_begin, visit_pinned_var_ref, visit_program, visit_qsymbols, visit_qsymbols_beg, visit_qwords, visit_qwords_beg, visit_range, visit_rassign, visit_rational, visit_rbrace, visit_rbracket, visit_redo, visit_regexp_beg, visit_regexp_content, visit_regexp_end, visit_regexp_literal, visit_rescue, visit_rescue_ex, visit_rescue_mod, visit_rest_param, visit_retry, visit_return, visit_rparen, visit_sclass, visit_statements, visit_string_concat, visit_string_content, visit_string_dvar, visit_string_embexpr, visit_string_literal, visit_super, visit_symbeg, visit_symbol_content, visit_symbol_literal, visit_symbols, visit_symbols_beg, visit_tlambda, visit_tlambeg, visit_top_const_field, visit_top_const_ref, visit_tstring_beg, visit_tstring_content, visit_tstring_end, visit_unary, visit_undef, visit_unless, visit_until, visit_var_field, visit_var_ref, visit_vcall, visit_void_stmt, visit_when, visit_while, visit_word, visit_words, visit_words_beg, visit_xstring, visit_xstring_literal, visit_yield, visit_zsuper, visit___end__



26
27
28
29
30
31
32
33
34
35
# File 'lib/syntax_tree/complete_mutation_visitor.rb', line 26

def copy_and_visit_children(node)
  node.dup.tap do |clone|
    clone.instance_variables.each do |name|
      next if i[@location @comments].include?(name)

      var = clone.instance_variable_get(name)
      clone.instance_variable_set(name, visit_child(var))
    end
  end
end

#mutate(query, &block) ⇒ Object



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

def mutate(query, &block)
  @mutations << [Pattern.new(query).compile, block]
end

#visit(node) ⇒ Object



15
16
17
18
19
20
21
22
23
24
# File 'lib/syntax_tree/complete_mutation_visitor.rb', line 15

def visit(node)
  return unless node

  result = node.accept(self)
  @mutations.each do |(pattern, mutation)|
    result = mutation.call(result) if pattern.call(result)
  end

  result
end

#visit_child(child) ⇒ Object



37
38
39
40
41
42
43
44
45
46
# File 'lib/syntax_tree/complete_mutation_visitor.rb', line 37

def visit_child(child)
  case child
  when Array
    child.map { |node| visit_child(node) }
  when SyntaxTree::Node
    visit(child)
  else
    child
  end
end