solargraph 0.14.3 → 0.15.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9b19cc5d128d5ad59344c60240530466594888a3
4
- data.tar.gz: db5e6a4c0f05e070c1b14d1c22d6ae32f1ac61e6
3
+ metadata.gz: a4f454b9e7f567d76ddc0b8902986eedbaa954be
4
+ data.tar.gz: 6c6717978be4f958dce42035ba8640cf332c9fe2
5
5
  SHA512:
6
- metadata.gz: 12d90c3ac837e6a3669e91dbdcc3101edfac58010f1dde7471caf7f6808529c64fbfcb31cf28859e6f11d52b91040cbd4929124295016e999a03627f6e2295af
7
- data.tar.gz: 3fe26bbd2699603487702b765734ae63df345d4afced95b1139e7bafdb2eef419fcd19e1778268b91b84193ea30da0b96ef609aabcb95a26abce46545f8e4e34
6
+ metadata.gz: 5db48477da0eb98a11a52b9f456d6bb693a79eb8efda1689b2b7cb1402c1011a84d099f4c29ffb6c35489a1937ed54da074ba2c07f198919f0534b06f555ed7f
7
+ data.tar.gz: 512f69ecf4dcd355e55cb5a5a9f44aa9af792273f3fb99e0fcf17944b0b7006bb338e4560795ca4cf33a0526b29c06b60ad8a0fd740ded92c906499dd371d8ed
@@ -20,24 +20,4 @@ module Solargraph
20
20
  YARD_EXTENSION_FILE = File.join(File.realpath(File.dirname(__FILE__)), 'yard-solargraph.rb')
21
21
  end
22
22
 
23
- # Make sure the core and stdlib documentation is available
24
- cache_dir = File.join(Dir.home, '.solargraph', 'cache')
25
- version_dir = File.join(cache_dir, '2.0.0')
26
- unless File.exist?(version_dir)
27
- FileUtils.mkdir_p cache_dir
28
- FileUtils.cp File.join(Solargraph::YARDOC_PATH, '2.0.0.tar.gz'), cache_dir
29
- tar_extract = Gem::Package::TarReader.new(Zlib::GzipReader.open(File.join(cache_dir, '2.0.0.tar.gz')))
30
- tar_extract.rewind
31
- tar_extract.each do |entry|
32
- if entry.directory?
33
- FileUtils.mkdir_p File.join(cache_dir, entry.full_name)
34
- else
35
- FileUtils.mkdir_p File.join(cache_dir, File.dirname(entry.full_name))
36
- File.open(File.join(cache_dir, entry.full_name), 'wb') do |f|
37
- f << entry.read
38
- end
39
- end
40
- end
41
- tar_extract.close
42
- #FileUtils.rm File.join(cache_dir, '2.0.0.tar.gz')
43
- end
23
+ Solargraph::YardMap::CoreDocs.require_minimum
@@ -4,10 +4,10 @@ require 'thread'
4
4
 
5
5
  module Solargraph
6
6
  class ApiMap
7
- autoload :Config, 'solargraph/api_map/config'
8
- autoload :Source, 'solargraph/api_map/source'
9
- autoload :Cache, 'solargraph/api_map/cache'
10
-
7
+ autoload :Config, 'solargraph/api_map/config'
8
+ autoload :Source, 'solargraph/api_map/source'
9
+ autoload :Cache, 'solargraph/api_map/cache'
10
+ autoload :SourceToYard, 'solargraph/api_map/source_to_yard'
11
11
  @@source_cache = {}
12
12
 
13
13
  KEYWORDS = [
@@ -23,6 +23,7 @@ module Solargraph
23
23
  ].freeze
24
24
 
25
25
  include NodeMethods
26
+ include Solargraph::ApiMap::SourceToYard
26
27
 
27
28
  # The root directory of the project. The ApiMap will search here for
28
29
  # additional files to parse and analyze.
@@ -40,7 +41,7 @@ module Solargraph
40
41
  workspace_files.each do |wf|
41
42
  begin
42
43
  @@source_cache[wf] ||= Source.load(wf)
43
- rescue Exception => e
44
+ rescue Parser::SyntaxError => e
44
45
  STDERR.puts "Failed to load #{wf}: #{e.message}"
45
46
  end
46
47
  end
@@ -49,6 +50,7 @@ module Solargraph
49
50
  @virtual_source = nil
50
51
  @virtual_filename = nil
51
52
  @stale = true
53
+ @yard_stale = true
52
54
  refresh
53
55
  yard_map
54
56
  end
@@ -333,6 +335,14 @@ module Solargraph
333
335
  suggest_unique_variables globals
334
336
  end
335
337
 
338
+ def get_global_variable_pins
339
+ globals = []
340
+ @sources.values.each do |s|
341
+ globals.concat s.global_variable_pins
342
+ end
343
+ globals
344
+ end
345
+
336
346
  # @return [String]
337
347
  def infer_assignment_node_type node, namespace
338
348
  type = cache.get_assignment_node_type(node, namespace)
@@ -369,6 +379,13 @@ module Solargraph
369
379
  return cache.get_signature_type(signature, namespace, scope)
370
380
  end
371
381
  return nil if signature.nil? or signature.empty?
382
+ if !signature.include?('.')
383
+ fqns = find_fully_qualified_namespace(signature, namespace)
384
+ unless fqns.nil? or fqns.empty?
385
+ type = (get_namespace_type(fqns) == :class ? 'Class' : 'Module')
386
+ return "#{type}<#{fqns}>"
387
+ end
388
+ end
372
389
  result = nil
373
390
  if namespace.end_with?('#class')
374
391
  result = infer_signature_type signature, namespace[0..-7], scope: (scope == :class ? :instance : :class)
@@ -439,7 +456,7 @@ module Solargraph
439
456
  if type == :class
440
457
  meths.concat yard_map.get_instance_methods('Class')
441
458
  else
442
- meths.concat yard_map.get_methods('Module')
459
+ meths.concat yard_map.get_instance_methods('Module')
443
460
  end
444
461
  end
445
462
  news = meths.select{|s| s.label == 'new'}
@@ -474,6 +491,8 @@ module Solargraph
474
491
  namespace = clean_namespace_string(namespace)
475
492
  if namespace.end_with?('#class')
476
493
  return get_methods(namespace.split('#').first, root, visibility: visibility)
494
+ elsif namespace.end_with?('#module')
495
+ return get_methods(namespace.split('#').first, root, visibility: visibility)
477
496
  end
