solargraph 0.56.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 (191) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/linting.yml +127 -0
  4. data/.github/workflows/plugins.yml +183 -7
  5. data/.github/workflows/rspec.yml +55 -5
  6. data/.github/workflows/typecheck.yml +6 -3
  7. data/.gitignore +6 -0
  8. data/.overcommit.yml +72 -0
  9. data/.rspec +1 -0
  10. data/.rubocop.yml +66 -0
  11. data/.rubocop_todo.yml +1279 -0
  12. data/.yardopts +1 -0
  13. data/CHANGELOG.md +92 -1
  14. data/README.md +8 -4
  15. data/Rakefile +125 -13
  16. data/bin/solargraph +3 -0
  17. data/lib/solargraph/api_map/cache.rb +110 -109
  18. data/lib/solargraph/api_map/constants.rb +279 -0
  19. data/lib/solargraph/api_map/index.rb +193 -175
  20. data/lib/solargraph/api_map/source_to_yard.rb +97 -88
  21. data/lib/solargraph/api_map/store.rb +384 -266
  22. data/lib/solargraph/api_map.rb +945 -973
  23. data/lib/solargraph/bench.rb +1 -0
  24. data/lib/solargraph/complex_type/type_methods.rb +228 -222
  25. data/lib/solargraph/complex_type/unique_type.rb +482 -475
  26. data/lib/solargraph/complex_type.rb +444 -423
  27. data/lib/solargraph/convention/active_support_concern.rb +111 -0
  28. data/lib/solargraph/convention/base.rb +17 -0
  29. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
  30. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
  31. data/lib/solargraph/convention/data_definition.rb +105 -0
  32. data/lib/solargraph/convention/gemspec.rb +3 -2
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -60
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -100
  35. data/lib/solargraph/convention/struct_definition.rb +164 -101
  36. data/lib/solargraph/convention.rb +32 -2
  37. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  38. data/lib/solargraph/diagnostics/rubocop.rb +118 -113
  39. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  40. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  41. data/lib/solargraph/doc_map.rb +439 -405
  42. data/lib/solargraph/environ.rb +9 -2
  43. data/lib/solargraph/equality.rb +34 -33
  44. data/lib/solargraph/gem_pins.rb +98 -88
  45. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  46. data/lib/solargraph/language_server/host/dispatch.rb +130 -128
  47. data/lib/solargraph/language_server/host/message_worker.rb +112 -109
  48. data/lib/solargraph/language_server/host/sources.rb +99 -99
  49. data/lib/solargraph/language_server/host.rb +878 -871
  50. data/lib/solargraph/language_server/message/base.rb +2 -1
  51. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
  52. data/lib/solargraph/language_server/message/extended/document.rb +23 -23
  53. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  54. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
  55. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  56. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -131
  57. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  58. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  59. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -24
  60. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
  61. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  62. data/lib/solargraph/language_server/progress.rb +8 -0
  63. data/lib/solargraph/language_server/request.rb +4 -1
  64. data/lib/solargraph/library.rb +683 -666
  65. data/lib/solargraph/location.rb +82 -79
  66. data/lib/solargraph/logging.rb +37 -28
  67. data/lib/solargraph/page.rb +3 -0
  68. data/lib/solargraph/parser/comment_ripper.rb +69 -62
  69. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -227
  70. data/lib/solargraph/parser/node_processor/base.rb +92 -87
  71. data/lib/solargraph/parser/node_processor.rb +62 -46
  72. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -159
  73. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -0
  74. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -164
  75. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -497
  76. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -21
  77. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -59
  78. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  79. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -45
  80. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +1 -21
  81. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -53
  82. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -21
  83. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
  84. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
  85. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -53
  86. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +0 -22
  87. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -41
  88. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -16
  89. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -37
  90. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -43
  91. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -271
  92. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +1 -0
  93. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
  94. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -66
  95. data/lib/solargraph/parser/region.rb +69 -66
  96. data/lib/solargraph/parser/snippet.rb +17 -15
  97. data/lib/solargraph/pin/base.rb +729 -651
  98. data/lib/solargraph/pin/base_variable.rb +126 -125
  99. data/lib/solargraph/pin/block.rb +104 -103
  100. data/lib/solargraph/pin/breakable.rb +9 -9
  101. data/lib/solargraph/pin/callable.rb +231 -218
  102. data/lib/solargraph/pin/closure.rb +72 -74
  103. data/lib/solargraph/pin/common.rb +79 -75
  104. data/lib/solargraph/pin/constant.rb +2 -0
  105. data/lib/solargraph/pin/conversions.rb +123 -123
  106. data/lib/solargraph/pin/delegated_method.rb +120 -120
  107. data/lib/solargraph/pin/documenting.rb +114 -114
  108. data/lib/solargraph/pin/instance_variable.rb +34 -34
  109. data/lib/solargraph/pin/keyword.rb +20 -20
  110. data/lib/solargraph/pin/local_variable.rb +75 -76
  111. data/lib/solargraph/pin/method.rb +672 -651
  112. data/lib/solargraph/pin/method_alias.rb +34 -31
  113. data/lib/solargraph/pin/namespace.rb +115 -115
  114. data/lib/solargraph/pin/parameter.rb +275 -261
  115. data/lib/solargraph/pin/proxy_type.rb +39 -35
  116. data/lib/solargraph/pin/reference/override.rb +47 -33
  117. data/lib/solargraph/pin/reference/superclass.rb +15 -10
  118. data/lib/solargraph/pin/reference.rb +39 -22
  119. data/lib/solargraph/pin/search.rb +61 -56
  120. data/lib/solargraph/pin/signature.rb +61 -59
  121. data/lib/solargraph/pin/symbol.rb +53 -48
  122. data/lib/solargraph/pin/until.rb +18 -18
  123. data/lib/solargraph/pin/while.rb +18 -18
  124. data/lib/solargraph/pin.rb +44 -44
  125. data/lib/solargraph/pin_cache.rb +245 -185
  126. data/lib/solargraph/position.rb +132 -116
  127. data/lib/solargraph/range.rb +112 -107
  128. data/lib/solargraph/rbs_map/conversions.rb +823 -773
  129. data/lib/solargraph/rbs_map/core_fills.rb +18 -0
  130. data/lib/solargraph/rbs_map/core_map.rb +58 -51
  131. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
  132. data/lib/solargraph/rbs_map.rb +163 -150
  133. data/lib/solargraph/shell.rb +352 -268
  134. data/lib/solargraph/source/chain/call.rb +337 -333
  135. data/lib/solargraph/source/chain/constant.rb +26 -89
  136. data/lib/solargraph/source/chain/hash.rb +34 -34
  137. data/lib/solargraph/source/chain/if.rb +28 -28
  138. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  139. data/lib/solargraph/source/chain/link.rb +11 -2
  140. data/lib/solargraph/source/chain/literal.rb +48 -48
  141. data/lib/solargraph/source/chain/or.rb +23 -23
  142. data/lib/solargraph/source/chain.rb +291 -282
  143. data/lib/solargraph/source/change.rb +82 -82
  144. data/lib/solargraph/source/cursor.rb +166 -167
  145. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  146. data/lib/solargraph/source/source_chainer.rb +194 -194
  147. data/lib/solargraph/source/updater.rb +55 -55
  148. data/lib/solargraph/source.rb +498 -495
  149. data/lib/solargraph/source_map/clip.rb +226 -234
  150. data/lib/solargraph/source_map/data.rb +34 -30
  151. data/lib/solargraph/source_map/mapper.rb +259 -259
  152. data/lib/solargraph/source_map.rb +212 -200
  153. data/lib/solargraph/type_checker/checks.rb +124 -124
  154. data/lib/solargraph/type_checker/param_def.rb +37 -35
  155. data/lib/solargraph/type_checker/problem.rb +32 -32
  156. data/lib/solargraph/type_checker/rules.rb +84 -62
  157. data/lib/solargraph/type_checker.rb +814 -699
  158. data/lib/solargraph/version.rb +5 -5
  159. data/lib/solargraph/workspace/config.rb +255 -239
  160. data/lib/solargraph/workspace/require_paths.rb +97 -0
  161. data/lib/solargraph/workspace.rb +220 -249
  162. data/lib/solargraph/yard_map/helpers.rb +44 -16
  163. data/lib/solargraph/yard_map/mapper/to_constant.rb +5 -5
  164. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -134
  165. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -30
  166. data/lib/solargraph/yard_map/mapper.rb +79 -79
  167. data/lib/solargraph/yard_map/to_method.rb +89 -88
  168. data/lib/solargraph/yardoc.rb +87 -49
  169. data/lib/solargraph.rb +105 -90
  170. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  171. data/rbs/fills/open3/0/open3.rbs +172 -0
  172. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  173. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  174. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  175. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  176. data/rbs/fills/{tuple.rbs → tuple/tuple.rbs} +2 -3
  177. data/rbs/shims/ast/0/node.rbs +5 -0
  178. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  179. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  180. data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  181. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  182. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  183. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  184. data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  185. data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
  186. data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
  187. data/rbs_collection.yaml +4 -4
  188. data/solargraph.gemspec +26 -5
  189. metadata +187 -15
  190. data/lib/.rubocop.yml +0 -22
  191. data/lib/solargraph/parser/node_methods.rb +0 -97
