class Mustermann::AST::Node
@!visibility private
def self.[](name)
-
(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)
-
(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)
-
(Mustermann::AST::Node)
-
def self.parse(payload = nil, **options, &block) new(payload, **options).tap { |n| n.parse(&block) } end
def self.type
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)
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)
def initialize(payload = nil, **options) options.each { |key, value| public_send("#{key}=", value) } self.payload = payload end
def is_a?(type)
def is_a?(type) type = Node[type] if type.is_a? Symbol super(type) end
def length
-
(Integer)
- length of the substring
def length stop - start if start and stop end
def min_size
-
(Integer)
- minimum size for a node
def min_size 0 end
def parse
Double dispatch helper for reading from the buffer into the payload.
def parse self.payload ||= [] while element = yield payload << element end end
def type
Turns a class name into a node identifier.
def type self.class.type end