Sha256: c279b77c33541a700c7a0d636c4dc7dc54c846352ef097798b030a7cda153666

Contents?: true

Size: 1.41 KB

Versions: 6

Compression:

Stored size: 1.41 KB

Contents

require "metamorpher/transformer/merger"
require "metamorpher/transformer/site"
require "metamorpher/rewriter/rule"
require "metamorpher/drivers/ruby"

module Metamorpher
  module Transformer
    module Base
      def transform(src, &block)
        literal = driver.parse(src)
        replacements = reduce_to_replacements(src, literal)
        merge(src, replacements, &block)
      end

      def transform_file(path, &block)
        transform(File.read(path), &block)
      end

      def transform_files(paths, &block)
        paths.each_with_object({}) do |path, result|
          changes = []
          result[path] = transform_file(path) { |change| changes << change }
          block.call(path, result[path], changes) if block
        end
      end

      def driver
        @driver ||= Metamorpher::Drivers::Ruby.new
      end

      private

      def reduce_to_replacements(src, literal)
        [].tap do |replacements|
          rule.reduce(literal) do |original, rewritings|
            original_position = driver.source_location_for(original)
            original_code = src[original_position]

            rewritings.alternatives.each do |rewriting|
              replacements << Site.new(original_position, original_code, driver.unparse(rewriting))
            end
          end
        end
      end

      def rule
        @rule ||= Rewriter::Rule.new(pattern: pattern, replacement: replacement)
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
metamorpher-0.2.6 lib/metamorpher/transformer/base.rb
metamorpher-0.2.5 lib/metamorpher/transformer/base.rb
metamorpher-0.2.4 lib/metamorpher/transformer/base.rb
metamorpher-0.2.3 lib/metamorpher/transformer/base.rb
metamorpher-0.2.2 lib/metamorpher/transformer/base.rb
metamorpher-0.2.1 lib/metamorpher/transformer/base.rb