class Mustermann::AST::Node

@!visibility private

def self.[](name)

Returns:
  • (Class) - factory for the node

Parameters:
  • name (Symbol) -- of the node
def self.[](name)
  @names       ||= {}
  @names[name] ||= begin
    const_name = constant_name(name)
    Object.const_get(const_name) if Object.const_defined?(const_name)
  end
end

def self.constant_name(name)

Returns:
  • (String) - qualified name of factory for the node

Parameters:
  • name (Symbol) -- of the node
def self.constant_name(name)
  return self.name if name.to_sym == :node
  name = name.to_s.split(?_).map(&:capitalize).join
  "#{self.name}::#{name}"
end

def self.parse(payload = nil, **options, &block)

Returns:
  • (Mustermann::AST::Node) -
def self.parse(payload = nil, **options, &block)
  new(payload, **options).tap { |n| n.parse(&block) }
end

def self.type

@!visibility private
Turns a class name into a node identifier.
def self.type
  name[/[^:]+$/].split(/(?<=.)(?=[A-Z])/).map(&:downcase).join(?_).to_sym
end

def each_leaf(&block)

@!visibility private
Loop through all nodes that don't have child nodes.
def each_leaf(&block)
  return enum_for(__method__) unless block_given?
  called = false
  Array(payload).each do |entry|
    next unless entry.respond_to? :each_leaf
    entry.each_leaf(&block)
    called = true
  end
  yield(self) unless called
end

def initialize(payload = nil, **options)

@!visibility private
def initialize(payload = nil, **options)
  options.each { |key, value| public_send("#{key}=", value) }
  self.payload = payload
end

def is_a?(type)

@!visibility private
def is_a?(type)
  type = Node[type] if type.is_a? Symbol
  super(type)
end

def length

Returns:
  • (Integer) - length of the substring
def length
  stop - start if start and stop
end

def min_size

Returns:
  • (Integer) - minimum size for a node
def min_size
  0
end

def parse

@!visibility private
Double dispatch helper for reading from the buffer into the payload.
def parse
  self.payload ||= []
  while element = yield
    payload << element
  end
end

def type

@!visibility private
Turns a class name into a node identifier.
def type
  self.class.type
end