solargraph 0.58.1 → 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 (195) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/plugins.yml +3 -2
  3. data/.gitignore +1 -0
  4. data/CHANGELOG.md +10 -1
  5. data/lib/solargraph/api_map/cache.rb +110 -110
  6. data/lib/solargraph/api_map/constants.rb +279 -279
  7. data/lib/solargraph/api_map/index.rb +193 -193
  8. data/lib/solargraph/api_map/source_to_yard.rb +97 -97
  9. data/lib/solargraph/api_map/store.rb +384 -384
  10. data/lib/solargraph/api_map.rb +945 -945
  11. data/lib/solargraph/bench.rb +45 -45
  12. data/lib/solargraph/complex_type/type_methods.rb +228 -228
  13. data/lib/solargraph/complex_type/unique_type.rb +482 -482
  14. data/lib/solargraph/complex_type.rb +444 -444
  15. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  16. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -91
  17. data/lib/solargraph/convention/data_definition.rb +105 -105
  18. data/lib/solargraph/convention/gemfile.rb +15 -15
  19. data/lib/solargraph/convention/gemspec.rb +23 -23
  20. data/lib/solargraph/convention/rakefile.rb +17 -17
  21. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -61
  22. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -102
  23. data/lib/solargraph/convention/struct_definition.rb +164 -164
  24. data/lib/solargraph/convention.rb +78 -78
  25. data/lib/solargraph/converters/dd.rb +17 -17
  26. data/lib/solargraph/converters/dl.rb +15 -15
  27. data/lib/solargraph/converters/dt.rb +15 -15
  28. data/lib/solargraph/converters/misc.rb +1 -1
  29. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  30. data/lib/solargraph/diagnostics/rubocop.rb +118 -118
  31. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -68
  32. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  33. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  34. data/lib/solargraph/doc_map.rb +439 -439
  35. data/lib/solargraph/equality.rb +34 -34
  36. data/lib/solargraph/gem_pins.rb +98 -98
  37. data/lib/solargraph/language_server/error_codes.rb +20 -20
  38. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  39. data/lib/solargraph/language_server/host/dispatch.rb +130 -130
  40. data/lib/solargraph/language_server/host/message_worker.rb +112 -112
  41. data/lib/solargraph/language_server/host/sources.rb +99 -99
  42. data/lib/solargraph/language_server/host.rb +878 -878
  43. data/lib/solargraph/language_server/message/base.rb +97 -97
  44. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  45. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -60
  46. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
  47. data/lib/solargraph/language_server/message/extended/document.rb +23 -23
  48. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  49. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -19
  50. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  51. data/lib/solargraph/language_server/message/initialize.rb +191 -191
  52. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  53. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -40
  54. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  55. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  56. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -148
  57. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  58. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  59. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  60. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  61. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  62. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -25
  63. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -35
  64. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -40
  65. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +26 -26
  66. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  67. data/lib/solargraph/language_server/message.rb +94 -94
  68. data/lib/solargraph/language_server/request.rb +27 -27
  69. data/lib/solargraph/language_server/transport/data_reader.rb +74 -74
  70. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  71. data/lib/solargraph/library.rb +683 -683
  72. data/lib/solargraph/location.rb +82 -82
  73. data/lib/solargraph/logging.rb +37 -37
  74. data/lib/solargraph/page.rb +92 -92
  75. data/lib/solargraph/parser/comment_ripper.rb +69 -69
  76. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -255
  77. data/lib/solargraph/parser/node_processor/base.rb +92 -92
  78. data/lib/solargraph/parser/node_processor.rb +62 -62
  79. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -149
  80. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  81. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -166
  82. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -486
  83. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  84. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -59
  85. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  86. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  87. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -53
  88. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +37 -37
  89. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -23
  90. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
  91. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
  92. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -59
  93. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  94. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  95. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -38
  96. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -52
  97. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -291
  98. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  99. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
  100. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -70
  101. data/lib/solargraph/parser/parser_gem.rb +12 -12
  102. data/lib/solargraph/parser/region.rb +69 -69
  103. data/lib/solargraph/parser/snippet.rb +17 -17
  104. data/lib/solargraph/parser.rb +23 -23
  105. data/lib/solargraph/pin/base.rb +729 -729
  106. data/lib/solargraph/pin/base_variable.rb +126 -126
  107. data/lib/solargraph/pin/block.rb +104 -104
  108. data/lib/solargraph/pin/breakable.rb +9 -9
  109. data/lib/solargraph/pin/callable.rb +231 -231
  110. data/lib/solargraph/pin/closure.rb +72 -72
  111. data/lib/solargraph/pin/common.rb +79 -79
  112. data/lib/solargraph/pin/constant.rb +45 -45
  113. data/lib/solargraph/pin/conversions.rb +123 -123
  114. data/lib/solargraph/pin/delegated_method.rb +120 -120
  115. data/lib/solargraph/pin/documenting.rb +114 -114
  116. data/lib/solargraph/pin/instance_variable.rb +34 -34
  117. data/lib/solargraph/pin/keyword.rb +20 -20
  118. data/lib/solargraph/pin/local_variable.rb +75 -75
  119. data/lib/solargraph/pin/method.rb +672 -672
  120. data/lib/solargraph/pin/method_alias.rb +34 -34
  121. data/lib/solargraph/pin/namespace.rb +115 -115
  122. data/lib/solargraph/pin/parameter.rb +275 -275
  123. data/lib/solargraph/pin/proxy_type.rb +39 -39
  124. data/lib/solargraph/pin/reference/override.rb +47 -47
  125. data/lib/solargraph/pin/reference/superclass.rb +15 -15
  126. data/lib/solargraph/pin/reference.rb +39 -39
  127. data/lib/solargraph/pin/search.rb +61 -61
  128. data/lib/solargraph/pin/signature.rb +61 -61
  129. data/lib/solargraph/pin/symbol.rb +53 -53
  130. data/lib/solargraph/pin/until.rb +18 -18
  131. data/lib/solargraph/pin/while.rb +18 -18
  132. data/lib/solargraph/pin.rb +44 -44
  133. data/lib/solargraph/pin_cache.rb +245 -245
  134. data/lib/solargraph/position.rb +132 -119
  135. data/lib/solargraph/range.rb +112 -112
  136. data/lib/solargraph/rbs_map/conversions.rb +823 -823
  137. data/lib/solargraph/rbs_map/core_fills.rb +84 -84
  138. data/lib/solargraph/rbs_map/core_map.rb +58 -58
  139. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
  140. data/lib/solargraph/rbs_map.rb +163 -163
  141. data/lib/solargraph/server_methods.rb +16 -16
  142. data/lib/solargraph/shell.rb +363 -352
  143. data/lib/solargraph/source/chain/array.rb +37 -37
  144. data/lib/solargraph/source/chain/call.rb +337 -337
  145. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  146. data/lib/solargraph/source/chain/constant.rb +26 -26
  147. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  148. data/lib/solargraph/source/chain/hash.rb +34 -34
  149. data/lib/solargraph/source/chain/if.rb +28 -28
  150. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  151. data/lib/solargraph/source/chain/link.rb +109 -109
  152. data/lib/solargraph/source/chain/literal.rb +48 -48
  153. data/lib/solargraph/source/chain/or.rb +23 -23
  154. data/lib/solargraph/source/chain/q_call.rb +11 -11
  155. data/lib/solargraph/source/chain/variable.rb +13 -13
  156. data/lib/solargraph/source/chain/z_super.rb +30 -30
  157. data/lib/solargraph/source/chain.rb +291 -291
  158. data/lib/solargraph/source/change.rb +82 -82
  159. data/lib/solargraph/source/cursor.rb +166 -166
  160. data/lib/solargraph/source/source_chainer.rb +194 -194
  161. data/lib/solargraph/source/updater.rb +55 -55
  162. data/lib/solargraph/source.rb +498 -498
  163. data/lib/solargraph/source_map/clip.rb +226 -226
  164. data/lib/solargraph/source_map/data.rb +34 -34
  165. data/lib/solargraph/source_map/mapper.rb +259 -259
  166. data/lib/solargraph/source_map.rb +212 -212
  167. data/lib/solargraph/type_checker/checks.rb +124 -124
  168. data/lib/solargraph/type_checker/param_def.rb +37 -37
  169. data/lib/solargraph/type_checker/problem.rb +32 -32
  170. data/lib/solargraph/type_checker/rules.rb +84 -84
  171. data/lib/solargraph/type_checker.rb +814 -814
  172. data/lib/solargraph/version.rb +1 -1
  173. data/lib/solargraph/workspace/config.rb +255 -255
  174. data/lib/solargraph/workspace/require_paths.rb +97 -97
  175. data/lib/solargraph/workspace.rb +220 -220
  176. data/lib/solargraph/yard_map/helpers.rb +44 -44
  177. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -130
  178. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -31
  179. data/lib/solargraph/yard_map/mapper.rb +79 -79
  180. data/lib/solargraph/yard_map/to_method.rb +89 -89
  181. data/lib/solargraph/yard_tags.rb +20 -20
  182. data/lib/solargraph/yardoc.rb +87 -87
  183. data/lib/solargraph.rb +105 -105
  184. data/rbs_collection.yaml +1 -1
  185. metadata +12 -12
  186. /data/{sig → rbs}/shims/ast/0/node.rbs +0 -0
  187. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  188. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  189. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  190. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  191. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  192. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  193. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  194. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  195. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,126 +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 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
+ # 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,104 +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
- # @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
+ # 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