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