Spec-Zone.ru › Ruby 3.4

модуль ErrorHighlight

Константы

VERSION

Методы публичного класса

formatter ()
Исходный код
# File lib/error_highlight/formatter.rb, line 67
def self.formatter
  Ractor.current[:__error_highlight_formatter__] || DefaultFormatter
end
formatter= (formatter)
Исходный код
# File lib/error_highlight/formatter.rb, line 71
def self.formatter=(formatter)
  Ractor.current[:__error_highlight_formatter__] = formatter
end
spot (obj, **opts)
Исходный код
# File lib/error_highlight/base.rb, line 33
def self.spot(obj, **opts)
  case obj
  when Exception
    exc = obj
    loc = opts[:backtrace_location]
    opts = { point_type: opts.fetch(:point_type, :name) }

    unless loc
      case exc
      when TypeError, ArgumentError
        opts[:point_type] = :args
      end

      locs = exc.backtrace_locations
      return nil unless locs

      loc = locs.first
      return nil unless loc

      opts[:name] = exc.name if NameError === obj
    end

    return nil unless Thread::Backtrace::Location === loc

    node =
      begin
        RubyVM::AbstractSyntaxTree.of(loc, keep_script_lines: true)
      rescue RuntimeError => error
        # RubyVM::AbstractSyntaxTree.of raises an error with a message that
        # includes "prism" when the ISEQ was compiled with the prism compiler.
        # In this case, we'll try to parse again with prism instead.
        raise unless error.message.include?("prism")
        prism_find(loc)
      end

    Spotter.new(node, **opts).spot

  when RubyVM::AbstractSyntaxTree::Node, Prism::Node
    Spotter.new(obj, **opts).spot

  else
    raise TypeError, "Exception is expected"
  end

rescue SyntaxError,
       SystemCallError, # file not found or something
       ArgumentError # eval'ed code

  return nil
end

Определите фрагмент кода, в котором произошла данная ошибка.

Параметры:

point_type: :name | :args

:name (default) points the method/variable name that the exception occurred.
:args points the arguments of the method call that the exception occurred.

backtrace_location: Thread::Backtrace::Location

It locates the code fragment of the given backtrace_location.
By default, it uses the first frame of backtrace_locations of the given exception.

Возвращает:

{
  first_lineno: Integer,
  first_column: Integer,
  last_lineno: Integer,
  last_column: Integer,
  snippet: String,
  script_lines: [String],
} | nil

Ограничения:

В настоящее время ErrorHighlight.spot поддерживает только фрагмент кода в одну строку. Поэтому, если возвращаемое значение не nil, first_lineno и last_lineno будут иметь одинаковое значение. Если фрагмент кода, относящийся к ошибке, занимает несколько строк (например, Array#[] в +ary+), метод вернет nil. Это ограничение может быть удалено в будущем.

Методы закрытого класса

prism_find (location)
Исходный код
# File lib/error_highlight/base.rb, line 86
def self.prism_find(location)
  require "prism"
  return nil if Prism::VERSION < "1.0.0"

  absolute_path = location.absolute_path
  return unless absolute_path

  node_id = RubyVM::AbstractSyntaxTree.node_id_for_backtrace_location(location)
  Prism.parse_file(absolute_path).value.breadth_first_search { |node| node.node_id == node_id }
end

Принимает объект Thread::Backtrace::Location и возвращает Prism::Node, соответствующий месту в исходном коде.

Ruby Core © 1993–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API