Parent

Namespace

Parser::Diagnostic

@api public

@!attribute [r] level

@see LEVELS
@return [Symbol] diagnostic level

@!attribute [r] reason

@see Parser::MESSAGES
@return [Symbol] reason for error

@!attribute [r] arguments

@see Parser::MESSAGES
@return [Symbol] extended arguments that describe the error

@!attribute [r] message

@return [String] error message

@!attribute [r] location

Main error-related source range.
@return [Parser::Source::Range]

@!attribute [r] highlights

Supplementary error-related source ranges.
@return [Array<Parser::Source::Range>]

Constants

LEVELS

Collection of the available diagnostic levels.

@return [Array]

Attributes

arguments[R]
highlights[R]
level[R]
location[R]
reason[R]

Public Class Methods

new(level, reason, arguments, location, highlights=[]) click to toggle source

@param [Symbol] level @param [Symbol] reason @param [Hash] arguments @param [Parser::Source::Range] location @param [Array<Parser::Source::Range>] highlights

# File lib/parser/diagnostic.rb, line 47
def initialize(level, reason, arguments, location, highlights=[])
  unless LEVELS.include?(level)
    raise ArgumentError,
          "Diagnostic#level must be one of #{LEVELS.join(', ')}; "                "#{level.inspect} provided."
  end
  raise 'Expected a location' unless location

  @level       = level
  @reason      = reason
  @arguments   = (arguments || {}).dup.freeze
  @location    = location
  @highlights  = highlights.dup.freeze

  freeze
end

Public Instance Methods

message() click to toggle source

@return [String] the rendered message.

# File lib/parser/diagnostic.rb, line 67
def message
  MESSAGES[@reason] % @arguments
end
render() click to toggle source

Renders the diagnostic message as a clang-like diagnostic.

@example

diagnostic.render # =>
# [
#   "(fragment:0):1:5: error: unexpected token $end",
#   "foo +",
#   "    ^"
# ]

@return [Array<String>]

# File lib/parser/diagnostic.rb, line 84
def render
  source_line    = @location.source_line
  highlight_line = ' ' * source_line.length

  @highlights.each do |hilight|
    range = hilight.column_range
    highlight_line[range] = '~' * hilight.size
  end

  range = @location.column_range
  highlight_line[range] = '^' * @location.size

  [
    "#{@location.to_s}: #{@level}: #{message}",
    source_line,
    highlight_line,
  ]
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.