Sha256: a982b0169231328d5419fcdd977285bb214ff18a12066af1462b06794287e9a0

Contents?: true

Size: 1.09 KB

Versions: 6

Compression:

Stored size: 1.09 KB

Contents

# frozen_string_literal: true

require "json"

module SyntaxTree
  # This visitor transforms the AST into a hash that contains only primitives
  # that can be easily serialized into JSON.
  class JSONVisitor < FieldVisitor
    attr_reader :target

    def initialize
      @target = nil
    end

    private

    def comments(node)
      target[:comments] = visit_all(node.comments)
    end

    def field(name, value)
      target[name] = value.is_a?(Node) ? visit(value) : value
    end

    def list(name, values)
      target[name] = visit_all(values)
    end

    def node(node, type)
      previous = @target
      @target = { type: type, location: visit_location(node.location) }
      yield
      @target
    ensure
      @target = previous
    end

    def pairs(name, values)
      target[name] = values.map { |(key, value)| [visit(key), visit(value)] }
    end

    def text(name, value)
      target[name] = value
    end

    def visit_location(location)
      [
        location.start_line,
        location.start_char,
        location.end_line,
        location.end_char
      ]
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
syntax_tree-6.2.0 lib/syntax_tree/json_visitor.rb
syntax_tree-6.1.1 lib/syntax_tree/json_visitor.rb
syntax_tree-6.1.0 lib/syntax_tree/json_visitor.rb
syntax_tree-6.0.2 lib/syntax_tree/json_visitor.rb
syntax_tree-6.0.1 lib/syntax_tree/json_visitor.rb
syntax_tree-6.0.0 lib/syntax_tree/json_visitor.rb