solargraph 0.57.0 → 0.58.3

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 (216) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/linting.yml +4 -2
  4. data/.github/workflows/plugins.yml +63 -28
  5. data/.github/workflows/rspec.yml +19 -4
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.gitignore +1 -0
  8. data/.rubocop.yml +1 -1
  9. data/.rubocop_todo.yml +90 -1438
  10. data/CHANGELOG.md +39 -0
  11. data/Rakefile +1 -1
  12. data/bin/solargraph +3 -0
  13. data/lib/solargraph/api_map/cache.rb +110 -110
  14. data/lib/solargraph/api_map/constants.rb +279 -218
  15. data/lib/solargraph/api_map/index.rb +193 -169
  16. data/lib/solargraph/api_map/source_to_yard.rb +97 -94
  17. data/lib/solargraph/api_map/store.rb +384 -374
  18. data/lib/solargraph/api_map.rb +945 -951
  19. data/lib/solargraph/bench.rb +45 -45
  20. data/lib/solargraph/complex_type/type_methods.rb +228 -223
  21. data/lib/solargraph/complex_type/unique_type.rb +482 -475
  22. data/lib/solargraph/complex_type.rb +444 -427
  23. data/lib/solargraph/convention/active_support_concern.rb +1 -1
  24. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  25. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -91
  26. data/lib/solargraph/convention/data_definition.rb +105 -105
  27. data/lib/solargraph/convention/gemfile.rb +15 -15
  28. data/lib/solargraph/convention/gemspec.rb +23 -23
  29. data/lib/solargraph/convention/rakefile.rb +17 -17
  30. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -61
  31. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -102
  32. data/lib/solargraph/convention/struct_definition.rb +164 -164
  33. data/lib/solargraph/convention.rb +78 -78
  34. data/lib/solargraph/converters/dd.rb +17 -17
  35. data/lib/solargraph/converters/dl.rb +15 -15
  36. data/lib/solargraph/converters/dt.rb +15 -15
  37. data/lib/solargraph/converters/misc.rb +1 -1
  38. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  39. data/lib/solargraph/diagnostics/rubocop.rb +118 -118
  40. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  41. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  42. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  43. data/lib/solargraph/doc_map.rb +439 -436
  44. data/lib/solargraph/environ.rb +1 -1
  45. data/lib/solargraph/equality.rb +34 -33
  46. data/lib/solargraph/gem_pins.rb +98 -94
  47. data/lib/solargraph/language_server/error_codes.rb +20 -20
  48. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  49. data/lib/solargraph/language_server/host/dispatch.rb +130 -130
  50. data/lib/solargraph/language_server/host/message_worker.rb +112 -112
  51. data/lib/solargraph/language_server/host/sources.rb +99 -99
  52. data/lib/solargraph/language_server/host.rb +878 -872
  53. data/lib/solargraph/language_server/message/base.rb +97 -97
  54. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  55. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -60
  56. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
  57. data/lib/solargraph/language_server/message/extended/document.rb +23 -23
  58. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  59. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -19
  60. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  61. data/lib/solargraph/language_server/message/initialize.rb +191 -191
  62. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  63. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -40
  64. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  65. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  66. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -145
  67. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  68. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  69. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  70. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  71. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  72. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -25
  73. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -35
  74. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -40
  75. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +26 -26
  76. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  77. data/lib/solargraph/language_server/message.rb +94 -94
  78. data/lib/solargraph/language_server/progress.rb +1 -1
  79. data/lib/solargraph/language_server/request.rb +27 -25
  80. data/lib/solargraph/language_server/transport/data_reader.rb +74 -74
  81. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  82. data/lib/solargraph/library.rb +683 -683
  83. data/lib/solargraph/location.rb +82 -81
  84. data/lib/solargraph/logging.rb +37 -37
  85. data/lib/solargraph/page.rb +92 -93
  86. data/lib/solargraph/parser/comment_ripper.rb +69 -69
  87. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -255
  88. data/lib/solargraph/parser/node_processor/base.rb +92 -92
  89. data/lib/solargraph/parser/node_processor.rb +62 -62
  90. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -159
  91. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  92. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -166
  93. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -499
  94. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -21
  95. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -59
  96. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  97. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  98. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -53
  99. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +37 -37
  100. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -23
  101. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
  102. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
  103. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -59
  104. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -42
  105. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  106. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -38
  107. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -43
  108. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -292
  109. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  110. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
  111. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -70
  112. data/lib/solargraph/parser/parser_gem.rb +12 -12
  113. data/lib/solargraph/parser/region.rb +69 -69
  114. data/lib/solargraph/parser/snippet.rb +17 -17
  115. data/lib/solargraph/parser.rb +23 -23
  116. data/lib/solargraph/pin/base.rb +729 -708
  117. data/lib/solargraph/pin/base_variable.rb +126 -124
  118. data/lib/solargraph/pin/block.rb +104 -103
  119. data/lib/solargraph/pin/breakable.rb +9 -9
  120. data/lib/solargraph/pin/callable.rb +231 -227
  121. data/lib/solargraph/pin/closure.rb +72 -76
  122. data/lib/solargraph/pin/common.rb +79 -79
  123. data/lib/solargraph/pin/constant.rb +45 -45
  124. data/lib/solargraph/pin/conversions.rb +123 -123
  125. data/lib/solargraph/pin/delegated_method.rb +120 -121
  126. data/lib/solargraph/pin/documenting.rb +114 -114
  127. data/lib/solargraph/pin/instance_variable.rb +34 -34
  128. data/lib/solargraph/pin/keyword.rb +20 -20
  129. data/lib/solargraph/pin/local_variable.rb +75 -79
  130. data/lib/solargraph/pin/method.rb +672 -656
  131. data/lib/solargraph/pin/method_alias.rb +34 -34
  132. data/lib/solargraph/pin/namespace.rb +115 -115
  133. data/lib/solargraph/pin/parameter.rb +275 -271
  134. data/lib/solargraph/pin/proxy_type.rb +39 -36
  135. data/lib/solargraph/pin/reference/override.rb +47 -47
  136. data/lib/solargraph/pin/reference/superclass.rb +15 -15
  137. data/lib/solargraph/pin/reference.rb +39 -48
  138. data/lib/solargraph/pin/search.rb +61 -58
  139. data/lib/solargraph/pin/signature.rb +61 -61
  140. data/lib/solargraph/pin/symbol.rb +53 -53
  141. data/lib/solargraph/pin/until.rb +18 -18
  142. data/lib/solargraph/pin/while.rb +18 -18
  143. data/lib/solargraph/pin.rb +44 -44
  144. data/lib/solargraph/pin_cache.rb +245 -245
  145. data/lib/solargraph/position.rb +132 -118
  146. data/lib/solargraph/range.rb +112 -108
  147. data/lib/solargraph/rbs_map/conversions.rb +823 -802
  148. data/lib/solargraph/rbs_map/core_fills.rb +84 -66
  149. data/lib/solargraph/rbs_map/core_map.rb +58 -54
  150. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
  151. data/lib/solargraph/rbs_map.rb +163 -163
  152. data/lib/solargraph/server_methods.rb +16 -16
  153. data/lib/solargraph/shell.rb +363 -271
  154. data/lib/solargraph/source/chain/array.rb +37 -37
  155. data/lib/solargraph/source/chain/call.rb +337 -333
  156. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  157. data/lib/solargraph/source/chain/constant.rb +26 -89
  158. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  159. data/lib/solargraph/source/chain/hash.rb +34 -34
  160. data/lib/solargraph/source/chain/if.rb +28 -28
  161. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  162. data/lib/solargraph/source/chain/link.rb +109 -109
  163. data/lib/solargraph/source/chain/literal.rb +48 -48
  164. data/lib/solargraph/source/chain/or.rb +23 -23
  165. data/lib/solargraph/source/chain/q_call.rb +11 -11
  166. data/lib/solargraph/source/chain/variable.rb +13 -13
  167. data/lib/solargraph/source/chain/z_super.rb +30 -30
  168. data/lib/solargraph/source/chain.rb +291 -289
  169. data/lib/solargraph/source/change.rb +82 -82
  170. data/lib/solargraph/source/cursor.rb +166 -166
  171. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  172. data/lib/solargraph/source/source_chainer.rb +194 -194
  173. data/lib/solargraph/source/updater.rb +55 -55
  174. data/lib/solargraph/source.rb +498 -498
  175. data/lib/solargraph/source_map/clip.rb +226 -234
  176. data/lib/solargraph/source_map/data.rb +34 -34
  177. data/lib/solargraph/source_map/mapper.rb +259 -261
  178. data/lib/solargraph/source_map.rb +212 -207
  179. data/lib/solargraph/type_checker/checks.rb +124 -124
  180. data/lib/solargraph/type_checker/param_def.rb +37 -37
  181. data/lib/solargraph/type_checker/problem.rb +32 -32
  182. data/lib/solargraph/type_checker/rules.rb +84 -70
  183. data/lib/solargraph/type_checker.rb +814 -752
  184. data/lib/solargraph/version.rb +5 -5
  185. data/lib/solargraph/workspace/config.rb +255 -237
  186. data/lib/solargraph/workspace/require_paths.rb +97 -98
  187. data/lib/solargraph/workspace.rb +220 -225
  188. data/lib/solargraph/yard_map/helpers.rb +44 -44
  189. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -129
  190. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -30
  191. data/lib/solargraph/yard_map/mapper.rb +79 -79
  192. data/lib/solargraph/yard_map/to_method.rb +89 -88
  193. data/lib/solargraph/yard_tags.rb +20 -20
  194. data/lib/solargraph/yardoc.rb +87 -64
  195. data/lib/solargraph.rb +105 -105
  196. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  197. data/rbs/fills/open3/0/open3.rbs +172 -0
  198. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  199. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  200. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  201. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  202. data/rbs/shims/ast/0/node.rbs +5 -0
  203. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  204. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  205. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  206. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  207. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  208. data/rbs_collection.yaml +4 -4
  209. data/solargraph.gemspec +15 -4
  210. metadata +71 -16
  211. data/lib/solargraph/parser/node_methods.rb +0 -97
  212. /data/rbs/fills/{tuple.rbs → tuple/tuple.rbs} +0 -0
  213. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  214. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  215. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  216. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,227 +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
