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