478
497
  meths = []
479
498
  meths += inner_get_instance_methods(namespace, root, [], visibility) #unless has_yardoc?
@@ -489,6 +508,11 @@ module Solargraph
489
508
  meths += yard_map.get_instance_methods('Module')
490
509
  end
491
510
  end
511
+ if namespace == '' and root == ''
512
+ config.domains.each do |d|
513
+ meths.concat get_instance_methods(d)
514
+ end
515
+ end
492
516
  strings = meths.map(&:to_s)
493
517
  live_map.get_methods(namespace, root, 'instance', visibility.include?(:private)).each do |m|
494
518
  next if strings.include?(m) or !m.match(/^[a-z]/i)
@@ -513,6 +537,10 @@ module Solargraph
513
537
  def update filename
514
538
  filename.gsub!(/\\/, '/')
515
539
  if filename.end_with?('.rb')
540
+ if @virtual_filename == filename
541
+ @virtual_filename = nil
542
+ @virtual_source = nil
543
+ end
516
544
  if @workspace_files.include?(filename)
517
545
  eliminate filename
518
546
  @@source_cache[filename] = Source.load(filename)
@@ -556,6 +584,30 @@ module Solargraph
556
584
  result
557
585
  end
558
586
 
587
+ def search query
588
+ refresh
589
+ rake_yard(@sources.values) if @yard_stale
590
+ @yard_stale = false
591
+ found = []
592
+ code_object_paths.each do |k|
593
+ if found.empty? or (query.include?('.') or query.include?('#')) or !(k.include?('.') or k.include?('#'))
594
+ found.push k if k.downcase.include?(query.downcase)
595
+ end
596
+ end
597
+ found.concat(yard_map.search(query)).uniq.sort
598
+ end
599
+
600
+ # @return [Array<YARD::CodeObject::Base>]
601
+ def document path
602
+ refresh
603
+ rake_yard(@sources.values) if @yard_stale
604
+ @yard_stale = false
605
+ docs = []
606
+ docs.push code_object_at(path) unless code_object_at(path).nil?
607
+ docs.concat yard_map.document(path)
608
+ docs
609
+ end
610
+
559
611
  private
560
612
 
561
613
  # @return [Hash]
@@ -599,6 +651,7 @@ module Solargraph
599
651
  @required.uniq!
600
652
  live_map.refresh
601
653
  @stale = false
654
+ @yard_stale = true
602
655
  end
603
656
 
604
657
  def rebuild_local_yardoc
@@ -707,13 +760,9 @@ module Solargraph
707
760
  if visibility.include?(:public) or visibility.include?(:protected)
708
761
  sc = @superclasses[fqns]
709
762
  unless sc.nil?
710
- meths.concat inner_get_methods(sc, fqns, skip, visibility - [:private])
711
- meths.concat yard_map.get_methods(sc, fqns, visibility: visibility - [:private])
712
- strings = meths.map(&:to_s)
713
- live_map.get_methods(sc, fqns, 'class', false).each do |m|
714
- next if strings.include?(m) or !m.match(/^[a-z]/i)
715
- meths.push Suggestion.new(m, kind: Suggestion::METHOD, docstring: YARD::Docstring.new('(defined at runtime)'), path: "#{fqns}##{m}")
716
- end
763
+ sc_visi = [:public]
764
+ sc_visi.push :protected if root == fqns
765
+ meths.concat get_methods(sc, fqns, visibility: sc_visi)
717
766
  end
718
767
  end
719
768
  meths.uniq
@@ -739,13 +788,9 @@ module Solargraph
739
788
  if visibility.include?(:public) or visibility.include?(:protected)
740
789
  sc = @superclasses[fqns]
741
790
  unless sc.nil?
742
- meths.concat inner_get_instance_methods(sc, fqns, skip, visibility - [:private])
743
- meths.concat yard_map.get_instance_methods(sc, fqns, visibility: visibility - [:private])
744
- strings = meths.map(&:to_s)
745
- live_map.get_methods(sc, fqns, 'instance', false).each do |m|
746
- next if strings.include?(m) or !m.match(/^[a-z]/i)
747
- meths.push Suggestion.new(m, kind: Suggestion::METHOD, docstring: YARD::Docstring.new('(defined at runtime)'))
748
- end
791
+ sc_visi = [:public]
792
+ sc_visi.push :protected if sc == fqns
793
+ meths.concat get_instance_methods(sc, fqns, visibility: sc_visi)
749
794
  end
750
795
  end
751
796
  im = @namespace_includes[fqns]
@@ -768,9 +813,12 @@ module Solargraph
768
813
  signature.gsub!(/\.$/, '')
769
814
  if signature.empty?
770
815
  if scope == :class
771
- return "Class<#{namespace}>"
772
- else
773
- return "#{namespace}"
816
+ type = get_namespace_type(namespace)
817
+ if type == :class
818
+ return "Class<#{namespace}>"
819
+ else
820
+ return "Module<#{namespace}>"
821
+ end
774
822
  end
775
823
  end
776
824
  parts = signature.split('.')
@@ -846,6 +894,9 @@ module Solargraph
846
894
  if result == 'Class' and namespace.include?('<')
847
895
  subtype = namespace.match(/<([a-z0-9:_]*)/i)[1]
848
896
  result = "#{subtype}#class"
897
+ elsif result == 'Module' and namespace.include?('<')
898
+ subtype = namespace.match(/<([a-z0-9:_]*)/i)[1]
899
+ result = "#{subtype}#module"
849
900
  end
850
901
  result
851
902
  end
@@ -32,6 +32,7 @@ module Solargraph
32
32
  @raw_data['exclude'] ||= exclude_globs
33
33
  @raw_data['domains'] ||= []
34
34
  @raw_data['required'] ||= []
35
+ @raw_data['plugins'] ||= []
35
36
  end
36
37
 
37
38
  # An array of files included in the workspace (before calculating excluded files).
@@ -66,6 +67,10 @@ module Solargraph
66
67
  raw_data['required']
67
68
  end
68
69
 
70
+ def plugins
71
+ raw_data['plugins']
72
+ end
73
+
69
74
  private
70
75
 
71
76
  def process_globs globs
@@ -15,9 +15,12 @@ module Solargraph
15
15
  # @return [String]
16
16
  attr_reader :filename
17
17
 
18
+ # @return [Array<Integer>]
19
+ attr_reader :stubbed_lines
20
+
18
21
  include NodeMethods
19
22
 
