Class: Solargraph::Pin::Method
- Inherits:
-
Closure
show all
- Includes:
- (rubyvm? ? Rubyvm::NodeMethods : Legacy(rubyvm? ? Rubyvm::NodeMethods : Legacy::NodeMethods)
- Defined in:
- lib/solargraph/pin/method.rb
Overview
The base class for method and attribute pins.
Instance Attribute Summary collapse
Attributes inherited from Closure
#scope
Attributes inherited from Base
#code_object, #location, #name, #source
Attributes included from Common
#closure, #location
Instance Method Summary
collapse
Methods inherited from Closure
#binder, #context, #gates
Methods inherited from Base
#==, #comments, #deprecated?, #directives, #docstring, #filename, #identity, #infer, #inspect, #macros, #maybe_directives?, #probed?, #proxied?, #proxy, #realize, #to_s, #variable?
#completion_item, #link_documentation, #reset_conversions, #resolve_completion_item, #text_documentation
Methods included from Common
#binder, #comments, #context, #name, #namespace
Constructor Details
#initialize(visibility: :public, explicit: true, parameters: [], node: nil, attribute: false, signatures: nil, anon_splat: false, **splat) ⇒ Method
Returns a new instance of Method.
24
25
26
27
28
29
30
31
32
33
|
# File 'lib/solargraph/pin/method.rb', line 24
def initialize visibility: :public, explicit: true, parameters: [], node: nil, attribute: false, signatures: nil, anon_splat: false, **splat
super(**splat)
@visibility = visibility
@explicit = explicit
@parameters = parameters
@node = node
@attribute = attribute
@signatures = signatures
@anon_splat = anon_splat
end
|
Instance Attribute Details
#node ⇒ Parser::AST::Node
17
18
19
|
# File 'lib/solargraph/pin/method.rb', line 17
def node
@node
end
|
11
12
13
|
# File 'lib/solargraph/pin/method.rb', line 11
def parameters
@parameters
end
|
#visibility ⇒ ::Symbol
Returns :public, :private, or :protected.
14
15
16
|
# File 'lib/solargraph/pin/method.rb', line 14
def visibility
@visibility
end
|
Instance Method Details
#anon_splat? ⇒ Boolean
189
190
191
|
# File 'lib/solargraph/pin/method.rb', line 189
def anon_splat?
@anon_splat
end
|
#attribute? ⇒ Boolean
146
147
148
|
# File 'lib/solargraph/pin/method.rb', line 146
def attribute?
@attribute
end
|
#completion_item_kind ⇒ Object
#detail ⇒ String
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
# File 'lib/solargraph/pin/method.rb', line 65
def detail
detail = String.new
detail += if signatures.length > 1
"(*) "
else
"(#{signatures.first.parameters.map(&:full).join(', ')}) " unless signatures.first.parameters.empty?
end.to_s
detail += "=#{probed? ? '~' : (proxied? ? '^' : '>')} #{return_type.to_s}" unless return_type.undefined?
detail.strip!
return nil if detail.empty?
detail
end
|
#documentation ⇒ Object
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
# File 'lib/solargraph/pin/method.rb', line 102
def documentation
if @documentation.nil?
@documentation ||= super || ''
param_tags = docstring.tags(:param)
unless param_tags.nil? or param_tags.empty?
@documentation += "\n\n" unless @documentation.empty?
@documentation += "Params:\n"
lines = []
param_tags.each do |p|
l = "* #{p.name}"
l += " [#{escape_brackets(p.types.join(', '))}]" unless p.types.nil? or p.types.empty?
l += " #{p.text}"
lines.push l
end
@documentation += lines.join("\n")
end
return_tags = docstring.tags(:return)
unless return_tags.empty?
@documentation += "\n\n" unless @documentation.empty?
@documentation += "Returns:\n"
lines = []
return_tags.each do |r|
l = "*"
l += " [#{escape_brackets(r.types.join(', '))}]" unless r.types.nil? or r.types.empty?
l += " #{r.text}"
lines.push l
end
@documentation += lines.join("\n")
end
@documentation += "\n\n" unless @documentation.empty?
@documentation += "Visibility: #{visibility}"
example_tags = docstring.tags(:example)
unless example_tags.empty?
@documentation += "\n\nExamples:\n\n"
@documentation += example_tags.map(&:text).join("\n")
end
end
@documentation.to_s
end
|
#explicit? ⇒ Boolean
142
143
144
|
# File 'lib/solargraph/pin/method.rb', line 142
def explicit?
@explicit
end
|
#nearly?(other) ⇒ Boolean
150
151
152
153
154
155
|
# File 'lib/solargraph/pin/method.rb', line 150
def nearly? other
return false unless super
parameters == other.parameters and
scope == other.scope and
visibility == other.visibility
end
|
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
|
# File 'lib/solargraph/pin/method.rb', line 168
def overloads
@overloads ||= docstring.tags(:overload).map do |tag|
Pin::Signature.new(
tag.parameters.map do |src|
name, decl = parse_overload_param(src.first)
Pin::Parameter.new(
location: location,
closure: self,
comments: tag.docstring.all.to_s,
name: name,
decl: decl,
presence: location ? location.range : nil,
return_type: param_type_from_name(tag, src.first)
)
end,
ComplexType.try_parse(*tag.docstring.tags(:return).flat_map(&:types))
)
end
@overloads
end
|
#parameter_names ⇒ Array<String>
36
37
38
|
# File 'lib/solargraph/pin/method.rb', line 36
def parameter_names
@parameter_names ||= parameters.map(&:name)
end
|
#path ⇒ Object
90
91
92
|
# File 'lib/solargraph/pin/method.rb', line 90
def path
@path ||= "#{namespace}#{(scope == :instance ? '#' : '.')}#{name}"
end
|
#probe(api_map) ⇒ Object
157
158
159
|
# File 'lib/solargraph/pin/method.rb', line 157
def probe api_map
attribute? ? infer_from_iv(api_map) : infer_from_return_nodes(api_map)
end
|
#return_type ⇒ Object
48
49
50
|
# File 'lib/solargraph/pin/method.rb', line 48
def return_type
@return_type ||= ComplexType.try_parse(*signatures.map(&:return_type).map(&:to_s))
end
|
#signature_help ⇒ Array<Hash>
81
82
83
84
85
86
87
88
|
# File 'lib/solargraph/pin/method.rb', line 81
def signature_help
@signature_help ||= signatures.map do |sig|
{
label: name + '(' + sig.parameters.map(&:full).join(', ') + ')',
documentation: documentation
}
end
end
|
#signatures ⇒ Array<Signature>
53
54
55
56
57
58
59
60
61
62
|
# File 'lib/solargraph/pin/method.rb', line 53
def signatures
@signatures ||= begin
top_type = generate_complex_type
result = []
result.push Signature.new(parameters, top_type) if top_type.defined?
result.concat(overloads.map { |meth| Signature.new(meth.parameters, meth.return_type) })
result.push Signature.new(parameters, top_type) if result.empty?
result
end
end
|
#try_merge!(pin) ⇒ Object
161
162
163
164
165
|
# File 'lib/solargraph/pin/method.rb', line 161
def try_merge! pin
return false unless super
@node = pin.node
true
end
|
#typify(api_map) ⇒ Object
94
95
96
97
98
99
100
|
# File 'lib/solargraph/pin/method.rb', line 94
def typify api_map
decl = super
return decl unless decl.undefined?
type = see_reference(api_map) || typify_from_super(api_map)
return type.qualify(api_map, namespace) unless type.nil?
name.end_with?('?') ? ComplexType::BOOLEAN : ComplexType::UNDEFINED
end
|