ErrorHighlight 모듈

ErrorHighlight 모듈 (ErrorHighlight)

ErrorHighlight 모듈은 예외가 발생한 정확한 코드 조각을 식별하는 데 쓰여요. 에러 메시지에서 해당 예외가 어느 코드 위치에서 터졌는지 가리키는 기능을 담당하죠.

출처: Ruby 4.0 API

본문

상수 (Constants)

  • VERSION — 모듈 버전.

::formatter (Public Class Method)

formatter() — 현재의 에러 하이라이트 포매터를 돌려줘요. 기본값은 DefaultFormatter예요. Ractor마다 별도로 설정할 수 있는 값이라, Ractor.current[:__error_highlight_formatter__]에 설정된 값이 있으면 그것을 돌려줍니다.

# File lib/error_highlight/formatter.rb, line 67
def self.formatter
  Ractor.current[:__error_highlight_formatter__] || DefaultFormatter
end

::formatter= (Public Class Method)

formatter=(formatter) — 에러 하이라이트 포매터를 설정해요. Ractor.current[:__error_highlight_formatter__]에 값을 넣는 방식이라 현재 Ractor에만 영향을 줘요.

# File lib/error_highlight/formatter.rb, line 71
def self.formatter=(formatter)
  Ractor.current[:__error_highlight_formatter__] = formatter
end

::spot (Public Class Method)

spot(obj, **opts) — 주어진 예외가 발생한 코드 조각을 식별해요.

옵션은 두 가지가 있어요.

  • point_type: :name | :args:name(기본)은 예외가 발생한 메서드/변수 이름을 가리키고, :args는 예외가 발생한 메서드 호출의 인자 부분을 가리켜요.
  • backtrace_location: Thread::Backtrace::Location — 주어진 백트레이스 위치의 코드 조각을 찾아요. 기본은 주어진 예외의 backtrace_locations의 첫 프레임을 사용해요.

반환 값은 위치 정보를 담은 해시이거나 nil이에요.

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

obj로 예외 객체를 넘기면 backtrace_locations의 첫 프레임을 기준으로 찾고, RubyVM::AbstractSyntaxTree::NodePrism::Node를 넘기면 그 노드를 직접 분석해요. 그 밖의 타입이면 TypeError가 발생해요.

제약 — 현재 ErrorHighlight.spot는 한 줄(single-line) 코드 조각만 지원해요. 그래서 반환값이 nil이 아니면 first_linenolast_lineno는 같은 값이에요. 관련 코드 조각이 여러 줄에 걸쳐 있으면(예: ary[(newline)expr(newline)] 형태의 Array#[]) 이 메서드는 nil을 돌려줘요. 이 제약은 나중에 없어질 수 있어요.

::prism_find (Private Class Method)

prism_find(location)Thread::Backtrace::Location 객체를 받아, 소스 코드에서 그 백트레이스 위치에 해당하는 Prism::Node를 돌려줘요. spot이 AST를 prism 컴파일러로 파싱한 경우에 내부적으로 사용되는 보조 메서드예요.