solargraph 0.58.1 → 0.59.0.dev.1

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 (162) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.github/workflows/linting.yml +4 -5
  4. data/.github/workflows/plugins.yml +40 -36
  5. data/.github/workflows/rspec.yml +45 -13
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.rubocop_todo.yml +27 -49
  8. data/README.md +3 -3
  9. data/Rakefile +1 -0
  10. data/lib/solargraph/api_map/cache.rb +110 -110
  11. data/lib/solargraph/api_map/constants.rb +289 -279
  12. data/lib/solargraph/api_map/index.rb +204 -193
  13. data/lib/solargraph/api_map/source_to_yard.rb +109 -97
  14. data/lib/solargraph/api_map/store.rb +387 -384
  15. data/lib/solargraph/api_map.rb +1000 -945
  16. data/lib/solargraph/complex_type/conformance.rb +176 -0
  17. data/lib/solargraph/complex_type/type_methods.rb +242 -228
  18. data/lib/solargraph/complex_type/unique_type.rb +632 -482
  19. data/lib/solargraph/complex_type.rb +549 -444
  20. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  21. data/lib/solargraph/convention/data_definition.rb +108 -105
  22. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  23. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  24. data/lib/solargraph/convention/struct_definition.rb +168 -164
  25. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  26. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  27. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  28. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  29. data/lib/solargraph/doc_map.rb +200 -439
  30. data/lib/solargraph/equality.rb +34 -34
  31. data/lib/solargraph/gem_pins.rb +97 -98
  32. data/lib/solargraph/language_server/host/dispatch.rb +131 -130
  33. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  34. data/lib/solargraph/language_server/host/sources.rb +100 -99
  35. data/lib/solargraph/language_server/host.rb +883 -878
  36. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +109 -114
  37. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  38. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  39. data/lib/solargraph/language_server/message/text_document/definition.rb +42 -40
  40. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +28 -26
  41. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  42. data/lib/solargraph/language_server/message/text_document/hover.rb +60 -58
  43. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  44. data/lib/solargraph/language_server/message/text_document/type_definition.rb +27 -25
  45. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +25 -23
  46. data/lib/solargraph/library.rb +729 -683
  47. data/lib/solargraph/location.rb +87 -82
  48. data/lib/solargraph/logging.rb +57 -37
  49. data/lib/solargraph/parser/comment_ripper.rb +76 -69
  50. data/lib/solargraph/parser/flow_sensitive_typing.rb +483 -255
  51. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  52. data/lib/solargraph/parser/node_processor.rb +63 -62
  53. data/lib/solargraph/parser/parser_gem/class_methods.rb +167 -149
  54. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  55. data/lib/solargraph/parser/parser_gem/node_methods.rb +506 -486
  56. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  57. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  58. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  59. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  60. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  61. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  62. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +41 -40
  63. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  64. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  65. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  66. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  67. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  68. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  69. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +53 -52
  70. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +296 -291
  71. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  72. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  73. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  74. data/lib/solargraph/parser/region.rb +75 -69
  75. data/lib/solargraph/parser/snippet.rb +17 -17
  76. data/lib/solargraph/pin/base.rb +761 -729
  77. data/lib/solargraph/pin/base_variable.rb +418 -126
  78. data/lib/solargraph/pin/block.rb +126 -104
  79. data/lib/solargraph/pin/breakable.rb +13 -9
  80. data/lib/solargraph/pin/callable.rb +278 -231
  81. data/lib/solargraph/pin/closure.rb +68 -72
  82. data/lib/solargraph/pin/common.rb +94 -79
  83. data/lib/solargraph/pin/compound_statement.rb +55 -0
  84. data/lib/solargraph/pin/conversions.rb +124 -123
  85. data/lib/solargraph/pin/delegated_method.rb +131 -120
  86. data/lib/solargraph/pin/documenting.rb +115 -114
  87. data/lib/solargraph/pin/instance_variable.rb +38 -34
  88. data/lib/solargraph/pin/keyword.rb +16 -20
  89. data/lib/solargraph/pin/local_variable.rb +31 -75
  90. data/lib/solargraph/pin/method.rb +720 -672
  91. data/lib/solargraph/pin/method_alias.rb +42 -34
  92. data/lib/solargraph/pin/namespace.rb +121 -115
  93. data/lib/solargraph/pin/parameter.rb +338 -275
  94. data/lib/solargraph/pin/proxy_type.rb +40 -39
  95. data/lib/solargraph/pin/reference/override.rb +47 -47
  96. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  97. data/lib/solargraph/pin/reference.rb +41 -39
  98. data/lib/solargraph/pin/search.rb +62 -61
  99. data/lib/solargraph/pin/signature.rb +69 -61
  100. data/lib/solargraph/pin/symbol.rb +53 -53
  101. data/lib/solargraph/pin/until.rb +18 -18
  102. data/lib/solargraph/pin/while.rb +18 -18
  103. data/lib/solargraph/pin.rb +46 -44
  104. data/lib/solargraph/pin_cache.rb +665 -245
  105. data/lib/solargraph/position.rb +118 -119
  106. data/lib/solargraph/range.rb +112 -112
  107. data/lib/solargraph/rbs_map/conversions.rb +846 -823
  108. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  109. data/lib/solargraph/rbs_map/stdlib_map.rb +72 -43
  110. data/lib/solargraph/rbs_map.rb +217 -163
  111. data/lib/solargraph/shell.rb +397 -352
  112. data/lib/solargraph/source/chain/call.rb +372 -337
  113. data/lib/solargraph/source/chain/constant.rb +28 -26
  114. data/lib/solargraph/source/chain/hash.rb +35 -34
  115. data/lib/solargraph/source/chain/if.rb +29 -28
  116. data/lib/solargraph/source/chain/instance_variable.rb +34 -13
  117. data/lib/solargraph/source/chain/literal.rb +53 -48
  118. data/lib/solargraph/source/chain/or.rb +31 -23
  119. data/lib/solargraph/source/chain.rb +294 -291
  120. data/lib/solargraph/source/change.rb +89 -82
  121. data/lib/solargraph/source/cursor.rb +172 -166
  122. data/lib/solargraph/source/source_chainer.rb +204 -194
  123. data/lib/solargraph/source/updater.rb +59 -55
  124. data/lib/solargraph/source.rb +524 -498
  125. data/lib/solargraph/source_map/clip.rb +237 -226
  126. data/lib/solargraph/source_map/data.rb +37 -34
  127. data/lib/solargraph/source_map/mapper.rb +282 -259
  128. data/lib/solargraph/source_map.rb +220 -212
  129. data/lib/solargraph/type_checker/problem.rb +34 -32
  130. data/lib/solargraph/type_checker/rules.rb +157 -84
  131. data/lib/solargraph/type_checker.rb +895 -814
  132. data/lib/solargraph/version.rb +1 -1
  133. data/lib/solargraph/workspace/config.rb +257 -255
  134. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  135. data/lib/solargraph/workspace/require_paths.rb +98 -97
  136. data/lib/solargraph/workspace.rb +362 -220
  137. data/lib/solargraph/yard_map/helpers.rb +45 -44
  138. data/lib/solargraph/yard_map/mapper/to_method.rb +134 -130
  139. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  140. data/lib/solargraph/yard_map/mapper.rb +84 -79
  141. data/lib/solargraph/yardoc.rb +97 -87
  142. data/lib/solargraph.rb +126 -105
  143. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  144. data/rbs/fills/tuple/tuple.rbs +28 -0
  145. data/rbs/shims/ast/0/node.rbs +5 -0
  146. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  147. data/rbs_collection.yaml +1 -1
  148. data/solargraph.gemspec +2 -1
  149. metadata +22 -17
  150. data/lib/solargraph/type_checker/checks.rb +0 -124
  151. data/lib/solargraph/type_checker/param_def.rb +0 -37
  152. data/lib/solargraph/yard_map/to_method.rb +0 -89
  153. data/sig/shims/ast/0/node.rbs +0 -5
  154. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  155. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  156. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  157. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  158. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  159. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  160. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  161. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  162. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,275 +1,338 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class Parameter < LocalVariable
