solargraph 0.25.1 → 0.26.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.rb +18 -16
- data/lib/solargraph/api_map.rb +100 -161
- data/lib/solargraph/api_map/source_to_yard.rb +9 -9
- data/lib/solargraph/api_map/store.rb +50 -13
- data/lib/solargraph/basic_type.rb +33 -0
- data/lib/solargraph/basic_type_methods.rb +111 -0
- data/lib/solargraph/complex_type.rb +51 -89
- data/lib/solargraph/core_fills.rb +12 -8
- data/lib/solargraph/diagnostics/type_not_defined.rb +2 -2
- data/lib/solargraph/language_server.rb +3 -0
- data/lib/solargraph/language_server/completion_item_kinds.rb +2 -0
- data/lib/solargraph/language_server/error_codes.rb +2 -0
- data/lib/solargraph/language_server/host.rb +53 -6
- data/lib/solargraph/language_server/message.rb +13 -0
- data/lib/solargraph/language_server/message/text_document/definition.rb +4 -6
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +2 -1
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -1
- data/lib/solargraph/language_server/message_types.rb +2 -0
- data/lib/solargraph/language_server/request.rb +4 -0
- data/lib/solargraph/language_server/symbol_kinds.rb +28 -26
- data/lib/solargraph/language_server/transport.rb +3 -0
- data/lib/solargraph/language_server/uri_helpers.rb +2 -0
- data/lib/solargraph/library.rb +12 -7
- data/lib/solargraph/pin.rb +1 -1
- data/lib/solargraph/pin/attribute.rb +5 -5
- data/lib/solargraph/pin/base.rb +51 -16
- data/lib/solargraph/pin/base_variable.rb +25 -7
- data/lib/solargraph/pin/block.rb +18 -1
- data/lib/solargraph/pin/block_parameter.rb +42 -5
- data/lib/solargraph/pin/conversions.rb +4 -2
- data/lib/solargraph/pin/method.rb +6 -6
- data/lib/solargraph/pin/method_parameter.rb +6 -6
- data/lib/solargraph/pin/namespace.rb +7 -2
- data/lib/solargraph/pin/proxy_type.rb +39 -0
- data/lib/solargraph/pin/symbol.rb +20 -12
- data/lib/solargraph/pin/yard_pin/method.rb +2 -2
- data/lib/solargraph/source.rb +89 -38
- data/lib/solargraph/source/call_chainer.rb +273 -0
- data/lib/solargraph/source/chain.rb +104 -0
- data/lib/solargraph/source/chain/call.rb +72 -0
- data/lib/solargraph/source/chain/class_variable.rb +11 -0
- data/lib/solargraph/source/chain/constant.rb +17 -0
- data/lib/solargraph/source/chain/definition.rb +16 -0
- data/lib/solargraph/source/chain/global_variable.rb +11 -0
- data/lib/solargraph/source/chain/head.rb +20 -0
- data/lib/solargraph/source/chain/instance_variable.rb +11 -0
- data/lib/solargraph/source/chain/link.rb +33 -0
- data/lib/solargraph/source/chain/literal.rb +21 -0
- data/lib/solargraph/source/chain/variable.rb +11 -0
- data/lib/solargraph/source/change.rb +3 -1
- data/lib/solargraph/{api_map → source}/completion.rb +3 -1
- data/lib/solargraph/source/encoding_fixes.rb +21 -0
- data/lib/solargraph/source/fragment.rb +139 -284
- data/lib/solargraph/source/mapper.rb +27 -16
- data/lib/solargraph/source/node_chainer.rb +94 -0
- data/lib/solargraph/source/node_methods.rb +2 -2
- data/lib/solargraph/source/position.rb +4 -0
- data/lib/solargraph/source/range.rb +10 -2
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/yard_map.rb +13 -2
- metadata +20 -6
- data/lib/solargraph/api_map/probe.rb +0 -251
- data/lib/solargraph/api_map/type_methods.rb +0 -40
- data/lib/solargraph/pin/proxy_method.rb +0 -30
data/lib/solargraph/pin.rb
CHANGED
@@ -20,7 +20,7 @@ module Solargraph
|
|
20
20
|
autoload :Documenting, 'solargraph/pin/documenting'
|
21
21
|
autoload :Block, 'solargraph/pin/block'
|
22
22
|
autoload :Localized, 'solargraph/pin/localized'
|
23
|
-
autoload :
|
23
|
+
autoload :ProxyType, 'solargraph/pin/proxy_type'
|
24
24
|
autoload :DuckMethod, 'solargraph/pin/duck_method'
|
25
25
|
autoload :YardPin, 'solargraph/pin/yard_pin'
|
26
26
|
|
@@ -29,13 +29,13 @@ module Solargraph
|
|
29
29
|
@path ||= namespace + (scope == :instance ? '#' : '.') + name
|
30
30
|
end
|
31
31
|
|
32
|
-
def
|
33
|
-
if @
|
34
|
-
@
|
32
|
+
def return_complex_type
|
33
|
+
if @return_complex_type.nil?
|
34
|
+
@return_complex_type = ComplexType.new
|
35
35
|
tag = docstring.tag(:return)
|
36
|
-
@
|
36
|
+
@return_complex_type = ComplexType.parse(*tag.types) unless tag.nil?
|
37
37
|
end
|
38
|
-
@
|
38
|
+
@return_complex_type
|
39
39
|
end
|
40
40
|
|
41
41
|
def visibility
|
data/lib/solargraph/pin/base.rb
CHANGED
@@ -9,15 +9,15 @@ module Solargraph
|
|
9
9
|
# @return [Solargraph::Source::Location]
|
10
10
|
attr_reader :location
|
11
11
|
|
12
|
+
# The namespace in which this pin is defined.
|
13
|
+
# The root namespace is an empty string.
|
14
|
+
#
|
12
15
|
# @return [String]
|
13
16
|
attr_reader :namespace
|
14
17
|
|
15
18
|
# @return [String]
|
16
19
|
attr_reader :name
|
17
20
|
|
18
|
-
# @return [String]
|
19
|
-
attr_reader :comments
|
20
|
-
|
21
21
|
# @return [Integer]
|
22
22
|
attr_reader :kind
|
23
23
|
|
@@ -32,7 +32,12 @@ module Solargraph
|
|
32
32
|
@location = location
|
33
33
|
@namespace = namespace
|
34
34
|
@name = name
|
35
|
-
@comments = comments
|
35
|
+
@comments = comments
|
36
|
+
end
|
37
|
+
|
38
|
+
# @return [String]
|
39
|
+
def comments
|
40
|
+
@comments ||= ''
|
36
41
|
end
|
37
42
|
|
38
43
|
# @return [String]
|
@@ -65,6 +70,7 @@ module Solargraph
|
|
65
70
|
false
|
66
71
|
end
|
67
72
|
|
73
|
+
# @return [Boolean]
|
68
74
|
def yard_pin?
|
69
75
|
false
|
70
76
|
end
|
@@ -105,33 +111,38 @@ module Solargraph
|
|
105
111
|
#
|
106
112
|
# @return [String]
|
107
113
|
def return_type
|
108
|
-
return nil if
|
109
|
-
|
114
|
+
return nil if return_complex_type.void?
|
115
|
+
return_complex_type.first.tag
|
110
116
|
end
|
111
117
|
|
112
118
|
# The namespace of the first return type.
|
113
119
|
# Use return_complex_types for an array of all return types.
|
114
120
|
#
|
121
|
+
# @deprecated Not in active internal use
|
122
|
+
#
|
115
123
|
# @return [String]
|
116
124
|
def return_namespace
|
117
|
-
|
118
|
-
|
125
|
+
return_type
|
126
|
+
return nil if return_complex_type.void?
|
127
|
+
@return_namespace ||= return_complex_type.first.namespace
|
119
128
|
end
|
120
129
|
|
121
130
|
# The scope of the first return type.
|
122
131
|
# Use return_complex_types for an array of all return types.
|
123
132
|
#
|
133
|
+
# @deprecated Not in active internal use
|
134
|
+
#
|
124
135
|
# @return [String]
|
125
136
|
def return_scope
|
126
|
-
return nil if
|
127
|
-
@return_scope ||=
|
137
|
+
return nil if return_complex_type.void?
|
138
|
+
@return_scope ||= return_complex_type.first.scope
|
128
139
|
end
|
129
140
|
|
130
141
|
# All of the pin's return types as an array of ComplexTypes.
|
131
142
|
#
|
132
|
-
# @return [
|
133
|
-
def
|
134
|
-
@
|
143
|
+
# @return [ComplexType]
|
144
|
+
def return_complex_type
|
145
|
+
@return_complex_type ||= ComplexType.new
|
135
146
|
end
|
136
147
|
|
137
148
|
# @return [YARD::Docstring]
|
@@ -140,7 +151,7 @@ module Solargraph
|
|
140
151
|
@docstring ||= YARD::Docstring.parser.parse('').to_docstring
|
141
152
|
end
|
142
153
|
|
143
|
-
# @
|
154
|
+
# @return [Array<YARD::Tags::Directive>]
|
144
155
|
def directives
|
145
156
|
parse_comments unless defined?(@directives)
|
146
157
|
@directives
|
@@ -159,6 +170,17 @@ module Solargraph
|
|
159
170
|
@maybe_directives ||= comments.include?('@!')
|
160
171
|
end
|
161
172
|
|
173
|
+
# @return [Boolean]
|
174
|
+
def deprecated?
|
175
|
+
@deprecated ||= docstring.has_tag?('deprecated')
|
176
|
+
end
|
177
|
+
|
178
|
+
# @param api_map [ApiMap]
|
179
|
+
# @return [ComplexType]
|
180
|
+
def infer api_map
|
181
|
+
return_complex_type.qualify(api_map, namespace)
|
182
|
+
end
|
183
|
+
|
162
184
|
# Try to merge data from another pin. Merges are only possible if the
|
163
185
|
# pins are near matches (see the #nearly? method). The changes should
|
164
186
|
# not have any side effects on the API surface.
|
@@ -171,8 +193,9 @@ module Solargraph
|
|
171
193
|
if comments != pin.comments
|
172
194
|
@comments = pin.comments
|
173
195
|
@docstring = pin.docstring
|
174
|
-
@
|
196
|
+
@return_complex_type = pin.return_complex_type
|
175
197
|
@documentation = nil
|
198
|
+
@deprecated = nil
|
176
199
|
reset_conversions
|
177
200
|
end
|
178
201
|
true
|
@@ -192,6 +215,12 @@ module Solargraph
|
|
192
215
|
end
|
193
216
|
end
|
194
217
|
|
218
|
+
# True if two docstrings have the same tags, regardless of any other
|
219
|
+
# differences.
|
220
|
+
#
|
221
|
+
# @param d1 [YARD::Docstring]
|
222
|
+
# @param d2 [YARD::Docstring]
|
223
|
+
# @return [boolean]
|
195
224
|
def compare_docstring_tags d1, d2
|
196
225
|
return false if d1.tags.length != d2.tags.length
|
197
226
|
d1.tags.each_index do |i|
|
@@ -200,6 +229,9 @@ module Solargraph
|
|
200
229
|
true
|
201
230
|
end
|
202
231
|
|
232
|
+
# @param d1 [Array<YARD::Tags::Directive>]
|
233
|
+
# @param d2 [Array<YARD::Tags::Directive>]
|
234
|
+
# @return [Boolean]
|
203
235
|
def compare_directives d1, d2
|
204
236
|
return false if d1.length != d2.length
|
205
237
|
d1.each_index do |i|
|
@@ -208,8 +240,11 @@ module Solargraph
|
|
208
240
|
true
|
209
241
|
end
|
210
242
|
|
243
|
+
# @param t1 [YARD::Tags::Tag]
|
244
|
+
# @param t2 [YARD::Tags::Tag]
|
245
|
+
# @return [Boolean]
|
211
246
|
def compare_tags t1, t2
|
212
|
-
|
247
|
+
t1.class == t2.class and
|
213
248
|
t1.tag_name == t2.tag_name and
|
214
249
|
t1.text == t2.text and
|
215
250
|
t1.name == t2.name and
|
@@ -1,17 +1,23 @@
|
|
1
1
|
module Solargraph
|
2
2
|
module Pin
|
3
3
|
class BaseVariable < Base
|
4
|
+
include Solargraph::Source::NodeMethods
|
5
|
+
|
4
6
|
attr_reader :signature
|
5
7
|
|
6
8
|
attr_reader :context
|
7
9
|
|
8
|
-
def initialize location, namespace, name, comments,
|
10
|
+
def initialize location, namespace, name, comments, assignment, literal, context
|
9
11
|
super(location, namespace, name, comments)
|
10
|
-
@
|
12
|
+
@assignment = assignment
|
11
13
|
@literal = literal
|
12
14
|
@context = context
|
13
15
|
end
|
14
16
|
|
17
|
+
def signature
|
18
|
+
@signature ||= resolve_node_signature(@assignment)
|
19
|
+
end
|
20
|
+
|
15
21
|
def scope
|
16
22
|
@scope ||= (context.kind == Pin::METHOD and context.scope == :instance ? :instance : :class)
|
17
23
|
end
|
@@ -25,8 +31,8 @@ module Solargraph
|
|
25
31
|
Solargraph::LanguageServer::SymbolKinds::VARIABLE
|
26
32
|
end
|
27
33
|
|
28
|
-
def
|
29
|
-
@
|
34
|
+
def return_complex_type
|
35
|
+
@return_complex_type ||= generate_complex_type
|
30
36
|
end
|
31
37
|
|
32
38
|
def nil_assignment?
|
@@ -37,6 +43,18 @@ module Solargraph
|
|
37
43
|
true
|
38
44
|
end
|
39
45
|
|
46
|
+
# @param api_map [ApiMap]
|
47
|
+
def infer api_map
|
48
|
+
result = super
|
49
|
+
return result if result.defined? or @assignment.nil?
|
50
|
+
# chain = Source::Chain.new(filename, @assignment)
|
51
|
+
# @todo Use NodeChainer
|
52
|
+
chain = Source::NodeChainer.chain(location.filename, @assignment)
|
53
|
+
fragment = api_map.fragment_at(location)
|
54
|
+
locals = fragment.locals - [self]
|
55
|
+
chain.infer_type_with(api_map, context, locals)
|
56
|
+
end
|
57
|
+
|
40
58
|
def == other
|
41
59
|
return false unless super
|
42
60
|
signature == other.signature
|
@@ -45,17 +63,17 @@ module Solargraph
|
|
45
63
|
def try_merge! pin
|
46
64
|
return false unless super
|
47
65
|
@signature = pin.signature
|
48
|
-
@
|
66
|
+
@return_complex_type = pin.return_complex_type
|
49
67
|
true
|
50
68
|
end
|
51
69
|
|
52
70
|
private
|
53
71
|
|
54
|
-
def
|
72
|
+
def generate_complex_type
|
55
73
|
tag = docstring.tag(:type)
|
56
74
|
return ComplexType.parse(*tag.types) unless tag.nil?
|
57
75
|
return ComplexType.parse(@literal) unless @literal.nil?
|
58
|
-
|
76
|
+
ComplexType.new
|
59
77
|
end
|
60
78
|
end
|
61
79
|
end
|
data/lib/solargraph/pin/block.rb
CHANGED
@@ -1,21 +1,38 @@
|
|
1
1
|
module Solargraph
|
2
2
|
module Pin
|
3
3
|
class Block < Base
|
4
|
+
# The signature of the method that receives this block.
|
5
|
+
#
|
6
|
+
# @return [Parser::AST::Node]
|
4
7
|
attr_reader :receiver
|
8
|
+
|
9
|
+
# @return [Array<String>]
|
5
10
|
attr_reader :parameters
|
6
11
|
|
7
|
-
|
12
|
+
attr_reader :scope
|
13
|
+
|
14
|
+
def initialize location, namespace, name, comments, receiver, scope
|
8
15
|
super(location, namespace, name, comments)
|
9
16
|
@receiver = receiver
|
17
|
+
@scope = scope
|
10
18
|
end
|
11
19
|
|
12
20
|
def kind
|
13
21
|
Pin::BLOCK
|
14
22
|
end
|
15
23
|
|
24
|
+
def return_complex_type
|
25
|
+
@return_complex_type ||= Solargraph::ComplexType.parse(namespace)
|
26
|
+
end
|
27
|
+
|
16
28
|
def parameters
|
17
29
|
@parameters ||= []
|
18
30
|
end
|
31
|
+
|
32
|
+
def nearly? other
|
33
|
+
return false unless super
|
34
|
+
receiver == other.receiver and parameters == other.parameters
|
35
|
+
end
|
19
36
|
end
|
20
37
|
end
|
21
38
|
end
|
@@ -34,19 +34,56 @@ module Solargraph
|
|
34
34
|
block.parameters.index(self)
|
35
35
|
end
|
36
36
|
|
37
|
+
def nearly? other
|
38
|
+
return false unless super
|
39
|
+
block.nearly?(other.block)
|
40
|
+
end
|
41
|
+
|
42
|
+
def try_merge! other
|
43
|
+
return false unless super
|
44
|
+
@block = other.block
|
45
|
+
@presence = block.location.range
|
46
|
+
@return_complex_type = nil
|
47
|
+
end
|
48
|
+
|
37
49
|
# @return [Array<Solargraph::ComplexType>]
|
38
|
-
def
|
39
|
-
if @
|
40
|
-
@
|
50
|
+
def return_complex_type
|
51
|
+
if @return_complex_type.nil?
|
52
|
+
@return_complex_type = ComplexType.new
|
41
53
|
found = nil
|
42
54
|
params = block.docstring.tags(:param)
|
43
55
|
params.each do |p|
|
44
56
|
next unless p.name == name
|
45
57
|
found = p
|
46
58
|
end
|
47
|
-
@
|
59
|
+
@return_complex_type = ComplexType.parse(*found.types) unless found.nil? or found.types.nil?
|
60
|
+
end
|
61
|
+
@return_complex_type
|
62
|
+
end
|
63
|
+
|
64
|
+
def context
|
65
|
+
block
|
66
|
+
end
|
67
|
+
|
68
|
+
def infer api_map
|
69
|
+
return return_complex_type unless return_complex_type.undefined?
|
70
|
+
chain = Source::NodeChainer.chain(location.filename, block.receiver)
|
71
|
+
fragment = api_map.fragment_at(location)
|
72
|
+
locals = fragment.locals - [self]
|
73
|
+
meths = chain.define_with(api_map, block, fragment.locals)
|
74
|
+
meths.each do |meth|
|
75
|
+
if (Solargraph::CoreFills::METHODS_WITH_YIELDPARAM_SUBTYPES.include?(meth.path))
|
76
|
+
bmeth = chain.define_base_with(api_map, context, locals).first
|
77
|
+
return ComplexType::UNDEFINED if bmeth.nil? or bmeth.return_complex_type.undefined? or bmeth.return_complex_type.subtypes.empty?
|
78
|
+
return bmeth.return_complex_type.subtypes.first.qualify(api_map)
|
79
|
+
else
|
80
|
+
yps = meth.docstring.tags(:yieldparam)
|
81
|
+
unless yps[index].nil? or yps[index].types.nil? or yps[index].types.empty?
|
82
|
+
return ComplexType.parse(yps[index].types[0]).first
|
83
|
+
end
|
84
|
+
end
|
48
85
|
end
|
49
|
-
|
86
|
+
ComplexType::UNDEFINED
|
50
87
|
end
|
51
88
|
end
|
52
89
|
end
|
@@ -11,7 +11,8 @@ module Solargraph
|
|
11
11
|
data: {
|
12
12
|
path: path,
|
13
13
|
return_type: return_type,
|
14
|
-
location: location
|
14
|
+
location: location,
|
15
|
+
deprecated: deprecated?
|
15
16
|
}
|
16
17
|
}
|
17
18
|
end
|
@@ -43,7 +44,7 @@ module Solargraph
|
|
43
44
|
if @detail.nil?
|
44
45
|
@detail = ''
|
45
46
|
@detail += "(#{parameters.join(', ')}) " unless kind != Pin::METHOD or parameters.empty?
|
46
|
-
@detail += "=> #{
|
47
|
+
@detail += "=> #{return_complex_type.tag}" unless return_complex_type.undefined?
|
47
48
|
@detail.strip!
|
48
49
|
end
|
49
50
|
return nil if @detail.empty?
|
@@ -68,6 +69,7 @@ module Solargraph
|
|
68
69
|
private
|
69
70
|
|
70
71
|
def generate_link
|
72
|
+
return nil if return_complex_type.undefined?
|
71
73
|
this_path = path || return_type
|
72
74
|
return nil if this_path.nil?
|
73
75
|
"[#{this_path.gsub('_', '\\\\_')}](solargraph:/document?query=#{URI.encode(this_path)})"
|
@@ -39,8 +39,8 @@ module Solargraph
|
|
39
39
|
LanguageServer::SymbolKinds::METHOD
|
40
40
|
end
|
41
41
|
|
42
|
-
def
|
43
|
-
@
|
42
|
+
def return_complex_type
|
43
|
+
@return_complex_type ||= generate_complex_type
|
44
44
|
end
|
45
45
|
|
46
46
|
def documentation
|
@@ -72,19 +72,19 @@ module Solargraph
|
|
72
72
|
|
73
73
|
private
|
74
74
|
|
75
|
-
# @return [
|
76
|
-
def
|
75
|
+
# @return [ComplexType]
|
76
|
+
def generate_complex_type
|
77
77
|
tag = docstring.tag(:return)
|
78
78
|
if tag.nil?
|
79
79
|
ol = docstring.tag(:overload)
|
80
80
|
tag = ol.tag(:return) unless ol.nil?
|
81
81
|
end
|
82
|
-
return
|
82
|
+
return ComplexType::UNDEFINED if tag.nil? or tag.types.nil? or tag.types.empty?
|
83
83
|
begin
|
84
84
|
ComplexType.parse *tag.types
|
85
85
|
rescue Solargraph::ComplexTypeError => e
|
86
86
|
STDERR.puts e.message
|
87
|
-
|
87
|
+
ComplexType::UNDEFINED
|
88
88
|
end
|
89
89
|
end
|
90
90
|
end
|
@@ -1,26 +1,26 @@
|
|
1
1
|
module Solargraph
|
2
2
|
module Pin
|
3
3
|
class MethodParameter < LocalVariable
|
4
|
-
def
|
5
|
-
if @
|
6
|
-
@
|
4
|
+
def return_complex_type
|
5
|
+
if @return_complex_type.nil?
|
6
|
+
@return_complex_type = ComplexType.new
|
7
7
|
found = nil
|
8
8
|
params = block.docstring.tags(:param)
|
9
9
|
params.each do |p|
|
10
10
|
next unless p.name == name
|
11
11
|
found = p
|
12
12
|
end
|
13
|
-
@
|
13
|
+
@return_complex_type = ComplexType.parse(*found.types) unless found.nil? or found.types.nil?
|
14
14
|
end
|
15
15
|
super
|
16
|
-
@
|
16
|
+
@return_complex_type
|
17
17
|
end
|
18
18
|
|
19
19
|
def try_merge! pin
|
20
20
|
return false unless super
|
21
21
|
# @todo This is a little expensive, but it's necessary because
|
22
22
|
# parameter data depends on the method's docstring.
|
23
|
-
@
|
23
|
+
@return_complex_type = pin.return_complex_type
|
24
24
|
reset_conversions
|
25
25
|
true
|
26
26
|
end
|