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.
Files changed (162) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.github/workflows/linting.yml +4 -5
  4. data/.github/workflows/plugins.yml +40 -36
  5. data/.github/workflows/rspec.yml +45 -13
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.rubocop_todo.yml +27 -49
  8. data/README.md +3 -3
  9. data/Rakefile +1 -0
  10. data/lib/solargraph/api_map/cache.rb +110 -110
  11. data/lib/solargraph/api_map/constants.rb +289 -279
  12. data/lib/solargraph/api_map/index.rb +204 -193
  13. data/lib/solargraph/api_map/source_to_yard.rb +109 -97
  14. data/lib/solargraph/api_map/store.rb +387 -384
  15. data/lib/solargraph/api_map.rb +1000 -945
  16. data/lib/solargraph/complex_type/conformance.rb +176 -0
  17. data/lib/solargraph/complex_type/type_methods.rb +242 -228
  18. data/lib/solargraph/complex_type/unique_type.rb +632 -482
  19. data/lib/solargraph/complex_type.rb +549 -444
  20. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  21. data/lib/solargraph/convention/data_definition.rb +108 -105
  22. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  23. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  24. data/lib/solargraph/convention/struct_definition.rb +168 -164
  25. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  26. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  27. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  28. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  29. data/lib/solargraph/doc_map.rb +200 -439
  30. data/lib/solargraph/equality.rb +34 -34
  31. data/lib/solargraph/gem_pins.rb +97 -98
  32. data/lib/solargraph/language_server/host/dispatch.rb +131 -130
  33. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  34. data/lib/solargraph/language_server/host/sources.rb +100 -99
  35. data/lib/solargraph/language_server/host.rb +883 -878
  36. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +109 -114
  37. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  38. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  39. data/lib/solargraph/language_server/message/text_document/definition.rb +42 -40
  40. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +28 -26
  41. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  42. data/lib/solargraph/language_server/message/text_document/hover.rb +60 -58
  43. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  44. data/lib/solargraph/language_server/message/text_document/type_definition.rb +27 -25
  45. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +25 -23
  46. data/lib/solargraph/library.rb +729 -683
  47. data/lib/solargraph/location.rb +87 -82
  48. data/lib/solargraph/logging.rb +57 -37
  49. data/lib/solargraph/parser/comment_ripper.rb +76 -69
  50. data/lib/solargraph/parser/flow_sensitive_typing.rb +483 -255
  51. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  52. data/lib/solargraph/parser/node_processor.rb +63 -62
  53. data/lib/solargraph/parser/parser_gem/class_methods.rb +167 -149
  54. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  55. data/lib/solargraph/parser/parser_gem/node_methods.rb +506 -486
  56. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  57. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  58. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  59. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  60. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  61. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  62. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +41 -40
  63. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  64. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  65. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  66. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  67. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  68. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  69. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +53 -52
  70. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +296 -291
  71. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  72. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  73. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  74. data/lib/solargraph/parser/region.rb +75 -69
  75. data/lib/solargraph/parser/snippet.rb +17 -17
  76. data/lib/solargraph/pin/base.rb +761 -729
  77. data/lib/solargraph/pin/base_variable.rb +418 -126
  78. data/lib/solargraph/pin/block.rb +126 -104
  79. data/lib/solargraph/pin/breakable.rb +13 -9
  80. data/lib/solargraph/pin/callable.rb +278 -231
  81. data/lib/solargraph/pin/closure.rb +68 -72
  82. data/lib/solargraph/pin/common.rb +94 -79
  83. data/lib/solargraph/pin/compound_statement.rb +55 -0
  84. data/lib/solargraph/pin/conversions.rb +124 -123
  85. data/lib/solargraph/pin/delegated_method.rb +131 -120
  86. data/lib/solargraph/pin/documenting.rb +115 -114
  87. data/lib/solargraph/pin/instance_variable.rb +38 -34
  88. data/lib/solargraph/pin/keyword.rb +16 -20
  89. data/lib/solargraph/pin/local_variable.rb +31 -75
  90. data/lib/solargraph/pin/method.rb +720 -672
  91. data/lib/solargraph/pin/method_alias.rb +42 -34
  92. data/lib/solargraph/pin/namespace.rb +121 -115
  93. data/lib/solargraph/pin/parameter.rb +338 -275
  94. data/lib/solargraph/pin/proxy_type.rb +40 -39
  95. data/lib/solargraph/pin/reference/override.rb +47 -47
  96. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  97. data/lib/solargraph/pin/reference.rb +41 -39
  98. data/lib/solargraph/pin/search.rb +62 -61
  99. data/lib/solargraph/pin/signature.rb +69 -61
  100. data/lib/solargraph/pin/symbol.rb +53 -53
  101. data/lib/solargraph/pin/until.rb +18 -18
  102. data/lib/solargraph/pin/while.rb +18 -18
  103. data/lib/solargraph/pin.rb +46 -44
  104. data/lib/solargraph/pin_cache.rb +665 -245
  105. data/lib/solargraph/position.rb +118 -119
  106. data/lib/solargraph/range.rb +112 -112
  107. data/lib/solargraph/rbs_map/conversions.rb +846 -823
  108. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  109. data/lib/solargraph/rbs_map/stdlib_map.rb +72 -43
  110. data/lib/solargraph/rbs_map.rb +217 -163
  111. data/lib/solargraph/shell.rb +397 -352
  112. data/lib/solargraph/source/chain/call.rb +372 -337
  113. data/lib/solargraph/source/chain/constant.rb +28 -26
  114. data/lib/solargraph/source/chain/hash.rb +35 -34
  115. data/lib/solargraph/source/chain/if.rb +29 -28
  116. data/lib/solargraph/source/chain/instance_variable.rb +34 -13
  117. data/lib/solargraph/source/chain/literal.rb +53 -48
  118. data/lib/solargraph/source/chain/or.rb +31 -23
  119. data/lib/solargraph/source/chain.rb +294 -291
  120. data/lib/solargraph/source/change.rb +89 -82
  121. data/lib/solargraph/source/cursor.rb +172 -166
  122. data/lib/solargraph/source/source_chainer.rb +204 -194
  123. data/lib/solargraph/source/updater.rb +59 -55
  124. data/lib/solargraph/source.rb +524 -498
  125. data/lib/solargraph/source_map/clip.rb +237 -226
  126. data/lib/solargraph/source_map/data.rb +37 -34
  127. data/lib/solargraph/source_map/mapper.rb +282 -259
  128. data/lib/solargraph/source_map.rb +220 -212
  129. data/lib/solargraph/type_checker/problem.rb +34 -32
  130. data/lib/solargraph/type_checker/rules.rb +157 -84
  131. data/lib/solargraph/type_checker.rb +895 -814
  132. data/lib/solargraph/version.rb +1 -1
  133. data/lib/solargraph/workspace/config.rb +257 -255
  134. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  135. data/lib/solargraph/workspace/require_paths.rb +98 -97
  136. data/lib/solargraph/workspace.rb +362 -220
  137. data/lib/solargraph/yard_map/helpers.rb +45 -44
  138. data/lib/solargraph/yard_map/mapper/to_method.rb +134 -130
  139. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  140. data/lib/solargraph/yard_map/mapper.rb +84 -79
  141. data/lib/solargraph/yardoc.rb +97 -87
  142. data/lib/solargraph.rb +126 -105
  143. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  144. data/rbs/fills/tuple/tuple.rbs +28 -0
  145. data/rbs/shims/ast/0/node.rbs +5 -0
  146. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  147. data/rbs_collection.yaml +1 -1
  148. data/solargraph.gemspec +2 -1
  149. metadata +22 -17
  150. data/lib/solargraph/type_checker/checks.rb +0 -124
  151. data/lib/solargraph/type_checker/param_def.rb +0 -37
  152. data/lib/solargraph/yard_map/to_method.rb +0 -89
  153. data/sig/shims/ast/0/node.rbs +0 -5
  154. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  155. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  156. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  157. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  158. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  159. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  160. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  161. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  162. /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
- # @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
+ 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 < 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 < 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