20
- def initialize code, node, comments, filename
23
+ def initialize code, node, comments, filename, stubbed_lines = []
21
24
  @code = code
22
25
  root = AST::Node.new(:source, [filename])
23
26
  root = root.append node
@@ -30,6 +33,7 @@ module Solargraph
30
33
  @all_nodes = []
31
34
  @node_stack = []
32
35
  @node_tree = {}
36
+ @stubbed_lines = stubbed_lines
33
37
  inner_map_node @node
34
38
  @directives.each_pair do |k, v|
35
39
  v.each do |d|
@@ -324,67 +328,62 @@ module Solargraph
324
328
  Source.new(code, node, comments, filename)
325
329
  end
326
330
 
327
- # @return [Solargraph::ApiMap::Source]
328
- def fix code, filename = nil, cursor = nil
331
+ def get_position_at(code, offset)
332
+ cursor = 0
333
+ line = 0
334
+ col = nil
335
+ code.each_line do |l|
336
+ if cursor + l.length >= offset
337
+ col = offset - cursor
338
+ break
339
+ end
340
+ cursor += l.length
341
+ line += 1
342
+ end
343
+ raise "Invalid offset" if col.nil?
344
+ [line, col]
345
+ end
346
+
347
+ def fix code, filename = nil, offset = nil
329
348
  tries = 0
330
349
  code.gsub!(/\r/, '')
350
+ offset = CodeMap.get_offset(code, offset[0], offset[1]) if offset.kind_of?(Array)
351
+ pos = nil
352
+ pos = get_position_at(code, offset) unless offset.nil?
353
+ stubs = []
354
+ fixed_position = false
331
355
  tmp = code
332
- cursor = CodeMap.get_offset(code, cursor[0], cursor[1]) if cursor.kind_of?(Array)
333
- fixed_cursor = false
334
356
  begin
335
- # HACK: The current file is parsed with a trailing underscore to fix
336
- # incomplete trees resulting from short scripts (e.g., an unfinished
337
- # variable assignment).
338
- node, comments = Parser::CurrentRuby.parse_with_comments(tmp + "\n_")
339
- Source.new(code, node, comments, filename)
357
+ node, comments = Parser::CurrentRuby.parse_with_comments(tmp)
358
+ Source.new(code, node, comments, filename, stubs)
340
359
  rescue Parser::SyntaxError => e
341
360
  if tries < 10
342
361
  tries += 1
343
- if tries == 10 and e.message.include?('token $end')
362
+ # Stub periods before the offset to retain the expected node tree
363
+ if !offset.nil? and tmp[offset-1] == '.'
364
+ tmp = tmp[0, offset-1] + '_' + tmp[offset..-1]
365
+ elsif !fixed_position and !offset.nil?
366
+ fixed_position = true
367
+ beg = beginning_of_line_from(tmp, offset)
368
+ tmp = tmp[0, beg] + '#' + tmp[beg+1..-1]
369
+ stubs.push(pos[0])
370
+ elsif e.message.include?('token $end')
344
371
  tmp += "\nend"
345
- else
346
- if !fixed_cursor and !cursor.nil? and cursor >= 2 and (e.message.include?('token $end') or tmp[cursor - 1] == '$')
347
- fixed_cursor = true
348
- spot = cursor - 2
349
- if tmp[cursor - 1] == '.' or tmp[cursor - 1] == '$'
350
- repl = ';'
351
- else
352
- repl = '#'
353
- end
354
- else
355
- spot = e.diagnostic.location.begin_pos
356
- repl = '_'
357
- if tmp[spot] == '@' or tmp[spot] == ':'
358
- # Stub unfinished instance variables and symbols
359
- spot -= 1
360
- elsif tmp[spot - 1] == '.'
361
- # Stub unfinished method calls
362
- repl = '#' if spot == tmp.length or tmp[spot] == '\n'
363
- spot -= 2
364
- else
365
- # Stub the whole line
366
- spot = beginning_of_line_from(tmp, spot)
367
- repl = '#'
368
- if tmp[spot+1..-1].rstrip == 'end'
369
- repl= 'end;end'
370
- end
371
- end
372
- end
373
- tmp = tmp[0..spot] + repl + tmp[spot+repl.length+1..-1].to_s
372
+ elsif e.message.include?("unexpected `@'")
373
+ tmp = tmp[0, e.diagnostic.location.begin_pos] + '_' + tmp[e.diagnostic.location.begin_pos+1..-1]
374
374
  end
375
375
  retry
376
376
  end
377
- raise e
377
+ STDERR.puts "Unable to parse code: #{e.message}"
378
+ virt = Source.virtual('', filename)
379
+ Source.new(code, virt.node, virt.comments, filename)
378
380
  end
379
381
  end
380
382
 
381
383
  def beginning_of_line_from str, i
382
- while i > 0 and str[i] != "\n"
384
+ while i > 0 and str[i-1] != "\n"
383
385
  i -= 1
384
386
  end
385
- if i > 0 and str[i..-1].strip == ''
386
- i = beginning_of_line_from str, i -1
387
- end
388
387
  i
389
388
  end
390
389
  end
