solargraph 0.8.1 → 0.8.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2f72dae250986fdd9e99493e59b943859d84ae1b
4
- data.tar.gz: 0a6844a9338265353973f84e9a2a69775be9d4be
3
+ metadata.gz: e47975025923e6fefaa775875a539c14a8ce263b
4
+ data.tar.gz: 253ceb89deba6b4a3e63a7861a167c7bd24e64eb
5
5
  SHA512:
6
- metadata.gz: 6cff3eafa7608cce8cbd110751c5606beb2ebfadcb767665c244c2574f4a117a34d02522db82fd94288ce630822610b1136c97046dd1104447ccb107c382e1f6
7
- data.tar.gz: a827be7bceaec34da8cae14642a8cde2f8f3da6276a9fc62be405ffc54b24e752d8cbabe7c01dd0c5703ee7fba7c6af305a0523757af338ef46de7a629100c2d
6
+ metadata.gz: b563880f6b352616b38c1accb2d0f07b189e23b25cbcc816c54bf1a3acae1b1e130b0f7f565110008bb4561234ff423bbb553843ffef1aba958164e61dd161a7
7
+ data.tar.gz: c6dbd8e28a73bf8ce205508b87146d6a189b8c216d42a2c72f1c5ce8d32796fb57a52f967278e36a07f89e8f5e3fa108ee6a0cbd048e8df858b9c032347ba19e
@@ -337,6 +337,7 @@ module Solargraph
337
337
  while parts.length > 0 and !type.nil?
338
338
  p = parts.shift
339
339
  if top and scope == :class
340
+ next if p == 'new'
340
341
  first_class = find_fully_qualified_namespace(p, namespace)
341
342
  sub = nil
342
343
  sub = infer_signature_type(parts.join('.'), first_class, scope: :class) unless first_class.nil?
@@ -580,7 +581,7 @@ module Solargraph
580
581
  def mappable?(node)
581
582
  return true if node.kind_of?(AST::Node) and [:array, :hash, :str, :int, :float].include?(node.type)
582
583
  # TODO Add node.type :casgn (constant assignment)
583
- if node.kind_of?(AST::Node) and (node.type == :class or node.type == :module or node.type == :def or node.type == :defs or node.type == :ivasgn or node.type == :gvasgn or node.type == :lvasgn or node.type == :or_asgn or node.type == :const or node.type == :lvar)
584
+ if node.kind_of?(AST::Node) and (node.type == :class or node.type == :module or node.type == :def or node.type == :defs or node.type == :ivasgn or node.type == :gvasgn or node.type == :lvasgn or node.type == :or_asgn or node.type == :const or node.type == :lvar or node.type == :args or node.type == :kwargs)
584
585
  true
585
586
  elsif node.kind_of?(AST::Node) and node.type == :send and node.children[0] == nil and MAPPABLE_METHODS.include?(node.children[1])
586
587
  true
@@ -618,7 +619,7 @@ module Solargraph
618
619
  children += node.children[0, 2]
619
620
  children += get_mappable_nodes(node.children[2..-1], comment_hash)
620
621
  #children += get_mappable_nodes(node.children, comment_hash)
621
- elsif node.type == :const
622
+ elsif node.type == :const or node.type == :args or node.type == :kwargs
622
623
  children += node.children
623
624
  elsif node.type == :def
624
625
  children += node.children[0, 2]
@@ -634,7 +635,10 @@ module Solargraph
634
635
  elsif node.type == :send and node.children[1] == :include
635
636
  children += node.children[0,3]
636
637
  elsif node.type == :send and node.children[1] == :require
637
- @required.push(node.children[2].children[0]) if node.children[2].children[0].kind_of?(String)
638
+ if node.children[2].children[0].kind_of?(String)
639
+ path = node.children[2].children[0].to_s
640
+ @required.push(path) unless local_path?(path)
641
+ end
638
642
  children += node.children[0, 3]
639
643
  elsif node.type == :send and node.children[1] == :autoload
640
644
  @required.push(node.children[3].children[0]) if node.children[3].children[0].kind_of?(String)
@@ -653,6 +657,13 @@ module Solargraph
653
657
  result
654
658
  end
655
659
 
660
+ def local_path? path
661
+ return false if workspace.nil?
662
+ return true if File.exist?(File.join workspace, 'lib', path)
663
+ return true if File.exist?(File.join workspace, 'lib', "#{path}.rb")
664
+ false
665
+ end
666
+
656
667
  def map_parents node, tree = []
