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
184
185
186
|
# File 'lib/solargraph/pin/method.rb', line 184
def anon_splat?
@anon_splat
end
|
#attribute? ⇒ Boolean
141
142
143
|
# File 'lib/solargraph/pin/method.rb', line 141
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
|
# 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}"
end
@documentation.to_s
end
|
#explicit? ⇒ Boolean
137
138
139
|
# File 'lib/solargraph/pin/method.rb', line 137
def explicit?
@explicit
end
|
#nearly?(other) ⇒ Boolean
145
146
147
148
149
150
|
# File 'lib/solargraph/pin/method.rb', line 145
def nearly? other
return false unless super
parameters == other.parameters and
scope == other.scope and
visibility == other.visibility
end
|
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
# File 'lib/solargraph/pin/method.rb', line 163
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
152
153
154
|
# File 'lib/solargraph/pin/method.rb', line 152
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
156
157
158
159
160
|
# File 'lib/solargraph/pin/method.rb', line 156
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
|