lib/parslet/cause.rb in parslet-1.3.0 vs lib/parslet/cause.rb in parslet-1.4.0

- old
+ new

@@ -1,16 +1,50 @@ module Parslet - # An internal class that allows delaying the construction of error messages - # (as strings) until we really need to print them. + # Represents a cause why a parse did fail. A lot of these objects are + # constructed - not all of the causes turn out to be failures for the whole + # parse. # - class Cause < Struct.new(:message, :source, :pos) # :nodoc: - # Appends 'at line ... char ...' to the string given. Use +pos+ to + class Cause + def initialize(message, source, pos, children) + @message, @source, @pos, @children = + message, source, pos, children + end + + # @return [String, Array] A string or an array of message pieces that + # provide failure information. Use #to_s to get a formatted string. + attr_reader :message + + # @return [Parslet::Source] Source that was parsed when this error + # happend. Mainly used for line number information. + attr_reader :source + + # Location of the error. + # + # @return [Fixnum] Position where the error happened. (character offset) + attr_reader :pos + + # When this cause is part of a tree of error causes: child nodes for this + # node. Very often carries the reasons for this cause. + # + # @return [Array<Parslet::Cause>] A list of reasons for this cause. + def children + @children ||= [] + end + + # Appends 'at line LINE char CHAR' to the string given. Use +pos+ to # override the position of the +source+. This method returns an object # that can be turned into a string using #to_s. # - def self.format(source, pos, str) - self.new(str, source, pos) + # @param source [Parslet::Source] source that was parsed when this error + # happened + # @param pos [Fixnum] position of error + # @param str [String, Array<String>] message parts + # @param children [Array<Parslet::Cause>] child nodes for this error tree + # @return [Parslet::Cause] a new instance of {Parslet::Cause} + # + def self.format(source, pos, str, children=[]) + self.new(str, source, pos, children) end def to_s line, column = source.line_and_column(pos) # Allow message to be a list of objects. Join them here, since we now @@ -35,26 +69,24 @@ def ascii_tree StringIO.new.tap { |io| recursive_ascii_tree(self, io, [true]) }. string end - - def children - @children ||= Array.new - end + private - def recursive_ascii_tree(node, stream, curved) # :nodoc: + def recursive_ascii_tree(node, stream, curved) append_prefix(stream, curved) stream.puts node.to_s node.children.each do |child| last_child = (node.children.last == child) recursive_ascii_tree(child, stream, curved + [last_child]) end end - def append_prefix(stream, curved) # :nodoc: - curved[0..-2].each do |c| + def append_prefix(stream, curved) + return if curved.size < 2 + curved[1..-2].each do |c| stream.print c ? " " : "| " end stream.print curved.last ? "`- " : "|- " end end \ No newline at end of file