657
668
  if node.kind_of?(AST::Node)
658
669
  @parent_stack[node] = tree
@@ -3,9 +3,9 @@ require 'parser/current'
3
3
  module Solargraph
4
4
  class CodeMap
5
5
  attr_accessor :node
6
- attr_accessor :api_map
7
6
  attr_reader :code
8
7
  attr_reader :parsed
8
+ attr_reader :workspace
9
9
 
10
10
  include NodeMethods
11
11
 
@@ -17,49 +17,54 @@ module Solargraph
17
17
  filename = filename.gsub(File::ALT_SEPARATOR, File::SEPARATOR) unless File::ALT_SEPARATOR.nil?
18
18
  workspace = CodeMap.find_workspace(filename)
19
19
  end
20
+ @workspace = workspace
20
21
  @filename = filename
21
22
  @api_map = api_map
22
- if @api_map.nil?
23
- @api_map = ApiMap.new(workspace)
24
- end
25
23
  @code = code.gsub(/\r/, '')
26
24
  tries = 0
27
25
  tmp = @code
28
26
  begin
29
27
  node, comments = Parser::CurrentRuby.parse_with_comments(tmp)
30
- @node = @api_map.append_node(node, comments, filename)
28
+ @node = self.api_map.append_node(node, comments, filename)
31
29
  @parsed = tmp
32
30
  @code.freeze
33
31
  @parsed.freeze
34
32
  rescue Parser::SyntaxError => e
35
33
  if tries < 10
36
- STDERR.puts "Error parsing #{filename}: #{e.message}"
37
- STDERR.puts "Retrying..."
38
34
  tries += 1
39
- spot = e.diagnostic.location.begin_pos
40
- repl = '_'
41
- if tmp[spot] == '@' or tmp[spot] == ':'
42
- # Stub unfinished instance variables and symbols
43
- spot -= 1
44
- elsif tmp[spot - 1] == '.'
45
- # Stub unfinished method calls
46
- repl = '#' if spot == tmp.length or tmp[spot] == '\n'
47
- spot -= 2
35
+ if tries == 10 and e.message.include?('token $end')
36
+ tmp += "\nend"
48
37
  else
49
- # Stub the whole line
50
- spot = beginning_of_line_from(tmp, spot)
51
- repl = '#'
52
- if tmp[spot+1..-1].rstrip == 'end'
53
- repl= 'end;end'
38
+ spot = e.diagnostic.location.begin_pos
39
+ repl = '_'
40
+ if tmp[spot] == '@' or tmp[spot] == ':'
41
+ # Stub unfinished instance variables and symbols
42
+ spot -= 1
43
+ elsif tmp[spot - 1] == '.'
44
+ # Stub unfinished method calls
45
+ repl = '#' if spot == tmp.length or tmp[spot] == '\n'
46
+ spot -= 2
47
+ else
48
+ # Stub the whole line
49
+ spot = beginning_of_line_from(tmp, spot)
50
+ repl = '#'
51
+ if tmp[spot+1..-1].rstrip == 'end'
52
+ repl= 'end;end'
53
+ end
54
54
  end
55
+ tmp = tmp[0..spot] + repl + tmp[spot+repl.length+1..-1].to_s
55
56
  end
56
- tmp = tmp[0..spot] + repl + tmp[spot+repl.length+1..-1].to_s
57
57
  retry
58
58
  end
59
59
  raise e
60
60
  end
61
61
  end
62
62
 
63
+ # @return [Solargraph::ApiMap]
64
+ def api_map
65
+ @api_map ||= ApiMap.new(workspace)
66
+ end
67
+
63
68
  def self.find_workspace filename
64
69
  return nil if filename.nil?
65
70
  dirname = filename
@@ -103,6 +108,9 @@ module Solargraph
103
108
  tree_at(index).first
104
109
  end
105
110
 
111
+ # Determine if the specified index is inside a string.
112
+ #
113
+ # @return [Boolean]
106
114
  def string_at?(index)
107
115
  n = node_at(index)
108
116
  n.kind_of?(AST::Node) and n.type == :str
@@ -132,6 +140,14 @@ module Solargraph
132
140
  parts.join("::")
133
141
  end
134
142
 
