class Dry::Transformer::Compiler

@api private

Constants

InvalidFunctionNameError

Attributes

registry[R]
transformer[R]

Public Class Methods

new(registry, transformer = nil) click to toggle source
# File lib/dry/transformer/compiler.rb, line 11
def initialize(registry, transformer = nil)
  @registry = registry
  @transformer = transformer
end

Public Instance Methods

call(ast) click to toggle source
# File lib/dry/transformer/compiler.rb, line 16
def call(ast)
  ast.map(&method(:visit)).reduce(:>>)
end
visit(node) click to toggle source
# File lib/dry/transformer/compiler.rb, line 20
def visit(node)
  id, *rest = node
  public_send(:"visit_#{id}", *rest)
end
visit_arg(arg) click to toggle source
# File lib/dry/transformer/compiler.rb, line 38
def visit_arg(arg)
  arg
end
visit_fn(node) click to toggle source
# File lib/dry/transformer/compiler.rb, line 25
def visit_fn(node)
  name, rest = node
  args = rest.map { |arg| visit(arg) }

  if registry.contain?(name)
    registry[name, *args]
  elsif transformer.respond_to?(name)
    Function.new(transformer.method(name), name: name, args: args)
  else
    raise InvalidFunctionNameError, "function name +#{name}+ is not valid"
  end
end
visit_t(node) click to toggle source
# File lib/dry/transformer/compiler.rb, line 42
def visit_t(node)
  call(node)
end