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
-
.arguments(module_config, output_path) ⇒ Object
Figure out the args to pass to symbolgraph-extract.
-
.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.
-
.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.
-
.parse_symbols(directory) ⇒ Object
Parse the symbol files in the given directory.
-
.sdk(module_config) ⇒ Object
Get the SDK path.
-
.target ⇒ Object
Guess a default LLVM target.
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 |
.target ⇒ Object
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 |