143
+ def namespace_from(node)
144
+ if node.respond_to?(:loc)
145
+ namespace_at(node.loc.expression.begin_pos)
146
+ else
147
+ namespace_at(0)
148
+ end
149
+ end
150
+
135
151
  def phrase_at index
136
152
  word = ''
137
153
  cursor = index - 1
@@ -161,50 +177,44 @@ module Solargraph
161
177
  def get_instance_variables_at(index)
162
178
  node = parent_node_from(index, :def, :defs, :class, :module)
163
179
  ns = namespace_at(index) || ''
164
- @api_map.get_instance_variables(ns, (node.type == :def ? :instance : :class))
180
+ api_map.get_instance_variables(ns, (node.type == :def ? :instance : :class))
165
181
  end
166
182
 
167
183
  def suggest_at index, filtered: false, with_snippets: false
168
- node = node_at(index - 2)
169
184
  return [] if string_at?(index)
170
185
  result = []
171
186
  phrase = phrase_at(index)
172
187
  signature = get_signature_at(index)
173
- if (@code[index - 1] == '.')
188
+ namespace = namespace_at(index)
189
+ if signature.include?('.')
190
+ # Check for literals first
174
191
  type = infer(node_at(index - 2))
175
- return @api_map.get_instance_methods(type) unless type.nil?
176
- end
177
- if signature.start_with?('@')
178
- parts = signature.split('.')
179
- var = parts.shift
180
- if parts.length > 0 or signature.end_with?('.')
181
- result = []
182
- ns = namespace_at(index)
183
- scope = :class
184
- node = parent_node_from(index, :def, :defs, :class, :module)
185
- scope = :instance if !node.nil? and node.type == :def
186
- obj = @api_map.infer_instance_variable(var, ns, scope)
187
- type = @api_map.infer_signature_type(parts.join('.'), obj, scope: :instance)
188
- result = @api_map.get_instance_methods(type) unless type.nil?
192
+ if type.nil?
193
+ nearest = @code[0, index].rindex('.')
194
+ revised = signature[0..nearest-index-1]
195
+ type = infer_signature_at(nearest) unless revised.empty?
196
+ if !type.nil?
197
+ result.concat api_map.get_instance_methods(type) unless type.nil?
198
+ elsif !revised.include?('.')
199
+ fqns = api_map.find_fully_qualified_namespace(revised, namespace)
200
+ result.concat api_map.get_methods(fqns) unless fqns.nil?
201
+ end
189
202
  else
190
- result = get_instance_variables_at(index)
203
+ result.concat api_map.get_instance_methods(type)
191
204
  end
205
+ elsif signature.start_with?('@')
206
+ result.concat get_instance_variables_at(index)
192
207
  elsif phrase.start_with?('$')
193
- result += @api_map.get_global_variables
194
- elsif phrase.start_with?(':') and !phrase.start_with?('::')
195
- # TODO: It's a symbol. Nothing to do for now.
196
- return []
208
+ result.concat api_map.get_global_variables
197
209
  elsif phrase.include?('::')
198
210
  parts = phrase.split('::', -1)
199
211
  ns = parts[0..-2].join('::')
200
212
  if parts.last.include?('.')
201
213
  ns = parts[0..-2].join('::') + '::' + parts.last[0..parts.last.index('.')-1]
202
- result = @api_map.get_methods(ns)
214
+ result = api_map.get_methods(ns)
203
215
  else
204
- result = @api_map.namespaces_in(ns)
216
+ result = api_map.namespaces_in(ns)
205
217
  end
206
- elsif signature.include?('.')
207
- result = resolve_signature_at @code[0, index].rindex('.')
208
218
  else
209
219
  current_namespace = namespace_at(index)
210
220
  parts = current_namespace.to_s.split('::')
@@ -213,17 +223,17 @@ module Solargraph
213
223
  result += ApiMap.get_keywords
214
224
  while parts.length > 0
215
225
  ns = parts.join('::')
216
- result += @api_map.namespaces_in(ns)
226
+ result += api_map.namespaces_in(ns)
217
227
  parts.pop
218
228
  end
