solargraph 0.39.15 → 0.39.16
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/Rakefile +12 -1
- data/lib/solargraph/api_map.rb +18 -15
- data/lib/solargraph/api_map/store.rb +1 -1
- data/lib/solargraph/complex_type.rb +2 -2
- data/lib/solargraph/core_fills.rb +8 -4
- data/lib/solargraph/parser/legacy/node_processors/send_node.rb +2 -1
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +2 -1
- data/lib/solargraph/pin/base_method.rb +8 -0
- data/lib/solargraph/pin/conversions.rb +2 -3
- data/lib/solargraph/pin/yard_pin/method.rb +4 -4
- data/lib/solargraph/source/chain.rb +18 -5
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/yard_map.rb +2 -0
- data/lib/solargraph/yard_map/mapper.rb +3 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 949ea02c957254c5fd37a427a4eacbdc55b185c14e2372b659eb0ec4ca3fd254
|
4
|
+
data.tar.gz: cdd35fd88fc71ed5421d1a4cbd6033791e44a00bc6bd695ea57055004ea09c94
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4db457d03f5464a15fedd4b6cd6dc60b591a7574013ef5babb246d33e6469078134511a77f80455dc52e47ac1d8d428b78e02c3bc818fe58b665e32f45331a7c
|
7
|
+
data.tar.gz: 17b166d81771a0a508e954c7c83ce9ceed0830a0d7c4f4d568a57cac1eb8b23524be0a23f4eaa049fd99b90415faea7be664c02b939e5103795cabc15a4a3ca4
|
data/Rakefile
CHANGED
@@ -11,4 +11,15 @@ end
|
|
11
11
|
desc "Open a Pry session preloaded with this library"
|
12
12
|
task :console do
|
13
13
|
sh "pry -I lib -r solargraph.rb"
|
14
|
-
end
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "Run the type checker"
|
17
|
+
task :typecheck do
|
18
|
+
sh "bundle exec solargraph typecheck --level typed"
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "Run all tests"
|
22
|
+
task :test do
|
23
|
+
Rake::Task["typecheck"].invoke
|
24
|
+
Rake::Task["spec"].invoke
|
25
|
+
end
|
data/lib/solargraph/api_map.rb
CHANGED
@@ -386,9 +386,7 @@ module Solargraph
|
|
386
386
|
# @return [Array<Solargraph::Pin::Base>]
|
387
387
|
def get_path_suggestions path
|
388
388
|
return [] if path.nil?
|
389
|
-
|
390
|
-
result.concat store.get_path_pins(path)
|
391
|
-
resolve_method_aliases(result)
|
389
|
+
resolve_method_aliases store.get_path_pins(path)
|
392
390
|
end
|
393
391
|
|
394
392
|
# Get an array of pins that match the specified path.
|
@@ -447,7 +445,7 @@ module Solargraph
|
|
447
445
|
# @return [Array<Solargraph::Pin::Base>]
|
448
446
|
def locate_pins location
|
449
447
|
return [] if location.nil? || !source_map_hash.has_key?(location.filename)
|
450
|
-
source_map_hash[location.filename].locate_pins(location)
|
448
|
+
resolve_method_aliases source_map_hash[location.filename].locate_pins(location)
|
451
449
|
end
|
452
450
|
|
453
451
|
# @raise [FileNotFoundError] if the cursor's file is not in the ApiMap
|
@@ -464,7 +462,7 @@ module Solargraph
|
|
464
462
|
# @return [Array<Pin::Symbol>]
|
465
463
|
def document_symbols filename
|
466
464
|
return [] unless source_map_hash.has_key?(filename) # @todo Raise error?
|
467
|
-
source_map_hash[filename].document_symbols
|
465
|
+
resolve_method_aliases source_map_hash[filename].document_symbols
|
468
466
|
end
|
469
467
|
|
470
468
|
# @return [Array<SourceMap>]
|
@@ -659,6 +657,7 @@ module Solargraph
|
|
659
657
|
return nil if name.nil?
|
660
658
|
return nil if skip.include?(root)
|
661
659
|
skip.add root
|
660
|
+
possibles = []
|
662
661
|
if name == ''
|
663
662
|
if root == ''
|
664
663
|
return ''
|
@@ -674,16 +673,19 @@ module Solargraph
|
|
674
673
|
incs = store.get_includes(roots.join('::'))
|
675
674
|
incs.each do |inc|
|
676
675
|
foundinc = inner_qualify(name, inc, skip)
|
677
|
-
|
676
|
+
possibles.push foundinc unless foundinc.nil?
|
678
677
|
end
|
679
678
|
roots.pop
|
680
679
|
end
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
680
|
+
if possibles.empty?
|
681
|
+
incs = store.get_includes('')
|
682
|
+
incs.each do |inc|
|
683
|
+
foundinc = inner_qualify(name, inc, skip)
|
684
|
+
possibles.push foundinc unless foundinc.nil?
|
685
|
+
end
|
685
686
|
end
|
686
687
|
return name if store.namespace_exists?(name)
|
688
|
+
return possibles.last
|
687
689
|
end
|
688
690
|
end
|
689
691
|
|
@@ -723,7 +725,7 @@ module Solargraph
|
|
723
725
|
result = []
|
724
726
|
pins.each do |pin|
|
725
727
|
resolved = resolve_method_alias(pin)
|
726
|
-
next
|
728
|
+
next if resolved.respond_to?(:visibility) && !visibility.include?(resolved.visibility)
|
727
729
|
result.push resolved
|
728
730
|
end
|
729
731
|
result
|
@@ -737,15 +739,16 @@ module Solargraph
|
|
737
739
|
origin = get_method_stack(pin.full_context.namespace, pin.original, scope: pin.scope).first
|
738
740
|
@method_alias_stack.pop
|
739
741
|
return pin if origin.nil?
|
740
|
-
|
742
|
+
args = {
|
741
743
|
location: pin.location,
|
742
744
|
closure: pin.closure,
|
743
745
|
name: pin.name,
|
744
746
|
comments: origin.comments,
|
745
747
|
scope: origin.scope,
|
746
|
-
visibility: origin.visibility
|
747
|
-
|
748
|
-
)
|
748
|
+
visibility: origin.visibility
|
749
|
+
}
|
750
|
+
args[:parameters] = origin.parameters if origin.is_a?(Pin::Method)
|
751
|
+
origin.class.new **args
|
749
752
|
end
|
750
753
|
end
|
751
754
|
end
|
@@ -218,7 +218,7 @@ module Solargraph
|
|
218
218
|
@pin_select_cache = {}
|
219
219
|
@namespace_map = set.classify(&:namespace).transform_values(&:to_a)
|
220
220
|
@path_pin_hash = set.classify(&:path).transform_values(&:to_a)
|
221
|
-
@namespaces = @path_pin_hash.keys.compact
|
221
|
+
@namespaces = @path_pin_hash.keys.compact.to_set
|
222
222
|
pins_by_class(Pin::Reference::Include).each do |pin|
|
223
223
|
include_references[pin.namespace] ||= []
|
224
224
|
include_references[pin.namespace].push pin.name
|
@@ -12,7 +12,7 @@ module Solargraph
|
|
12
12
|
|
13
13
|
# @param types [Array<UniqueType>]
|
14
14
|
def initialize types = [UniqueType::UNDEFINED]
|
15
|
-
@items = types
|
15
|
+
@items = types.uniq(&:to_s)
|
16
16
|
end
|
17
17
|
|
18
18
|
# @param api_map [ApiMap]
|
@@ -113,7 +113,7 @@ module Solargraph
|
|
113
113
|
#
|
114
114
|
# @param *strings [Array<String>] The type definitions to parse
|
115
115
|
# @param partial [Boolean] True if the string is part of a another type
|
116
|
-
# @return [ComplexType]
|
116
|
+
# @return [ComplexType, Array, nil]
|
117
117
|
def parse *strings, partial: false
|
118
118
|
@cache ||= {}
|
119
119
|
unless partial
|
@@ -53,6 +53,7 @@ module Solargraph
|
|
53
53
|
@return_single_parameter
|
54
54
|
@return_single_parameter
|
55
55
|
)),
|
56
|
+
Override.method_return('Array#concat', 'Array'),
|
56
57
|
Override.from_comment('Array#first', %(
|
57
58
|
@overload first(num)
|
58
59
|
@param num [Integer]
|
@@ -65,6 +66,7 @@ module Solargraph
|
|
65
66
|
@return [self]
|
66
67
|
@return_single_parameter
|
67
68
|
)),
|
69
|
+
Override.method_return('Array#map', 'Array'),
|
68
70
|
Override.method_return('Array#uniq', 'self'),
|
69
71
|
Override.method_return('Array#zip', 'Array, nil'),
|
70
72
|
|
@@ -102,6 +104,8 @@ module Solargraph
|
|
102
104
|
@param_tuple
|
103
105
|
)),
|
104
106
|
|
107
|
+
Override.method_return('Hash#merge', 'Hash'),
|
108
|
+
|
105
109
|
Override.from_comment('Integer#+', %(
|
106
110
|
@param y [Numeric]
|
107
111
|
@return [Numeric]
|
@@ -109,10 +113,6 @@ module Solargraph
|
|
109
113
|
|
110
114
|
Override.method_return('Kernel#puts', 'nil'),
|
111
115
|
|
112
|
-
# Override.method_return('Module#attr_reader', 'void'),
|
113
|
-
# Override.method_return('Module#attr_writer', 'void'),
|
114
|
-
# Override.method_return('Module#attr_accessor', 'void'),
|
115
|
-
|
116
116
|
Override.from_comment('Numeric#+', %(
|
117
117
|
@param y [Numeric]
|
118
118
|
@return [Numeric]
|
@@ -148,6 +148,10 @@ module Solargraph
|
|
148
148
|
Override.method_return('String#lines', 'Array<String>'),
|
149
149
|
Override.from_comment('String#each_line', %(
|
150
150
|
@yieldparam [String]
|
151
|
+
)),
|
152
|
+
Override.from_comment('String.new', %(
|
153
|
+
@overload new(*)
|
154
|
+
@return [self]
|
151
155
|
))
|
152
156
|
].concat(
|
153
157
|
methods_with_yieldparam_subtypes.map do |path|
|
@@ -90,7 +90,8 @@ module Solargraph
|
|
90
90
|
if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
|
91
91
|
cp = region.closure
|
92
92
|
node.children[2..-1].each do |i|
|
93
|
-
|
93
|
+
type = region.scope == :class ? Pin::Reference::Extend : Pin::Reference::Include
|
94
|
+
pins.push type.new(
|
94
95
|
location: get_node_location(i),
|
95
96
|
closure: cp,
|
96
97
|
name: unpack_name(i)
|
@@ -91,7 +91,8 @@ module Solargraph
|
|
91
91
|
return unless Parser.is_ast_node?(node.children.last)
|
92
92
|
node.children.last.children[0..-2].each do |i|
|
93
93
|
next unless [:COLON2, :COLON3, :CONST].include?(i.type)
|
94
|
-
|
94
|
+
type = region.scope == :class ? Pin::Reference::Extend : Pin::Reference::Include
|
95
|
+
pins.push type.new(
|
95
96
|
location: get_node_location(i),
|
96
97
|
closure: region.closure,
|
97
98
|
name: unpack_name(i)
|
@@ -84,6 +84,14 @@ module Solargraph
|
|
84
84
|
@explicit
|
85
85
|
end
|
86
86
|
|
87
|
+
def completion_item_kind
|
88
|
+
Solargraph::LanguageServer::CompletionItemKinds::METHOD
|
89
|
+
end
|
90
|
+
|
91
|
+
def symbol_kind
|
92
|
+
Solargraph::LanguageServer::SymbolKinds::METHOD
|
93
|
+
end
|
94
|
+
|
87
95
|
private
|
88
96
|
|
89
97
|
# @return [ComplexType]
|
@@ -23,16 +23,15 @@ module Solargraph
|
|
23
23
|
|
24
24
|
# @return [Hash]
|
25
25
|
def resolve_completion_item
|
26
|
-
|
26
|
+
@resolve_completion_item ||= begin
|
27
27
|
extra = {}
|
28
28
|
alldoc = ''
|
29
29
|
# alldoc += link_documentation unless link_documentation.nil?
|
30
30
|
# alldoc += "\n\n" unless alldoc.empty?
|
31
31
|
alldoc += documentation unless documentation.nil?
|
32
32
|
extra[:documentation] = alldoc unless alldoc.empty?
|
33
|
-
|
33
|
+
completion_item.merge(extra)
|
34
34
|
end
|
35
|
-
@resolve_completion_item
|
36
35
|
end
|
37
36
|
|
38
37
|
# @return [Hash]
|
@@ -54,11 +54,11 @@ module Solargraph
|
|
54
54
|
# @param a [Array]
|
55
55
|
# @return [String]
|
56
56
|
def arg_name a
|
57
|
-
a[0].
|
57
|
+
a[0].gsub(/[^a-z0-9_]/i, '')
|
58
58
|
end
|
59
59
|
|
60
60
|
# @param a [Array]
|
61
|
-
# @return [Symbol]
|
61
|
+
# @return [::Symbol]
|
62
62
|
def arg_type a
|
63
63
|
if a[0].start_with?('**')
|
64
64
|
:kwrestarg
|
@@ -66,10 +66,10 @@ module Solargraph
|
|
66
66
|
:restarg
|
67
67
|
elsif a[0].start_with?('&')
|
68
68
|
:blockarg
|
69
|
+
elsif a[0].end_with?(':')
|
70
|
+
a[1] ? :kwoptarg : :kwarg
|
69
71
|
elsif a[1]
|
70
72
|
:optarg
|
71
|
-
elsif a[0].end_with?(':')
|
72
|
-
a[1] ? :kwarg : :kwoptarg
|
73
73
|
else
|
74
74
|
:arg
|
75
75
|
end
|
@@ -110,18 +110,21 @@ module Solargraph
|
|
110
110
|
# @param api_map [ApiMap]
|
111
111
|
# @return [ComplexType]
|
112
112
|
def infer_first_defined pins, context, api_map
|
113
|
-
|
113
|
+
possibles = []
|
114
114
|
pins.each do |pin|
|
115
115
|
# Avoid infinite recursion
|
116
116
|
next if @@inference_stack.include?(pin.identity)
|
117
117
|
@@inference_stack.push pin.identity
|
118
118
|
type = pin.typify(api_map)
|
119
119
|
@@inference_stack.pop
|
120
|
-
|
120
|
+
if type.defined?
|
121
|
+
possibles.push type
|
122
|
+
break if pin.is_a?(Pin::BaseMethod)
|
123
|
+
end
|
121
124
|
end
|
122
|
-
if
|
125
|
+
if possibles.empty?
|
123
126
|
# Limit method inference recursion
|
124
|
-
return
|
127
|
+
return ComplexType::UNDEFINED if @@inference_depth >= 10 && pins.first.is_a?(Pin::BaseMethod)
|
125
128
|
@@inference_depth += 1
|
126
129
|
pins.each do |pin|
|
127
130
|
# Avoid infinite recursion
|
@@ -129,10 +132,20 @@ module Solargraph
|
|
129
132
|
@@inference_stack.push pin.identity
|
130
133
|
type = pin.probe(api_map)
|
131
134
|
@@inference_stack.pop
|
132
|
-
|
135
|
+
if type.defined?
|
136
|
+
possibles.push type
|
137
|
+
break if pin.is_a?(Pin::BaseMethod)
|
138
|
+
end
|
133
139
|
end
|
134
140
|
@@inference_depth -= 1
|
135
141
|
end
|
142
|
+
return ComplexType::UNDEFINED if possibles.empty?
|
143
|
+
type = if possibles.length > 1
|
144
|
+
sorted = possibles.map { |t| t.rooted? ? "::#{t}" : t.to_s }.sort { |a, _| a == 'nil' ? 1 : 0 }
|
145
|
+
ComplexType.parse(*sorted)
|
146
|
+
else
|
147
|
+
possibles.first
|
148
|
+
end
|
136
149
|
return type if context.nil? || context.return_type.undefined?
|
137
150
|
type.self_to(context.return_type.namespace)
|
138
151
|
end
|
data/lib/solargraph/version.rb
CHANGED
data/lib/solargraph/yard_map.rb
CHANGED
@@ -158,10 +158,12 @@ module Solargraph
|
|
158
158
|
@cache ||= YardMap::Cache.new
|
159
159
|
end
|
160
160
|
|
161
|
+
# @return [Hash]
|
161
162
|
def pin_class_hash
|
162
163
|
@pin_class_hash ||= pins.to_set.classify(&:class).transform_values(&:to_a)
|
163
164
|
end
|
164
165
|
|
166
|
+
# @return [Array<Pin::Base>]
|
165
167
|
def pins_by_class klass
|
166
168
|
@pin_select_cache[klass] ||= pin_class_hash.select { |key, _| key <= klass }.values.flatten
|
167
169
|
end
|
@@ -35,10 +35,10 @@ module Solargraph
|
|
35
35
|
# This method of superclass detection is a bit of a hack. If
|
36
36
|
# the superclass is a Proxy, it is assumed to be undefined in its
|
37
37
|
# yardoc and converted to a fully qualified namespace.
|
38
|
-
if code_object.superclass.is_a?(YARD::CodeObjects::Proxy)
|
39
|
-
|
38
|
+
superclass = if code_object.superclass.is_a?(YARD::CodeObjects::Proxy)
|
39
|
+
"::#{code_object.superclass}"
|
40
40
|
else
|
41
|
-
|
41
|
+
code_object.superclass.to_s
|
42
42
|
end
|
43
43
|
result.push Solargraph::Pin::Reference::Superclass.new(name: superclass, closure: nspin)
|
44
44
|
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.39.
|
4
|
+
version: 0.39.16
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Fred Snyder
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: backport
|