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, type_location: nil, closure: nil, source: nil, name: '', comments: '') ⇒ Base
Returns a new instance of Base.
39
40
41
42
43
44
45
46
47
|
# File 'lib/solargraph/pin/base.rb', line 39
def initialize location: nil, type_location: nil, closure: nil, source: nil, name: '', comments: ''
@location = location
@type_location = type_location
@closure = closure
@name = name
@source = source
@comments =
@source = source
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
22
23
24
|
# File 'lib/solargraph/pin/base.rb', line 22
def name
@name
end
|
#path ⇒ String
25
26
27
|
# File 'lib/solargraph/pin/base.rb', line 25
def path
@path
end
|
151
152
153
|
# File 'lib/solargraph/pin/base.rb', line 151
def return_type
@return_type ||= ComplexType::UNDEFINED
end
|
#source ⇒ ::Symbol
28
29
30
|
# File 'lib/solargraph/pin/base.rb', line 28
def source
@source
end
|
19
20
21
|
# File 'lib/solargraph/pin/base.rb', line 19
def type_location
@type_location
end
|
Instance Method Details
#==(other) ⇒ Object
Pin equality is determined using the #nearly? method and also requiring both pins to have the same location.
143
144
145
146
|
# File 'lib/solargraph/pin/base.rb', line 143
def == other
return false unless nearly? other
== other. && location == other.location
end
|
#all_rooted? ⇒ Boolean
83
84
85
|
# File 'lib/solargraph/pin/base.rb', line 83
def all_rooted?
!return_type || return_type.all_rooted?
end
|
#best_location ⇒ Location?
120
121
122
|
# File 'lib/solargraph/pin/base.rb', line 120
def best_location
location || type_location
end
|
50
51
52
|
# File 'lib/solargraph/pin/base.rb', line 50
def
@comments ||= ''
end
|
#completion_item_kind ⇒ Integer
#deprecated? ⇒ Boolean
186
187
188
|
# File 'lib/solargraph/pin/base.rb', line 186
def deprecated?
@deprecated ||= docstring.has_tag?('deprecated')
end
|
#desc ⇒ String
302
303
304
305
306
|
# File 'lib/solargraph/pin/base.rb', line 302
def desc
closure_info = closure&.desc
binder_info = binder&.desc
"[name=#{name.inspect} return_type=#{type_desc}, context=#{context.rooted_tags}, closure=#{closure_info}, binder=#{binder_info}]"
end
|
#directives ⇒ ::Array<YARD::Tags::Directive>
162
163
164
165
|
# File 'lib/solargraph/pin/base.rb', line 162
def directives
unless defined?(@directives)
@directives
end
|
#docstring ⇒ YARD::Docstring
156
157
158
159
|
# File 'lib/solargraph/pin/base.rb', line 156
def docstring
unless defined?(@docstring)
@docstring ||= Solargraph::Source.parse_docstring('').to_docstring
end
|
#erase_generics(generics_to_erase) ⇒ self
89
90
91
92
|
# File 'lib/solargraph/pin/base.rb', line 89
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?
95
96
97
98
|
# File 'lib/solargraph/pin/base.rb', line 95
def filename
return nil if location.nil?
location.filename
end
|
#identity ⇒ String
276
277
278
|
# File 'lib/solargraph/pin/base.rb', line 276
def identity
@identity ||= "#{closure&.path}|#{name}|#{location}"
end
|
Deprecated.
Use #typify and/or #probe instead
213
214
215
216
217
218
|
# File 'lib/solargraph/pin/base.rb', line 213
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
308
309
310
|
# File 'lib/solargraph/pin/base.rb', line 308
def inspect
"#<#{self.class} `#{self.desc}` at #{self.location.inspect}>"
end
|
#macros ⇒ ::Array<YARD::Tags::MacroDirective>
168
169
170
|
# File 'lib/solargraph/pin/base.rb', line 168
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.
180
181
182
183
|
# File 'lib/solargraph/pin/base.rb', line 180
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.
130
131
132
133
134
135
136
137
138
|
# File 'lib/solargraph/pin/base.rb', line 130
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
|
#presence_certain? ⇒ Boolean
30
31
32
|
# File 'lib/solargraph/pin/base.rb', line 30
def presence_certain?
true
end
|
Infer the pin’s return type via static code analysis.
206
207
208
|
# File 'lib/solargraph/pin/base.rb', line 206
def probe api_map
typify api_map
end
|
#probed? ⇒ Boolean
244
245
246
|
# File 'lib/solargraph/pin/base.rb', line 244
def probed?
@probed ||= false
end
|
#proxied? ⇒ Boolean
240
241
242
|
# File 'lib/solargraph/pin/base.rb', line 240
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.
267
268
269
270
271
272
|
# File 'lib/solargraph/pin/base.rb', line 267
def proxy return_type
result = dup
result.return_type = return_type
result.proxied = true
result
end
|
#realize(api_map) ⇒ self
250
251
252
253
254
255
256
257
258
259
|
# File 'lib/solargraph/pin/base.rb', line 250
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.
79
80
81
|
# File 'lib/solargraph/pin/base.rb', line 79
def resolve_generics definitions, context_type
transform_types { |t| t.resolve_generics(definitions, context_type) if t }
end
|
#resolve_generics_from_context(generics_to_resolve, return_type_context = nil, resolved_generic_values: {}) ⇒ self
59
60
61
62
63
|
# File 'lib/solargraph/pin/base.rb', line 59
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?
106
107
108
|
# File 'lib/solargraph/pin/base.rb', line 106
def symbol_kind
nil
end
|
#to_rbs ⇒ String?
281
282
283
|
# File 'lib/solargraph/pin/base.rb', line 281
def to_rbs
return_type.to_rbs
end
|
#to_s ⇒ Object
110
111
112
|
# File 'lib/solargraph/pin/base.rb', line 110
def to_s
desc
end
|
68
69
70
|
# File 'lib/solargraph/pin/base.rb', line 68
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.
226
227
228
229
230
231
232
233
234
235
236
237
238
|
# File 'lib/solargraph/pin/base.rb', line 226
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
|
#type_desc ⇒ String
286
287
288
289
290
291
292
293
294
295
296
297
298
299
|
# File 'lib/solargraph/pin/base.rb', line 286
def type_desc
rbs = to_rbs
rbs = return_type.rooted_tags if return_type.name == 'Class'
if path
if rbs
path + ' ' + rbs
else
path
end
else
rbs
end
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.
198
199
200
|
# File 'lib/solargraph/pin/base.rb', line 198
def typify api_map
return_type.qualify(api_map, namespace)
end
|
#variable? ⇒ Boolean
115
116
117
|
# File 'lib/solargraph/pin/base.rb', line 115
def variable?
false
end
|