Module: Jazzy::SymbolGraph

Defined in:
lib/jazzy/symbol_graph.rb,
lib/jazzy/symbol_graph/graph.rb,
lib/jazzy/symbol_graph/symbol.rb,
lib/jazzy/symbol_graph/ext_key.rb,
lib/jazzy/symbol_graph/ext_node.rb,
lib/jazzy/symbol_graph/sym_node.rb,
lib/jazzy/symbol_graph/constraint.rb,
lib/jazzy/symbol_graph/relationship.rb

Defined Under Namespace

Classes: BaseNode, Constraint, ExtConstraints, ExtKey, ExtNode, ExtSymNode, Graph, Relationship, SymNode, Symbol

Class Method Summary collapse

Class Method Details

.arguments(module_config, output_path) ⇒ Object

Figure out the args to pass to symbolgraph-extract



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/jazzy/symbol_graph.rb', line 40

def self.arguments(module_config, output_path)
  if module_config.module_name.empty?
    raise 'error: `--swift-build-tool symbolgraph` requires `--module`.'
  end

  user_args = module_config.build_tool_arguments.join

  if user_args =~ /-(?:module-name|minimum-access-level|output-dir)/
    raise 'error: `--build-tool-arguments` for ' \
      "`--swift-build-tool symbolgraph` can't use `-module`, " \
      '`-minimum-access-level`, or `-output-dir`.'
  end

  # Default set
  args = [
    '-module-name', module_config.module_name,
    '-minimum-access-level', 'private',
    '-output-dir', output_path,
    '-skip-synthesized-members'
  ]

  # Things user can override
  args += ['-sdk', sdk(module_config)] unless user_args =~ /-sdk/
  args += ['-target', target] unless user_args =~ /-target/
  args += ['-F', module_config.source_directory.to_s] unless user_args =~ /-F(?!s)/
  args += ['-I', module_config.source_directory.to_s] unless user_args =~ /-I/

  args + module_config.build_tool_arguments
end

.build(module_config) ⇒ Object

Find swift symbol graph files, either having been passed in directly, or generated by running`swift symbolgraph-extract` with configured args. Then parse the results, and return as JSON in SourceKit format.



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/jazzy/symbol_graph.rb', line 23

def self.build(module_config)
  if module_config.symbolgraph_directory.nil?
    Dir.mktmpdir do |tmp_dir|
      args = arguments(module_config, tmp_dir)

      Executable.execute_command('swift',
                                 args.unshift('symbolgraph-extract'),
                                 true) # raise on error

      parse_symbols(tmp_dir)
    end
  else
    parse_symbols(module_config.symbolgraph_directory.to_s)
  end
end

.demangle(usr) ⇒ Object

This is a last-ditch fallback for when symbolgraph doesn’t provide a name - at least conforming external types to local protocols.



101
102
103
104
105
106
107
# File 'lib/jazzy/symbol_graph.rb', line 101

def self.demangle(usr)
  args = %w[demangle -simplified -compact].append(usr.sub(/^s:/, 's'))
  output, = Executable.execute_command('swift', args, true)
  output.chomp
rescue StandardError
  usr
end

.parse_symbols(directory) ⇒ Object

Parse the symbol files in the given directory



71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/jazzy/symbol_graph.rb', line 71

def self.parse_symbols(directory)
  Dir[directory + '/*.symbols.json'].sort.map do |filename|
    # The @ part is for extensions in our module (before the @)
    # of types in another module (after the @).
    File.basename(filename) =~ /(.*?)(@(.*?))?\.symbols/
    module_name = Regexp.last_match[1]
    ext_module_name = Regexp.last_match[3] || module_name
    json = File.read(filename)
    {
      filename =>
        Graph.new(json, module_name, ext_module_name).to_sourcekit,
    }
  end.to_json
end

.sdk(module_config) ⇒ Object

Get the SDK path. On !darwin this just isn’t needed.



87
88
89
# File 'lib/jazzy/symbol_graph.rb', line 87

def self.sdk(module_config)
  `xcrun --show-sdk-path --sdk #{module_config.sdk}`.chomp
end

.targetObject

Guess a default LLVM target. Feels like the tool should figure this out from sdk + the binary somehow?



93
94
95
96
# File 'lib/jazzy/symbol_graph.rb', line 93

def self.target
  `swift -version` =~ /Target: (.*?)$/
  Regexp.last_match[1] || 'x86_64-apple-macosx10.15'
end