Class: Jazzy::SymbolGraph::Symbol
- Inherits:
-
Object
- Object
- Jazzy::SymbolGraph::Symbol
- Includes:
- Comparable
- Defined in:
- lib/jazzy/symbol_graph/symbol.rb
Overview
A Symbol is a tidied-up SymbolGraph JSON object
Constant Summary collapse
- KIND_MAP =
Mapping SymbolGraph’s declkinds to SourceKit
{ 'class' => 'class', 'struct' => 'struct', 'enum' => 'enum', 'enum.case' => 'enumelement', # intentional 'protocol' => 'protocol', 'init' => 'function.constructor', 'deinit' => 'function.destructor', 'func.op' => 'function.operator', 'type.method' => 'function.method.class', 'static.method' => 'function.method.static', 'method' => 'function.method.instance', 'func' => 'function.free', 'type.property' => 'var.class', 'static.property' => 'var.static', 'property' => 'var.instance', 'var' => 'var.global', 'subscript' => 'function.subscript', 'type.subscript' => 'function.subscript', 'static.subscript' => 'function.subscript', 'typealias' => 'typealias', 'associatedtype' => 'associatedtype', 'actor' => 'actor', }.freeze
Instance Attribute Summary collapse
-
#acl ⇒ Object
Returns the value of attribute acl.
-
#attributes ⇒ Object
array, can be empty.
-
#constraints ⇒ Object
array, can be empty.
-
#declaration ⇒ Object
Returns the value of attribute declaration.
-
#doc_comments ⇒ Object
can be nil.
-
#generic_type_params ⇒ Object
set, can be empty.
-
#kind ⇒ Object
Returns the value of attribute kind.
-
#location ⇒ Object
can be nil, keys :filename :line :character.
-
#parameter_names ⇒ Object
array, can be nil.
-
#path_components ⇒ Object
Returns the value of attribute path_components.
-
#spi ⇒ Object
Returns the value of attribute spi.
-
#usr ⇒ Object
Returns the value of attribute usr.
Instance Method Summary collapse
- #<=>(other) ⇒ Object
-
#adjust_kind_for_declaration(kind, keywords) ⇒ Object
We treat ‘static var’ differently to ‘class var’ We treat actors as first-class entities.
-
#availability_attributes(avail_hash_list) ⇒ Object
Availability Re-encode this as Swift.
- #decode_version(hash) ⇒ Object
-
#init_acl(acl) ⇒ Object
Mapping SymbolGraph’s ACL to SourceKit.
- #init_attributes(avail_hash_list) ⇒ Object
-
#init_constraints(hash, raw_decl) ⇒ Object
Generic constraints: in one or both of two places.
-
#init_declaration(raw_decl) ⇒ Object
Repair problems with SymbolGraph’s declprinter.
- #init_doc_comments(comments_hash) ⇒ Object
-
#init_func_signature(func_signature) ⇒ Object
Remember pieces of methods for later markdown parsing.
-
#init_generic_type_params(hash) ⇒ Object
Generic type params.
- #init_kind(kind, keywords) ⇒ Object
-
#init_location(loc_hash) ⇒ Object
Symbol location - only available for public+ decls.
-
#initialize(hash) ⇒ Symbol
constructor
A new instance of Symbol.
- #name ⇒ Object
- #parse_decl_fragments(fragments) ⇒ Object
- #spi_attributes ⇒ Object
Constructor Details
#initialize(hash) ⇒ Symbol
Returns a new instance of Symbol.
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 25 def initialize(hash) self.usr = hash[:identifier][:precise] self.path_components = hash[:pathComponents] raw_decl, keywords = parse_decl_fragments(hash[:declarationFragments]) init_kind(hash[:kind][:identifier], keywords) init_declaration(raw_decl) if func_signature = hash[:functionSignature] init_func_signature(func_signature) end init_acl(hash[:accessLevel]) self.spi = hash[:spi] if location = hash[:location] init_location(location) end init_constraints(hash, raw_decl) if comments_hash = hash[:docComment] init_doc_comments(comments_hash) end init_attributes(hash[:availability] || []) init_generic_type_params(hash) end |
Instance Attribute Details
#acl ⇒ Object
Returns the value of attribute acl.
12 13 14 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 12 def acl @acl end |
#attributes ⇒ Object
array, can be empty
17 18 19 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 17 def attributes @attributes end |
#constraints ⇒ Object
array, can be empty
15 16 17 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 15 def constraints @constraints end |
#declaration ⇒ Object
Returns the value of attribute declaration.
10 11 12 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 10 def declaration @declaration end |
#doc_comments ⇒ Object
can be nil
16 17 18 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 16 def doc_comments @doc_comments end |
#generic_type_params ⇒ Object
set, can be empty
18 19 20 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 18 def generic_type_params @generic_type_params end |
#kind ⇒ Object
Returns the value of attribute kind.
11 12 13 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 11 def kind @kind end |
#location ⇒ Object
can be nil, keys :filename :line :character
14 15 16 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 14 def location @location end |
#parameter_names ⇒ Object
array, can be nil
19 20 21 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 19 def parameter_names @parameter_names end |
#path_components ⇒ Object
Returns the value of attribute path_components.
9 10 11 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 9 def path_components @path_components end |
#spi ⇒ Object
Returns the value of attribute spi.
13 14 15 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 13 def spi @spi end |
#usr ⇒ Object
Returns the value of attribute usr.
8 9 10 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 8 def usr @usr end |
Instance Method Details
#<=>(other) ⇒ Object
222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 222 def <=>(other) # Things with location: order by file/line/column # (pls tell what wheel i am reinventing :/) if location && other_loc = other.location if location[:filename] == other_loc[:filename] if location[:line] == other_loc[:line] return location[:character] <=> other_loc[:character] end return location[:line] <=> other_loc[:line] end return location[:filename] <=> other_loc[:filename] end # Things with a location before things without a location return +1 if location.nil? && other.location return -1 if location && other.location.nil? # Things without a location: by name and then USR return usr <=> other.usr if name == other.name name <=> other.name end |
#adjust_kind_for_declaration(kind, keywords) ⇒ Object
We treat ‘static var’ differently to ‘class var’ We treat actors as first-class entities
107 108 109 110 111 112 113 114 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 107 def adjust_kind_for_declaration(kind, keywords) if kind == 'swift.class' && keywords.member?('actor') return 'swift.actor' end return kind unless keywords.member?('static') kind.gsub(/type/, 'static') end |
#availability_attributes(avail_hash_list) ⇒ Object
Availability Re-encode this as Swift. Should really teach Jazzy about these, could maybe then do something smarter here.
179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 179 def availability_attributes(avail_hash_list) avail_hash_list.map do |avail| str = '@available(' if avail[:isUnconditionallyDeprecated] str += '*, deprecated' elsif domain = avail[:domain] str += domain %i[introduced deprecated obsoleted].each do |event| if version = avail[event] str += ", #{event}: #{decode_version(version)}" end end else warn "Found confusing availability: #{avail}" next nil end str += ", message: \"#{avail[:message]}\"" if avail[:message] str += ", renamed: \"#{avail[:renamed]}\"" if avail[:renamed] str + ')' end.compact end |
#decode_version(hash) ⇒ Object
203 204 205 206 207 208 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 203 def decode_version(hash) str = hash[:major].to_s str += ".#{hash[:minor]}" if hash[:minor] str += ".#{hash[:patch]}" if hash[:patch] str end |
#init_acl(acl) ⇒ Object
Mapping SymbolGraph’s ACL to SourceKit
126 127 128 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 126 def init_acl(acl) self.acl = "source.lang.swift.accessibility.#{acl}" end |
#init_attributes(avail_hash_list) ⇒ Object
214 215 216 217 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 214 def init_attributes(avail_hash_list) self.attributes = availability_attributes(avail_hash_list) + spi_attributes end |
#init_constraints(hash, raw_decl) ⇒ Object
Generic constraints: in one or both of two places. There can be duplicates; these are removed by ‘Constraint`.
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 141 def init_constraints(hash, raw_decl) raw_constraints = %i[swiftGenerics swiftExtension].flat_map do |key| next [] unless container = hash[key] container[:constraints] || [] end constraints = Constraint.new_list_for_symbol(raw_constraints, path_components) if raw_decl =~ / where (.*)$/ constraints += Constraint.new_list_from_declaration(Regexp.last_match[1]) end self.constraints = constraints.sort.uniq end |
#init_declaration(raw_decl) ⇒ Object
Repair problems with SymbolGraph’s declprinter
59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 59 def init_declaration(raw_decl) # Too much 'Self.TypeName'; omitted arg labels look odd; # duplicated constraints; swift 5.3 vs. master workaround self.declaration = raw_decl .gsub(/\bSelf\./, '') .gsub(/(?<=\(|, )_: /, '_ arg: ') .gsub(/ where.*$/, '') if kind == 'source.lang.swift.decl.class' declaration.sub!(/\s*:.*$/, '') end end |
#init_doc_comments(comments_hash) ⇒ Object
170 171 172 173 174 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 170 def init_doc_comments(comments_hash) self.doc_comments = comments_hash[:lines] .map { |l| l[:text] } .join("\n") end |
#init_func_signature(func_signature) ⇒ Object
Remember pieces of methods for later markdown parsing
73 74 75 76 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 73 def init_func_signature(func_signature) self.parameter_names = (func_signature[:parameters] || []).map { |h| h[:name] } end |
#init_generic_type_params(hash) ⇒ Object
Generic type params
159 160 161 162 163 164 165 166 167 168 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 159 def init_generic_type_params(hash) self.generic_type_params = Set.new( if (generics = hash[:swiftGenerics]) && (parameters = generics[:parameters]) parameters.map { |p| p[:name] } else [] end, ) end |
#init_kind(kind, keywords) ⇒ Object
116 117 118 119 120 121 122 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 116 def init_kind(kind, keywords) adjusted = adjust_kind_for_declaration(kind, keywords) sourcekit_kind = KIND_MAP[adjusted.sub('swift.', '')] raise "Unknown symbol kind '#{kind}'" unless sourcekit_kind self.kind = "source.lang.swift.decl.#{sourcekit_kind}" end |
#init_location(loc_hash) ⇒ Object
Symbol location - only available for public+ decls
132 133 134 135 136 137 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 132 def init_location(loc_hash) self.location = {} location[:filename] = loc_hash[:uri].sub(%r{^file://}, '') location[:line] = loc_hash[:position][:line] location[:character] = loc_hash[:position][:character] end |
#name ⇒ Object
21 22 23 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 21 def name path_components[-1] || '??' end |
#parse_decl_fragments(fragments) ⇒ Object
47 48 49 50 51 52 53 54 55 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 47 def parse_decl_fragments(fragments) decl = '' keywords = Set.new fragments.each do |frag| decl += frag[:spelling] keywords.add(frag[:spelling]) if frag[:kind] == 'keyword' end [decl, keywords] end |
#spi_attributes ⇒ Object
210 211 212 |
# File 'lib/jazzy/symbol_graph/symbol.rb', line 210 def spi_attributes spi ? ['@_spi(Unknown)'] : [] end |