jazzy 0.13.7 → 0.14.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/Tests.yml +6 -6
- data/.rubocop.yml +155 -24
- data/CHANGELOG.md +91 -0
- data/CONTRIBUTING.md +1 -1
- data/Dangerfile +11 -8
- data/Gemfile +3 -1
- data/Gemfile.lock +85 -64
- data/ObjectiveC.md +208 -0
- data/README.md +63 -33
- data/Rakefile +18 -15
- data/bin/jazzy +3 -2
- data/bin/sourcekitten +0 -0
- data/jazzy.gemspec +9 -6
- data/lib/jazzy/config.rb +135 -69
- data/lib/jazzy/doc.rb +3 -1
- data/lib/jazzy/doc_builder.rb +72 -83
- data/lib/jazzy/docset_builder.rb +3 -1
- data/lib/jazzy/documentation_generator.rb +6 -2
- data/lib/jazzy/executable.rb +3 -0
- data/lib/jazzy/extensions/bitbucket/img/bitbucket.svg +11 -0
- data/lib/jazzy/{themes/apple/assets → extensions/github}/img/gh.png +0 -0
- data/lib/jazzy/extensions/gitlab/img/gitlab.svg +23 -0
- data/lib/jazzy/gem_version.rb +3 -1
- data/lib/jazzy/highlighter.rb +5 -3
- data/lib/jazzy/jazzy_markdown.rb +75 -32
- data/lib/jazzy/podspec_documenter.rb +14 -16
- data/lib/jazzy/search_builder.rb +5 -6
- data/lib/jazzy/source_declaration/access_control_level.rb +7 -5
- data/lib/jazzy/source_declaration/type.rb +29 -3
- data/lib/jazzy/source_declaration.rb +22 -5
- data/lib/jazzy/source_document.rb +8 -5
- data/lib/jazzy/source_host.rb +111 -0
- data/lib/jazzy/source_mark.rb +8 -6
- data/lib/jazzy/source_module.rb +6 -6
- data/lib/jazzy/sourcekitten.rb +155 -81
- data/lib/jazzy/stats.rb +14 -3
- data/lib/jazzy/symbol_graph/constraint.rb +5 -1
- data/lib/jazzy/symbol_graph/ext_node.rb +3 -1
- data/lib/jazzy/symbol_graph/graph.rb +19 -12
- data/lib/jazzy/symbol_graph/relationship.rb +9 -0
- data/lib/jazzy/symbol_graph/sym_node.rb +25 -7
- data/lib/jazzy/symbol_graph/symbol.rb +54 -25
- data/lib/jazzy/symbol_graph.rb +43 -32
- data/lib/jazzy/themes/apple/assets/css/highlight.css.scss +63 -59
- data/lib/jazzy/themes/apple/assets/css/jazzy.css.scss +5 -1
- data/lib/jazzy/themes/apple/assets/js/jazzy.js +4 -0
- data/lib/jazzy/themes/apple/assets/js/jazzy.search.js +4 -0
- data/lib/jazzy/themes/apple/templates/doc.mustache +4 -5
- data/lib/jazzy/themes/apple/templates/footer.mustache +1 -1
- data/lib/jazzy/themes/apple/templates/header.mustache +6 -6
- data/lib/jazzy/themes/apple/templates/task.mustache +6 -11
- data/lib/jazzy/themes/fullwidth/assets/css/highlight.css.scss +63 -59
- data/lib/jazzy/themes/fullwidth/assets/css/jazzy.css.scss +6 -2
- data/lib/jazzy/themes/fullwidth/assets/js/jazzy.js +4 -0
- data/lib/jazzy/themes/fullwidth/assets/js/jazzy.search.js +4 -0
- data/lib/jazzy/themes/fullwidth/templates/doc.mustache +4 -5
- data/lib/jazzy/themes/fullwidth/templates/footer.mustache +1 -1
- data/lib/jazzy/themes/fullwidth/templates/header.mustache +8 -8
- data/lib/jazzy/themes/fullwidth/templates/task.mustache +6 -11
- data/lib/jazzy/themes/jony/assets/css/highlight.css.scss +63 -59
- data/lib/jazzy/themes/jony/assets/css/jazzy.css.scss +5 -1
- data/lib/jazzy/themes/jony/assets/js/jazzy.js +4 -0
- data/lib/jazzy/themes/jony/templates/doc.mustache +4 -5
- data/lib/jazzy/themes/jony/templates/footer.mustache +1 -1
- data/lib/jazzy/themes/jony/templates/header.mustache +6 -6
- data/lib/jazzy/themes/jony/templates/task.mustache +6 -11
- data/lib/jazzy.rb +2 -0
- data/spec/integration_spec.rb +46 -42
- data/spec/spec_helper/pre_flight.rb +2 -0
- data/spec/spec_helper.rb +3 -1
- metadata +32 -16
- data/lib/jazzy/themes/fullwidth/assets/img/gh.png +0 -0
- data/lib/jazzy/themes/jony/assets/img/gh.png +0 -0
- data/spec/sourcekitten_spec.rb +0 -6
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# rubocop:disable Metrics/ClassLength
|
2
4
|
module Jazzy
|
3
5
|
module SymbolGraph
|
@@ -63,21 +65,26 @@ module Jazzy
|
|
63
65
|
# Increasingly desparate ways to find the name of the symbol
|
64
66
|
# at the target end of a relationship
|
65
67
|
def rel_target_name(rel, target_node)
|
66
|
-
|
68
|
+
target_node&.symbol&.name ||
|
67
69
|
rel.target_fallback ||
|
68
70
|
Jazzy::SymbolGraph.demangle(rel.target_usr)
|
69
71
|
end
|
70
72
|
|
71
73
|
# Same for the source end. Less help from the tool here
|
72
74
|
def rel_source_name(rel, source_node)
|
73
|
-
|
75
|
+
source_node&.qualified_name ||
|
74
76
|
Jazzy::SymbolGraph.demangle(rel.source_usr)
|
75
77
|
end
|
76
78
|
|
77
79
|
# Protocol conformance is redundant if it's unconditional
|
78
80
|
# and already expressed in the type's declaration.
|
81
|
+
#
|
82
|
+
# Skip implementation-detail conformances.
|
79
83
|
def redundant_conformance?(rel, type, protocol)
|
80
|
-
|
84
|
+
return false unless type
|
85
|
+
|
86
|
+
(rel.constraints.empty? && type.conformance?(protocol)) ||
|
87
|
+
(type.actor? && rel.actor_protocol?)
|
81
88
|
end
|
82
89
|
|
83
90
|
# source is a member/protocol requirement of target
|
@@ -86,11 +93,11 @@ module Jazzy
|
|
86
93
|
|
87
94
|
source.protocol_requirement = rel.protocol_requirement?
|
88
95
|
constraints =
|
89
|
-
ExtConstraints.new(target
|
96
|
+
ExtConstraints.new(target&.constraints,
|
90
97
|
source.unique_context_constraints(target))
|
91
98
|
|
92
99
|
# Add to its parent or invent an extension
|
93
|
-
unless target
|
100
|
+
unless target&.try_add_child(source, constraints.ext)
|
94
101
|
add_ext_member(rel.target_usr, source, constraints)
|
95
102
|
end
|
96
103
|
end
|
@@ -101,7 +108,7 @@ module Jazzy
|
|
101
108
|
|
102
109
|
return if redundant_conformance?(rel, source, protocol_name)
|
103
110
|
|
104
|
-
type_constraints =
|
111
|
+
type_constraints = source&.constraints || []
|
105
112
|
constraints =
|
106
113
|
ExtConstraints.new(type_constraints,
|
107
114
|
rel.constraints - type_constraints)
|
@@ -122,7 +129,7 @@ module Jazzy
|
|
122
129
|
target_parent.is_a?(SymNode)
|
123
130
|
# Could probably figure this out with demangle, but...
|
124
131
|
warn "Can't resolve membership of default implementation "\
|
125
|
-
|
132
|
+
"#{source.symbol.usr}."
|
126
133
|
source.unlisted = true
|
127
134
|
return
|
128
135
|
end
|
@@ -174,14 +181,14 @@ module Jazzy
|
|
174
181
|
|
175
182
|
root_symbol_nodes =
|
176
183
|
symbol_nodes.values
|
177
|
-
|
178
|
-
|
179
|
-
|
184
|
+
.select(&:top_level_decl?)
|
185
|
+
.sort
|
186
|
+
.map(&:to_sourcekit)
|
180
187
|
|
181
188
|
root_ext_nodes =
|
182
189
|
ext_nodes.values
|
183
|
-
|
184
|
-
|
190
|
+
.sort
|
191
|
+
.map { |n| n.to_sourcekit(module_name) }
|
185
192
|
{
|
186
193
|
'key.diagnostic_stage' => 'parse',
|
187
194
|
'key.substructure' => root_symbol_nodes + root_ext_nodes,
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jazzy
|
2
4
|
module SymbolGraph
|
3
5
|
# A Relationship is a tidied-up SymbolGraph JSON object
|
@@ -20,11 +22,18 @@ module Jazzy
|
|
20
22
|
kind == :defaultImplementationOf
|
21
23
|
end
|
22
24
|
|
25
|
+
# Protocol conformances added by compiler to actor decls that
|
26
|
+
# users aren't interested in.
|
27
|
+
def actor_protocol?
|
28
|
+
%w[Actor Sendable].include?(target_fallback)
|
29
|
+
end
|
30
|
+
|
23
31
|
def initialize(hash)
|
24
32
|
kind = hash[:kind]
|
25
33
|
unless KINDS.include?(kind)
|
26
34
|
raise "Unknown relationship kind '#{kind}'"
|
27
35
|
end
|
36
|
+
|
28
37
|
self.kind = kind.to_sym
|
29
38
|
self.source_usr = hash[:source]
|
30
39
|
self.target_usr = hash[:target]
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Jazzy
|
2
4
|
module SymbolGraph
|
3
5
|
# The rebuilt syntax tree is made of nodes that either match
|
@@ -23,6 +25,7 @@ module Jazzy
|
|
23
25
|
|
24
26
|
# A SymNode is a node of the reconstructed syntax tree holding a symbol.
|
25
27
|
# It can turn itself into SourceKit and helps decode extensions.
|
28
|
+
# rubocop:disable Metrics/ClassLength
|
26
29
|
class SymNode < BaseNode
|
27
30
|
attr_accessor :symbol
|
28
31
|
attr_writer :override
|
@@ -59,6 +62,10 @@ module Jazzy
|
|
59
62
|
symbol.kind.end_with?('protocol')
|
60
63
|
end
|
61
64
|
|
65
|
+
def actor?
|
66
|
+
symbol.kind.end_with?('actor')
|
67
|
+
end
|
68
|
+
|
62
69
|
def constraints
|
63
70
|
symbol.constraints
|
64
71
|
end
|
@@ -72,6 +79,7 @@ module Jazzy
|
|
72
79
|
(!protocol? || node.protocol_requirement?)
|
73
80
|
return false
|
74
81
|
end
|
82
|
+
|
75
83
|
add_child(node)
|
76
84
|
true
|
77
85
|
end
|
@@ -93,24 +101,31 @@ module Jazzy
|
|
93
101
|
# conformance: don't bother if it's already in the type declaration.
|
94
102
|
def conformance?(protocol)
|
95
103
|
return false unless symbol.declaration =~ /(?<=:).*?(?=(where|$))/
|
104
|
+
|
96
105
|
Regexp.last_match[0] =~ /\b#{protocol}\b/
|
97
106
|
end
|
98
107
|
|
99
108
|
# Generate the 'where' clause for the declaration
|
100
109
|
def where_clause
|
101
|
-
parent_constraints =
|
110
|
+
parent_constraints = parent&.constraints || []
|
102
111
|
(constraints - parent_constraints).to_where_clause
|
103
112
|
end
|
104
113
|
|
105
114
|
def inherits_clause
|
106
115
|
return '' unless superclass_name
|
116
|
+
|
107
117
|
" : #{superclass_name}"
|
108
118
|
end
|
109
119
|
|
120
|
+
# approximately...
|
121
|
+
def async?
|
122
|
+
symbol.declaration =~ /\basync\b[^)]*$/
|
123
|
+
end
|
124
|
+
|
110
125
|
def full_declaration
|
111
|
-
symbol.
|
112
|
-
|
113
|
-
|
126
|
+
symbol.attributes
|
127
|
+
.append(symbol.declaration + inherits_clause + where_clause)
|
128
|
+
.join("\n")
|
114
129
|
end
|
115
130
|
|
116
131
|
# rubocop:disable Metrics/MethodLength
|
@@ -120,11 +135,12 @@ module Jazzy
|
|
120
135
|
|
121
136
|
hash = {
|
122
137
|
'key.kind' => symbol.kind,
|
123
|
-
'key.usr' =>
|
138
|
+
'key.usr' => symbol.usr,
|
124
139
|
'key.name' => symbol.name,
|
125
140
|
'key.accessibility' => symbol.acl,
|
126
141
|
'key.parsed_decl' => declaration,
|
127
142
|
'key.annotated_decl' => xml_declaration,
|
143
|
+
'key.symgraph_async' => async?,
|
128
144
|
}
|
129
145
|
if docs = symbol.doc_comments
|
130
146
|
hash['key.doc.comment'] = docs
|
@@ -136,12 +152,13 @@ module Jazzy
|
|
136
152
|
end
|
137
153
|
if location = symbol.location
|
138
154
|
hash['key.filepath'] = location[:filename]
|
139
|
-
hash['key.doc.line'] = location[:line]
|
140
|
-
hash['key.doc.column'] = location[:character]
|
155
|
+
hash['key.doc.line'] = location[:line] + 1
|
156
|
+
hash['key.doc.column'] = location[:character] + 1
|
141
157
|
end
|
142
158
|
unless children.empty?
|
143
159
|
hash['key.substructure'] = children_to_sourcekit
|
144
160
|
end
|
161
|
+
hash['key.symgraph_spi'] = true if symbol.spi
|
145
162
|
|
146
163
|
hash
|
147
164
|
end
|
@@ -154,5 +171,6 @@ module Jazzy
|
|
154
171
|
symbol <=> other.symbol
|
155
172
|
end
|
156
173
|
end
|
174
|
+
# rubocop:enable Metrics/ClassLength
|
157
175
|
end
|
158
176
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# rubocop:disable Metrics/ClassLength
|
2
4
|
module Jazzy
|
3
5
|
module SymbolGraph
|
@@ -8,10 +10,11 @@ module Jazzy
|
|
8
10
|
attr_accessor :declaration
|
9
11
|
attr_accessor :kind
|
10
12
|
attr_accessor :acl
|
13
|
+
attr_accessor :spi
|
11
14
|
attr_accessor :location # can be nil, keys :filename :line :character
|
12
15
|
attr_accessor :constraints # array, can be empty
|
13
16
|
attr_accessor :doc_comments # can be nil
|
14
|
-
attr_accessor :
|
17
|
+
attr_accessor :attributes # array, can be empty
|
15
18
|
attr_accessor :generic_type_params # set, can be empty
|
16
19
|
attr_accessor :parameter_names # array, can be nil
|
17
20
|
|
@@ -22,13 +25,14 @@ module Jazzy
|
|
22
25
|
def initialize(hash)
|
23
26
|
self.usr = hash[:identifier][:precise]
|
24
27
|
self.path_components = hash[:pathComponents]
|
25
|
-
raw_decl = hash[:declarationFragments]
|
26
|
-
init_kind(hash[:kind][:identifier])
|
28
|
+
raw_decl, keywords = parse_decl_fragments(hash[:declarationFragments])
|
29
|
+
init_kind(hash[:kind][:identifier], keywords)
|
27
30
|
init_declaration(raw_decl)
|
28
31
|
if func_signature = hash[:functionSignature]
|
29
32
|
init_func_signature(func_signature)
|
30
33
|
end
|
31
34
|
init_acl(hash[:accessLevel])
|
35
|
+
self.spi = hash[:spi]
|
32
36
|
if location = hash[:location]
|
33
37
|
init_location(location)
|
34
38
|
end
|
@@ -36,19 +40,29 @@ module Jazzy
|
|
36
40
|
if comments_hash = hash[:docComment]
|
37
41
|
init_doc_comments(comments_hash)
|
38
42
|
end
|
39
|
-
|
43
|
+
init_attributes(hash[:availability] || [])
|
40
44
|
init_generic_type_params(hash)
|
41
45
|
end
|
42
46
|
|
47
|
+
def parse_decl_fragments(fragments)
|
48
|
+
decl = ''
|
49
|
+
keywords = Set.new
|
50
|
+
fragments.each do |frag|
|
51
|
+
decl += frag[:spelling]
|
52
|
+
keywords.add(frag[:spelling]) if frag[:kind] == 'keyword'
|
53
|
+
end
|
54
|
+
[decl, keywords]
|
55
|
+
end
|
56
|
+
|
43
57
|
# Repair problems with SymbolGraph's declprinter
|
44
58
|
|
45
59
|
def init_declaration(raw_decl)
|
46
60
|
# Too much 'Self.TypeName'; omitted arg labels look odd;
|
47
61
|
# duplicated constraints; swift 5.3 vs. master workaround
|
48
|
-
self.declaration =
|
49
|
-
|
50
|
-
|
51
|
-
|
62
|
+
self.declaration = raw_decl
|
63
|
+
.gsub(/\bSelf\./, '')
|
64
|
+
.gsub(/(?<=\(|, )_: /, '_ arg: ')
|
65
|
+
.gsub(/ where.*$/, '')
|
52
66
|
if kind == 'source.lang.swift.decl.class'
|
53
67
|
declaration.sub!(/\s*:.*$/, '')
|
54
68
|
end
|
@@ -85,25 +99,32 @@ module Jazzy
|
|
85
99
|
'static.subscript' => 'function.subscript',
|
86
100
|
'typealias' => 'typealias',
|
87
101
|
'associatedtype' => 'associatedtype',
|
102
|
+
'actor' => 'actor',
|
88
103
|
}.freeze
|
89
104
|
|
90
105
|
# We treat 'static var' differently to 'class var'
|
91
|
-
|
92
|
-
|
106
|
+
# We treat actors as first-class entities
|
107
|
+
def adjust_kind_for_declaration(kind, keywords)
|
108
|
+
if kind == 'swift.class' && keywords.member?('actor')
|
109
|
+
return 'swift.actor'
|
110
|
+
end
|
111
|
+
return kind unless keywords.member?('static')
|
112
|
+
|
93
113
|
kind.gsub(/type/, 'static')
|
94
114
|
end
|
95
115
|
|
96
|
-
def init_kind(kind)
|
97
|
-
adjusted = adjust_kind_for_declaration(kind)
|
116
|
+
def init_kind(kind, keywords)
|
117
|
+
adjusted = adjust_kind_for_declaration(kind, keywords)
|
98
118
|
sourcekit_kind = KIND_MAP[adjusted.sub('swift.', '')]
|
99
119
|
raise "Unknown symbol kind '#{kind}'" unless sourcekit_kind
|
100
|
-
|
120
|
+
|
121
|
+
self.kind = "source.lang.swift.decl.#{sourcekit_kind}"
|
101
122
|
end
|
102
123
|
|
103
124
|
# Mapping SymbolGraph's ACL to SourceKit
|
104
125
|
|
105
126
|
def init_acl(acl)
|
106
|
-
self.acl =
|
127
|
+
self.acl = "source.lang.swift.accessibility.#{acl}"
|
107
128
|
end
|
108
129
|
|
109
130
|
# Symbol location - only available for public+ decls
|
@@ -120,6 +141,7 @@ module Jazzy
|
|
120
141
|
def init_constraints(hash, raw_decl)
|
121
142
|
raw_constraints = %i[swiftGenerics swiftExtension].flat_map do |key|
|
122
143
|
next [] unless container = hash[key]
|
144
|
+
|
123
145
|
container[:constraints] || []
|
124
146
|
end
|
125
147
|
|
@@ -146,16 +168,16 @@ module Jazzy
|
|
146
168
|
end
|
147
169
|
|
148
170
|
def init_doc_comments(comments_hash)
|
149
|
-
self.doc_comments =
|
150
|
-
|
151
|
-
|
171
|
+
self.doc_comments = comments_hash[:lines]
|
172
|
+
.map { |l| l[:text] }
|
173
|
+
.join("\n")
|
152
174
|
end
|
153
175
|
|
154
176
|
# Availability
|
155
177
|
# Re-encode this as Swift. Should really teach Jazzy about these,
|
156
178
|
# could maybe then do something smarter here.
|
157
|
-
def
|
158
|
-
|
179
|
+
def availability_attributes(avail_hash_list)
|
180
|
+
avail_hash_list.map do |avail|
|
159
181
|
str = '@available('
|
160
182
|
if avail[:isUnconditionallyDeprecated]
|
161
183
|
str += '*, deprecated'
|
@@ -171,8 +193,8 @@ module Jazzy
|
|
171
193
|
next nil
|
172
194
|
end
|
173
195
|
|
174
|
-
str +=
|
175
|
-
str +=
|
196
|
+
str += ", message: \"#{avail[:message]}\"" if avail[:message]
|
197
|
+
str += ", renamed: \"#{avail[:renamed]}\"" if avail[:renamed]
|
176
198
|
|
177
199
|
str + ')'
|
178
200
|
end.compact
|
@@ -185,11 +207,18 @@ module Jazzy
|
|
185
207
|
str
|
186
208
|
end
|
187
209
|
|
210
|
+
def spi_attributes
|
211
|
+
spi ? ['@_spi(Unknown)'] : []
|
212
|
+
end
|
213
|
+
|
214
|
+
def init_attributes(avail_hash_list)
|
215
|
+
self.attributes =
|
216
|
+
availability_attributes(avail_hash_list) + spi_attributes
|
217
|
+
end
|
218
|
+
|
188
219
|
# Sort order
|
189
220
|
include Comparable
|
190
221
|
|
191
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
192
|
-
# rubocop:disable Metrics/PerceivedComplexity
|
193
222
|
def <=>(other)
|
194
223
|
# Things with location: order by file/line/column
|
195
224
|
# (pls tell what wheel i am reinventing :/)
|
@@ -198,6 +227,7 @@ module Jazzy
|
|
198
227
|
if location[:line] == other_loc[:line]
|
199
228
|
return location[:character] <=> other_loc[:character]
|
200
229
|
end
|
230
|
+
|
201
231
|
return location[:line] <=> other_loc[:line]
|
202
232
|
end
|
203
233
|
return location[:filename] <=> other_loc[:filename]
|
@@ -209,10 +239,9 @@ module Jazzy
|
|
209
239
|
|
210
240
|
# Things without a location: by name and then USR
|
211
241
|
return usr <=> other.usr if name == other.name
|
242
|
+
|
212
243
|
name <=> other.name
|
213
244
|
end
|
214
|
-
# rubocop:enable Metrics/PerceivedComplexity
|
215
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
216
245
|
end
|
217
246
|
end
|
218
247
|
end
|
data/lib/jazzy/symbol_graph.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'set'
|
2
4
|
require 'jazzy/symbol_graph/graph'
|
3
5
|
require 'jazzy/symbol_graph/constraint'
|
@@ -12,32 +14,28 @@ require 'jazzy/symbol_graph/ext_node'
|
|
12
14
|
|
13
15
|
module Jazzy
|
14
16
|
module SymbolGraph
|
15
|
-
#
|
16
|
-
#
|
17
|
+
# Find swift symbol graph files, either having been passed
|
18
|
+
# in directly, or generated by running`swift symbolgraph-extract`
|
19
|
+
# with configured args.
|
20
|
+
# Then parse the results, and return as JSON in SourceKit[ten]
|
17
21
|
# format.
|
18
22
|
def self.build(config)
|
19
|
-
|
20
|
-
|
23
|
+
if config.symbolgraph_directory.nil?
|
24
|
+
Dir.mktmpdir do |tmp_dir|
|
25
|
+
args = arguments(config, tmp_dir)
|
21
26
|
|
22
|
-
|
23
|
-
|
24
|
-
|
27
|
+
Executable.execute_command('swift',
|
28
|
+
args.unshift('symbolgraph-extract'),
|
29
|
+
true) # raise on error
|
25
30
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
module_name = Regexp.last_match[3] || Regexp.last_match[1]
|
31
|
-
{
|
32
|
-
filename =>
|
33
|
-
Graph.new(File.read(filename), module_name).to_sourcekit,
|
34
|
-
}
|
35
|
-
end.to_json
|
31
|
+
parse_symbols(tmp_dir)
|
32
|
+
end
|
33
|
+
else
|
34
|
+
parse_symbols(config.symbolgraph_directory.to_s)
|
36
35
|
end
|
37
36
|
end
|
38
37
|
|
39
38
|
# Figure out the args to pass to symbolgraph-extract
|
40
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
41
39
|
def self.arguments(config, output_path)
|
42
40
|
if config.module_name.empty?
|
43
41
|
raise 'error: `--swift-build-tool symbolgraph` requires `--module`.'
|
@@ -45,29 +43,42 @@ module Jazzy
|
|
45
43
|
|
46
44
|
user_args = config.build_tool_arguments.join
|
47
45
|
|
48
|
-
if user_args =~
|
46
|
+
if user_args =~ /-(?:module-name|minimum-access-level|output-dir)/
|
49
47
|
raise 'error: `--build-tool-arguments` for '\
|
50
|
-
"`--swift-build-tool symbolgraph` can't use
|
51
|
-
'
|
48
|
+
"`--swift-build-tool symbolgraph` can't use `-module`, "\
|
49
|
+
'`-minimum-access-level`, or `-output-dir`.'
|
52
50
|
end
|
53
51
|
|
54
52
|
# Default set
|
55
53
|
args = [
|
56
|
-
|
57
|
-
'
|
58
|
-
|
59
|
-
'
|
54
|
+
'-module-name', config.module_name,
|
55
|
+
'-minimum-access-level', 'private',
|
56
|
+
'-output-dir', output_path,
|
57
|
+
'-skip-synthesized-members'
|
60
58
|
]
|
61
59
|
|
62
60
|
# Things user can override
|
63
|
-
args
|
64
|
-
args
|
65
|
-
args
|
66
|
-
args
|
61
|
+
args += ['-sdk', sdk(config)] unless user_args =~ /-sdk/
|
62
|
+
args += ['-target', target] unless user_args =~ /-target/
|
63
|
+
args += ['-F', config.source_directory.to_s] unless user_args =~ /-F(?!s)/
|
64
|
+
args += ['-I', config.source_directory.to_s] unless user_args =~ /-I/
|
67
65
|
|
68
66
|
args + config.build_tool_arguments
|
69
67
|
end
|
70
|
-
|
68
|
+
|
69
|
+
# Parse the symbol files in the given directory
|
70
|
+
def self.parse_symbols(directory)
|
71
|
+
Dir[directory + '/*.symbols.json'].map do |filename|
|
72
|
+
# The @ part is for extensions in our module (before the @)
|
73
|
+
# of types in another module (after the @).
|
74
|
+
File.basename(filename) =~ /(.*?)(@(.*?))?\.symbols/
|
75
|
+
module_name = Regexp.last_match[3] || Regexp.last_match[1]
|
76
|
+
{
|
77
|
+
filename =>
|
78
|
+
Graph.new(File.read(filename), module_name).to_sourcekit,
|
79
|
+
}
|
80
|
+
end.to_json
|
81
|
+
end
|
71
82
|
|
72
83
|
# Get the SDK path. On !darwin this just isn't needed.
|
73
84
|
def self.sdk(config)
|
@@ -87,8 +98,8 @@ module Jazzy
|
|
87
98
|
def self.demangle(usr)
|
88
99
|
args = %w[demangle -simplified -compact].append(usr.sub(/^s:/, 's'))
|
89
100
|
output, = Executable.execute_command('swift', args, true)
|
90
|
-
|
91
|
-
rescue
|
101
|
+
output.chomp
|
102
|
+
rescue StandardError
|
92
103
|
usr
|
93
104
|
end
|
94
105
|
end
|
@@ -1,63 +1,67 @@
|
|
1
|
+
/*! Jazzy - https://github.com/realm/jazzy
|
2
|
+
* Copyright Realm Inc.
|
3
|
+
* SPDX-License-Identifier: MIT
|
4
|
+
*/
|
1
5
|
/* Credit to https://gist.github.com/wataru420/2048287 */
|
2
6
|
|
3
7
|
.highlight {
|
4
|
-
.c { color: #999988; font-style: italic }
|
5
|
-
.err { color: #a61717; background-color: #e3d2d2 }
|
6
|
-
.k { color: #000000; font-weight: bold }
|
7
|
-
.o { color: #000000; font-weight: bold }
|
8
|
-
.cm { color: #999988; font-style: italic }
|
9
|
-
.cp { color: #999999; font-weight: bold }
|
10
|
-
.c1 { color: #999988; font-style: italic }
|
11
|
-
.cs { color: #999999; font-weight: bold; font-style: italic }
|
12
|
-
.gd { color: #000000; background-color: #ffdddd }
|
13
|
-
.gd .x { color: #000000; background-color: #ffaaaa }
|
14
|
-
.ge { color: #000000; font-style: italic }
|
15
|
-
.gr { color: #aa0000 }
|
16
|
-
.gh { color: #999999 }
|
17
|
-
.gi { color: #000000; background-color: #ddffdd }
|
18
|
-
.gi .x { color: #000000; background-color: #aaffaa }
|
19
|
-
.go { color: #888888 }
|
20
|
-
.gp { color: #555555 }
|
21
|
-
.gs { font-weight: bold }
|
22
|
-
.gu { color: #aaaaaa }
|
23
|
-
.gt { color: #aa0000 }
|
24
|
-
.kc { color: #000000; font-weight: bold }
|
25
|
-
.kd { color: #000000; font-weight: bold }
|
26
|
-
.kp { color: #000000; font-weight: bold }
|
27
|
-
.kr { color: #000000; font-weight: bold }
|
28
|
-
.kt { color: #445588; }
|
29
|
-
.m { color: #009999 }
|
30
|
-
.s { color: #d14 }
|
31
|
-
.na { color: #008080 }
|
32
|
-
.nb { color: #0086B3 }
|
33
|
-
.nc { color: #445588; font-weight: bold }
|
34
|
-
.no { color: #008080 }
|
35
|
-
.ni { color: #800080 }
|
36
|
-
.ne { color: #990000; font-weight: bold }
|
37
|
-
.nf { color: #990000; }
|
38
|
-
.nn { color: #555555 }
|
39
|
-
.nt { color: #000080 }
|
40
|
-
.nv { color: #008080 }
|
41
|
-
.ow { color: #000000; font-weight: bold }
|
42
|
-
.w { color: #bbbbbb }
|
43
|
-
.mf { color: #009999 }
|
44
|
-
.mh { color: #009999 }
|
45
|
-
.mi { color: #009999 }
|
46
|
-
.mo { color: #009999 }
|
47
|
-
.sb { color: #d14 }
|
48
|
-
.sc { color: #d14 }
|
49
|
-
.sd { color: #d14 }
|
50
|
-
.s2 { color: #d14 }
|
51
|
-
.se { color: #d14 }
|
52
|
-
.sh { color: #d14 }
|
53
|
-
.si { color: #d14 }
|
54
|
-
.sx { color: #d14 }
|
55
|
-
.sr { color: #009926 }
|
56
|
-
.s1 { color: #d14 }
|
57
|
-
.ss { color: #990073 }
|
58
|
-
.bp { color: #999999 }
|
59
|
-
.vc { color: #008080 }
|
60
|
-
.vg { color: #008080 }
|
61
|
-
.vi { color: #008080 }
|
62
|
-
.il { color: #009999 }
|
8
|
+
.c { color: #999988; font-style: italic } // Comment
|
9
|
+
.err { color: #a61717; background-color: #e3d2d2 } // Error
|
10
|
+
.k { color: #000000; font-weight: bold } // Keyword
|
11
|
+
.o { color: #000000; font-weight: bold } // Operator
|
12
|
+
.cm { color: #999988; font-style: italic } // Comment.Multiline
|
13
|
+
.cp { color: #999999; font-weight: bold } // Comment.Preproc
|
14
|
+
.c1 { color: #999988; font-style: italic } // Comment.Single
|
15
|
+
.cs { color: #999999; font-weight: bold; font-style: italic } // Comment.Special
|
16
|
+
.gd { color: #000000; background-color: #ffdddd } // Generic.Deleted
|
17
|
+
.gd .x { color: #000000; background-color: #ffaaaa } // Generic.Deleted.Specific
|
18
|
+
.ge { color: #000000; font-style: italic } // Generic.Emph
|
19
|
+
.gr { color: #aa0000 } // Generic.Error
|
20
|
+
.gh { color: #999999 } // Generic.Heading
|
21
|
+
.gi { color: #000000; background-color: #ddffdd } // Generic.Inserted
|
22
|
+
.gi .x { color: #000000; background-color: #aaffaa } // Generic.Inserted.Specific
|
23
|
+
.go { color: #888888 } // Generic.Output
|
24
|
+
.gp { color: #555555 } // Generic.Prompt
|
25
|
+
.gs { font-weight: bold } // Generic.Strong
|
26
|
+
.gu { color: #aaaaaa } // Generic.Subheading
|
27
|
+
.gt { color: #aa0000 } // Generic.Traceback
|
28
|
+
.kc { color: #000000; font-weight: bold } // Keyword.Constant
|
29
|
+
.kd { color: #000000; font-weight: bold } // Keyword.Declaration
|
30
|
+
.kp { color: #000000; font-weight: bold } // Keyword.Pseudo
|
31
|
+
.kr { color: #000000; font-weight: bold } // Keyword.Reserved
|
32
|
+
.kt { color: #445588; } // Keyword.Type
|
33
|
+
.m { color: #009999 } // Literal.Number
|
34
|
+
.s { color: #d14 } // Literal.String
|
35
|
+
.na { color: #008080 } // Name.Attribute
|
36
|
+
.nb { color: #0086B3 } // Name.Builtin
|
37
|
+
.nc { color: #445588; font-weight: bold } // Name.Class
|
38
|
+
.no { color: #008080 } // Name.Constant
|
39
|
+
.ni { color: #800080 } // Name.Entity
|
40
|
+
.ne { color: #990000; font-weight: bold } // Name.Exception
|
41
|
+
.nf { color: #990000; } // Name.Function
|
42
|
+
.nn { color: #555555 } // Name.Namespace
|
43
|
+
.nt { color: #000080 } // Name.Tag
|
44
|
+
.nv { color: #008080 } // Name.Variable
|
45
|
+
.ow { color: #000000; font-weight: bold } // Operator.Word
|
46
|
+
.w { color: #bbbbbb } // Text.Whitespace
|
47
|
+
.mf { color: #009999 } // Literal.Number.Float
|
48
|
+
.mh { color: #009999 } // Literal.Number.Hex
|
49
|
+
.mi { color: #009999 } // Literal.Number.Integer
|
50
|
+
.mo { color: #009999 } // Literal.Number.Oct
|
51
|
+
.sb { color: #d14 } // Literal.String.Backtick
|
52
|
+
.sc { color: #d14 } // Literal.String.Char
|
53
|
+
.sd { color: #d14 } // Literal.String.Doc
|
54
|
+
.s2 { color: #d14 } // Literal.String.Double
|
55
|
+
.se { color: #d14 } // Literal.String.Escape
|
56
|
+
.sh { color: #d14 } // Literal.String.Heredoc
|
57
|
+
.si { color: #d14 } // Literal.String.Interpol
|
58
|
+
.sx { color: #d14 } // Literal.String.Other
|
59
|
+
.sr { color: #009926 } // Literal.String.Regex
|
60
|
+
.s1 { color: #d14 } // Literal.String.Single
|
61
|
+
.ss { color: #990073 } // Literal.String.Symbol
|
62
|
+
.bp { color: #999999 } // Name.Builtin.Pseudo
|
63
|
+
.vc { color: #008080 } // Name.Variable.Class
|
64
|
+
.vg { color: #008080 } // Name.Variable.Global
|
65
|
+
.vi { color: #008080 } // Name.Variable.Instance
|
66
|
+
.il { color: #009999 } // Literal.Number.Integer.Long
|
63
67
|
}
|
@@ -1,3 +1,7 @@
|
|
1
|
+
/*! Jazzy - https://github.com/realm/jazzy
|
2
|
+
* Copyright Realm Inc.
|
3
|
+
* SPDX-License-Identifier: MIT
|
4
|
+
*/
|
1
5
|
////////////////////////////////
|
2
6
|
// Constants
|
3
7
|
////////////////////////////////
|
@@ -181,7 +185,7 @@ header {
|
|
181
185
|
z-index: 3;
|
182
186
|
img {
|
183
187
|
padding-right: 6px;
|
184
|
-
vertical-align: -
|
188
|
+
vertical-align: -3px;
|
185
189
|
height: 16px;
|
186
190
|
}
|
187
191
|
a {
|