class Parser::Diagnostic::Engine

{Parser::Diagnostic::Engine} provides a basic API for dealing with diagnostics by delegating them to registered consumers.

@example

buffer      = Parser::Source::Buffer.new(__FILE__, source: 'foobar')

consumer = lambda do |diagnostic|
  puts diagnostic.message
end

engine     = Parser::Diagnostic::Engine.new(consumer)
diagnostic = Parser::Diagnostic.new(
    :warning, :unexpected_token, { :token => 'abc' }, buffer, 1..2)

engine.process(diagnostic) # => "unexpected token abc"

@api public

@!attribute [rw] consumer

@return [#call(Diagnostic)]

@!attribute [rw] all_errors_are_fatal

When set to `true` any error that is encountered will result in
{Parser::SyntaxError} being raised.
@return [Boolean]

@!attribute [rw] ignore_warnings

When set to `true` warnings will be ignored.
@return [Boolean]

Attributes

all_errors_are_fatal[RW]
consumer[RW]
ignore_warnings[RW]

Public Class Methods

new(consumer=nil) click to toggle source

@param [#call(Diagnostic)] consumer

# File lib/parser/diagnostic/engine.rb, line 45
def initialize(consumer=nil)
  @consumer             = consumer

  @all_errors_are_fatal = false
  @ignore_warnings      = false
end

Public Instance Methods

process(diagnostic) click to toggle source

Processes a `diagnostic`:

* Passes the diagnostic to the consumer, if it's not a warning when
  `ignore_warnings` is set.
* After that, raises {Parser::SyntaxError} when `all_errors_are_fatal`
  is set to true.

@param [Parser::Diagnostic] diagnostic @return [Parser::Diagnostic::Engine] @see ignore? @see raise?

# File lib/parser/diagnostic/engine.rb, line 64
def process(diagnostic)
  if ignore?(diagnostic)
    # do nothing
  elsif @consumer
    @consumer.call(diagnostic)
  end

  if raise?(diagnostic)
    raise Parser::SyntaxError, diagnostic
  end

  self
end

Protected Instance Methods

ignore?(diagnostic) click to toggle source

Checks whether `diagnostic` should be ignored.

@param [Parser::Diagnostic] diagnostic @return [Boolean]

# File lib/parser/diagnostic/engine.rb, line 86
def ignore?(diagnostic)
  @ignore_warnings &&
        diagnostic.level == :warning
end
raise?(diagnostic) click to toggle source

Checks whether `diagnostic` should be raised as an exception.

@param [Parser::Diagnostic] diagnostic @return [Boolean]

# File lib/parser/diagnostic/engine.rb, line 97
def raise?(diagnostic)
  (@all_errors_are_fatal &&
      diagnostic.level == :error) ||
    diagnostic.level == :fatal
end