solargraph 0.58.1 → 0.59.0.dev.1
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/.envrc +3 -0
- data/.github/workflows/linting.yml +4 -5
- data/.github/workflows/plugins.yml +40 -36
- data/.github/workflows/rspec.yml +45 -13
- data/.github/workflows/typecheck.yml +2 -2
- data/.rubocop_todo.yml +27 -49
- data/README.md +3 -3
- data/Rakefile +1 -0
- data/lib/solargraph/api_map/cache.rb +110 -110
- data/lib/solargraph/api_map/constants.rb +289 -279
- data/lib/solargraph/api_map/index.rb +204 -193
- data/lib/solargraph/api_map/source_to_yard.rb +109 -97
- data/lib/solargraph/api_map/store.rb +387 -384
- data/lib/solargraph/api_map.rb +1000 -945
- data/lib/solargraph/complex_type/conformance.rb +176 -0
- data/lib/solargraph/complex_type/type_methods.rb +242 -228
- data/lib/solargraph/complex_type/unique_type.rb +632 -482
- data/lib/solargraph/complex_type.rb +549 -444
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
- data/lib/solargraph/convention/data_definition.rb +108 -105
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
- data/lib/solargraph/convention/struct_definition.rb +168 -164
- data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
- data/lib/solargraph/diagnostics/rubocop.rb +119 -118
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
- data/lib/solargraph/diagnostics/type_check.rb +56 -55
- data/lib/solargraph/doc_map.rb +200 -439
- data/lib/solargraph/equality.rb +34 -34
- data/lib/solargraph/gem_pins.rb +97 -98
- data/lib/solargraph/language_server/host/dispatch.rb +131 -130
- data/lib/solargraph/language_server/host/message_worker.rb +113 -112
- data/lib/solargraph/language_server/host/sources.rb +100 -99
- data/lib/solargraph/language_server/host.rb +883 -878
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +109 -114
- data/lib/solargraph/language_server/message/extended/document.rb +24 -23
- data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
- data/lib/solargraph/language_server/message/text_document/definition.rb +42 -40
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +28 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
- data/lib/solargraph/language_server/message/text_document/hover.rb +60 -58
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +27 -25
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +25 -23
- data/lib/solargraph/library.rb +729 -683
- data/lib/solargraph/location.rb +87 -82
- data/lib/solargraph/logging.rb +57 -37
- data/lib/solargraph/parser/comment_ripper.rb +76 -69
- data/lib/solargraph/parser/flow_sensitive_typing.rb +483 -255
- data/lib/solargraph/parser/node_processor/base.rb +122 -92
- data/lib/solargraph/parser/node_processor.rb +63 -62
- data/lib/solargraph/parser/parser_gem/class_methods.rb +167 -149
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
- data/lib/solargraph/parser/parser_gem/node_methods.rb +506 -486
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +41 -40
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
- data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +53 -52
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +296 -291
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
- data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
- data/lib/solargraph/parser/region.rb +75 -69
- data/lib/solargraph/parser/snippet.rb +17 -17
- data/lib/solargraph/pin/base.rb +761 -729
- data/lib/solargraph/pin/base_variable.rb +418 -126
- data/lib/solargraph/pin/block.rb +126 -104
- data/lib/solargraph/pin/breakable.rb +13 -9
- data/lib/solargraph/pin/callable.rb +278 -231
- data/lib/solargraph/pin/closure.rb +68 -72
- data/lib/solargraph/pin/common.rb +94 -79
- data/lib/solargraph/pin/compound_statement.rb +55 -0
- data/lib/solargraph/pin/conversions.rb +124 -123
- data/lib/solargraph/pin/delegated_method.rb +131 -120
- data/lib/solargraph/pin/documenting.rb +115 -114
- data/lib/solargraph/pin/instance_variable.rb +38 -34
- data/lib/solargraph/pin/keyword.rb +16 -20
- data/lib/solargraph/pin/local_variable.rb +31 -75
- data/lib/solargraph/pin/method.rb +720 -672
- data/lib/solargraph/pin/method_alias.rb +42 -34
- data/lib/solargraph/pin/namespace.rb +121 -115
- data/lib/solargraph/pin/parameter.rb +338 -275
- data/lib/solargraph/pin/proxy_type.rb +40 -39
- data/lib/solargraph/pin/reference/override.rb +47 -47
- data/lib/solargraph/pin/reference/superclass.rb +17 -15
- data/lib/solargraph/pin/reference.rb +41 -39
- data/lib/solargraph/pin/search.rb +62 -61
- data/lib/solargraph/pin/signature.rb +69 -61
- data/lib/solargraph/pin/symbol.rb +53 -53
- data/lib/solargraph/pin/until.rb +18 -18
- data/lib/solargraph/pin/while.rb +18 -18
- data/lib/solargraph/pin.rb +46 -44
- data/lib/solargraph/pin_cache.rb +665 -245
- data/lib/solargraph/position.rb +118 -119
- data/lib/solargraph/range.rb +112 -112
- data/lib/solargraph/rbs_map/conversions.rb +846 -823
- data/lib/solargraph/rbs_map/core_map.rb +65 -58
- data/lib/solargraph/rbs_map/stdlib_map.rb +72 -43
- data/lib/solargraph/rbs_map.rb +217 -163
- data/lib/solargraph/shell.rb +397 -352
- data/lib/solargraph/source/chain/call.rb +372 -337
- data/lib/solargraph/source/chain/constant.rb +28 -26
- data/lib/solargraph/source/chain/hash.rb +35 -34
- data/lib/solargraph/source/chain/if.rb +29 -28
- data/lib/solargraph/source/chain/instance_variable.rb +34 -13
- data/lib/solargraph/source/chain/literal.rb +53 -48
- data/lib/solargraph/source/chain/or.rb +31 -23
- data/lib/solargraph/source/chain.rb +294 -291
- data/lib/solargraph/source/change.rb +89 -82
- data/lib/solargraph/source/cursor.rb +172 -166
- data/lib/solargraph/source/source_chainer.rb +204 -194
- data/lib/solargraph/source/updater.rb +59 -55
- data/lib/solargraph/source.rb +524 -498
- data/lib/solargraph/source_map/clip.rb +237 -226
- data/lib/solargraph/source_map/data.rb +37 -34
- data/lib/solargraph/source_map/mapper.rb +282 -259
- data/lib/solargraph/source_map.rb +220 -212
- data/lib/solargraph/type_checker/problem.rb +34 -32
- data/lib/solargraph/type_checker/rules.rb +157 -84
- data/lib/solargraph/type_checker.rb +895 -814
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +257 -255
- data/lib/solargraph/workspace/gemspecs.rb +367 -0
- data/lib/solargraph/workspace/require_paths.rb +98 -97
- data/lib/solargraph/workspace.rb +362 -220
- data/lib/solargraph/yard_map/helpers.rb +45 -44
- data/lib/solargraph/yard_map/mapper/to_method.rb +134 -130
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
- data/lib/solargraph/yard_map/mapper.rb +84 -79
- data/lib/solargraph/yardoc.rb +97 -87
- data/lib/solargraph.rb +126 -105
- data/rbs/fills/rubygems/0/dependency.rbs +193 -0
- data/rbs/fills/tuple/tuple.rbs +28 -0
- data/rbs/shims/ast/0/node.rbs +5 -0
- data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
- data/rbs_collection.yaml +1 -1
- data/solargraph.gemspec +2 -1
- metadata +22 -17
- data/lib/solargraph/type_checker/checks.rb +0 -124
- data/lib/solargraph/type_checker/param_def.rb +0 -37
- data/lib/solargraph/yard_map/to_method.rb +0 -89
- data/sig/shims/ast/0/node.rbs +0 -5
- /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
|
@@ -1,231 +1,278 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Pin
|
|
5
|
-
class Callable < Closure
|
|
6
|
-
# @return [Signature]
|
|
7
|
-
attr_reader :block
|
|
8
|
-
|
|
9
|
-
attr_accessor :parameters
|
|
10
|
-
|
|
11
|
-
# @return [ComplexType, nil]
|
|
12
|
-
attr_reader :return_type
|
|
13
|
-
|
|
14
|
-
# @param block [Signature, nil]
|
|
15
|
-
# @param return_type [ComplexType, nil]
|
|
16
|
-
# @param parameters [::Array<Pin::Parameter>]
|
|
17
|
-
def initialize block: nil, return_type: nil, parameters: [], **splat
|
|
18
|
-
super(**splat)
|
|
19
|
-
@block = block
|
|
20
|
-
@return_type = return_type
|
|
21
|
-
@parameters = parameters
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# @
|
|
30
|
-
#
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
def
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
#
|
|
101
|
-
#
|
|
102
|
-
#
|
|
103
|
-
# @
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
# @return [
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class Callable < Closure
|
|
6
|
+
# @return [Signature]
|
|
7
|
+
attr_reader :block
|
|
8
|
+
|
|
9
|
+
attr_accessor :parameters
|
|
10
|
+
|
|
11
|
+
# @return [ComplexType, nil]
|
|
12
|
+
attr_reader :return_type
|
|
13
|
+
|
|
14
|
+
# @param block [Signature, nil]
|
|
15
|
+
# @param return_type [ComplexType, nil]
|
|
16
|
+
# @param parameters [::Array<Pin::Parameter>]
|
|
17
|
+
def initialize block: nil, return_type: nil, parameters: [], **splat
|
|
18
|
+
super(**splat)
|
|
19
|
+
@block = block
|
|
20
|
+
@return_type = return_type
|
|
21
|
+
@parameters = parameters
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def reset_generated!
|
|
25
|
+
parameters.each(&:reset_generated!)
|
|
26
|
+
super
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @sg-ignore Need to add nil check here
|
|
30
|
+
# @return [String]
|
|
31
|
+
def method_namespace
|
|
32
|
+
# @sg-ignore Need to add nil check here
|
|
33
|
+
closure.namespace
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# @param other [self]
|
|
37
|
+
#
|
|
38
|
+
# @return [Pin::Signature, nil]
|
|
39
|
+
def combine_blocks(other)
|
|
40
|
+
if block.nil?
|
|
41
|
+
other.block
|
|
42
|
+
elsif other.block.nil?
|
|
43
|
+
block
|
|
44
|
+
else
|
|
45
|
+
# @type [Pin::Signature, nil]
|
|
46
|
+
choose_pin_attr(other, :block)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# @param other [self]
|
|
51
|
+
# @param attrs [Hash{Symbol => Object}]
|
|
52
|
+
#
|
|
53
|
+
# @return [self]
|
|
54
|
+
def combine_with(other, attrs={})
|
|
55
|
+
new_attrs = {
|
|
56
|
+
block: combine_blocks(other),
|
|
57
|
+
return_type: combine_return_type(other),
|
|
58
|
+
}.merge(attrs)
|
|
59
|
+
new_attrs[:parameters] = choose_parameters(other).clone.freeze unless new_attrs.key?(:parameters)
|
|
60
|
+
super(other, new_attrs)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# @return [::Array<String>]
|
|
64
|
+
def parameter_names
|
|
65
|
+
@parameter_names ||= parameters.map(&:name)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def generics
|
|
69
|
+
[]
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# @param other [self]
|
|
73
|
+
#
|
|
74
|
+
# @return [Array<Pin::Parameter>]
|
|
75
|
+
def choose_parameters(other)
|
|
76
|
+
raise "Trying to combine two pins with different arities - \nself =#{inspect}, \nother=#{other.inspect}, \n\n self.arity=#{self.arity}, \nother.arity=#{other.arity}" if other.arity != arity
|
|
77
|
+
# @param param [Pin::Parameter]
|
|
78
|
+
# @param other_param [Pin::Parameter]
|
|
79
|
+
parameters.zip(other.parameters).map do |param, other_param|
|
|
80
|
+
if param.nil? && other_param.block?
|
|
81
|
+
other_param
|
|
82
|
+
elsif other_param.nil? && param.block?
|
|
83
|
+
param
|
|
84
|
+
else
|
|
85
|
+
param.combine_with(other_param)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# @sg-ignore Need to add nil check here
|
|
91
|
+
# @return [Array<Pin::Parameter>]
|
|
92
|
+
def blockless_parameters
|
|
93
|
+
if parameters.last&.block?
|
|
94
|
+
parameters[0..-2]
|
|
95
|
+
else
|
|
96
|
+
parameters
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# e.g., [["T"], "", "?", "foo:"] - parameter arity declarations,
|
|
101
|
+
# ignoring positional names. Used to match signatures.
|
|
102
|
+
#
|
|
103
|
+
# @return [Array<Array<String>, String, nil>]
|
|
104
|
+
def arity
|
|
105
|
+
[generics, blockless_parameters.map(&:arity_decl), block&.arity]
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# e.g., [["T"], "1", "?3", "foo:5"] - parameter arity
|
|
109
|
+
# declarations, including the number of unique types in each
|
|
110
|
+
# parameter. Used to determine whether combining two
|
|
111
|
+
# signatures has lost useful information mapping specific
|
|
112
|
+
# parameter types to specific return types.
|
|
113
|
+
#
|
|
114
|
+
# @return [Array<Array, String, nil>]
|
|
115
|
+
def type_arity
|
|
116
|
+
[generics, blockless_parameters.map(&:type_arity_decl), block&.type_arity]
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# Same as type_arity, but includes return type arity at the front.
|
|
120
|
+
#
|
|
121
|
+
# @return [Array<Array, String, nil>]
|
|
122
|
+
def full_type_arity
|
|
123
|
+
# @sg-ignore flow sensitive typing needs to handle attrs
|
|
124
|
+
[return_type ? return_type.items.count.to_s : nil] + type_arity
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# @param generics_to_resolve [Enumerable<String>]
|
|
128
|
+
# @param arg_types [Array<ComplexType>, nil]
|
|
129
|
+
# @param return_type_context [ComplexType, nil]
|
|
130
|
+
# @param yield_arg_types [Array<ComplexType>, nil]
|
|
131
|
+
# @param yield_return_type_context [ComplexType, nil]
|
|
132
|
+
# @param context [ComplexType, nil]
|
|
133
|
+
# @param resolved_generic_values [Hash{String => ComplexType}]
|
|
134
|
+
#
|
|
135
|
+
# @return [self]
|
|
136
|
+
def resolve_generics_from_context(generics_to_resolve,
|
|
137
|
+
arg_types = nil,
|
|
138
|
+
return_type_context = nil,
|
|
139
|
+
yield_arg_types = nil,
|
|
140
|
+
yield_return_type_context = nil,
|
|
141
|
+
resolved_generic_values: {})
|
|
142
|
+
callable = super(generics_to_resolve, return_type_context, resolved_generic_values: resolved_generic_values)
|
|
143
|
+
callable.parameters = callable.parameters.each_with_index.map do |param, i|
|
|
144
|
+
if arg_types.nil?
|
|
145
|
+
param.dup
|
|
146
|
+
else
|
|
147
|
+
param.resolve_generics_from_context(generics_to_resolve,
|
|
148
|
+
arg_types[i],
|
|
149
|
+
resolved_generic_values: resolved_generic_values)
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
callable.block = block.resolve_generics_from_context(generics_to_resolve,
|
|
153
|
+
yield_arg_types,
|
|
154
|
+
yield_return_type_context,
|
|
155
|
+
resolved_generic_values: resolved_generic_values) if callable.block?
|
|
156
|
+
callable
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def typify api_map
|
|
160
|
+
type = super
|
|
161
|
+
return type if type.defined?
|
|
162
|
+
if method_name.end_with?('?')
|
|
163
|
+
logger.debug { "Callable#typify(self=#{self}) => Boolean (? suffix)" }
|
|
164
|
+
ComplexType::BOOLEAN
|
|
165
|
+
else
|
|
166
|
+
logger.debug { "Callable#typify(self=#{self}) => undefined" }
|
|
167
|
+
ComplexType::UNDEFINED
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# @sg-ignore Need to add nil check here
|
|
172
|
+
# @return [String]
|
|
173
|
+
def method_name
|
|
174
|
+
raise "closure was nil in #{self.inspect}" if closure.nil?
|
|
175
|
+
# @sg-ignore Need to add nil check here
|
|
176
|
+
@method_name ||= closure.name
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# @param generics_to_resolve [::Array<String>]
|
|
180
|
+
# @param arg_types [Array<ComplexType>, nil]
|
|
181
|
+
# @param return_type_context [ComplexType, nil]
|
|
182
|
+
# @param yield_arg_types [Array<ComplexType>, nil]
|
|
183
|
+
# @param yield_return_type_context [ComplexType, nil]
|
|
184
|
+
# @param context [ComplexType, nil]
|
|
185
|
+
# @param resolved_generic_values [Hash{String => ComplexType}]
|
|
186
|
+
#
|
|
187
|
+
# @return [self]
|
|
188
|
+
def resolve_generics_from_context_until_complete(generics_to_resolve,
|
|
189
|
+
arg_types = nil,
|
|
190
|
+
return_type_context = nil,
|
|
191
|
+
yield_arg_types = nil,
|
|
192
|
+
yield_return_type_context = nil,
|
|
193
|
+
resolved_generic_values: {})
|
|
194
|
+
# See
|
|
195
|
+
# https://github.com/soutaro/steep/tree/master/lib/steep/type_inference
|
|
196
|
+
# and
|
|
197
|
+
# https://github.com/sorbet/sorbet/blob/master/infer/inference.cc
|
|
198
|
+
# for other implementations
|
|
199
|
+
|
|
200
|
+
return self if generics_to_resolve.empty?
|
|
201
|
+
|
|
202
|
+
last_resolved_generic_values = resolved_generic_values.dup
|
|
203
|
+
new_pin = resolve_generics_from_context(generics_to_resolve,
|
|
204
|
+
arg_types,
|
|
205
|
+
return_type_context,
|
|
206
|
+
yield_arg_types,
|
|
207
|
+
yield_return_type_context,
|
|
208
|
+
resolved_generic_values: resolved_generic_values)
|
|
209
|
+
if last_resolved_generic_values == resolved_generic_values
|
|
210
|
+
# erase anything unresolved
|
|
211
|
+
return new_pin.erase_generics(self.generics)
|
|
212
|
+
end
|
|
213
|
+
new_pin.resolve_generics_from_context_until_complete(generics_to_resolve,
|
|
214
|
+
arg_types,
|
|
215
|
+
return_type_context,
|
|
216
|
+
yield_arg_types,
|
|
217
|
+
yield_return_type_context,
|
|
218
|
+
resolved_generic_values: resolved_generic_values)
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
# @yieldparam [ComplexType]
|
|
222
|
+
# @yieldreturn [ComplexType]
|
|
223
|
+
# @return [self]
|
|
224
|
+
def transform_types(&transform)
|
|
225
|
+
# @todo 'super' alone should work here I think, but doesn't typecheck at level typed
|
|
226
|
+
callable = super(&transform)
|
|
227
|
+
callable.block = block.transform_types(&transform) if block?
|
|
228
|
+
callable.parameters = parameters.map do |param|
|
|
229
|
+
param.transform_types(&transform)
|
|
230
|
+
end
|
|
231
|
+
callable
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
# @param arguments [::Array<Chain>]
|
|
235
|
+
# @param with_block [Boolean]
|
|
236
|
+
# @return [Boolean]
|
|
237
|
+
def arity_matches? arguments, with_block
|
|
238
|
+
argcount = arguments.length
|
|
239
|
+
parcount = mandatory_positional_param_count
|
|
240
|
+
parcount -= 1 if !parameters.empty? && parameters.last.block?
|
|
241
|
+
return false if block? && !with_block
|
|
242
|
+
# @todo this and its caller should be changed so that this can
|
|
243
|
+
# look at the kwargs provided and check names against what
|
|
244
|
+
# we acccept
|
|
245
|
+
return false if argcount < parcount && !(argcount == parcount - 1 && parameters.last.restarg?)
|
|
246
|
+
true
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def reset_generated!
|
|
250
|
+
super
|
|
251
|
+
@parameters.each(&:reset_generated!)
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
# @return [Integer]
|
|
255
|
+
def mandatory_positional_param_count
|
|
256
|
+
parameters.count(&:arg?)
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
# @return [String]
|
|
260
|
+
def parameters_to_rbs
|
|
261
|
+
# @sg-ignore Need to add nil check here
|
|
262
|
+
rbs_generics + '(' + parameters.map { |param| param.to_rbs }.join(', ') + ') ' + (block.nil? ? '' : '{ ' + block.to_rbs + ' } ')
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def to_rbs
|
|
266
|
+
parameters_to_rbs + '-> ' + (return_type&.to_rbs || 'untyped')
|
|
267
|
+
end
|
|
268
|
+
|
|
269
|
+
def block?
|
|
270
|
+
!!@block
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
protected
|
|
274
|
+
|
|
275
|
+
attr_writer :block
|
|
276
|
+
end
|
|
277
|
+
end
|
|
278
|
+
end
|
|
@@ -1,72 +1,68 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Pin
|
|
5
|
-
class Closure <
|
|
6
|
-
# @return [::Symbol] :class or :instance
|
|
7
|
-
attr_reader :scope
|
|
8
|
-
|
|
9
|
-
# @param scope [::Symbol] :class or :instance
|
|
10
|
-
# @param generics [::Array<Pin::
|
|
11
|
-
# @param generic_defaults [Hash{String => ComplexType}]
|
|
12
|
-
def initialize scope: :class, generics: nil, generic_defaults: {}, **splat
|
|
13
|
-
super(**splat)
|
|
14
|
-
@scope = scope
|
|
15
|
-
@generics = generics
|
|
16
|
-
@generic_defaults = generic_defaults
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
# @return [Hash{String => ComplexType}]
|
|
20
|
-
def generic_defaults
|
|
21
|
-
@generic_defaults ||= {}
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# @param other [self]
|
|
25
|
-
# @param attrs [Hash{Symbol => Object}]
|
|
26
|
-
#
|
|
27
|
-
# @return [self]
|
|
28
|
-
def combine_with(other, attrs={})
|
|
29
|
-
new_attrs = {
|
|
30
|
-
scope: assert_same(other, :scope),
|
|
31
|
-
generics: generics.empty? ? other.generics : generics,
|
|
32
|
-
}.merge(attrs)
|
|
33
|
-
super(other, new_attrs)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def context
|
|
37
|
-
@context ||= begin
|
|
38
|
-
result = super
|
|
39
|
-
if scope == :instance
|
|
40
|
-
result.reduce_class_type
|
|
41
|
-
else
|
|
42
|
-
result
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# @
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def
|
|
57
|
-
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class Closure < CompoundStatement
|
|
6
|
+
# @return [::Symbol] :class or :instance
|
|
7
|
+
attr_reader :scope
|
|
8
|
+
|
|
9
|
+
# @param scope [::Symbol] :class or :instance
|
|
10
|
+
# @param generics [::Array<Pin::String>, nil]
|
|
11
|
+
# @param generic_defaults [Hash{String => ComplexType}]
|
|
12
|
+
def initialize scope: :class, generics: nil, generic_defaults: {}, **splat
|
|
13
|
+
super(**splat)
|
|
14
|
+
@scope = scope
|
|
15
|
+
@generics = generics
|
|
16
|
+
@generic_defaults = generic_defaults
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# @return [Hash{String => ComplexType}]
|
|
20
|
+
def generic_defaults
|
|
21
|
+
@generic_defaults ||= {}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @param other [self]
|
|
25
|
+
# @param attrs [Hash{Symbol => Object}]
|
|
26
|
+
#
|
|
27
|
+
# @return [self]
|
|
28
|
+
def combine_with(other, attrs={})
|
|
29
|
+
new_attrs = {
|
|
30
|
+
scope: assert_same(other, :scope),
|
|
31
|
+
generics: generics.empty? ? other.generics : generics,
|
|
32
|
+
}.merge(attrs)
|
|
33
|
+
super(other, new_attrs)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def context
|
|
37
|
+
@context ||= begin
|
|
38
|
+
result = super
|
|
39
|
+
if scope == :instance
|
|
40
|
+
result.reduce_class_type
|
|
41
|
+
else
|
|
42
|
+
result
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# @param api_map [Solargraph::ApiMap]
|
|
48
|
+
# @return [void]
|
|
49
|
+
def rebind api_map; end
|
|
50
|
+
|
|
51
|
+
# @return [::Array<String>]
|
|
52
|
+
def generics
|
|
53
|
+
@generics ||= docstring.tags(:generic).map(&:name)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def to_rbs
|
|
57
|
+
rbs_generics + return_type.to_rbs
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# @return [String]
|
|
61
|
+
def rbs_generics
|
|
62
|
+
return '' if generics.empty?
|
|
63
|
+
|
|
64
|
+
'[' + generics.map { |gen| gen.to_s }.join(', ') + '] '
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|