class DeepCover::ExpressionDebugger

Attributes

options[R]

Public Class Methods

new(source, filename: '(source)', lineno: 1, debug: false, **options) click to toggle source
# File lib/deep_cover/expression_debugger.rb, line 24
def initialize(source, filename: '(source)', lineno: 1, debug: false, **options)
  @source = source
  @filename = filename
  @lineno = lineno
  @debug = debug
  @options = options
end

Public Instance Methods

covered_code() click to toggle source
# File lib/deep_cover/expression_debugger.rb, line 91
def covered_code
  @covered_code ||= CoveredCode.new(source: @source, path: @filename, lineno: @lineno)
end
execute() click to toggle source
# File lib/deep_cover/expression_debugger.rb, line 95
def execute
  execute_sample(covered_code)
# output { trace_counts }  # Keep for low-level debugging purposes
rescue Exception => e
  output { "Can't `execute_sample`:#{e.class}: #{e}\n#{e.backtrace.join("\n")}" }
  @failed = true
end
finish() click to toggle source
# File lib/deep_cover/expression_debugger.rb, line 87
def finish
  exit(!@failed)
end
output() { || ... } click to toggle source
# File lib/deep_cover/expression_debugger.rb, line 116
def output
  Tools.dont_profile do
    puts yield
  end
end
pry() click to toggle source
# File lib/deep_cover/expression_debugger.rb, line 80
def pry
  a = covered_code.covered_ast
  b = a.children.first
  ::DeepCover.load_pry
  binding.pry
end
show() click to toggle source
# File lib/deep_cover/expression_debugger.rb, line 32
def show
  Tools.profile(options[:profile]) do
    execute
    covered_code.freeze # Our output relies on the counts, so better freeze. See [#13]
    if @debug
      show_line_coverage
      show_instrumented_code
      show_ast
    end
    show_char_coverage
  end
  pry if @debug
  finish
end
show_ast() click to toggle source
# File lib/deep_cover/expression_debugger.rb, line 68
def show_ast
  output { "\nParsed code:\n" }
  Node.prepend ColorAST
  output { covered_code.covered_ast }
end
show_char_coverage() click to toggle source
# File lib/deep_cover/expression_debugger.rb, line 74
def show_char_coverage
  output { "\nNode coverage:\n" }

  output { format_char_cover(covered_code, show_whitespace: !!ENV['W'], **options) }
end
show_instrumented_code() click to toggle source
# File lib/deep_cover/expression_debugger.rb, line 63
def show_instrumented_code
  output { "\nInstrumented code:\n" }
  output { format_generated_code(covered_code) }
end
show_line_coverage() click to toggle source
# File lib/deep_cover/expression_debugger.rb, line 47
def show_line_coverage
  output { "Line Coverage: Builtin | DeepCover | DeepCover Strict:\n" }
  begin
    builtin_line_coverage = builtin_coverage(@source, @filename, @lineno)
    our_line_coverage = our_coverage(@source, @filename, @lineno, **options)
    our_strict_line_coverage = our_coverage(@source, @filename, @lineno, allow_partial: false, **options)
    output do
      lines = format(builtin_line_coverage, our_line_coverage, our_strict_line_coverage, source: @source)
      number_lines(lines, lineno: @lineno)
    end
  rescue Exception => e
    output { "Can't run coverage: #{e.class}: #{e}\n#{e.backtrace.join("\n")}" }
    @failed = true
  end
end
trace_counts() click to toggle source
# File lib/deep_cover/expression_debugger.rb, line 103
def trace_counts
  all = []
  trace = TracePoint.new(:call) do |tr|
    if %i[flow_entry_count flow_completion_count execution_count].include? tr.method_id
      node = tr.self
      str = "#{node.type} #{(node.value if node.respond_to?(:value))} #{tr.method_id}"
      all << str unless all.last == str
    end
  end
  trace.enable { covered_code.freeze }
  all
end