@@ -1,261 +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]
109
- def full
110
- case decl
111
- when :optarg
112
- "#{name} = #{asgn_code || '?'}"
113
- when :kwarg
114
- "#{name}:"
115
- when :kwoptarg
116
- "#{name}: #{asgn_code || '?'}"
117
- when :restarg
118
- "*#{name}"
119
- when :kwrestarg
120
- "**#{name}"
121
- when :block, :blockarg
122
- "&#{name}"
123
- else
124
- name
125
- end
126
- end
127
-
128
- # @return [ComplexType]
129
- def return_type
130
- if @return_type.nil?
131
- @return_type = ComplexType::UNDEFINED
132
- found = param_tag
133
- @return_type = ComplexType.try_parse(*found.types) unless found.nil? or found.types.nil?
134
- if @return_type.undefined?
135
- if decl == :restarg
136
- @return_type = ComplexType.try_parse('::Array')
137
- elsif decl == :kwrestarg
138
- @return_type = ComplexType.try_parse('::Hash')
139
- elsif decl == :blockarg
140
- @return_type = ComplexType.try_parse('::Proc')
141
- end
142
- end
143
- end
144
- super
145
- @return_type
146
- end
147
-
148
- # The parameter's zero-based location in the block's signature.
149
- #
150
- # @return [Integer]
151
- def index
152
- # @type [Method, Block]
153
- method_pin = closure
154
- method_pin.parameter_names.index(name)
155
- end
156
-
157
- # @param api_map [ApiMap]
158
- def typify api_map
159
- return return_type.qualify(api_map, closure.context.namespace) unless return_type.undefined?
160
- closure.is_a?(Pin::Block) ? typify_block_param(api_map) : typify_method_param(api_map)
161
- end
162
-
163
- # @param atype [ComplexType]
164
- # @param api_map [ApiMap]
165
- def compatible_arg?(atype, api_map)
166
- # make sure we get types from up the method
167
- # inheritance chain if we don't have them on this pin
168
- ptype = typify api_map
169
- ptype.undefined? || ptype.can_assign?(api_map, atype) || ptype.generic?
170
- end
171
-
172
- def documentation
173
- tag = param_tag
174
- return '' if tag.nil? || tag.text.nil?
175
- tag.text
176
- end
177
-
178
- private
179
-
180
- # @return [YARD::Tags::Tag, nil]
181
- def param_tag
182
- params = closure.docstring.tags(:param)
183
- params.each do |p|
184
- return p if p.name == name
185
- end
186
- params[index] if index && params[index] && (params[index].name.nil? || params[index].name.empty?)
187
- end
188
-
189
- # @param api_map [ApiMap]
190
- # @return [ComplexType]
191
- def typify_block_param api_map
192
- block_pin = closure
193
- if block_pin.is_a?(Pin::Block) && block_pin.receiver
194
- return block_pin.typify_parameters(api_map)[index]
195
- end
196
- ComplexType::UNDEFINED
197
- end
198
-
199
- # @param api_map [ApiMap]
200
- # @return [ComplexType]
201
- def typify_method_param api_map
202
- meths = api_map.get_method_stack(closure.full_context.tag, closure.name, scope: closure.scope)
203
- # meths.shift # Ignore the first one
204
- meths.each do |meth|
205
- found = nil
206
- params = meth.docstring.tags(:param) + see_reference(docstring, api_map)
207
- params.each do |p|
208
- next unless p.name == name
209
- found = p
210
- break
211
- end
212
- if found.nil? and !index.nil?
213
- found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
214
- end
215
- return ComplexType.try_parse(*found.types).qualify(api_map, meth.context.namespace) unless found.nil? || found.types.nil?
216
- end
217
- ComplexType::UNDEFINED
218
- end
219
-
220
- # @param heredoc [YARD::Docstring]
221
- # @param api_map [ApiMap]
222
- # @param skip [::Array]
223
- # @return [::Array<YARD::Tags::Tag>]
224
- def see_reference heredoc, api_map, skip = []
225
- heredoc.ref_tags.each do |ref|
226
- next unless ref.tag_name == 'param' && ref.owner
227
- result = resolve_reference(ref.owner.to_s, api_map, skip)
228
- return result unless result.nil?
229
- end
230
- []
231
- end
232
-
233
- # @param ref [String]
234
- # @param api_map [ApiMap]
235
- # @param skip [::Array]
236
- # @return [::Array<YARD::Tags::Tag>, nil]
237
- def resolve_reference ref, api_map, skip
238
- return nil if skip.include?(ref)
239
- skip.push ref
240
- parts = ref.split(/[\.#]/)
241
- if parts.first.empty?
242
- path = "#{namespace}#{ref}"
243
- else
244
- fqns = api_map.qualify(parts.first, namespace)
245
- return nil if fqns.nil?
246
- path = fqns + ref[parts.first.length] + parts.last
247
- end
248
- pins = api_map.get_path_pins(path)
249
- pins.each do |pin|
250
- params = pin.docstring.tags(:param)
251
- return params unless params.empty?
252
- end
253
- pins.each do |pin|
254
- params = see_reference(pin.docstring, api_map, skip)
255
- return params unless params.empty?
256
- end
257
- nil
258
- end
259
- end
260
- end
261
- 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,35 +1,39 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Pin
5
- class ProxyType < Base
6
- # @param return_type [ComplexType]
7
- def initialize return_type: ComplexType::UNDEFINED, binder: nil, **splat
8
- super(**splat)
9
- @return_type = return_type
10
- @binder = binder if binder
11
- end
12
-
13
- def context
14
- @return_type
15
- end
16
-
17
- # @param context [ComplexType, ComplexType::UniqueType] Used as context for this pin
18
- # @param closure [Pin::Namespace, nil] Used as the closure for this pin
19
- # @param binder [ComplexType, ComplexType::UniqueType, nil]
20
- # @return [ProxyType]
21
- def self.anonymous context, closure: nil, binder: nil, **kwargs
22
- unless closure
23
- parts = context.namespace.split('::')
24
- namespace = parts[0..-2].join('::').to_s
25
- closure = Solargraph::Pin::Namespace.new(name: namespace, source: :proxy_type)
26
- end
27
- # name = parts.last.to_s
28
- # ProxyType.new(nil, namespace, name, return_type)
29
- ProxyType.new(
30
- closure: closure, return_type: context, binder: binder || context, **kwargs
31
- )
32
- end
33
- end
34
- end
35
- 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