6
- # @return [::Symbol]
7
- attr_reader :decl
8
-
9
- # @return [String]
10
- attr_reader :asgn_code
11
-
12
- # allow this to be set to the method after the method itself has
13
- # been created
14
- attr_writer :closure
15
-
16
- # @param decl [::Symbol] :arg, :optarg, :kwarg, :kwoptarg, :restarg, :kwrestarg, :block, :blockarg
17
- # @param asgn_code [String, nil]
18
- def initialize decl: :arg, asgn_code: nil, **splat
19
- super(**splat)
20
- @asgn_code = asgn_code
21
- @decl = decl
22
- end
23
-
24
- def type_location
25
- super || closure&.type_location
26
- end
27
-
28
- def location
29
- super || closure&.type_location
30
- end
31
-
32
- def combine_with(other, attrs={})
33
- new_attrs = {
34
- decl: assert_same(other, :decl),
35
- presence: choose(other, :presence),
36
- asgn_code: choose(other, :asgn_code),
37
- }.merge(attrs)
38
- super(other, new_attrs)
39
- end
40
-
41
- def keyword?
42
- [:kwarg, :kwoptarg].include?(decl)
43
- end
44
-
45
- def kwrestarg?
46
- decl == :kwrestarg || (assignment && [:HASH, :hash].include?(assignment.type))
47
- end
48
-
49
- def needs_consistent_name?
50
- keyword?
51
- end
52
-
53
- # @return [String]
54
- def arity_decl
55
- name = (self.name || '(anon)')
56
- type = (return_type&.to_rbs || 'untyped')
57
- case decl
58
- when :arg
59
- ""
60
- when :optarg
61
- "?"
62
- when :kwarg
63
- "#{name}:"
64
- when :kwoptarg
65
- "?#{name}:"
66
- when :restarg
67
- "*"
68
- when :kwrestarg
69
- "**"
70
- else
71
- "(unknown decl: #{decl})"
72
- end
73
- end
74
-
75
- def arg?
76
- decl == :arg
77
- end
78
-
79
- def restarg?
80
- decl == :restarg
81
- end
82
-
83
- def rest?
84
- decl == :restarg || decl == :kwrestarg
85
- end
86
-
87
- def block?
88
- [:block, :blockarg].include?(decl)
89
- end
90
-
91
- def to_rbs
92
- case decl
93
- when :optarg
94
- "?#{super}"
95
- when :kwarg
96
- "#{name}: #{return_type.to_rbs}"
97
- when :kwoptarg
98
- "?#{name}: #{return_type.to_rbs}"
99
- when :restarg
100
- "*#{super}"
101
- when :kwrestarg
102
- "**#{super}"
103
- else
104
- super
105
- end
106
- end
107
-
108
- # @return [String] the full name of the parameter, including any
109
- # declarative symbols such as `*` or `:` indicating type of
110
- # parameter. This is used in method signatures.
111
- def full_name
112
- case decl
113
- when :kwarg, :kwoptarg
114
- "#{name}:"
115
- when :restarg
116
- "*#{name}"
117
- when :kwrestarg
118
- "**#{name}"
119
- when :block, :blockarg
120
- "&#{name}"
121
- else
122
- name
123
- end
124
- end
125
-
126
- # @return [String]
127
- def full
128
- full_name + case decl
129
- when :optarg
130
- " = #{asgn_code || '?'}"
131
- when :kwoptarg
132
- " #{asgn_code || '?'}"
133
- else
134
- ''
135
- end
136
- end
137
-
138
- # @return [ComplexType]
139
- def return_type
140
- if @return_type.nil?
141
- @return_type = ComplexType::UNDEFINED
142
- found = param_tag
143
- @return_type = ComplexType.try_parse(*found.types) unless found.nil? or found.types.nil?
144
- if @return_type.undefined?
145
- if decl == :restarg
146
- @return_type = ComplexType.try_parse('::Array')
147
- elsif decl == :kwrestarg
148
- @return_type = ComplexType.try_parse('::Hash')
149
- elsif decl == :blockarg
150
- @return_type = ComplexType.try_parse('::Proc')
151
- end
152
- end
153
- end
154
- super
155
- @return_type
156
- end
157
-
158
- # The parameter's zero-based location in the block's signature.
159
- #
160
- # @return [Integer]
161
- def index
162
- # @type [Method, Block]
163
- method_pin = closure
164
- method_pin.parameter_names.index(name)
165
- end
166
-
167
- # @param api_map [ApiMap]
168
- def typify api_map
169
- return return_type.qualify(api_map, *closure.gates) unless return_type.undefined?
170
- closure.is_a?(Pin::Block) ? typify_block_param(api_map) : typify_method_param(api_map)
171
- end
172
-
173
- # @param atype [ComplexType]
174
- # @param api_map [ApiMap]
175
- def compatible_arg?(atype, api_map)
176
- # make sure we get types from up the method
177
- # inheritance chain if we don't have them on this pin
178
- ptype = typify api_map
179
- ptype.undefined? || ptype.can_assign?(api_map, atype) || ptype.generic?
180
- end
181
-
182
- def documentation
183
- tag = param_tag
184
- return '' if tag.nil? || tag.text.nil?
185
- tag.text
186
- end
187
-
188
- private
189
-
190
- # @return [YARD::Tags::Tag, nil]
191
- def param_tag
192
- params = closure.docstring.tags(:param)
193
- params.each do |p|
194
- return p if p.name == name
195
- end
196
- params[index] if index && params[index] && (params[index].name.nil? || params[index].name.empty?)
197
- end
198
-
199
- # @param api_map [ApiMap]
200
- # @return [ComplexType]
201
- def typify_block_param api_map
202
- block_pin = closure
203
- if block_pin.is_a?(Pin::Block) && block_pin.receiver
204
- return block_pin.typify_parameters(api_map)[index]
205
- end
206
- ComplexType::UNDEFINED
207
- end
208
-
209
- # @param api_map [ApiMap]
210
- # @return [ComplexType]
211
- def typify_method_param api_map
212
- meths = api_map.get_method_stack(closure.full_context.tag, closure.name, scope: closure.scope)
213
- # meths.shift # Ignore the first one
214
- meths.each do |meth|
215
- found = nil
216
- params = meth.docstring.tags(:param) + see_reference(docstring, api_map)
217
- params.each do |p|
218
- next unless p.name == name
219
- found = p
220
- break
221
- end
222
- if found.nil? and !index.nil?
223
- found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
224
- end
225
- return ComplexType.try_parse(*found.types).qualify(api_map, *meth.closure.gates) unless found.nil? || found.types.nil?
226
- end
227
- ComplexType::UNDEFINED
228
- end
229
-
230
- # @param heredoc [YARD::Docstring]
231
- # @param api_map [ApiMap]
232
- # @param skip [::Array]
233
- # @return [::Array<YARD::Tags::Tag>]
234
- def see_reference heredoc, api_map, skip = []
235
- # This should actually be an intersection type
236
- # @param ref [YARD::Tags::Tag, Solargraph::Yard::Tags::RefTag]
237
- heredoc.ref_tags.each do |ref|
238
- # @sg-ignore ref should actually be an intersection type
239
- next unless ref.tag_name == 'param' && ref.owner
240
- # @sg-ignore ref should actually be an intersection type
241
- result = resolve_reference(ref.owner.to_s, api_map, skip)
242
- return result unless result.nil?
243
- end
244
- []
245
- end
246
-
247
- # @param ref [String]
248
- # @param api_map [ApiMap]
249
- # @param skip [::Array]
250
- # @return [::Array<YARD::Tags::Tag>, nil]
251
- def resolve_reference ref, api_map, skip
252
- return nil if skip.include?(ref)
253
- skip.push ref
254
- parts = ref.split(/[.#]/)
255
- if parts.first.empty?
256
- path = "#{namespace}#{ref}"
257
- else
258
- fqns = api_map.qualify(parts.first, namespace)
259
- return nil if fqns.nil?
260
- path = fqns + ref[parts.first.length] + parts.last
261
- end
262
- pins = api_map.get_path_pins(path)
263
- pins.each do |pin|
264
- params = pin.docstring.tags(:param)
265
- return params unless params.empty?
266
- end
267
- pins.each do |pin|
268
- params = see_reference(pin.docstring, api_map, skip)
269
- return params unless params.empty?
270
- end
271
- nil
272
- end
273
- end
274
- end
275
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Parameter < LocalVariable
6
+ # @return [::Symbol]
7
+ attr_reader :decl
8
+
9
+ # @return [String]
10
+ attr_reader :asgn_code
11
+
12
+ # allow this to be set to the method after the method itself has
13
+ # been created
14
+ attr_writer :closure
15
+
16
+ # @param decl [::Symbol] :arg, :optarg, :kwarg, :kwoptarg, :restarg, :kwrestarg, :block, :blockarg
17
+ # @param asgn_code [String, nil]
18
+ def initialize decl: :arg, asgn_code: nil, **splat
19
+ super(**splat)
20
+ @asgn_code = asgn_code
21
+ @decl = decl
22
+ end
23
+
24
+ def type_location
25
+ super || closure&.type_location
26
+ end
27
+
28
+ def location
29
+ super || closure&.type_location
30
+ end
31
+
32
+ def combine_with(other, attrs={})
33
+ # Parameters can be combined with local variables
34
+ new_attrs = if other.is_a?(Parameter)
35
+ {
36
+ decl: assert_same(other, :decl),
37
+ asgn_code: choose(other, :asgn_code)
38
+ }
39
+ else
40
+ {
41
+ decl: decl,
42
+ asgn_code: asgn_code
43
+ }
44
+ end
45
+ super(other, new_attrs.merge(attrs))
46
+ end
47
+
48
+ def combine_return_type(other)
49
+ out = super
50
+ if out&.undefined?
51
+ # allow our return_type method to provide a better type
52
+ # using :param tag
53
+ out = nil
54
+ end
55
+ out
56
+ end
57
+
58
+ def keyword?
59
+ [:kwarg, :kwoptarg].include?(decl)
60
+ end
61
+
62
+ def kwrestarg?
63
+ # @sg-ignore flow sensitive typing needs to handle attrs
64
+ decl == :kwrestarg || (assignment && [:HASH, :hash].include?(assignment.type))
65
+ end
66
+
67
+ def needs_consistent_name?
68
+ keyword?
69
+ end
70
+
71
+ # @return [String]
72
+ def arity_decl
73
+ name = (self.name || '(anon)')
74
+ type = (return_type&.to_rbs || 'untyped')
75
+ case decl
76
+ when :arg
77
+ ""
78
+ when :optarg
79
+ "?"
80
+ when :kwarg
81
+ "#{name}:"
82
+ when :kwoptarg
83
+ "?#{name}:"
84
+ when :restarg
85
+ "*"
86
+ when :kwrestarg
87
+ "**"
88
+ else
89
+ "(unknown decl: #{decl})"
90
+ end
91
+ end
92
+
93
+ # @return [String]
94
+ def type_arity_decl
95
+ arity_decl + return_type.items.count.to_s
96
+ end
97
+
98
+ def arg?
99
+ decl == :arg
100
+ end
101
+
102
+ def restarg?
103
+ decl == :restarg
104
+ end
105
+
106
+ def mandatory_positional?
107
+ decl == :arg
108
+ end
109
+
110
+ def positional?
111
+ !keyword?
112
+ end
113
+
114
+ def rest?
115
+ decl == :restarg || decl == :kwrestarg
116
+ end
117
+
118
+ def block?
119
+ [:block, :blockarg].include?(decl)
120
+ end
121
+
122
+ def to_rbs
123
+ case decl
124
+ when :optarg
125
+ "?#{super}"
126
+ when :kwarg
127
+ "#{name}: #{return_type.to_rbs}"
128
+ when :kwoptarg
129
+ "?#{name}: #{return_type.to_rbs}"
130
+ when :restarg
131
+ "*#{super}"
132
+ when :kwrestarg
133
+ "**#{super}"
134
+ else
135
+ super
136
+ end
137
+ end
138
+
139
+ # @return [String] the full name of the parameter, including any
140
+ # declarative symbols such as `*` or `:` indicating type of
141
+ # parameter. This is used in method signatures.
142
+ def full_name
143
+ case decl
144
+ when :kwarg, :kwoptarg
145
+ "#{name}:"
146
+ when :restarg
147
+ "*#{name}"
148
+ when :kwrestarg
149
+ "**#{name}"
150
+ when :block, :blockarg
151
+ "&#{name}"
152
+ else
153
+ name
154
+ end
155
+ end
156
+
157
+ def reset_generated!
158
+ @return_type = nil if param_tag
159
+ super
160
+ end
161
+
162
+ # @return [String]
163
+ def full
164
+ full_name + case decl
165
+ when :optarg
166
+ " = #{asgn_code || '?'}"
167
+ when :kwoptarg
168
+ " #{asgn_code || '?'}"
169
+ else
170
+ ''
171
+ end
172
+ end
173
+
174
+ # @sg-ignore super always sets @return_type to something
175
+ # @return [ComplexType]
176
+ def return_type
177
+ if @return_type.nil?
178
+ @return_type = ComplexType::UNDEFINED
179
+ found = param_tag
180
+ @return_type = ComplexType.try_parse(*found.types) unless found.nil? or found.types.nil?
181
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
182
+ if @return_type.undefined?
183
+ if decl == :restarg
184
+ @return_type = ComplexType.try_parse('::Array')
185
+ elsif decl == :kwrestarg
186
+ @return_type = ComplexType.try_parse('::Hash')
187
+ elsif decl == :blockarg
188
+ @return_type = ComplexType.try_parse('::Proc')
189
+ end
190
+ end
191
+ end
192
+ super
193
+ end
194
+
195
+ # The parameter's zero-based location in the block's signature.
196
+ #
197
+ # @sg-ignore Need to add nil check here
198
+ # @return [Integer]
199
+ def index
200
+ method_pin = closure
201
+ # @sg-ignore Need to add nil check here
202
+ method_pin.parameter_names.index(name)
203
+ end
204
+
205
+ # @param api_map [ApiMap]
206
+ def typify api_map
207
+ new_type = super
208
+ return new_type if new_type.defined?
209
+
210
+ # sniff based on param tags
211
+ new_type = closure.is_a?(Pin::Block) ? typify_block_param(api_map) : typify_method_param(api_map)
212
+
213
+ return adjust_type api_map, new_type.self_to_type(full_context) if new_type.defined?
214
+
215
+ adjust_type api_map, super.self_to_type(full_context)
216
+ end
217
+
218
+ # @param atype [ComplexType]
219
+ # @param api_map [ApiMap]
220
+ def compatible_arg?(atype, api_map)
221
+ # make sure we get types from up the method
222
+ # inheritance chain if we don't have them on this pin
223
+ ptype = typify api_map
224
+ return true if ptype.undefined?
225
+
226
+ return true if atype.conforms_to?(api_map,
227
+ ptype,
228
+ :method_call,
229
+ [:allow_empty_params, :allow_undefined])
230
+ ptype.generic?
231
+ end
232
+
233
+ # @sg-ignore flow sensitive typing needs to handle attrs
234
+ def documentation
235
+ tag = param_tag
236
+ return '' if tag.nil? || tag.text.nil?
237
+ tag.text
238
+ end
239
+
240
+ private
241
+
242
+ def generate_complex_type
243
+ nil
244
+ end
245
+
246
+ # @return [YARD::Tags::Tag, nil]
247
+ def param_tag
248
+ # @sg-ignore Need to add nil check here
249
+ params = closure.docstring.tags(:param)
250
+ # @sg-ignore Need to add nil check here
251
+ params.each do |p|
252
+ return p if p.name == name
253
+ end
254
+ # @sg-ignore Need to add nil check here
255
+ params[index] if index && params[index] && (params[index].name.nil? || params[index].name.empty?)
256
+ end
257
+
258
+ # @param api_map [ApiMap]
259
+ # @return [ComplexType]
260
+ def typify_block_param api_map
261
+ block_pin = closure
262
+ if block_pin.is_a?(Pin::Block) && block_pin.receiver && index
263
+ return block_pin.typify_parameters(api_map)[index]
264
+ end
265
+ ComplexType::UNDEFINED
266
+ end
267
+
268
+ # @param api_map [ApiMap]
269
+ # @return [ComplexType]
270
+ def typify_method_param api_map
271
+ # @sg-ignore Need to add nil check here
272
+ meths = api_map.get_method_stack(closure.full_context.tag, closure.name, scope: closure.scope)
273
+ # meths.shift # Ignore the first one
274
+ meths.each do |meth|
275
+ found = nil
276
+ params = meth.docstring.tags(:param) + see_reference(docstring, api_map)
277
+ params.each do |p|
278
+ next unless p.name == name
279
+ found = p
280
+ break
281
+ end
282
+ if found.nil? and !index.nil?
283
+ found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
284
+ end
285
+ # @sg-ignore Need to add nil check here
286
+ return ComplexType.try_parse(*found.types).qualify(api_map, *meth.closure.gates) unless found.nil? || found.types.nil?
287
+ end
288
+ ComplexType::UNDEFINED
289
+ end
290
+
291
+ # @param heredoc [YARD::Docstring]
292
+ # @param api_map [ApiMap]
293
+ # @param skip [::Array]
294
+ #
295
+ # @return [::Array<YARD::Tags::Tag>]
296
+ def see_reference heredoc, api_map, skip = []
297
+ # This should actually be an intersection type
298
+ # @param ref [YARD::Tags::Tag, Solargraph::Yard::Tags::RefTag]
299
+ heredoc.ref_tags.each do |ref|
300
+ # @sg-ignore ref should actually be an intersection type
301
+ next unless ref.tag_name == 'param' && ref.owner
302
+ # @todo ref should actually be an intersection type
303
+ result = resolve_reference(ref.owner.to_s, api_map, skip)
304
+ return result unless result.nil?
305
+ end
306
+ []
307
+ end
308
+
309
+ # @param ref [String]
310
+ # @param api_map [ApiMap]
311
+ # @param skip [::Array]
312
+ # @return [::Array<YARD::Tags::Tag>, nil]
313
+ def resolve_reference ref, api_map, skip
314
+ return nil if skip.include?(ref)
315
+ skip.push ref
316
+ parts = ref.split(/[.#]/)
317
+ if parts.first.empty?
318
+ path = "#{namespace}#{ref}"
319
+ else
320
+ fqns = api_map.qualify(parts.first, namespace)
321
+ return nil if fqns.nil?
322
+ # @sg-ignore Need to add nil check here
323
+ path = fqns + ref[parts.first.length] + parts.last
324
+ end
325
+ pins = api_map.get_path_pins(path)
326
+ pins.each do |pin|
327
+ params = pin.docstring.tags(:param)
328
+ return params unless params.empty?
329
+ end
330
+ pins.each do |pin|
331
+ params = see_reference(pin.docstring, api_map, skip)
332
+ return params unless params.empty?
333
+ end
334
+ nil
335
+ end
336
+ end
337
+ end
338
+ end