Module: Wood::TreeRewriter

Defined in:
lib/wood/tree_rewriter.rb

Defined Under Namespace

Modules: ClassMethods Classes: Rewriter

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(klass) ⇒ Object



26
27
28
# File 'lib/wood/tree_rewriter.rb', line 26

def self.included(klass)
  klass.extend ClassMethods
end

.new(&block) ⇒ Object



14
15
16
# File 'lib/wood/tree_rewriter.rb', line 14

def self.new(&block)
  Class.new(Rewriter, &block).new
end

Instance Method Details

#do_rewrite(node, repeat = false) ⇒ Object



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/wood/tree_rewriter.rb', line 43

def do_rewrite(node, repeat = false)
  patterns.each do |p|
    node = p.replacement_for(node)
  end

  if node.respond_to? :each_child
    node.each_child do |c|
      node.set_child(c, rewrite(node.get_child(c), repeat))
    end
  else
    if Array === node
      node = node.map do |c|
        rewrite(c, repeat)
      end
    end
  end

  return node
end

#patternsObject



63
64
65
# File 'lib/wood/tree_rewriter.rb', line 63

def patterns
  self.class.patterns
end

#rewrite(node, repeat = false) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/wood/tree_rewriter.rb', line 30

def rewrite(node, repeat = false)
  return do_rewrite(node, repeat) unless repeat

  changed = true
  while changed
    tmp     = do_rewrite(node, repeat)
    changed = tmp != node
    node    = tmp
  end

  return do_rewrite(node, false)
end