solargraph 0.24.1 → 0.25.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/solargraph/api_map.rb +93 -46
- data/lib/solargraph/api_map/cache.rb +51 -0
- data/lib/solargraph/api_map/probe.rb +23 -12
- data/lib/solargraph/api_map/source_to_yard.rb +2 -2
- data/lib/solargraph/api_map/store.rb +20 -9
- data/lib/solargraph/complex_type.rb +10 -1
- data/lib/solargraph/diagnostics/require_not_found.rb +1 -1
- data/lib/solargraph/diagnostics/rubocop.rb +35 -27
- data/lib/solargraph/diagnostics/type_not_defined.rb +10 -13
- data/lib/solargraph/language_server/host.rb +11 -11
- data/lib/solargraph/language_server/message.rb +0 -1
- data/lib/solargraph/language_server/message/base.rb +24 -4
- data/lib/solargraph/language_server/message/text_document/completion.rb +9 -16
- data/lib/solargraph/language_server/message/text_document/did_change.rb +0 -2
- data/lib/solargraph/language_server/message/text_document/formatting.rb +1 -10
- data/lib/solargraph/language_server/transport/socket.rb +0 -1
- data/lib/solargraph/language_server/transport/stdio.rb +0 -1
- data/lib/solargraph/pin.rb +1 -1
- data/lib/solargraph/pin/attribute.rb +4 -7
- data/lib/solargraph/pin/base.rb +113 -8
- data/lib/solargraph/pin/base_variable.rb +17 -25
- data/lib/solargraph/pin/block.rb +2 -2
- data/lib/solargraph/pin/block_parameter.rb +8 -10
- data/lib/solargraph/pin/constant.rb +2 -2
- data/lib/solargraph/pin/conversions.rb +8 -0
- data/lib/solargraph/pin/documenting.rb +2 -2
- data/lib/solargraph/pin/duck_method.rb +0 -1
- data/lib/solargraph/pin/local_variable.rb +8 -2
- data/lib/solargraph/pin/method.rb +26 -16
- data/lib/solargraph/pin/method_parameter.rb +15 -8
- data/lib/solargraph/pin/namespace.rb +2 -2
- data/lib/solargraph/pin/reference.rb +7 -0
- data/lib/solargraph/pin/yard_pin.rb +10 -0
- data/lib/solargraph/pin/yard_pin/constant.rb +14 -0
- data/lib/solargraph/pin/yard_pin/method.rb +35 -0
- data/lib/solargraph/pin/yard_pin/namespace.rb +27 -0
- data/lib/solargraph/pin/yard_pin/yard_mixin.rb +18 -0
- data/lib/solargraph/source.rb +59 -15
- data/lib/solargraph/source/mapper.rb +46 -99
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace.rb +11 -2
- data/lib/solargraph/workspace/config.rb +47 -1
- data/lib/solargraph/yard_map.rb +103 -278
- data/lib/solargraph/yard_map/cache.rb +13 -38
- metadata +7 -3
- data/lib/solargraph/pin/yard_object.rb +0 -119
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: efdf4fdf971f5d10e148b73902701dae0ce549ef38f7304455fefba0465f4e90
|
4
|
+
data.tar.gz: 49c3fcc4fb9c3ad339e7e08c256275ac73907edc62f239a4b315938c18b68661
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d3bddec5d8f6f083905349634b6a36144b5e069b1b94abf0d2ab3e3f074e8bc851ceb79a6d42cee9b2aa9af4645f3ed04347228a16db08fc3b94b7ff974aa0e3
|
7
|
+
data.tar.gz: 6b384c71d2a38c4e5cd02cabb2801d0b57cf5c5f2eb81d63cb56e37fb90b24c030d308cd2e75dc3977963841d1dfcb1f1e33eb8f220a759b83580296c40fb413
|
data/lib/solargraph/api_map.rb
CHANGED
@@ -23,9 +23,6 @@ module Solargraph
|
|
23
23
|
# @return [Solargraph::Workspace]
|
24
24
|
attr_reader :workspace
|
25
25
|
|
26
|
-
# @return [ApiMap::Store]
|
27
|
-
attr_reader :store
|
28
|
-
|
29
26
|
# Get a LiveMap associated with the current workspace.
|
30
27
|
#
|
31
28
|
# @return [Solargraph::LiveMap]
|
@@ -36,14 +33,13 @@ module Solargraph
|
|
36
33
|
@workspace = workspace
|
37
34
|
require_extensions
|
38
35
|
@virtual_source = nil
|
39
|
-
@yard_stale = true
|
40
|
-
# process_maps
|
41
36
|
@sources = workspace.sources
|
42
37
|
refresh_store_and_maps
|
43
38
|
end
|
44
39
|
|
45
40
|
# Create an ApiMap with a workspace in the specified directory.
|
46
41
|
#
|
42
|
+
# @param directory [String]
|
47
43
|
# @return [ApiMap]
|
48
44
|
def self.load directory
|
49
45
|
self.new(Solargraph::Workspace.new(directory))
|
@@ -71,17 +67,6 @@ module Solargraph
|
|
71
67
|
result.uniq
|
72
68
|
end
|
73
69
|
|
74
|
-
# Get a YardMap associated with the current workspace.
|
75
|
-
#
|
76
|
-
# @return [Solargraph::YardMap]
|
77
|
-
def yard_map
|
78
|
-
# refresh
|
79
|
-
if @yard_map.required.to_set != required.to_set
|
80
|
-
@yard_map = Solargraph::YardMap.new(required: required, workspace: workspace)
|
81
|
-
end
|
82
|
-
@yard_map
|
83
|
-
end
|
84
|
-
|
85
70
|
# Declare a virtual source that will be included in the map regardless of
|
86
71
|
# whether it's in the workspace.
|
87
72
|
#
|
@@ -91,6 +76,8 @@ module Solargraph
|
|
91
76
|
# @param source [Solargraph::Source]
|
92
77
|
# @return [Solargraph::Source]
|
93
78
|
def virtualize source
|
79
|
+
# @todo Confirm the correct way to handle caches
|
80
|
+
cache.clear if (source.nil? and !@virtual_source.nil?) or (!source.nil? and !@virtual_source.nil? and source.pins != @virtual_source.pins)
|
94
81
|
store.remove @virtual_source unless @virtual_source.nil?
|
95
82
|
domains.clear
|
96
83
|
domains.concat workspace.config.domains
|
@@ -133,12 +120,8 @@ module Solargraph
|
|
133
120
|
if force
|
134
121
|
refresh_store_and_maps
|
135
122
|
else
|
136
|
-
|
137
|
-
@sources = workspace.sources
|
138
|
-
@sources.push @virtual_source unless @virtual_source.nil?
|
139
|
-
store.update *(@sources.select{ |s| @stime.nil? or s.stime > @stime })
|
123
|
+
update_store_and_maps
|
140
124
|
end
|
141
|
-
@stime = Time.new
|
142
125
|
true
|
143
126
|
end
|
144
127
|
|
@@ -187,6 +170,8 @@ module Solargraph
|
|
187
170
|
# @return [Array<Solargraph::Pin::Base>]
|
188
171
|
def get_constants namespace, context = ''
|
189
172
|
namespace ||= ''
|
173
|
+
cached = cache.get_constants(namespace, context)
|
174
|
+
return cached.clone unless cached.nil?
|
190
175
|
skip = []
|
191
176
|
result = []
|
192
177
|
bases = context.split('::')
|
@@ -202,6 +187,7 @@ module Solargraph
|
|
202
187
|
visibility = [:public]
|
203
188
|
visibility.push :private if fqns == context
|
204
189
|
result.concat inner_get_constants(fqns, visibility, skip)
|
190
|
+
cache.set_constants(namespace, context, result)
|
205
191
|
result
|
206
192
|
end
|
207
193
|
|
@@ -212,10 +198,19 @@ module Solargraph
|
|
212
198
|
# @param context [String] The context to search
|
213
199
|
# @return [String]
|
214
200
|
def qualify namespace, context = ''
|
215
|
-
|
201
|
+
# @todo The return for self might work better elsewhere
|
202
|
+
return qualify(context) if namespace == 'self'
|
203
|
+
cached = cache.get_qualified_namespace(namespace, context)
|
204
|
+
return cached.clone unless cached.nil?
|
205
|
+
result = inner_qualify(namespace, context, [])
|
206
|
+
cache.set_qualified_namespace(namespace, context, result)
|
207
|
+
result
|
216
208
|
end
|
217
209
|
|
218
210
|
# @deprecated Use #qualify instead
|
211
|
+
# @param namespace [String]
|
212
|
+
# @param context [String]
|
213
|
+
# @return [String]
|
219
214
|
def find_fully_qualified_namespace namespace, context = ''
|
220
215
|
qualify namespace, context
|
221
216
|
end
|
@@ -260,6 +255,8 @@ module Solargraph
|
|
260
255
|
# @param deep [Boolean] True to include superclasses, mixins, etc.
|
261
256
|
# @return [Array<Solargraph::Pin::Base>]
|
262
257
|
def get_methods fqns, scope: :instance, visibility: [:public], deep: true
|
258
|
+
cached = cache.get_methods(fqns, scope, visibility, deep)
|
259
|
+
return cached.clone unless cached.nil?
|
263
260
|
result = []
|
264
261
|
skip = []
|
265
262
|
if fqns == ''
|
@@ -278,6 +275,23 @@ module Solargraph
|
|
278
275
|
exist = result.map(&:name)
|
279
276
|
result.concat live.reject{|p| exist.include?(p.name)}
|
280
277
|
end
|
278
|
+
cache.set_methods(fqns, scope, visibility, deep, result)
|
279
|
+
result
|
280
|
+
end
|
281
|
+
|
282
|
+
# Get a stack of method pins for a method name in a namespace. The order
|
283
|
+
# of the pins corresponds to the ancestry chain, with highest precedence
|
284
|
+
# first.
|
285
|
+
#
|
286
|
+
# @param fqns [String]
|
287
|
+
# @param name [String]
|
288
|
+
# @param scope [Symbol] :instance or :class
|
289
|
+
# @return [Array<Solargraph::Pin::Base>]
|
290
|
+
def get_method_stack fqns, name, scope: :instance
|
291
|
+
# cached = cache.get_method_stack(fqns, name, scope)
|
292
|
+
# return cached.clone unless cached.nil?
|
293
|
+
result = get_methods(fqns, scope: scope, visibility: [:private, :protected, :public]).select{|p| p.name == name}
|
294
|
+
# cache.set_method_stack(fqns, name, scope, result)
|
281
295
|
result
|
282
296
|
end
|
283
297
|
|
@@ -328,7 +342,10 @@ module Solargraph
|
|
328
342
|
pins = probe.infer_signature_pins(fragment.base, fragment.named_path, fragment.locals)
|
329
343
|
unless pins.empty?
|
330
344
|
pin = pins.first
|
331
|
-
if pin.
|
345
|
+
if pin.variable? and pin.return_type.nil? and !pin.signature.nil?
|
346
|
+
type = probe.infer_signature_type(pin.signature, pin.context, fragment.locals)
|
347
|
+
result.concat(get_methods(type)) unless type.nil?
|
348
|
+
elsif pin.return_complex_types.any? and pin.return_complex_types.first.duck_type?
|
332
349
|
pin.return_complex_types.each do |t|
|
333
350
|
next unless t.duck_type?
|
334
351
|
result.push Pin::DuckMethod.new(pin.location, t.tag[1..-1])
|
@@ -350,7 +367,7 @@ module Solargraph
|
|
350
367
|
end
|
351
368
|
end
|
352
369
|
frag_start = fragment.word.to_s.downcase
|
353
|
-
filtered = result.uniq(&:identifier).select{|s| s.name.downcase.start_with?(frag_start) and (s.kind != Pin::METHOD or s.name.match(/^[a-z0-9_]
|
370
|
+
filtered = result.uniq(&:identifier).select{|s| s.name.downcase.start_with?(frag_start) and (s.kind != Pin::METHOD or s.name.match(/^[a-z0-9_]+(\!|\?|=)?$/i))}.sort_by.with_index{ |x, idx| [x.name, idx] }
|
354
371
|
Completion.new(filtered, fragment.whole_word_range)
|
355
372
|
end
|
356
373
|
|
@@ -360,7 +377,7 @@ module Solargraph
|
|
360
377
|
# @return [Array<Solargraph::Pin::Base>]
|
361
378
|
def define fragment
|
362
379
|
return get_path_suggestions(fragment.namespace) if fragment.whole_signature == 'self'
|
363
|
-
return [] if fragment.string? or fragment.comment? or fragment.literal? or fragment.whole_signature
|
380
|
+
return [] if fragment.string? or fragment.comment? or fragment.literal? or KEYWORDS.include?(fragment.whole_signature)
|
364
381
|
if fragment.base_literal?
|
365
382
|
probe.infer_signature_pins fragment.whole_signature, Pin::ProxyMethod.new(fragment.base_literal), fragment.locals
|
366
383
|
else
|
@@ -406,7 +423,7 @@ module Solargraph
|
|
406
423
|
return [] if path.nil?
|
407
424
|
result = []
|
408
425
|
result.concat store.get_path_pins(path)
|
409
|
-
result.concat yard_map.objects(path)
|
426
|
+
# result.concat yard_map.objects(path)
|
410
427
|
if result.empty?
|
411
428
|
lp = live_map.get_path_pin(path)
|
412
429
|
result.push lp unless lp.nil?
|
@@ -430,7 +447,7 @@ module Solargraph
|
|
430
447
|
found.push k if k.downcase.include?(query.downcase)
|
431
448
|
end
|
432
449
|
end
|
433
|
-
found
|
450
|
+
found
|
434
451
|
end
|
435
452
|
|
436
453
|
# Get YARD documentation for the specified path.
|
@@ -445,7 +462,7 @@ module Solargraph
|
|
445
462
|
@yard_stale = false
|
446
463
|
docs = []
|
447
464
|
docs.push code_object_at(path) unless code_object_at(path).nil?
|
448
|
-
docs.concat yard_map.document(path)
|
465
|
+
# docs.concat yard_map.document(path)
|
449
466
|
docs
|
450
467
|
end
|
451
468
|
|
@@ -461,6 +478,7 @@ module Solargraph
|
|
461
478
|
result
|
462
479
|
end
|
463
480
|
|
481
|
+
# @param location [Solargraph::Source::Location]
|
464
482
|
# @return [Solargraph::Pin::Base]
|
465
483
|
def locate_pin location
|
466
484
|
@sources.each do |source|
|
@@ -477,27 +495,53 @@ module Solargraph
|
|
477
495
|
@probe ||= Probe.new(self)
|
478
496
|
end
|
479
497
|
|
498
|
+
def unresolved_requires
|
499
|
+
# return [] if yard_map_changed?
|
500
|
+
yard_map.unresolved_requires
|
501
|
+
end
|
502
|
+
|
480
503
|
private
|
481
504
|
|
505
|
+
# @return [ApiMap::Store]
|
506
|
+
def store
|
507
|
+
@store ||= ApiMap::Store.new(@sources, yard_map.pins)
|
508
|
+
end
|
509
|
+
|
510
|
+
# @return [void]
|
482
511
|
def refresh_store_and_maps
|
483
|
-
@
|
512
|
+
@yard_stale = true
|
484
513
|
@live_map = Solargraph::LiveMap.new(self)
|
485
|
-
|
514
|
+
store.update_yard(yard_map.pins) if yard_map.change(required)
|
515
|
+
cache.clear
|
516
|
+
@stime = Time.now
|
486
517
|
end
|
487
518
|
|
519
|
+
# @return [void]
|
520
|
+
def update_store_and_maps
|
521
|
+
@yard_stale = true
|
522
|
+
store.remove *(current_workspace_sources.reject{ |s| workspace.sources.include?(s) })
|
523
|
+
@sources = workspace.sources
|
524
|
+
@sources.push @virtual_source unless @virtual_source.nil?
|
525
|
+
store.update *(@sources.select{ |s| @stime.nil? or s.stime > @stime })
|
526
|
+
store.update_yard(yard_map.pins) if yard_map.change(required)
|
527
|
+
cache.clear
|
528
|
+
@stime = Time.now
|
529
|
+
end
|
530
|
+
|
531
|
+
# @return [void]
|
488
532
|
def process_virtual
|
489
|
-
unless @virtual_source.nil?
|
490
|
-
|
533
|
+
map_source @virtual_source unless @virtual_source.nil?
|
534
|
+
if yard_map.change(required)
|
535
|
+
store.update_yard(yard_map.pins)
|
491
536
|
end
|
537
|
+
cache.clear
|
492
538
|
end
|
493
539
|
|
494
|
-
# @param [Solargraph::Source]
|
540
|
+
# @param source [Solargraph::Source]
|
541
|
+
# @return [void]
|
495
542
|
def map_source source
|
496
543
|
store.update source
|
497
544
|
path_macros.merge! source.path_macros
|
498
|
-
source.required.each do |r|
|
499
|
-
required.push r
|
500
|
-
end
|
501
545
|
end
|
502
546
|
|
503
547
|
# @return [Solargraph::ApiMap::Cache]
|
@@ -525,17 +569,17 @@ module Solargraph
|
|
525
569
|
fqim = qualify(im, fqns)
|
526
570
|
result.concat inner_get_methods(fqim, scope, visibility, deep, skip) unless fqim.nil?
|
527
571
|
end
|
528
|
-
result.concat yard_map.get_instance_methods(fqns, visibility: visibility)
|
572
|
+
# result.concat yard_map.get_instance_methods(fqns, visibility: visibility)
|
529
573
|
result.concat inner_get_methods('Object', :instance, [:public], deep, skip) unless fqns == 'Object'
|
530
574
|
else
|
531
575
|
store.get_extends(fqns).each do |em|
|
532
576
|
fqem = qualify(em, fqns)
|
533
577
|
result.concat inner_get_methods(fqem, :instance, visibility, deep, skip) unless fqem.nil?
|
534
578
|
end
|
535
|
-
result.concat yard_map.get_methods(fqns, '', visibility: visibility)
|
579
|
+
# result.concat yard_map.get_methods(fqns, '', visibility: visibility)
|
536
580
|
type = get_namespace_type(fqns)
|
537
581
|
result.concat inner_get_methods('Class', :instance, fqns == '' ? [:public] : visibility, deep, skip) if type == :class
|
538
|
-
result.concat inner_get_methods('Module', :instance, fqns == '' ? [:public] : visibility, deep, skip) if type == :module
|
582
|
+
result.concat inner_get_methods('Module', :instance, fqns == '' ? [:public] : visibility, deep, skip) #if type == :module
|
539
583
|
end
|
540
584
|
end
|
541
585
|
result
|
@@ -546,7 +590,7 @@ module Solargraph
|
|
546
590
|
skip.push fqns
|
547
591
|
result = []
|
548
592
|
result.concat store.get_constants(fqns, visibility)
|
549
|
-
result.concat yard_map.get_constants(fqns)
|
593
|
+
# result.concat yard_map.get_constants(fqns)
|
550
594
|
store.get_includes(fqns).each do |is|
|
551
595
|
fqis = qualify(is, fqns)
|
552
596
|
result.concat inner_get_constants(fqis, [:public], skip) unless fqis.nil?
|
@@ -613,11 +657,7 @@ module Solargraph
|
|
613
657
|
return name if store.namespace_exists?(name)
|
614
658
|
end
|
615
659
|
end
|
616
|
-
|
617
|
-
if result.nil?
|
618
|
-
result = live_map.get_fqns(name, root)
|
619
|
-
end
|
620
|
-
result
|
660
|
+
live_map.get_fqns(name, root)
|
621
661
|
end
|
622
662
|
|
623
663
|
# Get the namespace's type (Class or Module).
|
@@ -626,8 +666,15 @@ module Solargraph
|
|
626
666
|
# @return [Symbol] :class, :module, or nil
|
627
667
|
def get_namespace_type fqns
|
628
668
|
pin = store.get_path_pins(fqns).first
|
629
|
-
return
|
669
|
+
return nil if pin.nil?
|
630
670
|
pin.type
|
631
671
|
end
|
672
|
+
|
673
|
+
# Get a YardMap associated with the current workspace.
|
674
|
+
#
|
675
|
+
# @return [Solargraph::YardMap]
|
676
|
+
def yard_map
|
677
|
+
@yard_map ||= Solargraph::YardMap.new(required: required, workspace: workspace)
|
678
|
+
end
|
632
679
|
end
|
633
680
|
end
|
@@ -4,6 +4,10 @@ module Solargraph
|
|
4
4
|
def initialize
|
5
5
|
@signature_types = {}
|
6
6
|
@assignment_node_types = {}
|
7
|
+
@methods = {}
|
8
|
+
@method_stacks = {}
|
9
|
+
@constants = {}
|
10
|
+
@qualified_namespaces = {}
|
7
11
|
end
|
8
12
|
|
9
13
|
def get_signature_type signature, namespace, scope
|
@@ -26,9 +30,56 @@ module Solargraph
|
|
26
30
|
@assignment_node_types[[node, namespace]] = value
|
27
31
|
end
|
28
32
|
|
33
|
+
def get_methods fqns, scope, visibility, deep
|
34
|
+
@methods[[fqns, scope, visibility.sort, deep]]
|
35
|
+
end
|
36
|
+
|
37
|
+
def set_methods fqns, scope, visibility, deep, value
|
38
|
+
@methods[[fqns, scope, visibility.sort, deep]] = value
|
39
|
+
end
|
40
|
+
|
41
|
+
def get_method_stack fqns, name, scope
|
42
|
+
@method_stacks[[fqns, name, scope]]
|
43
|
+
end
|
44
|
+
|
45
|
+
def set_method_stack fqns, name, scope, value
|
46
|
+
@method_stacks[[fqns, name, scope]] = value
|
47
|
+
end
|
48
|
+
|
49
|
+
def get_constants namespace, context
|
50
|
+
@constants[[namespace, context]]
|
51
|
+
end
|
52
|
+
|
53
|
+
def set_constants namespace, context, value
|
54
|
+
@constants[[namespace, context]] = value
|
55
|
+
end
|
56
|
+
|
57
|
+
def get_qualified_namespace name, context
|
58
|
+
@qualified_namespaces[[name, context]]
|
59
|
+
end
|
60
|
+
|
61
|
+
def set_qualified_namespace name, context, value
|
62
|
+
@qualified_namespaces[[name, context]] = value
|
63
|
+
end
|
64
|
+
|
65
|
+
# @return [void]
|
29
66
|
def clear
|
30
67
|
@signature_types.clear
|
31
68
|
@assignment_node_types.clear
|
69
|
+
@methods.clear
|
70
|
+
@method_stacks.clear
|
71
|
+
@constants.clear
|
72
|
+
@qualified_namespaces.clear
|
73
|
+
end
|
74
|
+
|
75
|
+
# @return [Boolean]
|
76
|
+
def empty?
|
77
|
+
@signature_types.empty? and
|
78
|
+
@assignment_node_types.empty? and
|
79
|
+
@methods.empty? and
|
80
|
+
@method_stacks.empty? and
|
81
|
+
@constants.empty? amd
|
82
|
+
@qualified_namespaces.empty?
|
32
83
|
end
|
33
84
|
end
|
34
85
|
end
|
@@ -1,17 +1,23 @@
|
|
1
1
|
module Solargraph
|
2
2
|
class ApiMap
|
3
|
+
# A deep analysis provider for ApiMaps.
|
4
|
+
#
|
3
5
|
class Probe
|
4
6
|
include TypeMethods
|
5
7
|
|
6
8
|
# @return [Solargraph::ApiMap]
|
7
9
|
attr_reader :api_map
|
8
10
|
|
11
|
+
# @param api_map [ApiMap]
|
9
12
|
def initialize api_map
|
10
13
|
@api_map = api_map
|
11
14
|
end
|
12
15
|
|
13
16
|
# Get all matching pins for the signature.
|
14
17
|
#
|
18
|
+
# @param signature [String]
|
19
|
+
# @param context_pin [Pin::Base]
|
20
|
+
# @param locals [Array<Pin::Base>]
|
15
21
|
# @return [Array<Pin::Base>]
|
16
22
|
def infer_signature_pins signature, context_pin, locals
|
17
23
|
return [] if signature.nil? or signature.empty?
|
@@ -44,6 +50,9 @@ module Solargraph
|
|
44
50
|
|
45
51
|
# Get the return type for the signature.
|
46
52
|
#
|
53
|
+
# @param signature [String]
|
54
|
+
# @param context_pin [Pin::Base]
|
55
|
+
# @param locals [Array<Pin::Base>]
|
47
56
|
# @return [String]
|
48
57
|
def infer_signature_type signature, context_pin, locals
|
49
58
|
pins = infer_signature_pins(signature, context_pin, locals)
|
@@ -65,6 +74,8 @@ module Solargraph
|
|
65
74
|
return resolve_word_types(lvars, locals) unless lvars.empty?
|
66
75
|
return api_map.get_global_variable_pins.select{|pin| pin.name == word} if word.start_with?('$')
|
67
76
|
namespace, scope = extract_namespace_and_scope_from_pin(context_pin)
|
77
|
+
return api_map.get_class_variable_pins(namespace).select{|pin| pin.name == word} if word.start_with?('@@')
|
78
|
+
return api_map.get_instance_variable_pins(namespace, scope).select{|pin| pin.name == word} if word.start_with?('@')
|
68
79
|
return api_map.pins.select{|pin| word_matches_context?(word, namespace, scope, pin)} if variable_name?(word)
|
69
80
|
result = []
|
70
81
|
cparts = namespace.split('::')
|
@@ -75,7 +86,8 @@ module Solargraph
|
|
75
86
|
cparts.pop
|
76
87
|
end
|
77
88
|
result.concat api_map.get_path_suggestions(word) if result.empty?
|
78
|
-
result.concat api_map.get_methods(namespace, scope: scope, visibility: [:public, :private, :protected]).select{|pin| pin.name == word} unless word.include?('::')
|
89
|
+
# result.concat api_map.get_methods(namespace, scope: scope, visibility: [:public, :private, :protected]).select{|pin| pin.name == word} unless word.include?('::')
|
90
|
+
result.concat api_map.get_method_stack(namespace, word, scope: scope) unless word.include?('::')
|
79
91
|
result.concat api_map.get_constants('', namespace).select{|pin| pin.name == word} if result.empty?
|
80
92
|
resolve_word_types(result, locals)
|
81
93
|
end
|
@@ -85,8 +97,9 @@ module Solargraph
|
|
85
97
|
next unless p.return_type.nil?
|
86
98
|
type = resolve_pin_type(p, locals)
|
87
99
|
# @todo Smelly instance variable access
|
88
|
-
p.instance_variable_set(:@
|
100
|
+
p.instance_variable_set(:@return_complex_types, ComplexType.parse(type)) unless type.nil?
|
89
101
|
end
|
102
|
+
pins
|
90
103
|
end
|
91
104
|
|
92
105
|
def infer_self context_pin
|
@@ -109,7 +122,8 @@ module Solargraph
|
|
109
122
|
namespace = api_map.qualify(relname, context_pin.namespace)
|
110
123
|
visibility = [:public]
|
111
124
|
visibility.push :protected, :private if internal
|
112
|
-
result = api_map.get_methods(namespace, scope: scope, visibility: visibility).select{|pin| pin.name == method_name}
|
125
|
+
# result = api_map.get_methods(namespace, scope: scope, visibility: visibility).select{|pin| pin.name == method_name}
|
126
|
+
result = api_map.get_method_stack(namespace, method_name, scope: scope).select{|pin| visibility.include?(pin.visibility)}
|
113
127
|
# @todo This needs more rules. Probably need to update YardObject for it.
|
114
128
|
return result if result.empty?
|
115
129
|
return result unless method_name == 'new' and result.first.path == 'Class#new'
|
@@ -165,9 +179,8 @@ module Solargraph
|
|
165
179
|
#
|
166
180
|
# @return [Pin::Method]
|
167
181
|
def virtual_new_pin new_pin, context_pin
|
168
|
-
pin = Pin::Method.new(new_pin.location,
|
182
|
+
pin = Pin::Method.new(new_pin.location, context_pin.path, new_pin.name, '', :class, new_pin.visibility, new_pin.parameters)
|
169
183
|
# @todo Smelly instance variable access.
|
170
|
-
# pin.instance_variable_set(:@return_type, context_pin.path)
|
171
184
|
pin.instance_variable_set(:@return_complex_types, ComplexType.parse(context_pin.path))
|
172
185
|
pin
|
173
186
|
end
|
@@ -177,6 +190,7 @@ module Solargraph
|
|
177
190
|
# @return [String]
|
178
191
|
def resolve_pin_type pin, locals
|
179
192
|
return pin.return_type unless pin.return_type.nil?
|
193
|
+
return pin.namespace if pin.kind == Pin::METHOD and pin.name == 'new' and pin.scope == :class
|
180
194
|
return resolve_block_parameter(pin, locals) if pin.kind == Pin::BLOCK_PARAMETER
|
181
195
|
return resolve_method_parameter(pin) if pin.is_a?(Pin::MethodParameter)
|
182
196
|
return resolve_variable(pin, locals) if pin.variable?
|
@@ -201,21 +215,18 @@ module Solargraph
|
|
201
215
|
return nil if subtypes.nil?
|
202
216
|
return subtypes[0]
|
203
217
|
else
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
return yps[pin.index].types[0]
|
208
|
-
end
|
218
|
+
yps = meth.docstring.tags(:yieldparam)
|
219
|
+
unless yps[pin.index].nil? or yps[pin.index].types.nil? or yps[pin.index].types.empty?
|
220
|
+
return yps[pin.index].types[0]
|
209
221
|
end
|
210
222
|
end
|
211
223
|
nil
|
212
224
|
end
|
213
225
|
|
214
226
|
def resolve_method_parameter pin
|
215
|
-
matches = api_map.
|
227
|
+
matches = api_map.get_method_stack(pin.namespace, pin.context.name, scope: pin.scope)
|
216
228
|
matches.each do |m|
|
217
229
|
next unless pin.context.parameters == m.parameters
|
218
|
-
next if m.docstring.nil?
|
219
230
|
tag = m.docstring.tags(:param).select{|t| t.name == pin.name}.first
|
220
231
|
next if tag.nil? or tag.types.nil?
|
221
232
|
return tag.types[0]
|