in scripts/extract_source.rb [267:338]
def deep_resolve(method_name, depth: 0, trail: [], global_resolved_by_parent: [], static_resolved_by_parent: [], static_base_filename: nil)
if @blacklist.include?(method_name)
puts 'ERROR: Hit blacklist entry ' + method_name
puts 'Trail: ' + trail.inspect
exit 1
end
if depth > RESOLVE_MAX_DEPTH
puts 'ERROR: Exceeded max depth'
puts method_name.inspect
puts trail.inspect
exit 1
end
base_filename = static_base_filename || @global_method_to_base_filename[method_name]
if !base_filename
(@unresolved << method_name).uniq!
return
end
analysis = @file_analysis[base_filename]
fail "could not find analysis data for #{base_filename}" if analysis.nil?
implementation_filename = analysis.symbol_to_file[method_name]
if !implementation_filename
(@unresolved << method_name).uniq!
return
end
@symbols_to_output[implementation_filename] ||= []
@symbols_to_output[implementation_filename] << method_name
(@include_files_to_output += analysis.included_files).uniq!
if @mock.key?(method_name)
return
end
dependents = (analysis.references[method_name] || [])
global_dependents = dependents.select { |c| !analysis.static_symbols.include?(c) } - global_resolved_by_parent
static_dependents = dependents.select { |c| analysis.static_symbols.include?(c) } - static_resolved_by_parent
@resolved_static_by_base_filename[base_filename] ||= []
global_dependents.delete_if { |s| @resolved_global.include?(s) }
static_dependents.delete_if { |s| @resolved_static_by_base_filename[base_filename].include?(s) }
global_dependents.each { |s| @resolved_global << s }
static_dependents.each { |s| @resolved_static_by_base_filename[base_filename] << s }
global_dependents.each do |symbol|
deep_resolve(
symbol, depth: depth + 1, trail: trail + [method_name],
global_resolved_by_parent: global_resolved_by_parent + global_dependents
)
end
static_dependents.each do |symbol|
deep_resolve(
symbol, depth: depth + 1, trail: trail + [method_name],
global_resolved_by_parent: global_resolved_by_parent + global_dependents,
static_resolved_by_parent: static_resolved_by_parent + static_dependents,
static_base_filename: base_filename
)
end
end