solargraph 0.58.1 → 0.58.2

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