219
- result += @api_map.namespaces_in('')
220
- result += @api_map.get_instance_methods('Kernel')
221
- unless @filename.nil? or @api_map.yardoc_has_file?(@filename)
222
- m = @code.match(/# +@bind \[([a-z0-9_:]*)/i)
223
- unless m.nil?
224
- @api_map.get_instance_methods(m[1])
225
- end
226
- end
229
+ result += api_map.namespaces_in('')
230
+ result += api_map.get_instance_methods('Kernel')
231
+ #unless @filename.nil? or @api_map.yardoc_has_file?(@filename)
232
+ # m = @code.match(/# +@bind \[([a-z0-9_:]*)/i)
233
+ # unless m.nil?
234
+ # @api_map.get_instance_methods(m[1])
235
+ # end
236
+ #end
227
237
  end
228
238
  result = reduce_starting_with(result, word_at(index)) if filtered
229
239
  result.uniq{|s| s.path}
@@ -237,6 +247,7 @@ module Solargraph
237
247
  end
238
248
 
239
249
  def resolve_object_at index
250
+ return [] if string_at?(index)
240
251
  signature = get_signature_at(index)
241
252
  cursor = index
242
253
  while @code[cursor] =~ /[a-z0-9_\?]/i
@@ -245,149 +256,117 @@ module Solargraph
245
256
  break if cursor >= @code.length
246
257
  end
247
258
  return [] if signature.to_s == ''
259
+ path = nil
248
260
  ns_here = namespace_at(index)
249
- scope = parent_node_from(index, :class, :module, :def, :defs) || @node
261
+ node = parent_node_from(index, :class, :module, :def, :defs) || @node
250
262
  parts = signature.split('.')
251
263
  if parts.length > 1
252
264
  beginner = parts[0..-2].join('.')
265
+ type = infer_signature_from_node(beginner, node)
253
266
  ender = parts.last
267
+ path = "#{type}##{ender}"
254
268
  else
255
- beginner = signature
256
- ender = nil
257
- end
258
- var = find_local_variable_node(parts[0], scope)
259
- if var.nil?
260
- # It's not a local variable
261
- fqns = @api_map.find_fully_qualified_namespace(beginner, ns_here)
262
- if fqns.nil?
263
- # It's a method call
264
- if ender.nil?
265
- return @api_map.yard_map.objects(beginner, ns_here)
266
- else
267
- sig_scope = (scope.type == :def ? :instance : :class)
268
- type = @api_map.infer_signature_type(beginner, ns_here, scope: sig_scope)
269
- return [] if type.nil?
270
- path = type
271
- path += "##{ender}" unless ender.nil?
272
- return @api_map.yard_map.objects(path, ns_here)
273
- end
269
+ if local_variable_in_node?(signature, node)
270
+ path = infer_signature_from_node(signature, node)
271
+ elsif signature.start_with?('@')
272
+ path = api_map.infer_instance_variable(signature, ns_here, (node.type == :def ? :instance : :class))
274
273
  else
275
- path = beginner
276
- path += "##{ender}" unless ender.nil?
277
- return @api_map.yard_map.objects(path, ns_here)
274
+ path = signature
278
275
  end
279
- else
280
- # It's a local variable. Get the type from the node
281
- type = get_type_comment(var)
282
- type = infer(var.children[1]) if type.nil?
283
- if type.nil?
284
- vsig = resolve_node_signature(var.children[1])
285
- vparts = vsig.split('.')
286
- fqns = @api_map.find_fully_qualified_namespace(vparts[0], ns_here)
287
- if fqns.nil?
288
- vtype = @api_map.infer_signature_type(vsig, ns_here, scope: :instance)
289
- else
290
- vtype = @api_map.infer_signature_type(vparts[1..-1].join('.'), fqns, scope: :class)
291
- end
292
- return [] if vtype.nil?
293
- fqns = @api_map.find_fully_qualified_namespace(vtype, ns_here)
294
- if ender.nil?
295
- signature = parts[1..-1].join('.')
296
- else
297
- signature = parts[1..-2].join('.')
298
- end
299
- type = @api_map.infer_signature_type(signature, fqns, scope: :instance)
300
- end
301
- unless type.nil?
302
- path = type
303
- path += "##{ender}" unless ender.nil?
304
- return @api_map.yard_map.objects(path, ns_here)
276
+ if path.nil?
277
+ path = api_map.find_fully_qualified_namespace(signature, ns_here)
305
278
  end
306
279
  end
307
- return []
280
+ return [] if path.nil?
281
+ return api_map.yard_map.objects(path, ns_here)
308
282
  end
309
283
 
310
- # Find the signature at the specified index and get suggestions based
311
- # on its inferred type.
312
- #
313
- # @return [Array<Solargraph::Suggestion>]
314
- def resolve_signature_at index
315
- result = []
284
+ def infer_signature_at index
316
285
  signature = get_signature_at(index)
317
- ns_here = namespace_at(index)
318
- scope = parent_node_from(index, :class, :module, :def, :defs) || @node
286
+ node = parent_node_from(index, :class, :module, :def, :defs) || @node
287
+ infer_signature_from_node signature, node
288
+ end
289
+
290
+ def local_variable_in_node?(name, node)
291
+ return true unless find_local_variable_node(name, node).nil?
292
+ if node.type == :def or node.type == :defs
293
+ args = get_method_arguments_from(node).keep_if{|a| a.label == name}
294
+ return true unless args.empty?
295
+ end
296
+ false
297
+ end
298
+
299
+ def infer_signature_from_node signature, node
300
+ inferred = nil
319
301
  parts = signature.split('.')
320
- var = find_local_variable_node(parts[0], scope)
302
+ ns_here = namespace_from(node)
303
+ start = parts[0]
304
+ remainder = parts[1..-1]
305
+ scope = :instance
306
+ var = find_local_variable_node(start, node)
321
307
  if var.nil?
322
- # It's not a local variable
323
- fqns = @api_map.find_fully_qualified_namespace(signature, ns_here)
324
- if fqns.nil?
325
- # It's a method call
326
- sig_scope = (scope.type == :def ? :instance : :class)
327
- type = @api_map.infer_signature_type(signature, ns_here, scope: sig_scope)
328
- result.concat @api_map.get_instance_methods(type) unless type.nil?
308
+ if start.start_with?('@')
309
+ type = api_map.infer_instance_variable(start, ns_here, (node.type == :def ? :instance : :class))
329
310
  else
330
- if fqns == ns_here
331
- result.concat @api_map.get_methods(fqns, '', visibility: [:private, :protected, :public])
311
+ if node.type == :def or node.type == :defs
312
+ args = get_method_arguments_from(node).keep_if{|a| a.label == start}
313
+ if args.empty?
314
+ scope = :class
315
+ type = api_map.find_fully_qualified_namespace(start, ns_here)
316
+ if type.nil?
317
+ # It's a method call
318
+ sig_scope = (node.type == :def ? :instance : :class)
319
+ type = api_map.infer_signature_type(start, ns_here, scope: sig_scope)
320
+ else
321
+ return nil if remainder.empty?
322
+ end
323
+ else
324
+ cmnt = api_map.get_comment_for(node)
325
+ params = cmnt.tags(:param)
326
+ params.each do |p|
327
+ if p.name == args[0].label
328
+ type = p.types[0]
329
+ break
330
+ end
331
+ end
332
+ end
332
333
  else
333
- result.concat @api_map.get_methods(fqns)
334
+ scope = :class
335
+ type = api_map.find_fully_qualified_namespace(start, ns_here)
336
+ if type.nil?
337
+ # It's a method call
338
+ sig_scope = (node.type == :def ? :instance : :class)
339
+ type = api_map.infer_signature_type(start, ns_here, scope: sig_scope)
340
+ else
341
+ return nil if remainder.empty?
342
+ end
334
343
  end
335
344
  end
336
345
  else
337
- # It's a local variable. Get the type from the node
346
+ # Signature starts with a local variable
338
347
  type = get_type_comment(var)
339
348
  type = infer(var.children[1]) if type.nil?
340
- skipdat = false
341
349
  if type.nil?
342
350
  vsig = resolve_node_signature(var.children[1])
343
- vparts = vsig.split('.')
344
- fqns = @api_map.find_fully_qualified_namespace(vparts[0], ns_here)
345
- if fqns.nil?
346
- lvar = find_local_variable_node(vparts[0], scope)
347
- if lvar.nil?
348
- vtype = @api_map.infer_signature_type(vsig, ns_here, scope: :instance)
349
- else
350
- type = get_type_comment(lvar)
351
- type = infer(lvar.children[1]) if type.nil?
352
- if type.nil?
353
- type = @api_map.infer_signature_type(resolve_node_signature(lvar.children[1]), ns_here, scope: :class)
354
- end
355
- unless type.nil?
356
- signature = "#{vparts[1..-1].join('.')}"
357
- skipdat = true
358
- end
359
- end
360
- else
361
- vtype = @api_map.infer_signature_type(vparts[1..-1].join('.'), fqns, scope: :class)
362
- type = fqns
363
- signature = parts[1..-1].join('.')
364
- skipdat = true
365
- end
366
- unless skipdat
367
- fqns = @api_map.find_fully_qualified_namespace(vtype, ns_here)
368
- signature = parts[1..-1].join('.')
369
- type = @api_map.infer_signature_type(signature, fqns, scope: :instance)
370
- end
371
- else
372
- signature = signature.split('.')[1..-1].join('.')
373
- end
374
- unless type.nil?
375
- lparts = signature.split('.')
376
- if lparts.length >= 1
377
- lsig = signature
378
- ltype = @api_map.infer_signature_type(lsig, type, scope: :instance)
379
- result.concat @api_map.get_instance_methods(ltype) unless ltype.nil?
380
- else
381
- result.concat @api_map.get_instance_methods(type)
382
- end
351
+ type = infer_signature_from_node vsig, node
383
352
  end
384
353
  end
354
+ unless type.nil?
355
+ inferred = api_map.infer_signature_type(remainder.join('.'), type, scope: scope)
356
+ end
357
+ inferred
358
+ end
359
+
360
+ def suggest_for_signature_at index
361
+ result = []
362
+ type = infer_signature_at(index)
363
+ result.concat api_map.get_instance_methods(type) unless type.nil?
385
364
  result
386
365
  end
387
366
 
388
367
  def get_type_comment node
389
368
  obj = nil
390
- cmnt = @api_map.get_comment_for(node)
369
+ cmnt = api_map.get_comment_for(node)
391
370
  unless cmnt.nil?
392
371
  tag = cmnt.tag(:type)
393
372
  obj = tag.types[0] unless tag.nil? or tag.types.empty?
@@ -463,16 +442,29 @@ module Solargraph
463
442
  result += get_local_variables_from(local)
464
443
  scope = namespace_at(index) || @node
465
444
  if local.type == :def
466
- result += @api_map.get_instance_methods(scope, visibility: [:public, :private, :protected])
445
+ result += api_map.get_instance_methods(scope, visibility: [:public, :private, :protected])
467
446
  else
468
- result += @api_map.get_methods(scope, visibility: [:public, :private, :protected])
447
+ result += api_map.get_methods(scope, visibility: [:public, :private, :protected])
469
448
  end
470
- result += @api_map.get_methods('Kernel')
449
+ if local.type == :def or local.type == :defs
450
+ result += get_method_arguments_from local
451
+ end
452
+ result += api_map.get_methods('Kernel')
471
453
  result
472
454
  end
473
455
 
474
456
  private
475
457
 
458
+ def get_method_arguments_from node
459
+ result = []
460
+ args = node.children[1]
461
+ args.children.each do |arg|
462
+ name = arg.children[0].to_s
463
+ result.push Suggestion.new(name, kind: Suggestion::VARIABLE, insert: name)
464
+ end
465
+ result
466
+ end
467
+
476
468
  def reduce_starting_with(suggestions, word)
477
469
  suggestions.reject { |s|
478
470
  !s.label.start_with?(word)
@@ -485,7 +477,7 @@ module Solargraph
485
477
  node.children.each { |c|
486
478
  if c.kind_of?(AST::Node)
487
479
  if c.type == :lvasgn
488
- arr.push Suggestion.new(c.children[0], kind: Suggestion::VARIABLE, documentation: @api_map.get_comment_for(c))
480
+ arr.push Suggestion.new(c.children[0], kind: Suggestion::VARIABLE, documentation: api_map.get_comment_for(c))
489
481
  else
490
482
  arr += get_local_variables_from(c) unless [:class, :module, :def, :defs].include?(c.type)
491
483
  end
@@ -35,7 +35,7 @@ module Solargraph
35
35
  if code_object.nil?
36
36
  unless documentation.nil?
37
37
  match = documentation.all.match(/@return \[([a-z0-9:_]*)/i)
38
- return match[1]
38
+ return match[1] unless match.nil?
39
39
  end
40
40
  else
41
41
  o = code_object.tag(:overload)
@@ -1,3 +1,3 @@
1
1
  module Solargraph
2
- VERSION = '0.8.1'
2
+ VERSION = '0.8.2'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solargraph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fred Snyder
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-31 00:00:00.000000000 Z
11
+ date: 2017-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser