in scripts/extract_source.rb [202:264]
def analyze_file(file)
index = FFI::Clang::Index.new(true, true)
translation_unit = index.parse_translation_unit(file, ['-I', @basepath + 'src/include', '-I', '/usr/local/opt/openssl/include', '-DDLSUFFIX=".bundle"', '-msse4.2', '-g'])
cursor = translation_unit.cursor
func_cursor = nil
analysis = FileAnalysis.new(file, @basepath)
included_files = []
translation_unit.inclusions do |included_file, _inclusions|
next if !included_file.start_with?(@basepath) || included_file == file
included_files << included_file
end
analysis.included_files = included_files.uniq.sort
cursor.visit_children do |cursor, parent|
if cursor.location.file && (File.dirname(file) == File.dirname(cursor.location.file) || cursor.location.file.end_with?('_impl.h'))
if parent.kind == :cursor_translation_unit
if (cursor.kind == :cursor_function && cursor.definition?) || (cursor.kind == :cursor_variable && !cursor.has_external_storage)
analysis.symbol_to_file[cursor.spelling] = cursor.location.file
if cursor.linkage == :external
elsif cursor.linkage == :internal
(analysis.static_symbols << cursor.spelling).uniq!
else
fail format('Unknown linkage: %s', cursor.linkage.inspect)
end
start_offset = cursor.extent.start.offset
end_offset = cursor.extent.end.offset
end_offset += 1 if cursor.kind == :cursor_variable
if cursor.kind == :cursor_variable && (cursor.linkage == :external || cursor.linkage == :internal) &&
!cursor.type.const_qualified? && !cursor.type.array_element_type.const_qualified?
analysis.external_variables << cursor.spelling
end
analysis.file_to_symbol_positions[cursor.location.file] ||= {}
analysis.file_to_symbol_positions[cursor.location.file][cursor.spelling] = [start_offset, end_offset]
cursor.visit_children do |child_cursor, parent|
next :recurse if child_cursor.definition.semantic_parent == cursor
if child_cursor.kind == :cursor_decl_ref_expr || child_cursor.kind == :cursor_call_expr
analysis.references[cursor.spelling] ||= []
(analysis.references[cursor.spelling] << child_cursor.spelling).uniq!
end
:recurse
end
end
end
end
next :recurse
end
analysis
end