Class: Klenod::Runtime::BacktraceRewriter

Inherits:
Object
  • Object
show all
Defined in:
lib/klenod/runtime/backtrace_rewriter.rb

Defined Under Namespace

Classes: BacktraceString, ParsedBacktraceEntry

Instance Method Summary collapse

Constructor Details

#initialize(mods) ⇒ BacktraceRewriter

Returns a new instance of BacktraceRewriter.



41
42
43
44
45
# File 'lib/klenod/runtime/backtrace_rewriter.rb', line 41

def initialize(mods)
  @source_maps = source_maps_for(mods)
  @source_map_cache = Hash.new { |h, path| h[path] = @source_maps[path] }
  @constant_display_names = constant_display_names_for(mods)
end

Instance Method Details

#format_exception(e, source_path: nil) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/klenod/runtime/backtrace_rewriter.rb', line 47

def format_exception(e, source_path: nil)
  reset = "\e[0;48;5;52m"
  rewrite_exception(e)
  sources = format_sources(e.backtrace)

  [
    "\e[1;31;47m ERROR \e[3;31;47m #{e.class.name}: #{e.message} #{reset}",
    "\e[1;34mBacktrace:#{reset}",
    e
      .backtrace
      .map do |line|
        if line in BacktraceString
          format(
            "#{reset}\e[2mfrom #{reset}\e[1m%<file>s:%<line>d#{reset}\e[2m:in '#{reset}\e[1m%<description>s#{reset}\e[2m'#{reset}",
            line.parsed_backtrace_entry.to_h
          )
        else
          "from #{line}"
        end
      end
      .join("\n"),
    formatted_sources(sources, reset)
  ].compact.join("\n") + "\e[0m"
end

#rewrite_backtrace(backtrace) ⇒ Object



77
78
79
80
81
82
83
84
85
# File 'lib/klenod/runtime/backtrace_rewriter.rb', line 77

def rewrite_backtrace(backtrace)
  backtrace.map do |line|
    if (entry = ParsedBacktraceEntry.parse(line))
      rewrite_backtrace_entry(entry).to_backtrace_string
    else
      line
    end
  end
end

#rewrite_exception(e) ⇒ Object



72
73
74
75
# File 'lib/klenod/runtime/backtrace_rewriter.rb', line 72

def rewrite_exception(e)
  rewrite_exception_message(e)
  e.set_backtrace(rewrite_backtrace(e.backtrace))
end