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,124 +1,126 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class BaseVariable < Base
6
- # include Solargraph::Source::NodeMethods
7
- include Solargraph::Parser::NodeMethods
8
-
9
- # @return [Parser::AST::Node, nil]
10
- attr_reader :assignment
11
-
12
- attr_accessor :mass_assignment
13
-
14
- # @param return_type [ComplexType, nil]
15
- # @param assignment [Parser::AST::Node, nil]
16
- def initialize assignment: nil, return_type: nil, **splat
17
- super(**splat)
18
- @assignment = assignment
19
- # @type [nil, ::Array(Parser::AST::Node, Integer)]
20
- @mass_assignment = nil
21
- @return_type = return_type
22
- end
23
-
24
- def combine_with(other, attrs={})
25
- attrs.merge({
26
- assignment: assert_same(other, :assignment),
27
- mass_assignment: assert_same(other, :mass_assignment),
28
- return_type: combine_return_type(other),
29
- })
30
- super(other, attrs)
31
- end
32
-
33
- def completion_item_kind
34
- Solargraph::LanguageServer::CompletionItemKinds::VARIABLE
35
- end
36
-
37
- # @return [Integer]
38
- def symbol_kind
39
- Solargraph::LanguageServer::SymbolKinds::VARIABLE
40
- end
41
-
42
- def return_type
43
- @return_type ||= generate_complex_type
44
- end
45
-
46
- def nil_assignment?
47
- # this will always be false - should it be return_type ==
48
- # ComplexType::NIL or somesuch?
49
- return_type.nil?
50
- end
51
-
52
- def variable?
53
- true
54
- end
55
-
56
- # @param parent_node [Parser::AST::Node]
57
- # @param api_map [ApiMap]
58
- # @return [::Array<ComplexType>]
59
- def return_types_from_node(parent_node, api_map)
60
- types = []
61
- value_position_nodes_only(parent_node).each do |node|
62
- # Nil nodes may not have a location
63
- if node.nil? || node.type == :NIL || node.type == :nil
64
- types.push ComplexType::NIL
65
- else
66
- rng = Range.from_node(node)
67
- next if rng.nil?
68
- pos = rng.ending
69
- clip = api_map.clip_at(location.filename, pos)
70
- # Use the return node for inference. The clip might infer from the
71
- # first node in a method call instead of the entire call.
72
- chain = Parser.chain(node, nil, nil)
73
- result = chain.infer(api_map, closure, clip.locals).self_to_type(closure.context)
74
- types.push result unless result.undefined?
75
- end
76
- end
77
- types
78
- end
79
-
80
- # @param api_map [ApiMap]
81
- # @return [ComplexType]
82
- def probe api_map
83
- unless @assignment.nil?
84
- types = return_types_from_node(@assignment, api_map)
85
- return ComplexType.new(types.uniq) unless types.empty?
86
- end
87
-
88
- unless @mass_assignment.nil?
89
- mass_node, index = @mass_assignment
90
- types = return_types_from_node(mass_node, api_map)
91
- types.map! do |type|
92
- if type.tuple?
93
- type.all_params[index]
94
- elsif ['::Array', '::Set', '::Enumerable'].include?(type.rooted_name)
95
- type.all_params.first
96
- end
97
- end.compact!
98
- return ComplexType.new(types.uniq) unless types.empty?
99
- end
100
-
101
- ComplexType::UNDEFINED
102
- end
103
-
104
- # @param other [Object]
105
- def == other
106
- return false unless super
107
- assignment == other.assignment
108
- end
109
-
110
- def type_desc
111
- "#{super} = #{assignment&.type.inspect}"
112
- end
113
-
114
- private
115
-
116
- # @return [ComplexType]
117
- def generate_complex_type
118
- tag = docstring.tag(:type)
119
- return ComplexType.try_parse(*tag.types) unless tag.nil? || tag.types.nil? || tag.types.empty?
120
- ComplexType.new
121
- end
122
- end
123
- end
124
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class BaseVariable < Base
6
+ # include Solargraph::Source::NodeMethods
7
+ include Solargraph::Parser::NodeMethods
8
+
9
+ # @return [Parser::AST::Node, nil]
10
+ attr_reader :assignment
11
+
12
+ attr_accessor :mass_assignment
13
+
14
+ # @param return_type [ComplexType, nil]
15
+ # @param mass_assignment [::Array(Parser::AST::Node, Integer), nil]
16
+ # @param assignment [Parser::AST::Node, nil]
17
+ def initialize assignment: nil, return_type: nil, mass_assignment: nil, **splat
18
+ super(**splat)
19
+ @assignment = assignment
20
+ # @type [nil, ::Array(Parser::AST::Node, Integer)]
21
+ @mass_assignment = nil
22
+ @return_type = return_type
23
+ end
24
+
25
+ def combine_with(other, attrs={})
26
+ new_attrs = attrs.merge({
27
+ assignment: assert_same(other, :assignment),
28
+ mass_assignment: assert_same(other, :mass_assignment),
29
+ return_type: combine_return_type(other),
30
+ })
31
+ super(other, new_attrs)
32
+ end
33
+
34
+ def completion_item_kind
35
+ Solargraph::LanguageServer::CompletionItemKinds::VARIABLE
36
+ end
37
+
38
+ # @return [Integer]
39
+ def symbol_kind
40
+ Solargraph::LanguageServer::SymbolKinds::VARIABLE
41
+ end
42
+
43
+ def return_type
44
+ @return_type ||= generate_complex_type
45
+ end
46
+
47
+ def nil_assignment?
48
+ # this will always be false - should it be return_type ==
49
+ # ComplexType::NIL or somesuch?
50
+ return_type.nil?
51
+ end
52
+
53
+ def variable?
54
+ true
55
+ end
56
+
57
+ # @param parent_node [Parser::AST::Node]
58
+ # @param api_map [ApiMap]
59
+ # @return [::Array<ComplexType>]
60
+ def return_types_from_node(parent_node, api_map)
61
+ types = []
62
+ value_position_nodes_only(parent_node).each do |node|
63
+ # Nil nodes may not have a location
64
+ if node.nil? || node.type == :NIL || node.type == :nil
65
+ types.push ComplexType::NIL
66
+ else
67
+ rng = Range.from_node(node)
68
+ next if rng.nil?
69
+ pos = rng.ending
70
+ clip = api_map.clip_at(location.filename, pos)
71
+ # Use the return node for inference. The clip might infer from the
72
+ # first node in a method call instead of the entire call.
73
+ chain = Parser.chain(node, nil, nil)
74
+ result = chain.infer(api_map, closure, clip.locals).self_to_type(closure.context)
75
+ types.push result unless result.undefined?
76
+ end
77
+ end
78
+ types
79
+ end
80
+
81
+ # @param api_map [ApiMap]
82
+ # @return [ComplexType]
83
+ def probe api_map
84
+ unless @assignment.nil?
85
+ types = return_types_from_node(@assignment, api_map)
86
+ return ComplexType.new(types.uniq) unless types.empty?
87
+ end
88
+
89
+ unless @mass_assignment.nil?
90
+ mass_node, index = @mass_assignment
91
+ types = return_types_from_node(mass_node, api_map)
92
+ types.map! do |type|
93
+ if type.tuple?
94
+ type.all_params[index]
95
+ elsif ['::Array', '::Set', '::Enumerable'].include?(type.rooted_name)
96
+ type.all_params.first
97
+ end
98
+ end.compact!
99
+ return ComplexType.new(types.uniq) unless types.empty?
100
+ end
101
+
102
+ ComplexType::UNDEFINED
103
+ end
104
+
105
+ # @param other [Object]
106
+ def == other
107
+ return false unless super
108
+ # @sg-ignore Should add type check on other
109
+ assignment == other.assignment
110
+ end
111
+
112
+ def type_desc
113
+ "#{super} = #{assignment&.type.inspect}"
114
+ end
115
+
116
+ private
117
+
118
+ # @return [ComplexType]
119
+ def generate_complex_type
120
+ tag = docstring.tag(:type)
121
+ return ComplexType.try_parse(*tag.types) unless tag.nil? || tag.types.nil? || tag.types.empty?
122
+ ComplexType.new
123
+ end
124
+ end
125
+ end
126
+ end
@@ -1,103 +1,104 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class Block < Callable
6
- include Breakable
7
-
8
- # @return [Parser::AST::Node]
9
- attr_reader :receiver
10
-
11
- # @return [Parser::AST::Node]
12
- attr_reader :node
13
-
14
- # @param receiver [Parser::AST::Node, nil]
15
- # @param node [Parser::AST::Node, nil]
16
- # @param context [ComplexType, nil]
17
- # @param args [::Array<Parameter>]
18
- def initialize receiver: nil, args: [], context: nil, node: nil, **splat
19
- super(**splat, parameters: args)
20
- @receiver = receiver
21
- @context = context
22
- @return_type = ComplexType.parse('::Proc')
23
- @node = node
24
- end
25
-
26
- # @param api_map [ApiMap]
27
- # @return [void]
28
- def rebind api_map
29
- @rebind ||= maybe_rebind(api_map)
30
- end
31
-
32
- def binder
33
- @rebind&.defined? ? @rebind : closure.binder
34
- end
35
-
36
- # @param yield_types [::Array<ComplexType>]
37
- # @param parameters [::Array<Parameter>]
38
- #
39
- # @return [::Array<ComplexType>]
40
- def destructure_yield_types(yield_types, parameters)
41
- # yielding a tuple into a block will destructure the tuple
42
- if yield_types.length == 1
43
- yield_type = yield_types.first
44
- return yield_type.all_params if yield_type.tuple? && yield_type.all_params.length == parameters.length
45
- end
46
- parameters.map.with_index { |_, idx| yield_types[idx] || ComplexType::UNDEFINED }
47
- end
48
-
49
- # @param api_map [ApiMap]
50
- # @return [::Array<ComplexType>]
51
- def typify_parameters(api_map)
52
- chain = Parser.chain(receiver, filename, node)
53
- clip = api_map.clip_at(location.filename, location.range.start)
54
- locals = clip.locals - [self]
55
- meths = chain.define(api_map, closure, locals)
56
- # @todo Convert logic to use signatures
57
- meths.each do |meth|
58
- next if meth.block.nil?
59
-
60
- yield_types = meth.block.parameters.map(&:return_type)
61
- # 'arguments' is what the method says it will yield to the
62
- # block; 'parameters' is what the block accepts
63
- argument_types = destructure_yield_types(yield_types, parameters)
64
- param_types = argument_types.each_with_index.map do |arg_type, idx|
65
- param = parameters[idx]
66
- param_type = chain.base.infer(api_map, param, locals)
67
- unless arg_type.nil?
68
- if arg_type.generic? && param_type.defined?
69
- namespace_pin = api_map.get_namespace_pins(meth.namespace, closure.namespace).first
70
- arg_type.resolve_generics(namespace_pin, param_type)
71
- else
72
- arg_type.self_to_type(chain.base.infer(api_map, self, locals)).qualify(api_map, meth.context.namespace)
73
- end
74
- end
75
- end
76
- return param_types if param_types.all?(&:defined?)
77
- end
78
- parameters.map { ComplexType::UNDEFINED }
79
- end
80
-
81
- private
82
-
83
- # @param api_map [ApiMap]
84
- # @return [ComplexType]
85
- def maybe_rebind api_map
86
- return ComplexType::UNDEFINED unless receiver
87
-
88
- chain = Parser.chain(receiver, location.filename)
89
- locals = api_map.source_map(location.filename).locals_at(location)
90
- receiver_pin = chain.define(api_map, closure, locals).first
91
- return ComplexType::UNDEFINED unless receiver_pin
92
-
93
- types = receiver_pin.docstring.tag(:yieldreceiver)&.types
94
- return ComplexType::UNDEFINED unless types&.any?
95
-
96
- target = chain.base.infer(api_map, receiver_pin, locals)
97
- target = full_context unless target.defined?
98
-
99
- ComplexType.try_parse(*types).qualify(api_map, receiver_pin.context.namespace).self_to_type(target)
100
- end
101
- end
102
- end
103
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Block < Callable
6
+ include Breakable
7
+
8
+ # @return [Parser::AST::Node]
9
+ attr_reader :receiver
10
+
11
+ # @return [Parser::AST::Node]
12
+ attr_reader :node
13
+
14
+ # @param receiver [Parser::AST::Node, nil]
15
+ # @param node [Parser::AST::Node, nil]
16
+ # @param context [ComplexType, nil]
17
+ # @param args [::Array<Parameter>]
18
+ def initialize receiver: nil, args: [], context: nil, node: nil, **splat
19
+ super(**splat, parameters: args)
20
+ @receiver = receiver
21
+ @context = context
22
+ @return_type = ComplexType.parse('::Proc')
23
+ @node = node
24
+ end
25
+
26
+ # @param api_map [ApiMap]
27
+ # @return [void]
28
+ def rebind api_map
29
+ @rebind ||= maybe_rebind(api_map)
30
+ end
31
+
32
+ def binder
33
+ @rebind&.defined? ? @rebind : closure.binder
34
+ end
35
+
36
+ # @param yield_types [::Array<ComplexType>]
37
+ # @param parameters [::Array<Parameter>]
38
+ #
39
+ # @return [::Array<ComplexType>]
40
+ def destructure_yield_types(yield_types, parameters)
41
+ # yielding a tuple into a block will destructure the tuple
42
+ if yield_types.length == 1
43
+ yield_type = yield_types.first
44
+ return yield_type.all_params if yield_type.tuple? && yield_type.all_params.length == parameters.length
45
+ end
46
+ parameters.map.with_index { |_, idx| yield_types[idx] || ComplexType::UNDEFINED }
47
+ end
48
+
49
+ # @param api_map [ApiMap]
50
+ # @return [::Array<ComplexType>]
51
+ def typify_parameters(api_map)
52
+ chain = Parser.chain(receiver, filename, node)
53
+ clip = api_map.clip_at(location.filename, location.range.start)
54
+ locals = clip.locals - [self]
55
+ meths = chain.define(api_map, closure, locals)
56
+ # @todo Convert logic to use signatures
57
+ # @param meth [Pin::Method]
58
+ meths.each do |meth|
59
+ next if meth.block.nil?
60
+
61
+ yield_types = meth.block.parameters.map(&:return_type)
62
+ # 'arguments' is what the method says it will yield to the
63
+ # block; 'parameters' is what the block accepts
64
+ argument_types = destructure_yield_types(yield_types, parameters)
65
+ param_types = argument_types.each_with_index.map do |arg_type, idx|
66
+ param = parameters[idx]
67
+ param_type = chain.base.infer(api_map, param, locals)
68
+ unless arg_type.nil?
69
+ if arg_type.generic? && param_type.defined?
70
+ namespace_pin = api_map.get_namespace_pins(meth.namespace, closure.namespace).first
71
+ arg_type.resolve_generics(namespace_pin, param_type)
72
+ else
73
+ arg_type.self_to_type(chain.base.infer(api_map, self, locals)).qualify(api_map, *meth.gates)
74
+ end
75
+ end
76
+ end
77
+ return param_types if param_types.all?(&:defined?)
78
+ end
79
+ parameters.map { ComplexType::UNDEFINED }
80
+ end
81
+
82
+ private
83
+
84
+ # @param api_map [ApiMap]
85
+ # @return [ComplexType]
86
+ def maybe_rebind api_map
87
+ return ComplexType::UNDEFINED unless receiver
88
+
89
+ chain = Parser.chain(receiver, location.filename)
90
+ locals = api_map.source_map(location.filename).locals_at(location)
91
+ receiver_pin = chain.define(api_map, closure, locals).first
92
+ return ComplexType::UNDEFINED unless receiver_pin
93
+
94
+ types = receiver_pin.docstring.tag(:yieldreceiver)&.types
95
+ return ComplexType::UNDEFINED unless types&.any?
96
+
97
+ target = chain.base.infer(api_map, receiver_pin, locals)
98
+ target = full_context unless target.defined?
99
+
100
+ ComplexType.try_parse(*types).qualify(api_map, *receiver_pin.gates).self_to_type(target)
101
+ end
102
+ end
103
+ end
104
+ end
@@ -1,9 +1,9 @@
1
- module Solargraph
2
- module Pin
3
- # Mix-in for pins which enclose code which the 'break' statement works with-in - e.g., blocks, when, until, ...
4
- module Breakable
5
- # @return [Parser::AST::Node]
6
- attr_reader :node
7
- end
8
- end
9
- end
1
+ module Solargraph
2
+ module Pin
3
+ # Mix-in for pins which enclose code which the 'break' statement works with-in - e.g., blocks, when, until, ...
4
+ module Breakable
5
+ # @return [Parser::AST::Node]
6
+ attr_reader :node
7
+ end
8
+ end
9
+ end