@@ -0,0 +1,66 @@
1
+ module Solargraph
2
+ class ApiMap
3
+ module SourceToYard
4
+
5
+ # Get the YARD CodeObject at the specified path.
6
+ #
7
+ # @return [YARD::CodeObjects::Base]
8
+ def code_object_at path
9
+ code_object_map[path]
10
+ end
11
+
12
+ def code_object_paths
13
+ code_object_map.keys
14
+ end
15
+
16
+ private
17
+
18
+ def code_object_map
19
+ @code_object_map ||= {}
20
+ end
21
+
22
+ def rake_yard sources
23
+ code_object_map.clear
24
+ sources.each do |s|
25
+ s.namespace_pins.each do |pin|
26
+ if pin.kind == :class
27
+ code_object_map[pin.path] ||= YARD::CodeObjects::ClassObject.new(code_object_at(pin.namespace), pin.name)
28
+ else
29
+ code_object_map[pin.path] ||= YARD::CodeObjects::ModuleObject.new(code_object_at(pin.namespace), pin.name)
30
+ end
31
+ code_object_map[pin.path].docstring = pin.docstring unless pin.docstring.nil?
32
+ end
33
+ s.namespace_includes.each_pair do |n, i|
34
+ code_object_map[n].mixins.push code_object_map[i] unless code_object_map[i].nil?
35
+ end
36
+ s.attribute_pins.each do |pin|
37
+ STDERR.puts "Adding #{pin.name} attribute to #{pin.namespace}"
38
+ code_object_map[pin.path] ||= YARD::CodeObjects::MethodObject.new(code_object_at(pin.namespace), pin.name, :instance)
39
+ code_object_map[pin.path].docstring = pin.docstring unless pin.docstring.nil?
40
+ code_object_map[pin.parameters] = []
41
+ #code_object_map[pin.path].parameters = pin.parameters.map do |p|
42
+ # n = p.match(/^[a-z0-9\-]*?:?/i)[0]
43
+ # v = nil
44
+ # if p.length > n.length
45
+ # v = p[n.length..-1].gsub(/^ = /, '')
46
+ # end
47
+ # [n, v]
48
+ #end
49
+ end
50
+ s.method_pins.each do |pin|
51
+ code_object_map[pin.path] ||= YARD::CodeObjects::MethodObject.new(code_object_at(pin.namespace), pin.name, pin.scope)
52
+ code_object_map[pin.path].docstring = pin.docstring unless pin.docstring.nil?
53
+ code_object_map[pin.path].parameters = pin.parameters.map do |p|
54
+ n = p.match(/^[a-z0-9\-]*?:?/i)[0]
55
+ v = nil
56
+ if p.length > n.length
57
+ v = p[n.length..-1].gsub(/^ = /, '')
58
+ end
59
+ [n, v]
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -23,18 +23,9 @@ module Solargraph
23
23
  # @return [String]
24
24
  attr_reader :filename
25
25
 
26
- # The root directory of the project. The ApiMap will search here for
27
- # additional files to parse and analyze.
28
- # @deprecated CodeMap will be server-agnostic in a future version.
29
- #
30
- # @return [String]
31
- attr_reader :workspace
32
-
33
26
  include NodeMethods
34
27
 
35
- def initialize code: '', filename: nil, workspace: nil, api_map: nil, cursor: nil
36
- STDERR.puts "WARNING: the `workspace` parameter in Solargraph::CodeMap#new is deprecated and will be removed in a future version." unless workspace.nil?
37
- @workspace = workspace
28
+ def initialize code: '', filename: nil, api_map: nil, cursor: nil
38
29
  # HACK: Adjust incoming filename's path separator for yardoc file comparisons
39
30
  filename = filename.gsub(File::ALT_SEPARATOR, File::SEPARATOR) unless filename.nil? or File::ALT_SEPARATOR.nil?
40
31
  @filename = filename
@@ -50,7 +41,7 @@ module Solargraph
50
41
  #
51
42
  # @return [Solargraph::ApiMap]
52
43
  def api_map
53
- @api_map ||= ApiMap.new(workspace)
44
+ @api_map ||= ApiMap.new(nil)
54
45
  end
55
46
 
56
47
  # Get the offset of the specified line and column.
@@ -107,6 +98,8 @@ module Solargraph
107
98
  #
108
99
  # @return [Boolean]
109
100
  def comment_at?(index)
101
+ line, col = Solargraph::ApiMap::Source.get_position_at(source.code, index)
102
+ return false if source.stubbed_lines.include?(line)
110
103
  @comments.each do |c|
111
104
  return true if index > c.location.expression.begin_pos and index <= c.location.expression.end_pos
112
105
  end
@@ -241,9 +234,9 @@ module Solargraph
241
234
  parts.pop
242
235
  end
243
236
  result += api_map.get_constants('')
244
- result += api_map.get_instance_methods('Kernel')
245
- result += api_map.get_methods('')
246
- result += api_map.get_instance_methods('')
237
+ result += api_map.get_instance_methods('Kernel', namespace)
238
+ result += api_map.get_methods('', namespace)
239
+ #result += api_map.get_instance_methods('', namespace)
247
240
  else
248
241
  result.concat api_map.get_instance_methods(type)
249
242
  end
@@ -333,7 +326,7 @@ module Solargraph
333
326
  end
334
327
  type = infer_literal_node_type(literal)
335
328
  if type.nil?
336
- node = parent_node_from(index, :class, :module, :def, :defs) || @node
329
+ node = parent_node_from(index, :class, :module, :def, :defs, :block) || @node
337
330
  result = infer_signature_from_node signature, node
338
331
  if result.nil? or result.empty?
339
332
  # The rest of this routine is dedicated to method and block parameters
@@ -428,6 +421,9 @@ module Solargraph
428
421
  scope = (node.type == :def ? :instance : :class)
429
422
  iv = api_map.get_instance_variable_pins(ns_here, scope).select{|s| s.name == start}.first
430
423
  return (iv.return_type || api_map.infer_assignment_node_type(iv.node, iv.namespace)) unless iv.nil?
424
+ elsif start.start_with?('$')
425
+ gv = api_map.get_global_variable_pins.select{|s| s.name == start}.first
426
+ return (gv.return_type || api_map.infer_assignment_node_type(gv.node, gv.namespace)) unless gv.nil?
431
427
  end
432
428
  var = find_local_variable_node(start, node)
433
429
  if var.nil?
@@ -458,6 +454,19 @@ module Solargraph
458
454
  inferred = api_map.infer_signature_type(remainder.join('.'), type, scope: :instance)
459
455
  end
460
456
  end
