solargraph 0.17.4 → 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/solargraph.rb +16 -12
- data/lib/solargraph/api_map.rb +516 -588
- data/lib/solargraph/api_map/completion.rb +16 -0
- data/lib/solargraph/api_map/source_to_yard.rb +2 -2
- data/lib/solargraph/language_server.rb +12 -0
- data/lib/solargraph/language_server/completion_item_kinds.rb +31 -0
- data/lib/solargraph/language_server/error_codes.rb +16 -0
- data/lib/solargraph/language_server/host.rb +305 -0
- data/lib/solargraph/language_server/message.rb +70 -0
- data/lib/solargraph/language_server/message/base.rb +64 -0
- data/lib/solargraph/language_server/message/cancel_request.rb +11 -0
- data/lib/solargraph/language_server/message/client.rb +5 -0
- data/lib/solargraph/language_server/message/client/register_capability.rb +13 -0
- data/lib/solargraph/language_server/message/completion_item.rb +9 -0
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +23 -0
- data/lib/solargraph/language_server/message/exit_notification.rb +12 -0
- data/lib/solargraph/language_server/message/extended.rb +15 -0
- data/lib/solargraph/language_server/message/extended/document.rb +18 -0
- data/lib/solargraph/language_server/message/extended/search.rb +18 -0
- data/lib/solargraph/language_server/message/initialize.rb +39 -0
- data/lib/solargraph/language_server/message/initialized.rb +10 -0
- data/lib/solargraph/language_server/message/method_not_found.rb +14 -0
- data/lib/solargraph/language_server/message/method_not_implemented.rb +12 -0
- data/lib/solargraph/language_server/message/shutdown.rb +11 -0
- data/lib/solargraph/language_server/message/text_document.rb +21 -0
- data/lib/solargraph/language_server/message/text_document/base.rb +17 -0
- data/lib/solargraph/language_server/message/text_document/completion.rb +69 -0
- data/lib/solargraph/language_server/message/text_document/definition.rb +38 -0
- data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -0
- data/lib/solargraph/language_server/message/text_document/did_close.rb +12 -0
- data/lib/solargraph/language_server/message/text_document/did_open.rb +13 -0
- data/lib/solargraph/language_server/message/text_document/did_save.rb +15 -0
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +31 -0
- data/lib/solargraph/language_server/message/text_document/formatting.rb +36 -0
- data/lib/solargraph/language_server/message/text_document/hover.rb +19 -0
- data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +29 -0
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +23 -0
- data/lib/solargraph/language_server/message/workspace.rb +11 -0
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +9 -0
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +30 -0
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +31 -0
- data/lib/solargraph/language_server/symbol_kinds.rb +32 -0
- data/lib/solargraph/language_server/transport.rb +7 -0
- data/lib/solargraph/language_server/transport/socket.rb +66 -0
- data/lib/solargraph/language_server/uri_helpers.rb +21 -0
- data/lib/solargraph/library.rb +225 -0
- data/lib/solargraph/live_map.rb +1 -1
- data/lib/solargraph/page.rb +61 -0
- data/lib/solargraph/pin.rb +7 -0
- data/lib/solargraph/pin/attribute.rb +9 -0
- data/lib/solargraph/pin/base.rb +76 -6
- data/lib/solargraph/pin/base_variable.rb +29 -7
- data/lib/solargraph/pin/block_parameter.rb +53 -0
- data/lib/solargraph/pin/constant.rb +6 -2
- data/lib/solargraph/pin/conversions.rb +65 -0
- data/lib/solargraph/pin/directed/attribute.rb +4 -0
- data/lib/solargraph/pin/directed/method.rb +6 -1
- data/lib/solargraph/pin/helper.rb +35 -0
- data/lib/solargraph/pin/keyword.rb +22 -0
- data/lib/solargraph/pin/local_variable.rb +0 -1
- data/lib/solargraph/pin/method.rb +55 -2
- data/lib/solargraph/pin/method_parameter.rb +19 -0
- data/lib/solargraph/pin/namespace.rb +7 -2
- data/lib/solargraph/pin/parameter.rb +23 -0
- data/lib/solargraph/pin/plugin/method.rb +3 -2
- data/lib/solargraph/pin/yard_object.rb +101 -0
- data/lib/solargraph/server.rb +82 -135
- data/lib/solargraph/shell.rb +20 -1
- data/lib/solargraph/source.rb +709 -0
- data/lib/solargraph/source/flawed_builder.rb +10 -0
- data/lib/solargraph/source/fragment.rb +319 -0
- data/lib/solargraph/source/position.rb +26 -0
- data/lib/solargraph/source/range.rb +39 -0
- data/lib/solargraph/suggestion.rb +29 -4
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace.rb +105 -0
- data/lib/solargraph/{api_map → workspace}/config.rb +1 -1
- data/lib/solargraph/yard_map.rb +59 -37
- metadata +168 -5
- data/lib/solargraph/api_map/source.rb +0 -470
- data/lib/solargraph/code_map.rb +0 -868
@@ -0,0 +1,319 @@
|
|
1
|
+
module Solargraph
|
2
|
+
class Source
|
3
|
+
class Fragment
|
4
|
+
# @return [Integer]
|
5
|
+
attr_reader :offset
|
6
|
+
|
7
|
+
include NodeMethods
|
8
|
+
|
9
|
+
# @param source [Solargraph::Source]
|
10
|
+
# @param offset [Integer]
|
11
|
+
def initialize source, offset
|
12
|
+
# @todo Split this object from the source. The source can change; if
|
13
|
+
# it does, this object's data should not.
|
14
|
+
@source = source
|
15
|
+
@code = source.code
|
16
|
+
@offset = offset
|
17
|
+
end
|
18
|
+
|
19
|
+
# Get the node at the current offset.
|
20
|
+
#
|
21
|
+
# @return [Parser::AST::Node]
|
22
|
+
def node
|
23
|
+
@node ||= @source.node_at(@offset)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Get the fully qualified namespace at the current offset.
|
27
|
+
#
|
28
|
+
# @return [String]
|
29
|
+
def namespace
|
30
|
+
if @namespace.nil?
|
31
|
+
base = @source.parent_node_from(@offset, :class, :module, :def, :defs)
|
32
|
+
@namespace ||= @source.namespace_for(base)
|
33
|
+
end
|
34
|
+
@namespace
|
35
|
+
end
|
36
|
+
|
37
|
+
# Get the scope at the current offset.
|
38
|
+
#
|
39
|
+
# @return [Symbol] :class or :instance
|
40
|
+
def scope
|
41
|
+
if @scope.nil?
|
42
|
+
@scope = :class
|
43
|
+
tree = @source.tree_at(@offset)
|
44
|
+
until tree.empty?
|
45
|
+
cursor = tree.shift
|
46
|
+
break if cursor.type == :class or cursor.type == :module
|
47
|
+
if cursor.type == :def
|
48
|
+
pin = @source.method_pins.select{|pin| pin.contain?(@offset)}.first
|
49
|
+
# @todo The pin should never be nil here, but we're guarding it just in case
|
50
|
+
@scope = (pin.nil? ? :instance : pin.scope)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
@scope
|
55
|
+
end
|
56
|
+
|
57
|
+
# Get the signature up to the current offset. Given the text `foo.bar`,
|
58
|
+
# the signature at offset 5 is `foo.b`.
|
59
|
+
#
|
60
|
+
# @return [String]
|
61
|
+
def signature
|
62
|
+
@signature ||= signature_data[1]
|
63
|
+
end
|
64
|
+
|
65
|
+
# Get the signature before the current word. Given the signature
|
66
|
+
# `String.new.split`, the base is `String.new`.
|
67
|
+
#
|
68
|
+
# @return [String]
|
69
|
+
def base
|
70
|
+
if @base.nil?
|
71
|
+
if signature.include?('.')
|
72
|
+
if signature.end_with?('.')
|
73
|
+
@base = signature[0..-2]
|
74
|
+
else
|
75
|
+
@base = signature.split('.')[0..-2].join('.')
|
76
|
+
end
|
77
|
+
elsif signature.include?('::')
|
78
|
+
if signature.end_with?('::')
|
79
|
+
@base = signature[0..-3]
|
80
|
+
else
|
81
|
+
@base = signature.split('::')[0..-2].join('::')
|
82
|
+
end
|
83
|
+
else
|
84
|
+
# @base = signature
|
85
|
+
@base = ''
|
86
|
+
end
|
87
|
+
end
|
88
|
+
@base
|
89
|
+
end
|
90
|
+
|
91
|
+
# Get the remainder of the word after the current offset. Given the text
|
92
|
+
# `foobar` with an offset of 3, the remainder is `bar`.
|
93
|
+
#
|
94
|
+
# @return [String]
|
95
|
+
def remainder
|
96
|
+
@remainder ||= remainder_at(@offset)
|
97
|
+
end
|
98
|
+
|
99
|
+
# Get the whole word at the current offset, including the remainder.
|
100
|
+
# Given the text `foobar.baz`, the whole word at any offset from 0 to 6
|
101
|
+
# is `foobar`.
|
102
|
+
#
|
103
|
+
# @return [String]
|
104
|
+
def whole_word
|
105
|
+
@whole_word ||= word + remainder
|
106
|
+
end
|
107
|
+
|
108
|
+
# Get the whole signature at the current offset, including the final
|
109
|
+
# word and its remainder.
|
110
|
+
#
|
111
|
+
# @return [String]
|
112
|
+
def whole_signature
|
113
|
+
@whole_signature ||= signature + remainder
|
114
|
+
end
|
115
|
+
|
116
|
+
# Get the entire phrase up to the current offset. Given the text
|
117
|
+
# `foo[bar].baz()`, the phrase at offset 10 is `foo[bar].b`.
|
118
|
+
#
|
119
|
+
# @return [String]
|
120
|
+
def phrase
|
121
|
+
@phrase ||= @code[signature_data[0]..@offset]
|
122
|
+
end
|
123
|
+
|
124
|
+
# Get the word before the current offset. Given the text `foo.bar`, the
|
125
|
+
# word at offset 6 is `ba`.
|
126
|
+
def word
|
127
|
+
@word ||= word_at(@offset)
|
128
|
+
end
|
129
|
+
|
130
|
+
# True if the current offset is inside a string.
|
131
|
+
#
|
132
|
+
# @return [Boolean]
|
133
|
+
def string?
|
134
|
+
@string = @source.string_at?(@offset) if @string.nil?
|
135
|
+
@string
|
136
|
+
end
|
137
|
+
|
138
|
+
# True if the current offset is inside a comment.
|
139
|
+
#
|
140
|
+
# @return [Boolean]
|
141
|
+
def comment?
|
142
|
+
@comment = get_comment_at(@offset) if @comment.nil?
|
143
|
+
@comment
|
144
|
+
end
|
145
|
+
|
146
|
+
# Get the range of the word up to the current offset.
|
147
|
+
#
|
148
|
+
# @return [Range]
|
149
|
+
def word_range
|
150
|
+
@word_range ||= word_range_at(@offset, false)
|
151
|
+
end
|
152
|
+
|
153
|
+
# Get the range of the whole word at the current offset, including its
|
154
|
+
# remainder.
|
155
|
+
#
|
156
|
+
# @return [Range]
|
157
|
+
def whole_word_range
|
158
|
+
@whole_word_range ||= word_range_at(@offset, true)
|
159
|
+
end
|
160
|
+
|
161
|
+
# Get an array of all the local variables in the source that are visible
|
162
|
+
# from the current offset.
|
163
|
+
#
|
164
|
+
# @return [Array<Solargraph::Pin::LocalVariable>]
|
165
|
+
def local_variable_pins
|
166
|
+
@local_variable_pins ||= @source.local_variable_pins.select{|pin| pin.visible_from?(node)}
|
167
|
+
end
|
168
|
+
|
169
|
+
private
|
170
|
+
|
171
|
+
def signature_data
|
172
|
+
@signature_data ||= get_signature_data_at(@offset)
|
173
|
+
end
|
174
|
+
|
175
|
+
def get_signature_data_at index
|
176
|
+
brackets = 0
|
177
|
+
squares = 0
|
178
|
+
parens = 0
|
179
|
+
signature = ''
|
180
|
+
index -=1
|
181
|
+
in_whitespace = false
|
182
|
+
while index >= 0
|
183
|
+
break if index > 0 and comment?
|
184
|
+
unless !in_whitespace and string?
|
185
|
+
break if brackets > 0 or parens > 0 or squares > 0
|
186
|
+
char = @code[index, 1]
|
187
|
+
if brackets.zero? and parens.zero? and squares.zero? and [' ', "\n", "\t"].include?(char)
|
188
|
+
in_whitespace = true
|
189
|
+
else
|
190
|
+
if brackets.zero? and parens.zero? and squares.zero? and in_whitespace
|
191
|
+
unless char == '.' or @code[index+1..-1].strip.start_with?('.')
|
192
|
+
old = @code[index+1..-1]
|
193
|
+
nxt = @code[index+1..-1].lstrip
|
194
|
+
index += (@code[index+1..-1].length - @code[index+1..-1].lstrip.length)
|
195
|
+
break
|
196
|
+
end
|
197
|
+
end
|
198
|
+
if char == ')'
|
199
|
+
parens -=1
|
200
|
+
elsif char == ']'
|
201
|
+
squares -=1
|
202
|
+
elsif char == '}'
|
203
|
+
brackets -= 1
|
204
|
+
elsif char == '('
|
205
|
+
parens += 1
|
206
|
+
elsif char == '{'
|
207
|
+
brackets += 1
|
208
|
+
elsif char == '['
|
209
|
+
squares += 1
|
210
|
+
signature = ".[]#{signature}" if squares == 0 and @code[index-2] != '%'
|
211
|
+
end
|
212
|
+
if brackets.zero? and parens.zero? and squares.zero?
|
213
|
+
break if ['"', "'", ',', ';', '%'].include?(char)
|
214
|
+
signature = char + signature if char.match(/[a-z0-9:\._@\$]/i) and @code[index - 1] != '%'
|
215
|
+
break if char == '$'
|
216
|
+
if char == '@'
|
217
|
+
signature = "@#{signature}" if @code[index-1, 1] == '@'
|
218
|
+
break
|
219
|
+
end
|
220
|
+
end
|
221
|
+
in_whitespace = false
|
222
|
+
end
|
223
|
+
end
|
224
|
+
index -= 1
|
225
|
+
end
|
226
|
+
if signature.start_with?('.')
|
227
|
+
pn = @source.node_at(index)
|
228
|
+
unless pn.nil?
|
229
|
+
literal = infer_literal_node_type(pn)
|
230
|
+
unless literal.nil?
|
231
|
+
signature = "#{literal}.new#{signature}"
|
232
|
+
# @todo Determine the index from the beginning of the literal node?
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
[index + 1, signature]
|
237
|
+
end
|
238
|
+
|
239
|
+
# Determine if the specified index is inside a comment.
|
240
|
+
#
|
241
|
+
# @return [Boolean]
|
242
|
+
def get_comment_at(index)
|
243
|
+
return false if string?
|
244
|
+
line, col = Solargraph::Source.get_position_at(@source.code, index)
|
245
|
+
@source.comments.each do |c|
|
246
|
+
return true if index > c.location.expression.begin_pos and index <= c.location.expression.end_pos
|
247
|
+
end
|
248
|
+
false
|
249
|
+
end
|
250
|
+
|
251
|
+
# Select the word that directly precedes the specified index.
|
252
|
+
# A word can only consist of letters, numbers, and underscores.
|
253
|
+
#
|
254
|
+
# @param index [Integer]
|
255
|
+
# @return [String]
|
256
|
+
def word_at index
|
257
|
+
@code[beginning_of_word_at(index)..index - 1]
|
258
|
+
end
|
259
|
+
|
260
|
+
def beginning_of_word_at index
|
261
|
+
cursor = index - 1
|
262
|
+
# Words can end with ? or !
|
263
|
+
if @code[cursor, 1] == '!' or @code[cursor, 1] == '?'
|
264
|
+
cursor -= 1
|
265
|
+
end
|
266
|
+
while cursor > -1
|
267
|
+
char = @code[cursor, 1]
|
268
|
+
break if char.nil? or char.strip.empty?
|
269
|
+
break unless char.match(/[a-z0-9_]/i)
|
270
|
+
cursor -= 1
|
271
|
+
end
|
272
|
+
# Words can begin with @@, @, $, or :
|
273
|
+
if cursor > -1
|
274
|
+
if cursor > 0 and @code[cursor - 1, 2] == '@@'
|
275
|
+
cursor -= 2
|
276
|
+
elsif @code[cursor, 1] == '@' or @code[cursor, 1] == '$'
|
277
|
+
cursor -= 1
|
278
|
+
elsif @code[cursor, 1] == ':' and (cursor == 0 or @code[cursor - 1, 2] != '::')
|
279
|
+
cursor -= 1
|
280
|
+
end
|
281
|
+
end
|
282
|
+
cursor + 1
|
283
|
+
end
|
284
|
+
|
285
|
+
# @return Solargraph::Source::Range
|
286
|
+
def word_range_at index, whole
|
287
|
+
cursor = beginning_of_word_at(index)
|
288
|
+
start_offset = cursor
|
289
|
+
start_offset -= 1 if (start_offset > 1 and @code[start_offset - 1] == ':') and (start_offset == 1 or @code[start_offset - 2] != ':')
|
290
|
+
cursor = index
|
291
|
+
if whole
|
292
|
+
while cursor < @code.length
|
293
|
+
char = @code[cursor, 1]
|
294
|
+
break if char.nil? or char == ''
|
295
|
+
break unless char.match(/[a-z0-9_\?\!]/i)
|
296
|
+
cursor += 1
|
297
|
+
end
|
298
|
+
end
|
299
|
+
end_offset = cursor
|
300
|
+
end_offset = start_offset if end_offset < start_offset
|
301
|
+
start_pos = Solargraph::Source.get_position_at(@code, start_offset)
|
302
|
+
end_pos = Solargraph::Source.get_position_at(@code, end_offset)
|
303
|
+
Solargraph::Source::Range.from_to(start_pos[0], start_pos[1], end_pos[0], end_pos[1])
|
304
|
+
end
|
305
|
+
|
306
|
+
def remainder_at index
|
307
|
+
cursor = index
|
308
|
+
while cursor < @code.length
|
309
|
+
char = @code[cursor, 1]
|
310
|
+
break if char.nil? or char == ''
|
311
|
+
break unless char.match(/[a-z0-9_\?\!]/i)
|
312
|
+
cursor += 1
|
313
|
+
end
|
314
|
+
@code[index..cursor-1]
|
315
|
+
end
|
316
|
+
|
317
|
+
end
|
318
|
+
end
|
319
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Solargraph
|
2
|
+
class Source
|
3
|
+
class Position
|
4
|
+
# @return [Integer]
|
5
|
+
attr_reader :line
|
6
|
+
|
7
|
+
# @return [Integer]
|
8
|
+
attr_reader :character
|
9
|
+
|
10
|
+
def initialize line, character
|
11
|
+
@line = line
|
12
|
+
@character = character
|
13
|
+
end
|
14
|
+
|
15
|
+
# Get a hash of the position. This representation is suitable for use in
|
16
|
+
# the language server protocol.
|
17
|
+
#
|
18
|
+
def to_hash
|
19
|
+
{
|
20
|
+
line: line,
|
21
|
+
character: character
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Solargraph
|
2
|
+
class Source
|
3
|
+
class Range
|
4
|
+
# @return [Position]
|
5
|
+
attr_reader :start
|
6
|
+
|
7
|
+
# @return [Position]
|
8
|
+
attr_reader :end
|
9
|
+
|
10
|
+
# @param start [Position]
|
11
|
+
# @param ending [Position]
|
12
|
+
def initialize start, ending
|
13
|
+
@start = start
|
14
|
+
@end = ending
|
15
|
+
end
|
16
|
+
|
17
|
+
# Get a hash of the range. This representation is suitable for use in
|
18
|
+
# the language server protocol.
|
19
|
+
#
|
20
|
+
def to_hash
|
21
|
+
{
|
22
|
+
start: start.to_hash,
|
23
|
+
end: self.end.to_hash
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
# Create a range from a pair of lines and characters.
|
28
|
+
#
|
29
|
+
# @param l1 [Integer] Starting line
|
30
|
+
# @param c1 [Integer] Starting character
|
31
|
+
# @param l2 [Integer] Ending line
|
32
|
+
# @param c2 [Integer] Ending character
|
33
|
+
# @return [Position]
|
34
|
+
def self.from_to l1, c1, l2, c2
|
35
|
+
Range.new(Position.new(l1, c1), Position.new(l2, c2))
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -17,7 +17,28 @@ module Solargraph
|
|
17
17
|
attr_reader :label
|
18
18
|
|
19
19
|
# @return [String]
|
20
|
-
|
20
|
+
def kind
|
21
|
+
case @kind
|
22
|
+
when Solargraph::LanguageServer::CompletionItemKinds::CLASS
|
23
|
+
'Class'
|
24
|
+
when Solargraph::LanguageServer::CompletionItemKinds::CONSTANT
|
25
|
+
'Constant'
|
26
|
+
when Solargraph::LanguageServer::CompletionItemKinds::FIELD
|
27
|
+
'Field'
|
28
|
+
when Solargraph::LanguageServer::CompletionItemKinds::KEYWORD
|
29
|
+
'Keyword'
|
30
|
+
when Solargraph::LanguageServer::CompletionItemKinds::METHOD
|
31
|
+
'Method'
|
32
|
+
when Solargraph::LanguageServer::CompletionItemKinds::MODULE
|
33
|
+
'Module'
|
34
|
+
when Solargraph::LanguageServer::CompletionItemKinds::PROPERTY
|
35
|
+
'Property'
|
36
|
+
when Solargraph::LanguageServer::CompletionItemKinds::VARIABLE
|
37
|
+
'Variable'
|
38
|
+
else
|
39
|
+
nil
|
40
|
+
end
|
41
|
+
end
|
21
42
|
|
22
43
|
# @return [String]
|
23
44
|
attr_reader :insert
|
@@ -37,7 +58,10 @@ module Solargraph
|
|
37
58
|
# @return [YARD::CodeObjects::Base]
|
38
59
|
attr_reader :code_object
|
39
60
|
|
40
|
-
|
61
|
+
# @return [Solargraph::Pin::Base]
|
62
|
+
attr_reader :pin
|
63
|
+
|
64
|
+
def initialize label, kind: KEYWORD, insert: nil, detail: nil, docstring: nil, code_object: nil, location: nil, arguments: [], return_type: nil, path: nil, pin: nil
|
41
65
|
@helper = Server::Helpers.new
|
42
66
|
@label = label.to_s
|
43
67
|
@kind = kind
|
@@ -49,6 +73,7 @@ module Solargraph
|
|
49
73
|
@arguments = arguments
|
50
74
|
@return_type = return_type
|
51
75
|
@path = path
|
76
|
+
@pin = pin
|
52
77
|
end
|
53
78
|
|
54
79
|
# The full path of the suggestion.
|
@@ -124,7 +149,7 @@ module Solargraph
|
|
124
149
|
def as_json args = {}
|
125
150
|
result = {
|
126
151
|
label: @label,
|
127
|
-
kind:
|
152
|
+
kind: kind,
|
128
153
|
insert: @insert,
|
129
154
|
detail: @detail,
|
130
155
|
path: path,
|
@@ -147,7 +172,7 @@ module Solargraph
|
|
147
172
|
# @param pin [Solargraph::Pin::Base]
|
148
173
|
def self.pull pin, return_type = nil
|
149
174
|
return pin if pin.kind_of?(Suggestion)
|
150
|
-
Suggestion.new(pin.name, insert: pin.name.gsub(/=$/, ' = '), kind: pin.kind, docstring: pin.docstring, detail: pin.namespace, arguments: pin.parameters, path: pin.path, return_type: return_type || pin.return_type, location: pin.location)
|
175
|
+
Suggestion.new(pin.name, insert: pin.name.gsub(/=$/, ' = '), kind: pin.kind, docstring: pin.docstring, detail: pin.namespace, arguments: pin.parameters, path: pin.path, return_type: return_type || pin.return_type, location: pin.location, pin: pin)
|
151
176
|
end
|
152
177
|
end
|
153
178
|
end
|