- # @return [Pin::Block, nil]
31
- def combine_blocks(other)
32
- if block.nil?
33
- other.block
34
- elsif other.block.nil?
35
- block
36
- else
37
- choose_pin_attr(other, :block)
38
- end
39
- end
40
-
41
- # @param other [self]
42
- # @param attrs [Hash{Symbol => Object}]
43
- #
44
- # @return [self]
45
- def combine_with(other, attrs={})
46
- new_attrs = {
47
- block: combine_blocks(other),
48
- return_type: combine_return_type(other),
49
- }.merge(attrs)
50
- new_attrs[:parameters] = choose_parameters(other).clone.freeze unless new_attrs.key?(:parameters)
51
- super(other, new_attrs)
52
- end
53
-
54
- # @return [::Array<String>]
55
- def parameter_names
56
- @parameter_names ||= parameters.map(&:name)
57
- end
58
-
59
- def generics
60
- []
61
- end
62
-
63
- # @param other [self]
64
- # @return [Array<Pin::Parameter>]
65
- def choose_parameters(other)
66
- 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
67
- parameters.zip(other.parameters).map do |param, other_param|
68
- if param.nil? && other_param.block?
69
- other_param
70
- elsif other_param.nil? && param.block?
71
- param
72
- else
73
- param.combine_with(other_param)
74
- end
75
- end
76
- end
77
-
78
- # @return [Array<Pin::Parameter>]
79
- def blockless_parameters
80
- if parameters.last&.block?
81
- parameters[0..-2]
82
- else
83
- parameters
84
- end
85
- end
86
-
87
- # @return [Array]
88
- def arity
89
- [generics, blockless_parameters.map(&:arity_decl), block&.arity]
90
- end
91
-
92
- # @param generics_to_resolve [Enumerable<String>]
93
- # @param arg_types [Array<ComplexType>, nil]
94
- # @param return_type_context [ComplexType, nil]
95
- # @param yield_arg_types [Array<ComplexType>, nil]
96
- # @param yield_return_type_context [ComplexType, nil]
97
- # @param context [ComplexType, nil]
98
- # @param resolved_generic_values [Hash{String => ComplexType}]
99
- # @return [self]
100
- def resolve_generics_from_context(generics_to_resolve,
101
- arg_types = nil,
102
- return_type_context = nil,
103
- yield_arg_types = nil,
104
- yield_return_type_context = nil,
105
- resolved_generic_values: {})
106
- callable = super(generics_to_resolve, return_type_context, resolved_generic_values: resolved_generic_values)
107
- callable.parameters = callable.parameters.each_with_index.map do |param, i|
108
- if arg_types.nil?
109
- param.dup
110
- else
111
- param.resolve_generics_from_context(generics_to_resolve,
112
- arg_types[i],
113
- resolved_generic_values: resolved_generic_values)
114
- end
115
- end
116
- callable.block = block.resolve_generics_from_context(generics_to_resolve,
117
- yield_arg_types,
118
- yield_return_type_context,
119
- resolved_generic_values: resolved_generic_values) if callable.block?
120
- callable
121
- end
122
-
123
- def typify api_map
124
- type = super
125
- return type if type.defined?
126
- if method_name.end_with?('?')
127
- logger.debug { "Callable#typify(self=#{self}) => Boolean (? suffix)" }
128
- ComplexType::BOOLEAN
129
- else
130
- logger.debug { "Callable#typify(self=#{self}) => undefined" }
131
- ComplexType::UNDEFINED
132
- end
133
- end
134
-
135
- # @return [String]
136
- def method_name
137
- raise "closure was nil in #{self.inspect}" if closure.nil?
138
- @method_name ||= closure.name
139
- end
140
-
141
- # @param generics_to_resolve [::Array<String>]
142
- # @param arg_types [Array<ComplexType>, nil]
143
- # @param return_type_context [ComplexType, nil]
144
- # @param yield_arg_types [Array<ComplexType>, nil]
145
- # @param yield_return_type_context [ComplexType, nil]
146
- # @param context [ComplexType, nil]
147
- # @param resolved_generic_values [Hash{String => ComplexType}]
148
- # @return [self]
149
- def resolve_generics_from_context_until_complete(generics_to_resolve,
150
- arg_types = nil,
151
- return_type_context = nil,
152
- yield_arg_types = nil,
153
- yield_return_type_context = nil,
154
- resolved_generic_values: {})
155
- # See
156
- # https://github.com/soutaro/steep/tree/master/lib/steep/type_inference
157
- # and
158
- # https://github.com/sorbet/sorbet/blob/master/infer/inference.cc
159
- # for other implementations
160
-
161
- return self if generics_to_resolve.empty?
162
-
163
- last_resolved_generic_values = resolved_generic_values.dup
164
- new_pin = resolve_generics_from_context(generics_to_resolve,
165
- arg_types,
166
- return_type_context,
167
- yield_arg_types,
168
- yield_return_type_context,
169
- resolved_generic_values: resolved_generic_values)
170
- if last_resolved_generic_values == resolved_generic_values
171
- # erase anything unresolved
172
- return new_pin.erase_generics(self.generics)
173
- end
174
- new_pin.resolve_generics_from_context_until_complete(generics_to_resolve,
175
- arg_types,
176
- return_type_context,
177
- yield_arg_types,
178
- yield_return_type_context,
179
- resolved_generic_values: resolved_generic_values)
180
- end
181
-
182
- # @return [Array<String>]
183
- # @yieldparam [ComplexType]
184
- # @yieldreturn [ComplexType]
185
- # @return [self]
186
- def transform_types(&transform)
187
- # @todo 'super' alone should work here I think, but doesn't typecheck at level typed
188
- callable = super(&transform)
189
- callable.block = block.transform_types(&transform) if block?
190
- callable.parameters = parameters.map do |param|
191
- param.transform_types(&transform)
192
- end
193
- callable
194
- end
195
-
196
- # @param arguments [::Array<Chain>]
197
- # @param with_block [Boolean]
198
- # @return [Boolean]
199
- def arity_matches? arguments, with_block
200
- argcount = arguments.length
201
- parcount = mandatory_positional_param_count
202
- parcount -= 1 if !parameters.empty? && parameters.last.block?
203
- return false if block? && !with_block
204
- return false if argcount < parcount && !(argcount == parcount - 1 && parameters.last.restarg?)
205
- true
206
- end
207
-
208
- # @return [Integer]
209
- def mandatory_positional_param_count
210
- parameters.count(&:arg?)
211
- end
212
-
213
- # @return [String]
214
- def to_rbs
215
- rbs_generics + '(' + parameters.map { |param| param.to_rbs }.join(', ') + ') ' + (block.nil? ? '' : '{ ' + block.to_rbs + ' } ') + '-> ' + return_type.to_rbs
216
- end
217
-
218
- def block?
219
- !!@block
220
- end
221
-
222
- protected
223
-
224
- attr_writer :block
225
- end
226
- end
227
- 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,76 +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
- # @return [::Array<String>]
52
- def gates
53
- # @todo This check might not be necessary. There should always be a
54
- # root pin
55
- closure ? closure.gates : ['']
56
- end
57
-
58
- # @return [::Array<String>]
59
- def generics
60
- @generics ||= docstring.tags(:generic).map(&:name)
61
- end
62
-
63
- # @return [String]
64
- def to_rbs
65
- rbs_generics + return_type.to_rbs
66
- end
67
-
68
- # @return [String]
69
- def rbs_generics
70
- return '' if generics.empty?
71
-
72
- '[' + generics.map { |gen| gen.to_s }.join(', ') + '] '
73
- end
74
- end
75
- end
76
- 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