Class: Jazzy::SymbolGraph::SymNode
- Includes:
- Comparable
- Defined in:
- lib/jazzy/symbol_graph/sym_node.rb
Overview
A SymNode is a node of the reconstructed syntax tree holding a symbol. It can turn itself into SourceKit and helps decode extensions.
Instance Attribute Summary collapse
-
#override ⇒ Object
writeonly
Sets the attribute override.
-
#protocol_requirement ⇒ Object
writeonly
Sets the attribute protocol_requirement.
-
#superclass_name ⇒ Object
Returns the value of attribute superclass_name.
-
#symbol ⇒ Object
Returns the value of attribute symbol.
-
#unlisted ⇒ Object
writeonly
Sets the attribute unlisted.
Attributes inherited from BaseNode
Instance Method Summary collapse
- #<=>(other) ⇒ Object
- #actor? ⇒ Boolean
-
#async? ⇒ Boolean
approximately…
-
#conformance?(protocol) ⇒ Boolean
Messy check whether we need to fabricate an extension for a protocol conformance: don’t bother if it’s already in the type declaration.
- #constraints ⇒ Object
- #full_declaration ⇒ Object
- #inherits_clause ⇒ Object
-
#initialize(symbol) ⇒ SymNode
constructor
A new instance of SymNode.
- #override? ⇒ Boolean
- #parent_qualified_name ⇒ Object
- #protocol? ⇒ Boolean
- #protocol_requirement? ⇒ Boolean
- #qualified_name ⇒ Object
- #to_sourcekit(module_name) ⇒ Object
- #top_level_decl? ⇒ Boolean
-
#try_add_child(node, unique_context_constraints) ⇒ Object
Add another SymNode as a member if possible.
-
#unique_context_constraints(context) ⇒ Object
The ‘Constraint`s on this decl that are both: 1.
-
#where_clause ⇒ Object
Generate the ‘where’ clause for the declaration.
Methods inherited from BaseNode
#add_child, #add_children_to_sourcekit
Constructor Details
#initialize(symbol) ⇒ SymNode
Returns a new instance of SymNode.
50 51 52 53 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 50 def initialize(symbol) self.symbol = symbol super() end |
Instance Attribute Details
#override=(value) ⇒ Object (writeonly)
Sets the attribute override
33 34 35 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 33 def override=(value) @override = value end |
#protocol_requirement=(value) ⇒ Object (writeonly)
Sets the attribute protocol_requirement
34 35 36 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 34 def protocol_requirement=(value) @protocol_requirement = value end |
#superclass_name ⇒ Object
Returns the value of attribute superclass_name.
36 37 38 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 36 def superclass_name @superclass_name end |
#symbol ⇒ Object
Returns the value of attribute symbol.
32 33 34 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 32 def symbol @symbol end |
#unlisted=(value) ⇒ Object (writeonly)
Sets the attribute unlisted
35 36 37 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 35 def unlisted=(value) @unlisted = value end |
Instance Method Details
#<=>(other) ⇒ Object
159 160 161 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 159 def <=>(other) symbol <=> other.symbol end |
#actor? ⇒ Boolean
67 68 69 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 67 def actor? symbol.kind.end_with?('actor') end |
#async? ⇒ Boolean
approximately…
123 124 125 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 123 def async? symbol.declaration =~ /\basync\b[^)]*$/ end |
#conformance?(protocol) ⇒ Boolean
Messy check whether we need to fabricate an extension for a protocol conformance: don’t bother if it’s already in the type declaration.
104 105 106 107 108 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 104 def conformance?(protocol) return false unless symbol.declaration =~ /(?<=:).*?(?=(where|$))/ Regexp.last_match[0] =~ /\b#{protocol}\b/ end |
#constraints ⇒ Object
71 72 73 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 71 def constraints symbol.constraints end |
#full_declaration ⇒ Object
127 128 129 130 131 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 127 def full_declaration symbol.attributes .append(symbol.declaration + inherits_clause + where_clause) .join("\n") end |
#inherits_clause ⇒ Object
116 117 118 119 120 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 116 def inherits_clause return '' unless superclass_name " : #{superclass_name}" end |
#override? ⇒ Boolean
38 39 40 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 38 def override? @override end |
#parent_qualified_name ⇒ Object
59 60 61 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 59 def parent_qualified_name symbol.path_components[0...-1].join('.') end |
#protocol? ⇒ Boolean
63 64 65 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 63 def protocol? symbol.kind.end_with?('protocol') end |
#protocol_requirement? ⇒ Boolean
42 43 44 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 42 def protocol_requirement? @protocol_requirement end |
#qualified_name ⇒ Object
55 56 57 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 55 def qualified_name symbol.path_components.join('.') end |
#to_sourcekit(module_name) ⇒ Object
133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 133 def to_sourcekit(module_name) declaration = full_declaration xml_declaration = "<swift>#{CGI.escapeHTML(declaration)}</swift>" hash = { 'key.kind' => symbol.kind, 'key.usr' => symbol.usr, 'key.name' => symbol.name, 'key.modulename' => module_name, 'key.parsed_declaration' => declaration, 'key.annotated_decl' => xml_declaration, 'key.symgraph_async' => async?, } if params = symbol.parameter_names hash['key.doc.parameters'] = params.map { |name| { 'name' => name } } end hash['key.symgraph_spi'] = true if symbol.spi add_children_to_sourcekit(hash, module_name) symbol.add_to_sourcekit(hash) end |
#top_level_decl? ⇒ Boolean
46 47 48 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 46 def top_level_decl? !@unlisted && parent.nil? end |
#try_add_child(node, unique_context_constraints) ⇒ Object
Add another SymNode as a member if possible. It must go in an extension if either:
- it has different generic constraints to us; or
- we're a protocol and it's a default impl / ext method
79 80 81 82 83 84 85 86 87 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 79 def try_add_child(node, unique_context_constraints) unless unique_context_constraints.empty? && (!protocol? || node.protocol_requirement?) return false end add_child(node) true end |
#unique_context_constraints(context) ⇒ Object
The ‘Constraint`s on this decl that are both:
-
Unique, ie. not just inherited from its context; and
-
Constraining the *context’s* gen params rather than our own.
92 93 94 95 96 97 98 99 100 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 92 def unique_context_constraints(context) return symbol.constraints unless context new_generic_type_params = symbol.generic_type_params - context.symbol.generic_type_params (symbol.constraints - context.symbol.constraints) .select { |con| con.type_names.disjoint?(new_generic_type_params) } end |
#where_clause ⇒ Object
Generate the ‘where’ clause for the declaration
111 112 113 114 |
# File 'lib/jazzy/symbol_graph/sym_node.rb', line 111 def where_clause parent_constraints = parent&.constraints || [] (constraints - parent_constraints).to_where_clause end |