Module: Maccro::Impl

Defined in:
lib/maccro/impl.rb

Class Method Summary collapse

Class Method Details

.update_by_rules(ast, source, rules) ⇒ Object

for internal use



4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/maccro/impl.rb', line 4

def self.update_by_rules(ast, source, rules)
  CodeUtil.extend_tree_with_wrapper(ast)

  rewrite_happens = false
  first_time = true

  while rewrite_happens || first_time
    rewrite_happens = false
    first_time = false

    try_once = ->(rule) {
      matched = rule.match(ast)
      next unless matched

      source = matched.rewrite(source)
      ast = yield source, ast.first_lineno, ast.first_column
      CodeUtil.extend_tree_with_wrapper(ast)
      rewrite_happens = true
      try_once.call(rule)
    }

    rules.each_pair do |_name, this_rule|
      try_once.call(this_rule)
      break if rewrite_happens # to retry all rules
    end
  end

  return ast, source
end