solargraph 0.58.1 → 0.58.2
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/.gitignore +1 -0
- data/CHANGELOG.md +7 -1
- data/lib/solargraph/api_map/cache.rb +110 -110
- data/lib/solargraph/api_map/constants.rb +279 -279
- data/lib/solargraph/api_map/index.rb +193 -193
- data/lib/solargraph/api_map/source_to_yard.rb +97 -97
- data/lib/solargraph/api_map/store.rb +384 -384
- data/lib/solargraph/api_map.rb +945 -945
- data/lib/solargraph/complex_type/type_methods.rb +228 -228
- data/lib/solargraph/complex_type/unique_type.rb +482 -482
- data/lib/solargraph/complex_type.rb +444 -444
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -91
- data/lib/solargraph/convention/data_definition.rb +105 -105
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -61
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -102
- data/lib/solargraph/convention/struct_definition.rb +164 -164
- data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
- data/lib/solargraph/diagnostics/rubocop.rb +118 -118
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -68
- data/lib/solargraph/diagnostics/type_check.rb +55 -55
- data/lib/solargraph/doc_map.rb +439 -439
- data/lib/solargraph/equality.rb +34 -34
- data/lib/solargraph/gem_pins.rb +98 -98
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +130 -130
- data/lib/solargraph/language_server/host/message_worker.rb +112 -112
- data/lib/solargraph/language_server/host/sources.rb +99 -99
- data/lib/solargraph/language_server/host.rb +878 -878
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
- data/lib/solargraph/language_server/message/extended/document.rb +23 -23
- data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
- data/lib/solargraph/language_server/message/text_document/definition.rb +40 -40
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -148
- data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -25
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
- data/lib/solargraph/library.rb +683 -683
- data/lib/solargraph/location.rb +82 -82
- data/lib/solargraph/logging.rb +37 -37
- data/lib/solargraph/parser/comment_ripper.rb +69 -69
- data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -255
- data/lib/solargraph/parser/node_processor/base.rb +92 -92
- data/lib/solargraph/parser/node_processor.rb +62 -62
- data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -149
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -166
- data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -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 +59 -59
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -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 +53 -53
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -23
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -59
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -38
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -52
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -291
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -70
- data/lib/solargraph/parser/region.rb +69 -69
- data/lib/solargraph/parser/snippet.rb +17 -17
- data/lib/solargraph/pin/base.rb +729 -729
- data/lib/solargraph/pin/base_variable.rb +126 -126
- data/lib/solargraph/pin/block.rb +104 -104
- data/lib/solargraph/pin/breakable.rb +9 -9
- data/lib/solargraph/pin/callable.rb +231 -231
- data/lib/solargraph/pin/closure.rb +72 -72
- data/lib/solargraph/pin/common.rb +79 -79
- data/lib/solargraph/pin/conversions.rb +123 -123
- data/lib/solargraph/pin/delegated_method.rb +120 -120
- data/lib/solargraph/pin/documenting.rb +114 -114
- data/lib/solargraph/pin/instance_variable.rb +34 -34
- data/lib/solargraph/pin/keyword.rb +20 -20
- data/lib/solargraph/pin/local_variable.rb +75 -75
- data/lib/solargraph/pin/method.rb +672 -672
- data/lib/solargraph/pin/method_alias.rb +34 -34
- data/lib/solargraph/pin/namespace.rb +115 -115
- data/lib/solargraph/pin/parameter.rb +275 -275
- data/lib/solargraph/pin/proxy_type.rb +39 -39
- data/lib/solargraph/pin/reference/override.rb +47 -47
- data/lib/solargraph/pin/reference/superclass.rb +15 -15
- data/lib/solargraph/pin/reference.rb +39 -39
- data/lib/solargraph/pin/search.rb +61 -61
- data/lib/solargraph/pin/signature.rb +61 -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 +44 -44
- data/lib/solargraph/pin_cache.rb +245 -245
- data/lib/solargraph/position.rb +132 -119
- data/lib/solargraph/range.rb +112 -112
- data/lib/solargraph/rbs_map/conversions.rb +823 -823
- data/lib/solargraph/rbs_map/core_map.rb +58 -58
- data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
- data/lib/solargraph/rbs_map.rb +163 -163
- data/lib/solargraph/shell.rb +352 -352
- data/lib/solargraph/source/chain/call.rb +337 -337
- data/lib/solargraph/source/chain/constant.rb +26 -26
- data/lib/solargraph/source/chain/hash.rb +34 -34
- data/lib/solargraph/source/chain/if.rb +28 -28
- data/lib/solargraph/source/chain/instance_variable.rb +13 -13
- data/lib/solargraph/source/chain/literal.rb +48 -48
- data/lib/solargraph/source/chain/or.rb +23 -23
- data/lib/solargraph/source/chain.rb +291 -291
- data/lib/solargraph/source/change.rb +82 -82
- data/lib/solargraph/source/cursor.rb +166 -166
- data/lib/solargraph/source/source_chainer.rb +194 -194
- data/lib/solargraph/source/updater.rb +55 -55
- data/lib/solargraph/source.rb +498 -498
- data/lib/solargraph/source_map/clip.rb +226 -226
- data/lib/solargraph/source_map/data.rb +34 -34
- data/lib/solargraph/source_map/mapper.rb +259 -259
- data/lib/solargraph/source_map.rb +212 -212
- data/lib/solargraph/type_checker/checks.rb +124 -124
- data/lib/solargraph/type_checker/param_def.rb +37 -37
- data/lib/solargraph/type_checker/problem.rb +32 -32
- data/lib/solargraph/type_checker/rules.rb +84 -84
- data/lib/solargraph/type_checker.rb +814 -814
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +255 -255
- data/lib/solargraph/workspace/require_paths.rb +97 -97
- data/lib/solargraph/workspace.rb +220 -220
- data/lib/solargraph/yard_map/helpers.rb +44 -44
- data/lib/solargraph/yard_map/mapper/to_method.rb +130 -130
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -31
- data/lib/solargraph/yard_map/mapper.rb +79 -79
- data/lib/solargraph/yard_map/to_method.rb +89 -89
- data/lib/solargraph/yardoc.rb +87 -87
- data/lib/solargraph.rb +105 -105
- data/rbs_collection.yaml +1 -1
- metadata +12 -12
- /data/{sig → rbs}/shims/ast/0/node.rbs +0 -0
- /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,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
|
-
# @return [String]
|
|
25
|
-
def method_namespace
|
|
26
|
-
closure.namespace
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
# @param other [self]
|
|
30
|
-
#
|
|
31
|
-
# @return [Pin::Signature, nil]
|
|
32
|
-
def combine_blocks(other)
|
|
33
|
-
if block.nil?
|
|
34
|
-
other.block
|
|
35
|
-
elsif other.block.nil?
|
|
36
|
-
block
|
|
37
|
-
else
|
|
38
|
-
# @type [Pin::Signature, nil]
|
|
39
|
-
choose_pin_attr(other, :block)
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
# @param other [self]
|
|
44
|
-
# @param attrs [Hash{Symbol => Object}]
|
|
45
|
-
#
|
|
46
|
-
# @return [self]
|
|
47
|
-
def combine_with(other, attrs={})
|
|
48
|
-
new_attrs = {
|
|
49
|
-
block: combine_blocks(other),
|
|
50
|
-
return_type: combine_return_type(other),
|
|
51
|
-
}.merge(attrs)
|
|
52
|
-
new_attrs[:parameters] = choose_parameters(other).clone.freeze unless new_attrs.key?(:parameters)
|
|
53
|
-
super(other, new_attrs)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
# @return [::Array<String>]
|
|
57
|
-
def parameter_names
|
|
58
|
-
@parameter_names ||= parameters.map(&:name)
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def generics
|
|
62
|
-
[]
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# @param other [self]
|
|
66
|
-
#
|
|
67
|
-
# @return [Array<Pin::Parameter>]
|
|
68
|
-
def choose_parameters(other)
|
|
69
|
-
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
|
|
70
|
-
# @param param [Pin::Parameter]
|
|
71
|
-
# @param other_param [Pin::Parameter]
|
|
72
|
-
parameters.zip(other.parameters).map do |param, other_param|
|
|
73
|
-
if param.nil? && other_param.block?
|
|
74
|
-
other_param
|
|
75
|
-
elsif other_param.nil? && param.block?
|
|
76
|
-
param
|
|
77
|
-
else
|
|
78
|
-
param.combine_with(other_param)
|
|
79
|
-
end
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
# @return [Array<Pin::Parameter>]
|
|
84
|
-
def blockless_parameters
|
|
85
|
-
if parameters.last&.block?
|
|
86
|
-
parameters[0..-2]
|
|
87
|
-
else
|
|
88
|
-
parameters
|
|
89
|
-
end
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
# @return [Array]
|
|
93
|
-
def arity
|
|
94
|
-
[generics, blockless_parameters.map(&:arity_decl), block&.arity]
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
# @param generics_to_resolve [Enumerable<String>]
|
|
98
|
-
# @param arg_types [Array<ComplexType>, nil]
|
|
99
|
-
# @param return_type_context [ComplexType, nil]
|
|
100
|
-
# @param yield_arg_types [Array<ComplexType>, nil]
|
|
101
|
-
# @param yield_return_type_context [ComplexType, nil]
|
|
102
|
-
# @param context [ComplexType, nil]
|
|
103
|
-
# @param resolved_generic_values [Hash{String => ComplexType}]
|
|
104
|
-
# @return [self]
|
|
105
|
-
def resolve_generics_from_context(generics_to_resolve,
|
|
106
|
-
arg_types = nil,
|
|
107
|
-
return_type_context = nil,
|
|
108
|
-
yield_arg_types = nil,
|
|
109
|
-
yield_return_type_context = nil,
|
|
110
|
-
resolved_generic_values: {})
|
|
111
|
-
callable = super(generics_to_resolve, return_type_context, resolved_generic_values: resolved_generic_values)
|
|
112
|
-
callable.parameters = callable.parameters.each_with_index.map do |param, i|
|
|
113
|
-
if arg_types.nil?
|
|
114
|
-
param.dup
|
|
115
|
-
else
|
|
116
|
-
param.resolve_generics_from_context(generics_to_resolve,
|
|
117
|
-
arg_types[i],
|
|
118
|
-
resolved_generic_values: resolved_generic_values)
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
callable.block = block.resolve_generics_from_context(generics_to_resolve,
|
|
122
|
-
yield_arg_types,
|
|
123
|
-
yield_return_type_context,
|
|
124
|
-
resolved_generic_values: resolved_generic_values) if callable.block?
|
|
125
|
-
callable
|
|
126
|
-
end
|
|
127
|
-
|
|
128
|
-
def typify api_map
|
|
129
|
-
type = super
|
|
130
|
-
return type if type.defined?
|
|
131
|
-
if method_name.end_with?('?')
|
|
132
|
-
logger.debug { "Callable#typify(self=#{self}) => Boolean (? suffix)" }
|
|
133
|
-
ComplexType::BOOLEAN
|
|
134
|
-
else
|
|
135
|
-
logger.debug { "Callable#typify(self=#{self}) => undefined" }
|
|
136
|
-
ComplexType::UNDEFINED
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
# @return [String]
|
|
141
|
-
def method_name
|
|
142
|
-
raise "closure was nil in #{self.inspect}" if closure.nil?
|
|
143
|
-
@method_name ||= closure.name
|
|
144
|
-
end
|
|
145
|
-
|
|
146
|
-
# @param generics_to_resolve [::Array<String>]
|
|
147
|
-
# @param arg_types [Array<ComplexType>, nil]
|
|
148
|
-
# @param return_type_context [ComplexType, nil]
|
|
149
|
-
# @param yield_arg_types [Array<ComplexType>, nil]
|
|
150
|
-
# @param yield_return_type_context [ComplexType, nil]
|
|
151
|
-
# @param context [ComplexType, nil]
|
|
152
|
-
# @param resolved_generic_values [Hash{String => ComplexType}]
|
|
153
|
-
# @return [self]
|
|
154
|
-
def resolve_generics_from_context_until_complete(generics_to_resolve,
|
|
155
|
-
arg_types = nil,
|
|
156
|
-
return_type_context = nil,
|
|
157
|
-
yield_arg_types = nil,
|
|
158
|
-
yield_return_type_context = nil,
|
|
159
|
-
resolved_generic_values: {})
|
|
160
|
-
# See
|
|
161
|
-
# https://github.com/soutaro/steep/tree/master/lib/steep/type_inference
|
|
162
|
-
# and
|
|
163
|
-
# https://github.com/sorbet/sorbet/blob/master/infer/inference.cc
|
|
164
|
-
# for other implementations
|
|
165
|
-
|
|
166
|
-
return self if generics_to_resolve.empty?
|
|
167
|
-
|
|
168
|
-
last_resolved_generic_values = resolved_generic_values.dup
|
|
169
|
-
new_pin = resolve_generics_from_context(generics_to_resolve,
|
|
170
|
-
arg_types,
|
|
171
|
-
return_type_context,
|
|
172
|
-
yield_arg_types,
|
|
173
|
-
yield_return_type_context,
|
|
174
|
-
resolved_generic_values: resolved_generic_values)
|
|
175
|
-
if last_resolved_generic_values == resolved_generic_values
|
|
176
|
-
# erase anything unresolved
|
|
177
|
-
return new_pin.erase_generics(self.generics)
|
|
178
|
-
end
|
|
179
|
-
new_pin.resolve_generics_from_context_until_complete(generics_to_resolve,
|
|
180
|
-
arg_types,
|
|
181
|
-
return_type_context,
|
|
182
|
-
yield_arg_types,
|
|
183
|
-
yield_return_type_context,
|
|
184
|
-
resolved_generic_values: resolved_generic_values)
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
# @return [Array<String>]
|
|
188
|
-
# @yieldparam [ComplexType]
|
|
189
|
-
# @yieldreturn [ComplexType]
|
|
190
|
-
# @return [self]
|
|
191
|
-
def transform_types(&transform)
|
|
192
|
-
# @todo 'super' alone should work here I think, but doesn't typecheck at level typed
|
|
193
|
-
callable = super(&transform)
|
|
194
|
-
callable.block = block.transform_types(&transform) if block?
|
|
195
|
-
callable.parameters = parameters.map do |param|
|
|
196
|
-
param.transform_types(&transform)
|
|
197
|
-
end
|
|
198
|
-
callable
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
# @param arguments [::Array<Chain>]
|
|
202
|
-
# @param with_block [Boolean]
|
|
203
|
-
# @return [Boolean]
|
|
204
|
-
def arity_matches? arguments, with_block
|
|
205
|
-
argcount = arguments.length
|
|
206
|
-
parcount = mandatory_positional_param_count
|
|
207
|
-
parcount -= 1 if !parameters.empty? && parameters.last.block?
|
|
208
|
-
return false if block? && !with_block
|
|
209
|
-
return false if argcount < parcount && !(argcount == parcount - 1 && parameters.last.restarg?)
|
|
210
|
-
true
|
|
211
|
-
end
|
|
212
|
-
|
|
213
|
-
# @return [Integer]
|
|
214
|
-
def mandatory_positional_param_count
|
|
215
|
-
parameters.count(&:arg?)
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
def to_rbs
|
|
219
|
-
rbs_generics + '(' + parameters.map { |param| param.to_rbs }.join(', ') + ') ' + (block.nil? ? '' : '{ ' + block.to_rbs + ' } ') + '-> ' + return_type.to_rbs
|
|
220
|
-
end
|
|
221
|
-
|
|
222
|
-
def block?
|
|
223
|
-
!!@block
|
|
224
|
-
end
|
|
225
|
-
|
|
226
|
-
protected
|
|
227
|
-
|
|
228
|
-
attr_writer :block
|
|
229
|
-
end
|
|
230
|
-
end
|
|
231
|
-
end
|
|
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
|
+
# @return [String]
|
|
25
|
+
def method_namespace
|
|
26
|
+
closure.namespace
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @param other [self]
|
|
30
|
+
#
|
|
31
|
+
# @return [Pin::Signature, nil]
|
|
32
|
+
def combine_blocks(other)
|
|
33
|
+
if block.nil?
|
|
34
|
+
other.block
|
|
35
|
+
elsif other.block.nil?
|
|
36
|
+
block
|
|
37
|
+
else
|
|
38
|
+
# @type [Pin::Signature, nil]
|
|
39
|
+
choose_pin_attr(other, :block)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# @param other [self]
|
|
44
|
+
# @param attrs [Hash{Symbol => Object}]
|
|
45
|
+
#
|
|
46
|
+
# @return [self]
|
|
47
|
+
def combine_with(other, attrs={})
|
|
48
|
+
new_attrs = {
|
|
49
|
+
block: combine_blocks(other),
|
|
50
|
+
return_type: combine_return_type(other),
|
|
51
|
+
}.merge(attrs)
|
|
52
|
+
new_attrs[:parameters] = choose_parameters(other).clone.freeze unless new_attrs.key?(:parameters)
|
|
53
|
+
super(other, new_attrs)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# @return [::Array<String>]
|
|
57
|
+
def parameter_names
|
|
58
|
+
@parameter_names ||= parameters.map(&:name)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def generics
|
|
62
|
+
[]
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# @param other [self]
|
|
66
|
+
#
|
|
67
|
+
# @return [Array<Pin::Parameter>]
|
|
68
|
+
def choose_parameters(other)
|
|
69
|
+
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
|
|
70
|
+
# @param param [Pin::Parameter]
|
|
71
|
+
# @param other_param [Pin::Parameter]
|
|
72
|
+
parameters.zip(other.parameters).map do |param, other_param|
|
|
73
|
+
if param.nil? && other_param.block?
|
|
74
|
+
other_param
|
|
75
|
+
elsif other_param.nil? && param.block?
|
|
76
|
+
param
|
|
77
|
+
else
|
|
78
|
+
param.combine_with(other_param)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# @return [Array<Pin::Parameter>]
|
|
84
|
+
def blockless_parameters
|
|
85
|
+
if parameters.last&.block?
|
|
86
|
+
parameters[0..-2]
|
|
87
|
+
else
|
|
88
|
+
parameters
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# @return [Array]
|
|
93
|
+
def arity
|
|
94
|
+
[generics, blockless_parameters.map(&:arity_decl), block&.arity]
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# @param generics_to_resolve [Enumerable<String>]
|
|
98
|
+
# @param arg_types [Array<ComplexType>, nil]
|
|
99
|
+
# @param return_type_context [ComplexType, nil]
|
|
100
|
+
# @param yield_arg_types [Array<ComplexType>, nil]
|
|
101
|
+
# @param yield_return_type_context [ComplexType, nil]
|
|
102
|
+
# @param context [ComplexType, nil]
|
|
103
|
+
# @param resolved_generic_values [Hash{String => ComplexType}]
|
|
104
|
+
# @return [self]
|
|
105
|
+
def resolve_generics_from_context(generics_to_resolve,
|
|
106
|
+
arg_types = nil,
|
|
107
|
+
return_type_context = nil,
|
|
108
|
+
yield_arg_types = nil,
|
|
109
|
+
yield_return_type_context = nil,
|
|
110
|
+
resolved_generic_values: {})
|
|
111
|
+
callable = super(generics_to_resolve, return_type_context, resolved_generic_values: resolved_generic_values)
|
|
112
|
+
callable.parameters = callable.parameters.each_with_index.map do |param, i|
|
|
113
|
+
if arg_types.nil?
|
|
114
|
+
param.dup
|
|
115
|
+
else
|
|
116
|
+
param.resolve_generics_from_context(generics_to_resolve,
|
|
117
|
+
arg_types[i],
|
|
118
|
+
resolved_generic_values: resolved_generic_values)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
callable.block = block.resolve_generics_from_context(generics_to_resolve,
|
|
122
|
+
yield_arg_types,
|
|
123
|
+
yield_return_type_context,
|
|
124
|
+
resolved_generic_values: resolved_generic_values) if callable.block?
|
|
125
|
+
callable
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def typify api_map
|
|
129
|
+
type = super
|
|
130
|
+
return type if type.defined?
|
|
131
|
+
if method_name.end_with?('?')
|
|
132
|
+
logger.debug { "Callable#typify(self=#{self}) => Boolean (? suffix)" }
|
|
133
|
+
ComplexType::BOOLEAN
|
|
134
|
+
else
|
|
135
|
+
logger.debug { "Callable#typify(self=#{self}) => undefined" }
|
|
136
|
+
ComplexType::UNDEFINED
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# @return [String]
|
|
141
|
+
def method_name
|
|
142
|
+
raise "closure was nil in #{self.inspect}" if closure.nil?
|
|
143
|
+
@method_name ||= closure.name
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# @param generics_to_resolve [::Array<String>]
|
|
147
|
+
# @param arg_types [Array<ComplexType>, nil]
|
|
148
|
+
# @param return_type_context [ComplexType, nil]
|
|
149
|
+
# @param yield_arg_types [Array<ComplexType>, nil]
|
|
150
|
+
# @param yield_return_type_context [ComplexType, nil]
|
|
151
|
+
# @param context [ComplexType, nil]
|
|
152
|
+
# @param resolved_generic_values [Hash{String => ComplexType}]
|
|
153
|
+
# @return [self]
|
|
154
|
+
def resolve_generics_from_context_until_complete(generics_to_resolve,
|
|
155
|
+
arg_types = nil,
|
|
156
|
+
return_type_context = nil,
|
|
157
|
+
yield_arg_types = nil,
|
|
158
|
+
yield_return_type_context = nil,
|
|
159
|
+
resolved_generic_values: {})
|
|
160
|
+
# See
|
|
161
|
+
# https://github.com/soutaro/steep/tree/master/lib/steep/type_inference
|
|
162
|
+
# and
|
|
163
|
+
# https://github.com/sorbet/sorbet/blob/master/infer/inference.cc
|
|
164
|
+
# for other implementations
|
|
165
|
+
|
|
166
|
+
return self if generics_to_resolve.empty?
|
|
167
|
+
|
|
168
|
+
last_resolved_generic_values = resolved_generic_values.dup
|
|
169
|
+
new_pin = resolve_generics_from_context(generics_to_resolve,
|
|
170
|
+
arg_types,
|
|
171
|
+
return_type_context,
|
|
172
|
+
yield_arg_types,
|
|
173
|
+
yield_return_type_context,
|
|
174
|
+
resolved_generic_values: resolved_generic_values)
|
|
175
|
+
if last_resolved_generic_values == resolved_generic_values
|
|
176
|
+
# erase anything unresolved
|
|
177
|
+
return new_pin.erase_generics(self.generics)
|
|
178
|
+
end
|
|
179
|
+
new_pin.resolve_generics_from_context_until_complete(generics_to_resolve,
|
|
180
|
+
arg_types,
|
|
181
|
+
return_type_context,
|
|
182
|
+
yield_arg_types,
|
|
183
|
+
yield_return_type_context,
|
|
184
|
+
resolved_generic_values: resolved_generic_values)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# @return [Array<String>]
|
|
188
|
+
# @yieldparam [ComplexType]
|
|
189
|
+
# @yieldreturn [ComplexType]
|
|
190
|
+
# @return [self]
|
|
191
|
+
def transform_types(&transform)
|
|
192
|
+
# @todo 'super' alone should work here I think, but doesn't typecheck at level typed
|
|
193
|
+
callable = super(&transform)
|
|
194
|
+
callable.block = block.transform_types(&transform) if block?
|
|
195
|
+
callable.parameters = parameters.map do |param|
|
|
196
|
+
param.transform_types(&transform)
|
|
197
|
+
end
|
|
198
|
+
callable
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# @param arguments [::Array<Chain>]
|
|
202
|
+
# @param with_block [Boolean]
|
|
203
|
+
# @return [Boolean]
|
|
204
|
+
def arity_matches? arguments, with_block
|
|
205
|
+
argcount = arguments.length
|
|
206
|
+
parcount = mandatory_positional_param_count
|
|
207
|
+
parcount -= 1 if !parameters.empty? && parameters.last.block?
|
|
208
|
+
return false if block? && !with_block
|
|
209
|
+
return false if argcount < parcount && !(argcount == parcount - 1 && parameters.last.restarg?)
|
|
210
|
+
true
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# @return [Integer]
|
|
214
|
+
def mandatory_positional_param_count
|
|
215
|
+
parameters.count(&:arg?)
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def to_rbs
|
|
219
|
+
rbs_generics + '(' + parameters.map { |param| param.to_rbs }.join(', ') + ') ' + (block.nil? ? '' : '{ ' + block.to_rbs + ' } ') + '-> ' + return_type.to_rbs
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def block?
|
|
223
|
+
!!@block
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
protected
|
|
227
|
+
|
|
228
|
+
attr_writer :block
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Pin
|
|
5
|
-
class Closure < Base
|
|
6
|
-
# @return [::Symbol] :class or :instance
|
|
7
|
-
attr_reader :scope
|
|
8
|
-
|
|
9
|
-
# @param scope [::Symbol] :class or :instance
|
|
10
|
-
# @param generics [::Array<Pin::Parameter>, 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
|
-
def binder
|
|
48
|
-
@binder || context
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# @param api_map [Solargraph::ApiMap]
|
|
52
|
-
# @return [void]
|
|
53
|
-
def rebind api_map; end
|
|
54
|
-
|
|
55
|
-
# @return [::Array<String>]
|
|
56
|
-
def generics
|
|
57
|
-
@generics ||= docstring.tags(:generic).map(&:name)
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def to_rbs
|
|
61
|
-
rbs_generics + return_type.to_rbs
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
# @return [String]
|
|
65
|
-
def rbs_generics
|
|
66
|
-
return '' if generics.empty?
|
|
67
|
-
|
|
68
|
-
'[' + generics.map { |gen| gen.to_s }.join(', ') + '] '
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class Closure < Base
|
|
6
|
+
# @return [::Symbol] :class or :instance
|
|
7
|
+
attr_reader :scope
|
|
8
|
+
|
|
9
|
+
# @param scope [::Symbol] :class or :instance
|
|
10
|
+
# @param generics [::Array<Pin::Parameter>, 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
|
+
def binder
|
|
48
|
+
@binder || context
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# @param api_map [Solargraph::ApiMap]
|
|
52
|
+
# @return [void]
|
|
53
|
+
def rebind api_map; end
|
|
54
|
+
|
|
55
|
+
# @return [::Array<String>]
|
|
56
|
+
def generics
|
|
57
|
+
@generics ||= docstring.tags(:generic).map(&:name)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def to_rbs
|
|
61
|
+
rbs_generics + return_type.to_rbs
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# @return [String]
|
|
65
|
+
def rbs_generics
|
|
66
|
+
return '' if generics.empty?
|
|
67
|
+
|
|
68
|
+
'[' + generics.map { |gen| gen.to_s }.join(', ') + '] '
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|