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,275 +1,275 @@
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
+ 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,39 +1,39 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class ProxyType < Base
6
- # @param return_type [ComplexType]
7
- # @param gates [Array<String>, nil] Namespaces to try while resolving non-rooted types
8
- # @param binder [ComplexType, ComplexType::UniqueType, nil]
9
- # @param gates [Array<String>, nil]
10
- def initialize return_type: ComplexType::UNDEFINED, binder: nil, gates: nil, **splat
11
- super(**splat)
12
- @gates = gates
13
- @return_type = return_type
14
- @binder = binder if binder
15
- end
16
-
17
- def context
18
- @return_type
19
- end
20
-
21
- # @param context [ComplexType, ComplexType::UniqueType] Used as context for this pin
22
- # @param closure [Pin::Namespace, nil] Used as the closure for this pin
23
- # @param binder [ComplexType, ComplexType::UniqueType, nil]
24
- # @return [ProxyType]
25
- def self.anonymous context, closure: nil, binder: nil, **kwargs
26
- unless closure
27
- parts = context.namespace.split('::')
28
- namespace = parts[0..-2].join('::').to_s
29
- closure = Solargraph::Pin::Namespace.new(name: namespace, source: :proxy_type)
30
- end
31
- # name = parts.last.to_s
32
- # ProxyType.new(nil, namespace, name, return_type)
33
- ProxyType.new(
34
- closure: closure, return_type: context, binder: binder || context, **kwargs
35
- )
36
- end
37
- end
38
- end
39
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class ProxyType < Base
6
+ # @param return_type [ComplexType]
7
+ # @param gates [Array<String>, nil] Namespaces to try while resolving non-rooted types
8
+ # @param binder [ComplexType, ComplexType::UniqueType, nil]
9
+ # @param gates [Array<String>, nil]
10
+ def initialize return_type: ComplexType::UNDEFINED, binder: nil, gates: nil, **splat
11
+ super(**splat)
12
+ @gates = gates
13
+ @return_type = return_type
14
+ @binder = binder if binder
15
+ end
16
+
17
+ def context
18
+ @return_type
19
+ end
20
+
21
+ # @param context [ComplexType, ComplexType::UniqueType] Used as context for this pin
22
+ # @param closure [Pin::Namespace, nil] Used as the closure for this pin
23
+ # @param binder [ComplexType, ComplexType::UniqueType, nil]
24
+ # @return [ProxyType]
25
+ def self.anonymous context, closure: nil, binder: nil, **kwargs
26
+ unless closure
27
+ parts = context.namespace.split('::')
28
+ namespace = parts[0..-2].join('::').to_s
29
+ closure = Solargraph::Pin::Namespace.new(name: namespace, source: :proxy_type)
30
+ end
31
+ # name = parts.last.to_s
32
+ # ProxyType.new(nil, namespace, name, return_type)
33
+ ProxyType.new(
34
+ closure: closure, return_type: context, binder: binder || context, **kwargs
35
+ )
36
+ end
37
+ end
38
+ end
39
+ end