Class: Solargraph::Pin::Base
Overview
The base class for map pins.
Instance Attribute Summary collapse
Attributes included from Common
#closure, #context
Instance Method Summary
collapse
#documentation, normalize_indentation, strip_html_comments
#completion_item, #detail, #link_documentation, #reset_conversions, #resolve_completion_item, #signature_help, #text_documentation
Methods included from Common
#binder, #namespace
Constructor Details
#initialize(location: nil, closure: nil, name: '', comments: '') ⇒ Base
Returns a new instance of Base.
31
32
33
34
35
36
|
# File 'lib/solargraph/pin/base.rb', line 31
def initialize location: nil, closure: nil, name: '', comments: ''
@location = location
@closure = closure
@name = name
@comments =
end
|
Instance Attribute Details
#code_object ⇒ YARD::CodeObjects::Base
13
14
15
|
# File 'lib/solargraph/pin/base.rb', line 13
def code_object
@code_object
end
|
16
17
18
|
# File 'lib/solargraph/pin/base.rb', line 16
def location
@location
end
|
#name ⇒ String
19
20
21
|
# File 'lib/solargraph/pin/base.rb', line 19
def name
@name
end
|
#path ⇒ String
22
23
24
|
# File 'lib/solargraph/pin/base.rb', line 22
def path
@path
end
|
132
133
134
|
# File 'lib/solargraph/pin/base.rb', line 132
def return_type
@return_type ||= ComplexType::UNDEFINED
end
|
#source ⇒ ::Symbol
25
26
27
|
# File 'lib/solargraph/pin/base.rb', line 25
def source
@source
end
|
Instance Method Details
#==(other) ⇒ Object
Pin equality is determined using the #nearly? method and also requiring both pins to have the same location.
108
109
110
111
|
# File 'lib/solargraph/pin/base.rb', line 108
def == other
return false unless nearly? other
== other. and location == other.location
end
|
39
40
41
|
# File 'lib/solargraph/pin/base.rb', line 39
def
@comments ||= ''
end
|
#completion_item_kind ⇒ Integer
#deprecated? ⇒ Boolean
167
168
169
|
# File 'lib/solargraph/pin/base.rb', line 167
def deprecated?
@deprecated ||= docstring.has_tag?('deprecated')
end
|
#desc ⇒ String?
266
267
268
269
270
271
272
273
274
275
276
|
# File 'lib/solargraph/pin/base.rb', line 266
def desc
if path
if to_rbs
path + ' ' + to_rbs
else
path
end
else
to_rbs
end
end
|
#directives ⇒ ::Array<YARD::Tags::Directive>
143
144
145
146
|
# File 'lib/solargraph/pin/base.rb', line 143
def directives
unless defined?(@directives)
@directives
end
|
#docstring ⇒ YARD::Docstring
137
138
139
140
|
# File 'lib/solargraph/pin/base.rb', line 137
def docstring
unless defined?(@docstring)
@docstring ||= Solargraph::Source.parse_docstring('').to_docstring
end
|
#erase_generics(generics_to_erase) ⇒ self
75
76
77
78
|
# File 'lib/solargraph/pin/base.rb', line 75
def erase_generics(generics_to_erase)
return self if generics_to_erase.empty?
transform_types { |t| t.erase_generics(generics_to_erase) }
end
|
#filename ⇒ String?
81
82
83
84
|
# File 'lib/solargraph/pin/base.rb', line 81
def filename
return nil if location.nil?
location.filename
end
|
#identity ⇒ String
256
257
258
|
# File 'lib/solargraph/pin/base.rb', line 256
def identity
@identity ||= "#{closure.path}|#{name}"
end
|
Deprecated.
Use #typify and/or #probe instead
194
195
196
197
198
199
|
# File 'lib/solargraph/pin/base.rb', line 194
def infer api_map
Solargraph::Logging.logger.warn "WARNING: Pin #infer methods are deprecated. Use #typify or #probe instead."
type = typify(api_map)
return type unless type.undefined?
probe api_map
end
|
#inspect ⇒ Object
278
279
280
|
# File 'lib/solargraph/pin/base.rb', line 278
def inspect
"#<#{self.class} `#{self.desc}` at #{self.location.inspect}>"
end
|
#macros ⇒ ::Array<YARD::Tags::MacroDirective>
149
150
151
|
# File 'lib/solargraph/pin/base.rb', line 149
def macros
@macros ||= collect_macros
end
|
#maybe_directives? ⇒ Boolean
Perform a quick check to see if this pin possibly includes YARD directives. This method does not require parsing the comments.
After the comments have been parsed, this method will return false if no directives were found, regardless of whether it previously appeared possible.
161
162
163
164
|
# File 'lib/solargraph/pin/base.rb', line 161
def maybe_directives?
return !@directives.empty? if defined?(@directives)
@maybe_directives ||= .include?('@!')
end
|
#nearly?(other) ⇒ Boolean
True if the specified pin is a near match to this one. A near match indicates that the pins contain mostly the same data. Any differences between them should not have an impact on the API surface.
119
120
121
122
123
124
125
126
127
|
# File 'lib/solargraph/pin/base.rb', line 119
def nearly? other
self.class == other.class &&
name == other.name &&
(closure == other.closure || (closure && closure.nearly?(other.closure))) &&
( == other. ||
(((maybe_directives? == false && other.maybe_directives? == false) || compare_directives(directives, other.directives)) &&
compare_docstring_tags(docstring, other.docstring))
)
end
|
Infer the pin’s return type via static code analysis.
187
188
189
|
# File 'lib/solargraph/pin/base.rb', line 187
def probe api_map
typify api_map
end
|
#probed? ⇒ Boolean
225
226
227
|
# File 'lib/solargraph/pin/base.rb', line 225
def probed?
@probed ||= false
end
|
#proxied? ⇒ Boolean
221
222
223
|
# File 'lib/solargraph/pin/base.rb', line 221
def proxied?
@proxied ||= false
end
|
#proxy(return_type) ⇒ self
Return a proxy for this pin with the specified return type. Other than the return type and the #proxied? setting, the proxy should be a clone of the original.
248
249
250
251
252
253
|
# File 'lib/solargraph/pin/base.rb', line 248
def proxy return_type
result = dup
result.return_type = return_type
result.proxied = true
result
end
|
#realize(api_map) ⇒ self
231
232
233
234
235
236
237
238
239
240
|
# File 'lib/solargraph/pin/base.rb', line 231
def realize api_map
return self if return_type.defined?
type = typify(api_map)
return proxy(type) if type.defined?
type = probe(api_map)
return self if type.undefined?
result = proxy(type)
result.probed = true
result
end
|
#resolve_generics(definitions, context_type) ⇒ self
Determine the concrete type for each of the generic type parameters used in this method based on the parameters passed into the its class and return a new method pin.
68
69
70
71
|
# File 'lib/solargraph/pin/base.rb', line 68
def resolve_generics definitions, context_type
transformed = transform_types { |t| t.resolve_generics(definitions, context_type) if t }
transformed.erase_generics(definitions.generics)
end
|
#resolve_generics_from_context(generics_to_resolve, return_type_context = nil, resolved_generic_values: {}) ⇒ self
48
49
50
51
52
|
# File 'lib/solargraph/pin/base.rb', line 48
def resolve_generics_from_context(generics_to_resolve, return_type_context = nil, resolved_generic_values: {})
proxy return_type.resolve_generics_from_context(generics_to_resolve,
return_type_context,
resolved_generic_values: resolved_generic_values)
end
|
#symbol_kind ⇒ Integer?
92
93
94
|
# File 'lib/solargraph/pin/base.rb', line 92
def symbol_kind
nil
end
|
#to_rbs ⇒ String?
261
262
263
|
# File 'lib/solargraph/pin/base.rb', line 261
def to_rbs
return_type.to_rbs
end
|
#to_s ⇒ Object
96
97
98
|
# File 'lib/solargraph/pin/base.rb', line 96
def to_s
to_rbs
end
|
57
58
59
|
# File 'lib/solargraph/pin/base.rb', line 57
def transform_types(&transform)
proxy return_type.transform(&transform)
end
|
#try_merge!(pin) ⇒ Boolean
Try to merge data from another pin. Merges are only possible if the pins are near matches (see the #nearly? method). The changes should not have any side effects on the API surface.
207
208
209
210
211
212
213
214
215
216
217
218
219
|
# File 'lib/solargraph/pin/base.rb', line 207
def try_merge! pin
return false unless nearly?(pin)
@location = pin.location
@closure = pin.closure
return true if == pin.
@comments = pin.
@docstring = pin.docstring
@return_type = pin.return_type
@documentation = nil
@deprecated = nil
reset_conversions
true
end
|
Get a fully qualified type from the pin’s return type.
The relative type is determined from YARD documentation (@return, @param, @type, etc.) and its namespaces are fully qualified using the provided ApiMap.
179
180
181
|
# File 'lib/solargraph/pin/base.rb', line 179
def typify api_map
return_type.qualify(api_map, namespace)
end
|
#variable? ⇒ Boolean
101
102
103
|
# File 'lib/solargraph/pin/base.rb', line 101
def variable?
false
end
|