Sha256: c91ff4c3cb5f53549b601486bed61065e58bcc48af417ba5f32828a316703b03

Contents?: true

Size: 1.01 KB

Versions: 14

Compression:

Stored size: 1.01 KB

Contents

# frozen_string_literal: true

module Liquid
  class ParseTreeVisitor
    def self.for(node, callbacks = Hash.new(proc {}))
      if defined?(node.class::ParseTreeVisitor)
        node.class::ParseTreeVisitor
      else
        self
      end.new(node, callbacks)
    end

    def initialize(node, callbacks)
      @node      = node
      @callbacks = callbacks
    end

    def add_callback_for(*classes, &block)
      callback = block
      callback = ->(node, _) { yield node } if block.arity.abs == 1
      callback = ->(_, _) { yield } if block.arity.zero?
      classes.each { |klass| @callbacks[klass] = callback }
      self
    end

    def visit(context = nil)
      children.map do |node|
        item, new_context = @callbacks[node.class].call(node, context)
        [
          item,
          ParseTreeVisitor.for(node, @callbacks).visit(new_context || context),
        ]
      end
    end

    protected

    def children
      @node.respond_to?(:nodelist) ? Array(@node.nodelist) : Const::EMPTY_ARRAY
    end
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
liquid-5.8.1 lib/liquid/parse_tree_visitor.rb
liquid-5.8.0 lib/liquid/parse_tree_visitor.rb
liquid-5.7.3 lib/liquid/parse_tree_visitor.rb
liquid-5.7.2 lib/liquid/parse_tree_visitor.rb
liquid-5.7.1 lib/liquid/parse_tree_visitor.rb
liquid-5.7.0 lib/liquid/parse_tree_visitor.rb
liquid-5.6.4 lib/liquid/parse_tree_visitor.rb
liquid-5.6.3 lib/liquid/parse_tree_visitor.rb
liquid-5.6.2 lib/liquid/parse_tree_visitor.rb
liquid-5.6.1 lib/liquid/parse_tree_visitor.rb
liquid-5.6.0 lib/liquid/parse_tree_visitor.rb
liquid-5.6.0.rc3 lib/liquid/parse_tree_visitor.rb
liquid-5.6.0.rc2 lib/liquid/parse_tree_visitor.rb
liquid-5.6.0.rc1 lib/liquid/parse_tree_visitor.rb