module Maccro::Impl

Public Class Methods

update_by_rules(ast, source, rules) { |source, first_lineno, first_column| ... } click to toggle source

for internal use

# 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