filter_backtrace(trace)
click to toggle source
def filter_backtrace(trace)
ntrace = [trace.first]
trace.each_cons(2) do |ep1, ep2|
ntrace << ep2 if ep1.ctx != ep2.ctx
end
ntrace
end
generate_analysis_trace(state, visited, backward_edge)
click to toggle source
def generate_analysis_trace(state, visited, backward_edge)
return nil if visited[state]
visited[state] = true
prev_states = backward_edges[state]
if prev_states
prev_states.each_key do |pstate|
trace = generate_analysis_trace(pstate, visited, backward_edge)
return [state] + trace if trace
end
nil
else
[]
end
end
show_error(errors, backward_edge, output)
click to toggle source
def show_error(errors, backward_edge, output)
return if errors.empty?
return unless Config.current.options[:show_errors]
output.puts "# Errors"
errors.each do |ep, msg|
if ENV["TP_DETAIL"]
backtrace = filter_backtrace(generate_analysis_trace(ep, {}, backward_edge))
else
backtrace = [ep]
end
loc, *backtrace = backtrace.map do |ep|
ep&.source_location
end
output.puts "#{ loc }: #{ msg }"
backtrace.each do |loc|
output.puts " from #{ loc }"
end
end
output.puts
end
show_gvars(scratch, gvars, output)
click to toggle source
def show_gvars(scratch, gvars, output)
gvars = gvars.dump.filter_map do |gvar_name, entry|
if entry.type != Type.bot && !entry.rbs_declared
[gvar_name, entry]
end
end
return if gvars.empty?
output.puts "# Global variables"
gvars.each do |gvar_name, entry|
output.puts "#{ gvar_name }: #{ entry.type.screen_name(scratch) }"
end
output.puts
end
show_message(terminated, output)
click to toggle source
def show_message(terminated, output)
if Config.current.options[:show_typeprof_version]
output.puts "# TypeProf #{ VERSION }"
output.puts
end
if terminated
output.puts "# CAUTION: Type profiling was terminated prematurely because of the limitation"
output.puts
end
end
show_reveal_types(scratch, reveal_types, output)
click to toggle source
def show_reveal_types(scratch, reveal_types, output)
return if reveal_types.empty?
output.puts "# Revealed types"
reveal_types.each do |source_location, ty|
output.puts "# #{ source_location } #=> #{ ty.screen_name(scratch) }"
end
output.puts
end