457
+ if inferred.nil? and node.respond_to?(:loc)
458
+ index = node.loc.expression.begin_pos
459
+ block_node = parent_node_from(index, :block, :class, :module, :sclass, :def, :defs)
460
+ unless block_node.nil? or block_node.type != :block or block_node.children[0].nil?
461
+ scope_node = parent_node_from(index, :class, :module, :def, :defs) || @node
462
+ meth = get_yielding_method_with_yieldself(block_node, scope_node)
463
+ unless meth.nil?
464
+ match = meth.docstring.all.match(/@yieldself \[([a-z0-9:_]*)/i)
465
+ self_yield = match[1]
466
+ inferred = api_map.infer_signature_type(signature, self_yield, scope: :instance)
467
+ end
468
+ end
469
+ end
461
470
  inferred
462
471
  end
463
472
 
@@ -516,9 +525,7 @@ module Solargraph
516
525
  if local.type == :def or local.type == :defs
517
526
  result += get_method_arguments_from local
518
527
  end
519
- result += get_yieldparams_at(index)
520
- # @todo This might not be necessary.
521
- #result += api_map.get_methods('Kernel')
528
+ result.concat get_yieldparams_at(index)
522
529
  result
523
530
  end
524
531
 
@@ -590,7 +597,8 @@ module Solargraph
590
597
  end
591
598
 
592
599
  def get_yieldparams_at index
593
- block_node = parent_node_from(index, :block)
600
+ block_node = parent_node_from(index, :block, :class, :module, :def, :defs)
601
+ return [] if block_node.nil? or block_node.type != :block
594
602
  scope_node = parent_node_from(index, :class, :module, :def, :defs) || @node
595
603
  return [] if block_node.nil?
596
604
  get_yieldparams_from block_node, scope_node
@@ -600,32 +608,63 @@ module Solargraph
600
608
  return [] unless block_node.kind_of?(AST::Node) and block_node.type == :block
601
609
  result = []
602
610
  unless block_node.nil? or block_node.children[1].nil?
603
- recv = resolve_node_signature(block_node.children[0].children[0])
604
- fqns = namespace_from(block_node)
605
- lvarnode = find_local_variable_node(recv, scope_node)
606
- if lvarnode.nil?
607
- sig = api_map.infer_signature_type(recv, fqns)
608
- else
609
- tmp = resolve_node_signature(lvarnode.children[1])
610
- sig = infer_signature_from_node tmp, scope_node
611
- end
612
- meths = api_map.get_instance_methods(sig, fqns)
613
- meths += api_map.get_methods('')
614
- meth = meths.keep_if{ |s| s.to_s == block_node.children[0].children[1].to_s }.first
611
+ meth = get_yielding_method(block_node, scope_node)
615
612
  yps = []
616
613
  unless meth.nil? or meth.docstring.nil?
617
614
  yps = meth.docstring.tags(:yieldparam) || []
618
615
  end
616
+ self_yield = nil
617
+ meth = get_yielding_method_with_yieldself(block_node, scope_node)
618
+ unless meth.nil?
619
+ match = meth.docstring.all.match(/@yieldself \[([a-z0-9:_]*)/i)
620
+ self_yield = match[1]
621
+ end
619
622
  i = 0
620
623
  block_node.children[1].children.each do |a|
621
624
  rt = (yps[i].nil? ? nil : yps[i].types[0])
622
625
  result.push Suggestion.new(a.children[0], kind: Suggestion::PROPERTY, return_type: rt)
623
626
  i += 1
624
627
  end
628
+ result.concat api_map.get_instance_methods(self_yield, namespace_from(scope_node)) unless self_yield.nil?
625
629
  end
626
630
  result
627
631
  end
628
632
 
633
+ def get_yielding_method block_node, scope_node
634
+ recv = resolve_node_signature(block_node.children[0].children[0])
635
+ fqns = namespace_from(block_node)
636
+ lvarnode = find_local_variable_node(recv, scope_node)
637
+ if lvarnode.nil?
638
+ sig = api_map.infer_signature_type(recv, fqns)
639
+ else
640
+ tmp = resolve_node_signature(lvarnode.children[1])
641
+ sig = infer_signature_from_node tmp, scope_node
642
+ end
643
+ if sig.nil?
644
+ meths = api_map.get_methods(fqns, fqns)
645
+ else
646
+ meths = api_map.get_instance_methods(sig, fqns)
647
+ end
648
+ meths += api_map.get_methods('')
649
+ meth = meths.keep_if{ |s| s.to_s == block_node.children[0].children[1].to_s }.first
650
+ meth
651
+ end
652
+
653
+ def get_yielding_method_with_yieldself block_node, scope_node
654
+ meth = get_yielding_method block_node, scope_node
655
+ if meth.nil? or meth.docstring.nil? or !meth.docstring.all.include?('@yieldself')
656
+ meth = nil
657
+ tree = @source.tree_for(block_node)
658
+ unless tree.nil?
659
+ tree.each do |p|
660
+ break if [:def, :defs, :class, :module, :sclass].include?(p.type)
661
+ return get_yielding_method_with_yieldself(p, scope_node) if p.type == :block
662
+ end
663
+ end
664
+ end
665
+ meth
666
+ end
667
+
629
668
  # @param suggestions [Array<Solargraph::Suggestion>]
630
669
  # @param word [String]
631
670
  def reduce_starting_with(suggestions, word)
@@ -661,7 +700,7 @@ module Solargraph
661
700
 
662
701
  def inner_node_at(index, node, arr)
663
702
  node.children.each do |c|
664
- if c.kind_of?(AST::Node)
703
+ if c.kind_of?(AST::Node) and c.respond_to?(:loc)
665
704
  unless c.loc.expression.nil?
666
705
  if index >= c.loc.expression.begin_pos
667
706
  if c.respond_to?(:end)
@@ -4,7 +4,7 @@ module Solargraph
4
4
  class LiveMap
5
5
  autoload :Cache, 'solargraph/live_map/cache'
6
6
 
7
- @@plugins = []
7
+ @@plugin_registry = {}
8
8
 
9
9
  # @return [Solargraph::ApiMap]
10
10
  attr_reader :api_map
@@ -68,19 +68,28 @@ module Solargraph
68
68
  nil
69
69
  end
70
70
 
71
+ def self.register name, klass
72
+ raise ArgumentError.new("A Solargraph plugin named #{name} already exists") if @@plugin_registry.has_key?(name)
73
+ @@plugin_registry[name] = klass
74
+ end
75
+
71
76
  # Register a plugin for LiveMap to use when generating suggestions.
77
+ # @deprecated See Solargraph::LiveMap.register instead
72
78
  #
73
79
  # @param cls [Class<Solargraph::Plugin::Base>]
74
80
  def self.install cls
75
- @@plugins.push cls unless @@plugins.include?(cls)
81
+ STDERR.puts "WARNING: The Solargraph::LiveMap.install procedure for installing plugins is no longer used. This operation will be ignored."
76
82
  end
77
83
 
84
+ # @deprecated
78
85
  def self.uninstall cls
79
- @@plugins.delete cls
86
+ STDERR.puts "WARNING: The Solargraph::LiveMap.uninstall procedure for uninstalling plugins is no longer used. This operation will be ignored."
80
87
  end
81
88
 
89
+ # @deprecated
82
90
  def self.plugins
83
- @@plugins.clone
91
+ STDERR.puts "WARNING: Plugins have changed. The Solargraph::LiveMap.plugins attribute is no longer used."
92
+ []
84
93
  end
85
94
 
86
95
  def refresh
@@ -114,14 +123,13 @@ module Solargraph
114
123
  # @return [Array<Solargraph::Plugin::Base>]
115
124
  def load_runners
116
125
  result = []
117
- has_runtime = false
118
- @@plugins.each do |p|
119
- r = p.new(api_map)
120
- result.push r if !has_runtime or !r.runtime?
121
- has_runtime = true if r.runtime?
126
+ api_map.config.plugins.each do |name|
127
+ r = @@plugin_registry[name].new(api_map)
128
+ result.push r
122
129
  end
123
- #result.push Solargraph::Plugin::Runtime.new(api_map) unless has_runtime
124
130
  result
125
131
  end
126
132
  end
127
133
  end
134
+
135
+ Solargraph::LiveMap.register 'runtime', Solargraph::Plugin::Runtime
@@ -64,20 +64,14 @@ module Solargraph
64
64
  con = find_constant(args['namespace'], args['root'])
65
65
  unless con.nil?
66
66
  if (args['scope'] == 'class')
67
- if args['with_private']
68
- result.concat con.methods(false)
69
- else
70
- result.concat con.public_methods(false)
71
- end
67
+ result.concat con.methods(false) if args['with_private']
68
+ result.concat con.public_methods(false)
72
69
  elsif (args['scope'] == 'instance')
73
- if args['with_private']
74
- result.concat con.instance_methods(false)
75
- else
76
- result.concat con.public_instance_methods(false)
77
- end
70
+ result.concat con.instance_methods(false) if args['with_private']
71
+ result.concat con.public_instance_methods(false)
78
72
  end
79
73
  end
80
- respond_ok result
74
+ respond_ok result.uniq
81
75
  end
82
76
 
83
77
  def get_constants args
@@ -103,11 +97,13 @@ module Solargraph
103
97
 
104
98
  def find_constant(namespace, root)
105
99
  result = nil
106
- parts = root.split('::')
107
- until parts.empty?
108
- result = inner_find_constant("#{parts.join('::')}::#{namespace}")
109
- parts.pop
110
- break unless result.nil?
100
+ unless root.empty?
101
+ parts = root.split('::')
102
+ until parts.empty?
103
+ result = inner_find_constant("#{parts.join('::')}::#{namespace}")
104
+ parts.pop
105
+ break unless result.nil?
106
+ end
111
107
  end
112
108
  result = inner_find_constant(namespace) if result.nil?
113
109
  result
@@ -124,7 +124,9 @@ module Solargraph
124
124
  @io.puts cmd.to_json
125
125
  @io.flush
126
126
  result = @io.gets
127
- JSON.parse(result)
127
+ obj = JSON.parse(result)
128
+ STDERR.puts obj['message'] if obj['status'] == 'err'
129
+ obj
128
130
  end
129
131
  end
130
132
  end
@@ -121,25 +121,15 @@ module Solargraph
121
121
 
122
122
  get '/search' do
123
123
  workspace = params['workspace']
124
- api_map = get_api_map(workspace)
125
- required = []
126
- unless api_map.nil?
127
- required.concat api_map.required
128
- end
129
- yard = YardMap.new(required: required, workspace: workspace)
130
- @results = yard.search(params['query'])
124
+ api_map = get_api_map(workspace) || Solargraph::ApiMap.new
125
+ @results = api_map.search(params['query'])
131
126
  erb :search
132
127
  end
133
128
 
134
129
  get '/document' do
135
130
  workspace = params['workspace']
136
- api_map = get_api_map(workspace)
137
- required = []
138
- unless api_map.nil?
139
- required.concat api_map.required
140
- end
141
- yard = YardMap.new(required: required, workspace: workspace)
142
- @objects = yard.document(params['query'])
131
+ api_map = get_api_map(workspace) || Solargraph::ApiMap.new
132
+ @objects = api_map.document(params['query'])
143
133
  erb :document
144
134
  end
145
135
 
@@ -15,41 +15,6 @@ module Solargraph
15
15
  puts Solargraph::VERSION
16
16
  end
17
17
 
18
- desc 'prepare', 'Cache YARD files for the current environment'
19
- option :force, type: :boolean, aliases: :f, desc: 'Force download of YARDOC files if they already exist'
20
- option :host, type: :string, aliases: :h, desc: 'The host that provides YARDOC files for download', default: 'yardoc.solargraph.org'
21
- def prepare
22
- cache_dir = File.join(Dir.home, '.solargraph', 'cache')
23
- version_dir = File.join(cache_dir, '2.0.0')
24
- unless File.exist?(version_dir) or options[:force]
25
- FileUtils.mkdir_p cache_dir
26
- puts 'Downloading 2.0.0...'
27
- Net::HTTP.start(options[:host]) do |http|
28
- resp = http.get("/2.0.0.tar.gz")
29
- open(File.join(cache_dir, '2.0.0.tar.gz'), "wb") do |file|
30
- file.write(resp.body)
31
- end
32
- puts 'Uncompressing archives...'
33
- FileUtils.rm_rf version_dir if File.exist?(version_dir)
34
- tar_extract = Gem::Package::TarReader.new(Zlib::GzipReader.open(File.join(cache_dir, '2.0.0.tar.gz')))
35
- tar_extract.rewind
36
- tar_extract.each do |entry|
37
- if entry.directory?
38
- FileUtils.mkdir_p File.join(cache_dir, entry.full_name)
39
- else
40
- FileUtils.mkdir_p File.join(cache_dir, File.dirname(entry.full_name))
41
- File.open(File.join(cache_dir, entry.full_name), 'wb') do |f|
42
- f << entry.read
43
- end
44
- end
45
- end
46
- tar_extract.close
47
- FileUtils.rm File.join(cache_dir, '2.0.0.tar.gz')
48
- puts 'Done.'
49
- end
50
- end
51
- end
52
-
53
18
  desc 'server', 'Start a Solargraph server'
54
19
  option :port, type: :numeric, aliases: :p, desc: 'The server port', default: 7657
55
20
  option :views, type: :string, aliases: :v, desc: 'The view template directory', default: nil
@@ -74,18 +39,6 @@ module Solargraph
74
39
  end
75
40
  end
76
41
  end
77
-
78
-
79
- desc 'plugin PLUGIN_NAME', 'Run a Solargraph runtime plugin'
80
- option :workspace, type: :string, aliases: :w, desc: 'The workspace'
81
- option :port, type: :numeric, aliases: :p, desc: 'The server port', required: true
82
- option :ppid, type: :numeric, desc: 'ppid'
83
- def plugin plugin_name
84
- # @todo Find the correct plugin based on the provided name
85
- cls = Solargraph::Plugin::Runtime
86
- #SolargraphRailsExt::Server.new(options[:workspace], options[:port]).run
87
- cls.serve options[:workspace], options[:port], options[:ppid]
88
- end
89
42
 
90
43
  desc 'suggest', 'Get code suggestions for the provided input'
91
44
  long_desc <<-LONGDESC
@@ -95,6 +48,7 @@ module Solargraph
95
48
  option :column, type: :numeric, aliases: [:c, :col], desc: 'Zero-based column number', required: true
96
49
  option :filename, type: :string, aliases: :f, desc: 'File name', required: false
97
50
  def suggest(*filenames)
51
+ STDERR.puts "WARNING: The `solargraph suggest` command is a candidate for deprecation. It will either change drastically or not exist in a future version."
98
52
  # HACK: The ARGV array needs to be manipulated for ARGF.read to work
99
53
  ARGV.clear
100
54
  ARGV.concat filenames
@@ -138,5 +92,27 @@ module Solargraph
138
92
  end
139
93
  STDOUT.puts "Configuration file initialized."
140
94
  end
95
+
96
+ desc 'download-core [VERSION]', 'Download core documentation'
97
+ def download_core version = nil
98
+ ver = version || Solargraph::YardMap::CoreDocs.best_download
99
+ puts "Downloading docs for #{ver}..."
100
+ Solargraph::YardMap::CoreDocs.download ver
101
+ end
102
+
103
+ desc 'list-cores', 'List the local documentation versions'
104
+ def list_cores
105
+ puts Solargraph::YardMap::CoreDocs.versions.join("\n")
106
+ end
107
+
108
+ desc 'available-cores', 'List available documentation versions'
109
+ def available_cores
110
+ puts Solargraph::YardMap::CoreDocs.available.join("\n")
111
+ end
112
+
113
+ desc 'clear-cores', 'Clear the cached core documentation'
114
+ def clear_cores
115
+ Solargraph::YardMap::CoreDocs.clear
116
+ end
141
117
  end
142
118
  end
@@ -26,7 +26,7 @@ module Solargraph
26
26
  attr_reader :detail
27
27
 
28
28
  # @return [YARD::CodeObjects::Base]
29
- attr_reader :code_object
29
+ #attr_reader :code_object
30
30
 
31
31
  # @return [String]
32
32
  attr_reader :location
@@ -34,6 +34,9 @@ module Solargraph
34
34
  # @return [Array<String>]
35
35
  attr_reader :arguments
36
36
 
37
+ # @return [YARD::CodeObjects::Base]
38
+ attr_reader :code_object
39
+
37
40
  def initialize label, kind: KEYWORD, insert: nil, detail: nil, docstring: nil, code_object: nil, location: nil, arguments: [], return_type: nil, path: nil
38
41
  @helper = Server::Helpers.new
39
42
  @label = label.to_s
@@ -1,3 +1,3 @@
1
1
  module Solargraph
2
- VERSION = '0.14.3'
2
+ VERSION = '0.15.0'
3
3
  end
@@ -1,17 +1,17 @@
1
- require 'parser/current'
2
1
  require 'yard'
3
2
 
4
3
  module Solargraph
5
4
  class YardMap
6
- @@stdlib_yardoc = File.join(Dir.home, '.solargraph', 'cache', '2.0.0', 'yardoc-stdlib')
5
+ autoload :Cache, 'solargraph/yard_map/cache'
6
+ autoload :CoreDocs, 'solargraph/yard_map/core_docs'
7
+
8
+ @@stdlib_yardoc = CoreDocs.yard_stdlib_file
7
9
  @@stdlib_namespaces = []
8
10
  YARD::Registry.load! @@stdlib_yardoc
9
11
  YARD::Registry.all(:class, :module).each do |ns|
10
12
  @@stdlib_namespaces.push ns.path
11
13
  end
12
14
 
13
- autoload :Cache, 'solargraph/yard_map/cache'
14
-
15
15
  attr_reader :workspace
16
16
  attr_reader :required
17
17
 
@@ -20,28 +20,22 @@ module Solargraph
20
20
  used = []
21
21
  @required = required
22
22
  @namespace_yardocs = {}
23
- #if @required.include?('bundler/setup') or @required.include?('bundler/require')
24
- # yardocs.concat bundled_gem_yardocs
25
- #else
26
- @required.each do |r|
27
- if workspace.nil? or !File.exist?(File.join workspace, 'lib', "#{r}.rb")
28
- g = r.split('/').first
29
- unless used.include?(g)
30
- used.push g
31
- gy = YARD::Registry.yardoc_file_for_gem(g)
32
- if gy.nil?
33
- STDERR.puts "Required path not found: #{r}"
34
- else
35
- #STDERR.puts "Adding #{gy}"
36
- yardocs.unshift gy
37
- add_gem_dependencies g
38
- end
23
+ @required.each do |r|
24
+ if workspace.nil? or !File.exist?(File.join workspace, 'lib', "#{r}.rb")
25
+ g = r.split('/').first
26
+ unless used.include?(g)
27
+ used.push g
28
+ gy = YARD::Registry.yardoc_file_for_gem(g)
29
+ if gy.nil?
30
+ STDERR.puts "Required path not found: #{r}"
31
+ else
32
+ yardocs.unshift gy
33
+ add_gem_dependencies g
39
34
  end
40
35
  end
41
36
  end
42
- #end
43
- yardocs.push File.join(Dir.home, '.solargraph', 'cache', '2.0.0', 'yardoc')
44
- #yardocs.push File.join(Dir.home, '.solargraph', 'cache', '2.0.0', 'yardoc-stdlib')
37
+ end
38
+ yardocs.push CoreDocs.yardoc_file
45
39
  yardocs.uniq!
46
40
  yardocs.each do |y|
47
41
  load_yardoc y
@@ -83,12 +77,14 @@ module Solargraph
83
77
  (yardocs + [@@stdlib_yardoc]).each { |y|
84
78
  yard = load_yardoc(y)
85
79
  unless yard.nil?
86
- yard.paths.each { |p|
87
- found.push p if p.downcase.include?(query.downcase)
88
- }
80
+ yard.paths.each do |p|
81
+ if found.empty? or (query.include?('.') or query.include?('#')) or !(p.include?('.') or p.include?('#'))
82
+ found.push p if p.downcase.include?(query.downcase)
83
+ end
84
+ end
89
85
  end
90
86
  }
91
- found.sort
87
+ found.uniq
92
88
  end
93
89
 
94
90
  # @param query [String]
@@ -227,13 +223,15 @@ module Solargraph
227
223
  end
228
224
 
229
225
  def find_fully_qualified_namespace namespace, scope
230
- yardocs.each { |y|
231
- yard = load_yardoc(y)
232
- unless yard.nil?
233
- obj = find_first_resolved_namespace(yard, namespace, scope)
234
- return obj.path unless obj.nil? or !obj.kind_of?(YARD::CodeObjects::NamespaceObject)
226
+ unless scope.empty?
227
+ parts = scope.split('::')
228
+ while parts.length > 0
229
+ here = "#{parts.join('::')}::#{namespace}"
230
+ return here unless yardocs_documenting(here).empty?
231
+ parts.pop
235
232
  end
236
- }
233
+ end
234
+ return namespace unless yardocs_documenting(namespace).empty?
237
235
  nil
238
236
  end
239
237
 
@@ -0,0 +1,111 @@
1
+ require 'net/http'
2
+ require 'uri'
3
+ require 'json'
4
+ require 'fileutils'
5
+
6
+ module Solargraph
7
+ class YardMap
8
+ module CoreDocs
9
+ class SourceNotAvailableError < StandardError;end
10
+
11
+ SOURCE = 'http://solargraph.org/download'
12
+
13
+ class << self
14
+ def cache_dir
15
+ @cache_dir ||= File.join(Dir.home, '.solargraph', 'cache')
16
+ end
17
+
18
+ # Solargraph installs Ruby 2.2.2 documentation to ensure minimum functionality.
19
+ def require_minimum
20
+ FileUtils.mkdir_p cache_dir
21
+ version_dir = File.join(cache_dir, '2.2.2')
22
+ unless File.exist?(version_dir)
23
+ FileUtils.cp File.join(Solargraph::YARDOC_PATH, '2.2.2.tar.gz'), cache_dir
24
+ install_archive File.join(cache_dir, '2.2.2.tar.gz')
25
+ end
26
+ end
27
+
28
+ def valid?(ver)
29
+ dir = File.join(cache_dir, ver)
30
+ return false unless File.directory?(dir)
31
+ return false unless File.directory?(File.join(dir, 'yardoc'))
32
+ return false unless File.directory?(File.join(dir, 'yardoc-stdlib'))
33
+ true
34
+ end
35
+
36
+ def versions
37
+ dirs = Dir[File.join(cache_dir, '*')].map{|d| File.basename(d)}
38
+ dirs.keep_if{|d| valid?(d)}
39
+ dirs.sort!{|a, b| Gem::Version.new(b) <=> Gem::Version.new(a)}
40
+ dirs
41
+ end
42
+
43
+ def best_match
44
+ available = versions
45
+ available.each do |v|
46
+ return v if Gem::Version.new(v) <= Gem::Version.new(RUBY_VERSION)
47
+ end
48
+ return available.last
49
+ end
50
+
51
+ def available
52
+ uri = URI.parse("#{SOURCE}/versions.json")
53
+ response = Net::HTTP.get_response(uri)
54
+ obj = JSON.parse(response.body)
55
+ raise SourceNotAvailableError.new("Error connecting to #{SOURCE}") unless obj['status'] == 'ok'
56
+ obj['cores']
57
+ end
58
+
59
+ def best_download
60
+ rv = Gem::Version.new(RUBY_VERSION)
61
+ available.each do |ver|
62
+ return ver if Gem::Version.new(ver) <= rv
63
+ end
64
+ obj['cores'].last
65
+ end
66
+
67
+ def yardoc_file(ver = best_match)
68
+ raise ArgumentError.new("Invalid core yardoc version #{ver}") unless valid?(ver)
69
+ File.join(cache_dir, ver, 'yardoc')
70
+ end
71
+
72
+ def yard_stdlib_file(ver = best_match)
73
+ raise ArgumentError.new("Invalid core yardoc version #{ver}") unless valid?(ver)
74
+ File.join(cache_dir, ver, 'yardoc-stdlib')
75
+ end
76
+
77
+ def download version
78
+ FileUtils.mkdir_p cache_dir
79
+ uri = URI.parse("http://solargraph.org/download/#{version}.tar.gz")
80
+ response = Net::HTTP.get_response(uri)
81
+ zipfile = File.join(cache_dir, "#{version}.tar.gz")
82
+ File.binwrite zipfile, response.body
83
+ install_archive zipfile
84
+ end
85
+
86
+ def clear
87
+ FileUtils.rm_rf cache_dir, secure: true
88
+ require_minimum
89
+ end
90
+
91
+ private
92
+
93
+ def install_archive filename
94
+ tar_extract = Gem::Package::TarReader.new(Zlib::GzipReader.open(filename))
95
+ tar_extract.rewind
96
+ tar_extract.each do |entry|
97
+ if entry.directory?
98
+ FileUtils.mkdir_p File.join(cache_dir, entry.full_name)
99
+ else
100
+ FileUtils.mkdir_p File.join(cache_dir, File.dirname(entry.full_name))
101
+ File.open(File.join(cache_dir, entry.full_name), 'wb') do |f|
102
+ f << entry.read
103
+ end
104
+ end
105
+ end
106
+ tar_extract.close
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
Binary file
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.14.3
4
+ version: 0.15.0
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-11-30 00:00:00.000000000 Z
11
+ date: 2017-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser
@@ -177,6 +177,7 @@ files:
177
177
  - lib/solargraph/api_map/cache.rb
178
178
  - lib/solargraph/api_map/config.rb
179
179
  - lib/solargraph/api_map/source.rb
180
+ - lib/solargraph/api_map/source_to_yard.rb
180
181
  - lib/solargraph/code_map.rb
181
182
  - lib/solargraph/live_map.rb
182
183
  - lib/solargraph/live_map/cache.rb
@@ -215,8 +216,9 @@ files:
215
216
  - lib/solargraph/views/search.erb
216
217
  - lib/solargraph/yard_map.rb
217
218
  - lib/solargraph/yard_map/cache.rb
219
+ - lib/solargraph/yard_map/core_docs.rb
218
220
  - lib/yard-solargraph.rb
219
- - yardoc/2.0.0.tar.gz
221
+ - yardoc/2.2.2.tar.gz
220
222
  homepage: http://solargraph.org
221
223
  licenses:
222
224
  - MIT
Binary file