solargraph 0.54.0 → 0.55.0

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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +58 -0
  3. data/lib/solargraph/api_map/cache.rb +10 -1
  4. data/lib/solargraph/api_map/index.rb +167 -0
  5. data/lib/solargraph/api_map/store.rb +75 -122
  6. data/lib/solargraph/api_map.rb +109 -41
  7. data/lib/solargraph/bench.rb +17 -1
  8. data/lib/solargraph/complex_type/type_methods.rb +17 -11
  9. data/lib/solargraph/complex_type/unique_type.rb +181 -17
  10. data/lib/solargraph/complex_type.rb +103 -24
  11. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +51 -0
  12. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +100 -0
  13. data/lib/solargraph/convention/struct_definition.rb +101 -0
  14. data/lib/solargraph/convention.rb +2 -0
  15. data/lib/solargraph/doc_map.rb +43 -18
  16. data/lib/solargraph/equality.rb +33 -0
  17. data/lib/solargraph/language_server/host/message_worker.rb +51 -5
  18. data/lib/solargraph/language_server/host.rb +13 -11
  19. data/lib/solargraph/language_server/message/base.rb +19 -12
  20. data/lib/solargraph/language_server/message/initialize.rb +3 -1
  21. data/lib/solargraph/language_server/message/text_document/completion.rb +0 -3
  22. data/lib/solargraph/language_server/message/text_document/definition.rb +3 -3
  23. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +3 -3
  24. data/lib/solargraph/language_server/message/text_document/formatting.rb +4 -0
  25. data/lib/solargraph/language_server/message/text_document/hover.rb +1 -1
  26. data/lib/solargraph/language_server/message/text_document/type_definition.rb +3 -3
  27. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -2
  28. data/lib/solargraph/language_server/progress.rb +19 -2
  29. data/lib/solargraph/library.rb +31 -41
  30. data/lib/solargraph/location.rb +29 -1
  31. data/lib/solargraph/parser/comment_ripper.rb +11 -6
  32. data/lib/solargraph/parser/flow_sensitive_typing.rb +226 -0
  33. data/lib/solargraph/parser/node_methods.rb +15 -1
  34. data/lib/solargraph/parser/parser_gem/class_methods.rb +11 -6
  35. data/lib/solargraph/parser/parser_gem/node_chainer.rb +10 -10
  36. data/lib/solargraph/parser/parser_gem/node_methods.rb +6 -4
  37. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +21 -0
  38. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +23 -19
  39. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +21 -1
  40. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +21 -0
  41. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +8 -2
  42. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +26 -5
  43. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +41 -0
  44. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +1 -1
  45. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +28 -0
  46. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +28 -0
  47. data/lib/solargraph/parser/parser_gem/node_processors.rb +10 -0
  48. data/lib/solargraph/parser.rb +3 -5
  49. data/lib/solargraph/pin/base.rb +47 -17
  50. data/lib/solargraph/pin/base_variable.rb +11 -4
  51. data/lib/solargraph/pin/block.rb +8 -26
  52. data/lib/solargraph/pin/breakable.rb +9 -0
  53. data/lib/solargraph/pin/callable.rb +147 -0
  54. data/lib/solargraph/pin/closure.rb +8 -3
  55. data/lib/solargraph/pin/common.rb +2 -6
  56. data/lib/solargraph/pin/conversions.rb +3 -2
  57. data/lib/solargraph/pin/instance_variable.rb +2 -2
  58. data/lib/solargraph/pin/local_variable.rb +7 -1
  59. data/lib/solargraph/pin/method.rb +76 -48
  60. data/lib/solargraph/pin/namespace.rb +14 -11
  61. data/lib/solargraph/pin/parameter.rb +24 -17
  62. data/lib/solargraph/pin/proxy_type.rb +13 -7
  63. data/lib/solargraph/pin/signature.rb +3 -129
  64. data/lib/solargraph/pin/until.rb +18 -0
  65. data/lib/solargraph/pin/while.rb +18 -0
  66. data/lib/solargraph/pin.rb +7 -1
  67. data/lib/solargraph/position.rb +7 -0
  68. data/lib/solargraph/range.rb +9 -4
  69. data/lib/solargraph/rbs_map/conversions.rb +84 -45
  70. data/lib/solargraph/rbs_map/core_fills.rb +16 -9
  71. data/lib/solargraph/rbs_map.rb +1 -0
  72. data/lib/solargraph/shell.rb +19 -2
  73. data/lib/solargraph/source/chain/array.rb +10 -8
  74. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  75. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  76. data/lib/solargraph/source/chain/call.rb +125 -61
  77. data/lib/solargraph/source/chain/constant.rb +1 -1
  78. data/lib/solargraph/source/chain/hash.rb +8 -2
  79. data/lib/solargraph/source/chain/if.rb +5 -0
  80. data/lib/solargraph/source/chain/link.rb +28 -5
  81. data/lib/solargraph/source/chain/literal.rb +27 -2
  82. data/lib/solargraph/source/chain/or.rb +1 -1
  83. data/lib/solargraph/source/chain/z_super.rb +1 -1
  84. data/lib/solargraph/source/chain.rb +131 -63
  85. data/lib/solargraph/source/cursor.rb +3 -2
  86. data/lib/solargraph/source/source_chainer.rb +2 -2
  87. data/lib/solargraph/source.rb +104 -86
  88. data/lib/solargraph/source_map/clip.rb +8 -6
  89. data/lib/solargraph/source_map/data.rb +30 -0
  90. data/lib/solargraph/source_map.rb +28 -16
  91. data/lib/solargraph/type_checker/checks.rb +4 -0
  92. data/lib/solargraph/type_checker/rules.rb +6 -1
  93. data/lib/solargraph/type_checker.rb +48 -21
  94. data/lib/solargraph/version.rb +1 -1
  95. data/lib/solargraph/views/environment.erb +3 -5
  96. data/lib/solargraph/workspace/config.rb +7 -3
  97. data/lib/solargraph/workspace.rb +1 -1
  98. data/lib/solargraph/yard_map/mapper/to_constant.rb +1 -0
  99. data/lib/solargraph/yard_map/mapper/to_method.rb +42 -15
  100. data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -0
  101. data/lib/solargraph/yard_map/mapper.rb +1 -0
  102. data/lib/solargraph/yardoc.rb +1 -1
  103. data/lib/solargraph.rb +1 -0
  104. data/solargraph.gemspec +5 -5
  105. metadata +41 -25
@@ -80,9 +80,12 @@ module Solargraph
80
80
  # @param closure [Pin::Namespace]
81
81
  # @return [void]
82
82
  def convert_self_type_to_pins decl, closure
83
+ type = build_type(decl.name, decl.args)
84
+ generic_values = type.all_params.map(&:to_s)
83
85
  include_pin = Solargraph::Pin::Reference::Include.new(
84
86
  name: decl.name.relative!.to_s,
85
- location: rbs_location_to_location(decl.location),
87
+ type_location: location_decl_to_pin_location(decl.location),
88
+ generic_values: generic_values,
86
89
  closure: closure
87
90
  )
88
91
  pins.push include_pin
@@ -144,6 +147,7 @@ module Solargraph
144
147
  name: decl.name.relative!.to_s,
145
148
  closure: Solargraph::Pin::ROOT_PIN,
146
149
  comments: decl.comment&.string,
150
+ type_location: location_decl_to_pin_location(decl.location),
147
151
  # @todo some type parameters in core/stdlib have default
148
152
  # values; Solargraph doesn't support that yet as so these
149
153
  # get treated as undefined if not specified
@@ -152,6 +156,7 @@ module Solargraph
152
156
  pins.push class_pin
153
157
  if decl.super_class
154
158
  pins.push Solargraph::Pin::Reference::Superclass.new(
159
+ type_location: location_decl_to_pin_location(decl.super_class.location),
155
160
  closure: class_pin,
156
161
  name: decl.super_class.name.relative!.to_s
157
162
  )
@@ -166,6 +171,7 @@ module Solargraph
166
171
  def interface_decl_to_pin decl, closure
167
172
  class_pin = Solargraph::Pin::Namespace.new(
168
173
  type: :module,
174
+ type_location: location_decl_to_pin_location(decl.location),
169
175
  name: decl.name.relative!.to_s,
170
176
  closure: Solargraph::Pin::ROOT_PIN,
171
177
  comments: decl.comment&.string,
@@ -185,6 +191,7 @@ module Solargraph
185
191
  module_pin = Solargraph::Pin::Namespace.new(
186
192
  type: :module,
187
193
  name: decl.name.relative!.to_s,
194
+ type_location: location_decl_to_pin_location(decl.location),
188
195
  closure: Solargraph::Pin::ROOT_PIN,
189
196
  comments: decl.comment&.string,
190
197
  generics: decl.type_params.map(&:name).map(&:to_s),
@@ -199,10 +206,11 @@ module Solargraph
199
206
  # @param name [String]
200
207
  # @param tag [String]
201
208
  # @param comments [String]
209
+ # @param decl [RBS::AST::Declarations::ClassAlias, RBS::AST::Declarations::Constant, RBS::AST::Declarations::ModuleAlias]
202
210
  # @param base [String, nil] Optional conversion of tag to base<tag>
203
211
  #
204
212
  # @return [Solargraph::Pin::Constant]
205
- def create_constant(name, tag, comments, base = nil)
213
+ def create_constant(name, tag, comments, decl, base = nil)
206
214
  parts = name.split('::')
207
215
  if parts.length > 1
208
216
  name = parts.last
@@ -214,10 +222,12 @@ module Solargraph
214
222
  constant_pin = Solargraph::Pin::Constant.new(
215
223
  name: name,
216
224
  closure: closure,
225
+ type_location: location_decl_to_pin_location(decl.location),
217
226
  comments: comments
218
227
  )
219
228
  tag = "#{base}<#{tag}>" if base
220
- constant_pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', tag))
229
+ rooted_tag = ComplexType.parse(tag).force_rooted.rooted_tags
230
+ constant_pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', rooted_tag))
221
231
  constant_pin
222
232
  end
223
233
 
@@ -228,7 +238,7 @@ module Solargraph
228
238
  new_name = decl.new_name.relative!.to_s
229
239
  old_name = decl.old_name.relative!.to_s
230
240
 
231
- pins.push create_constant(new_name, old_name, decl.comment&.string, 'Class')
241
+ pins.push create_constant(new_name, old_name, decl.comment&.string, decl, 'Class')
232
242
  end
233
243
 
234
244
  # @param decl [RBS::AST::Declarations::ModuleAlias]
@@ -238,14 +248,14 @@ module Solargraph
238
248
  new_name = decl.new_name.relative!.to_s
239
249
  old_name = decl.old_name.relative!.to_s
240
250
 
241
- pins.push create_constant(new_name, old_name, decl.comment&.string, 'Module')
251
+ pins.push create_constant(new_name, old_name, decl.comment&.string, decl, 'Module')
242
252
  end
243
253
 
244
254
  # @param decl [RBS::AST::Declarations::Constant]
245
255
  # @return [void]
246
256
  def constant_decl_to_pin decl
247
257
  tag = other_type_to_tag(decl.type)
248
- pins.push create_constant(decl.name.relative!.to_s, tag, decl.comment&.string)
258
+ pins.push create_constant(decl.name.relative!.to_s, tag, decl.comment&.string, decl)
249
259
  end
250
260
 
251
261
  # @param decl [RBS::AST::Declarations::Global]
@@ -253,13 +263,13 @@ module Solargraph
253
263
  def global_decl_to_pin decl
254
264
  closure = Solargraph::Pin::ROOT_PIN
255
265
  name = decl.name.to_s
256
- tag = other_type_to_tag(decl.type)
257
266
  pin = Solargraph::Pin::GlobalVariable.new(
258
267
  name: name,
259
268
  closure: closure,
260
269
  comments: decl.comment&.string,
261
270
  )
262
- pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', tag))
271
+ rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
272
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
263
273
  pins.push pin
264
274
  end
265
275
 
@@ -276,6 +286,7 @@ module Solargraph
276
286
  pin = Solargraph::Pin::Method.new(
277
287
  name: decl.name.to_s,
278
288
  closure: closure,
289
+ type_location: location_decl_to_pin_location(decl.location),
279
290
  comments: decl.comment&.string,
280
291
  scope: :instance,
281
292
  signatures: [],
@@ -295,6 +306,7 @@ module Solargraph
295
306
  name: decl.name.to_s,
296
307
  closure: closure,
297
308
  comments: decl.comment&.string,
309
+ type_location: location_decl_to_pin_location(decl.location),
298
310
  scope: :class,
299
311
  signatures: [],
300
312
  generics: generics
@@ -309,67 +321,69 @@ module Solargraph
309
321
  # @return [void]
310
322
  def method_def_to_sigs decl, pin
311
323
  decl.overloads.map do |overload|
312
- generics = overload.method_type.type_params.map(&:to_s)
313
- parameters, return_type = parts_of_function(overload.method_type, pin)
324
+ generics = overload.method_type.type_params.map(&:name).map(&:to_s)
325
+ signature_parameters, signature_return_type = parts_of_function(overload.method_type, pin)
314
326
  block = if overload.method_type.block
315
- Pin::Signature.new(generics, *parts_of_function(overload.method_type.block, pin))
316
- end
317
- return_type = ComplexType.try_parse(method_type_to_tag(overload.method_type))
318
- Pin::Signature.new(generics, parameters, return_type, block)
327
+ block_parameters, block_return_type = parts_of_function(overload.method_type.block, pin)
328
+ Pin::Signature.new(generics: generics, parameters: block_parameters, return_type: block_return_type)
329
+ end
330
+ Pin::Signature.new(generics: generics, parameters: signature_parameters, return_type: signature_return_type, block: block)
319
331
  end
320
332
  end
321
333
 
322
334
  # @param location [RBS::Location, nil]
323
335
  # @return [Solargraph::Location, nil]
324
- def rbs_location_to_location(location)
336
+ def location_decl_to_pin_location(location)
325
337
  return nil if location&.name.nil?
326
338
 
327
339
  start_pos = Position.new(location.start_line - 1, location.start_column)
328
340
  end_pos = Position.new(location.end_line - 1, location.end_column)
329
341
  range = Range.new(start_pos, end_pos)
330
- Location.new(location.name, range)
342
+ Location.new(location.name.to_s, range)
331
343
  end
332
344
 
333
345
  # @param type [RBS::MethodType,RBS::Types::Block]
334
346
  # @param pin [Pin::Method]
335
- # @return [Array<Array<Pin::Parameter>, ComplexType>]
347
+ # @return [Array(Array<Pin::Parameter>, ComplexType)]
336
348
  def parts_of_function type, pin
337
- return [[Solargraph::Pin::Parameter.new(decl: :restarg, name: 'arg', closure: pin)], ComplexType.try_parse(method_type_to_tag(type))] if defined?(RBS::Types::UntypedFunction) && type.type.is_a?(RBS::Types::UntypedFunction)
349
+ return [[Solargraph::Pin::Parameter.new(decl: :restarg, name: 'arg', closure: pin)], ComplexType.try_parse(method_type_to_tag(type)).force_rooted] if defined?(RBS::Types::UntypedFunction) && type.type.is_a?(RBS::Types::UntypedFunction)
338
350
 
339
351
  parameters = []
340
352
  arg_num = -1
341
353
  type.type.required_positionals.each do |param|
342
- name = param.name ? param.name.to_s : "arg#{arg_num += 1}"
343
- parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin, return_type: ComplexType.try_parse(other_type_to_tag(param.type)))
354
+ name = param.name ? param.name.to_s : "arg_#{arg_num += 1}"
355
+ parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin, return_type: ComplexType.try_parse(other_type_to_tag(param.type)).force_rooted)
344
356
  end
345
357
  type.type.optional_positionals.each do |param|
346
- name = param.name ? param.name.to_s : "arg#{arg_num += 1}"
358
+ name = param.name ? param.name.to_s : "arg_#{arg_num += 1}"
347
359
  parameters.push Solargraph::Pin::Parameter.new(decl: :optarg, name: name, closure: pin,
348
- return_type: ComplexType.try_parse(other_type_to_tag(param.type)))
360
+ return_type: ComplexType.try_parse(other_type_to_tag(param.type)).force_rooted)
349
361
  end
350
362
  if type.type.rest_positionals
351
- name = type.type.rest_positionals.name ? type.type.rest_positionals.name.to_s : "arg#{arg_num += 1}"
363
+ name = type.type.rest_positionals.name ? type.type.rest_positionals.name.to_s : "arg_#{arg_num += 1}"
352
364
  parameters.push Solargraph::Pin::Parameter.new(decl: :restarg, name: name, closure: pin)
353
365
  end
354
366
  type.type.trailing_positionals.each do |param|
355
- name = param.name ? param.name.to_s : "arg#{arg_num += 1}"
367
+ name = param.name ? param.name.to_s : "arg_#{arg_num += 1}"
356
368
  parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin)
357
369
  end
358
370
  type.type.required_keywords.each do |orig, param|
359
- name = orig ? orig.to_s : "arg#{arg_num += 1}"
371
+ name = orig ? orig.to_s : "arg_#{arg_num += 1}"
360
372
  parameters.push Solargraph::Pin::Parameter.new(decl: :kwarg, name: name, closure: pin,
361
- return_type: ComplexType.try_parse(other_type_to_tag(param.type)))
373
+ return_type: ComplexType.try_parse(other_type_to_tag(param.type)).force_rooted)
362
374
  end
363
375
  type.type.optional_keywords.each do |orig, param|
364
- name = orig ? orig.to_s : "arg#{arg_num += 1}"
376
+ name = orig ? orig.to_s : "arg_#{arg_num += 1}"
365
377
  parameters.push Solargraph::Pin::Parameter.new(decl: :kwoptarg, name: name, closure: pin,
366
- return_type: ComplexType.try_parse(other_type_to_tag(param.type)))
378
+ return_type: ComplexType.try_parse(other_type_to_tag(param.type)).force_rooted)
367
379
  end
368
380
  if type.type.rest_keywords
369
- name = type.type.rest_keywords.name ? type.type.rest_keywords.name.to_s : "arg#{arg_num += 1}"
381
+ name = type.type.rest_keywords.name ? type.type.rest_keywords.name.to_s : "arg_#{arg_num += 1}"
370
382
  parameters.push Solargraph::Pin::Parameter.new(decl: :kwrestarg, name: type.type.rest_keywords.name.to_s, closure: pin)
371
383
  end
372
- return_type = ComplexType.try_parse(method_type_to_tag(type))
384
+
385
+ rooted_tag = method_type_to_tag(type)
386
+ return_type = ComplexType.try_parse(rooted_tag).force_rooted
373
387
  [parameters, return_type]
374
388
  end
375
389
 
@@ -379,12 +393,14 @@ module Solargraph
379
393
  def attr_reader_to_pin(decl, closure)
380
394
  pin = Solargraph::Pin::Method.new(
381
395
  name: decl.name.to_s,
396
+ type_location: location_decl_to_pin_location(decl.location),
382
397
  closure: closure,
383
398
  comments: decl.comment&.string,
384
399
  scope: :instance,
385
400
  attribute: true
386
401
  )
387
- pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', other_type_to_tag(decl.type)))
402
+ rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
403
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', rooted_tag))
388
404
  pins.push pin
389
405
  end
390
406
 
@@ -394,12 +410,14 @@ module Solargraph
394
410
  def attr_writer_to_pin(decl, closure)
395
411
  pin = Solargraph::Pin::Method.new(
396
412
  name: "#{decl.name.to_s}=",
413
+ type_location: location_decl_to_pin_location(decl.location),
397
414
  closure: closure,
398
415
  comments: decl.comment&.string,
399
416
  scope: :instance,
400
417
  attribute: true
401
418
  )
402
- pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', other_type_to_tag(decl.type)))
419
+ rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
420
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', rooted_tag))
403
421
  pins.push pin
404
422
  end
405
423
 
@@ -418,9 +436,11 @@ module Solargraph
418
436
  pin = Solargraph::Pin::InstanceVariable.new(
419
437
  name: decl.name.to_s,
420
438
  closure: closure,
439
+ type_location: location_decl_to_pin_location(decl.location),
421
440
  comments: decl.comment&.string
422
441
  )
423
- pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', other_type_to_tag(decl.type)))
442
+ rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
443
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
424
444
  pins.push pin
425
445
  end
426
446
 
@@ -434,7 +454,8 @@ module Solargraph
434
454
  closure: closure,
435
455
  comments: decl.comment&.string
436
456
  )
437
- pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', other_type_to_tag(decl.type)))
457
+ rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
458
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
438
459
  pins.push pin
439
460
  end
440
461
 
@@ -448,7 +469,8 @@ module Solargraph
448
469
  closure: closure,
449
470
  comments: decl.comment&.string
450
471
  )
451
- pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', other_type_to_tag(decl.type)))
472
+ rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
473
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
452
474
  pins.push pin
453
475
  end
454
476
 
@@ -456,10 +478,11 @@ module Solargraph
456
478
  # @param closure [Pin::Namespace]
457
479
  # @return [void]
458
480
  def include_to_pin decl, closure
459
- type = generic_type(decl.name, decl.args)
481
+ type = build_type(decl.name, decl.args)
460
482
  generic_values = type.all_params.map(&:to_s)
461
483
  pins.push Solargraph::Pin::Reference::Include.new(
462
484
  name: decl.name.relative!.to_s,
485
+ type_location: location_decl_to_pin_location(decl.location),
463
486
  generic_values: generic_values,
464
487
  closure: closure
465
488
  )
@@ -471,6 +494,7 @@ module Solargraph
471
494
  def prepend_to_pin decl, closure
472
495
  pins.push Solargraph::Pin::Reference::Prepend.new(
473
496
  name: decl.name.relative!.to_s,
497
+ type_location: location_decl_to_pin_location(decl.location),
474
498
  closure: closure
475
499
  )
476
500
  end
@@ -481,6 +505,7 @@ module Solargraph
481
505
  def extend_to_pin decl, closure
482
506
  pins.push Solargraph::Pin::Reference::Extend.new(
483
507
  name: decl.name.relative!.to_s,
508
+ type_location: location_decl_to_pin_location(decl.location),
484
509
  closure: closure
485
510
  )
486
511
  end
@@ -491,6 +516,7 @@ module Solargraph
491
516
  def alias_to_pin decl, closure
492
517
  pins.push Solargraph::Pin::MethodAlias.new(
493
518
  name: decl.new_name.to_s,
519
+ type_location: location_decl_to_pin_location(decl.location),
494
520
  original: decl.old_name.to_s,
495
521
  closure: closure
496
522
  )
@@ -517,10 +543,10 @@ module Solargraph
517
543
  # @param type_name [RBS::TypeName]
518
544
  # @param type_args [Enumerable<RBS::Types::Bases::Base>]
519
545
  # @return [ComplexType::UniqueType]
520
- def generic_type(type_name, type_args)
546
+ def build_type(type_name, type_args = [])
521
547
  base = RBS_TO_YARD_TYPE[type_name.relative!.to_s] || type_name.relative!.to_s
522
548
  params = type_args.map { |a| other_type_to_tag(a) }.reject { |t| t == 'undefined' }.map do |t|
523
- ComplexType.try_parse(t)
549
+ ComplexType.try_parse(t).force_rooted
524
550
  end
525
551
  if base == 'Hash' && params.length == 2
526
552
  ComplexType::UniqueType.new(base, [params.first], [params.last], rooted: true, parameters_type: :hash)
@@ -532,8 +558,8 @@ module Solargraph
532
558
  # @param type_name [RBS::TypeName]
533
559
  # @param type_args [Enumerable<RBS::Types::Bases::Base>]
534
560
  # @return [String]
535
- def generic_type_tag(type_name, type_args)
536
- generic_type(type_name, type_args).tag
561
+ def type_tag(type_name, type_args = [])
562
+ build_type(type_name, type_args).tags
537
563
  end
538
564
 
539
565
  # @param type [RBS::Types::Bases::Base]
@@ -549,7 +575,7 @@ module Solargraph
549
575
  elsif type.is_a?(RBS::Types::Tuple)
550
576
  "Array(#{type.types.map { |t| other_type_to_tag(t) }.join(', ')})"
551
577
  elsif type.is_a?(RBS::Types::Literal)
552
- "#{type.literal}"
578
+ type.literal.inspect
553
579
  elsif type.is_a?(RBS::Types::Union)
554
580
  type.types.map { |t| other_type_to_tag(t) }.join(', ')
555
581
  elsif type.is_a?(RBS::Types::Record)
@@ -564,7 +590,7 @@ module Solargraph
564
590
  elsif type.is_a?(RBS::Types::Variable)
565
591
  "#{Solargraph::ComplexType::GENERIC_TAG_NAME}<#{type.name}>"
566
592
  elsif type.is_a?(RBS::Types::ClassInstance) #&& !type.args.empty?
567
- generic_type_tag(type.name, type.args)
593
+ type_tag(type.name, type.args)
568
594
  elsif type.is_a?(RBS::Types::Bases::Instance)
569
595
  'self'
570
596
  elsif type.is_a?(RBS::Types::Bases::Top)
@@ -581,8 +607,18 @@ module Solargraph
581
607
  type.types.map { |member| other_type_to_tag(member) }.join(', ')
582
608
  elsif type.is_a?(RBS::Types::Proc)
583
609
  'Proc'
584
- elsif type.respond_to?(:name) && type.name.respond_to?(:relative!)
585
- RBS_TO_YARD_TYPE[type.name.relative!.to_s] || type.name.relative!.to_s
610
+ elsif type.is_a?(RBS::Types::Alias)
611
+ # type-level alias use - e.g., 'bool' in "type bool = true | false"
612
+ # @todo ensure these get resolved after processing all aliases
613
+ # @todo handle recursive aliases
614
+ type_tag(type.name, type.args)
615
+ elsif type.is_a?(RBS::Types::Interface)
616
+ # represents a mix-in module which can be considered a
617
+ # subtype of a consumer of it
618
+ type_tag(type.name, type.args)
619
+ elsif type.is_a?(RBS::Types::ClassSingleton)
620
+ # e.g., singleton(String)
621
+ type_tag(type.name)
586
622
  else
587
623
  Solargraph.logger.warn "Unrecognized RBS type: #{type.class} at #{type.location}"
588
624
  'undefined'
@@ -595,9 +631,12 @@ module Solargraph
595
631
  def add_mixins decl, namespace
596
632
  decl.each_mixin do |mixin|
597
633
  klass = mixin.is_a?(RBS::AST::Members::Include) ? Pin::Reference::Include : Pin::Reference::Extend
634
+ type = build_type(mixin.name, mixin.args)
635
+ generic_values = type.all_params.map(&:to_s)
598
636
  pins.push klass.new(
599
637
  name: mixin.name.relative!.to_s,
600
- location: rbs_location_to_location(mixin.location),
638
+ type_location: location_decl_to_pin_location(mixin.location),
639
+ generic_values: generic_values,
601
640
  closure: namespace
602
641
  )
603
642
  end
@@ -16,25 +16,32 @@ module Solargraph
16
16
  ].map { |k| Pin::Keyword.new(k) }
17
17
 
18
18
  MISSING = [
19
- Solargraph::Pin::Method.new(name: 'tap', scope: :instance,
20
- closure: Solargraph::Pin::Namespace.new(name: 'Object')),
21
19
  Solargraph::Pin::Method.new(name: 'class', scope: :instance,
22
- closure: Solargraph::Pin::Namespace.new(name: 'Object'), comments: '@return [Class<self>]')
20
+ closure: Solargraph::Pin::Namespace.new(name: 'Object'), comments: '@return [::Class<self>]')
23
21
  ]
24
22
 
25
23
  OVERRIDES = [
26
24
  Override.from_comment('BasicObject#instance_eval', '@yieldreceiver [self]'),
27
25
  Override.from_comment('BasicObject#instance_exec', '@yieldreceiver [self]'),
28
- Override.from_comment('Module#define_method', '@yieldreceiver [Object<self>]'),
29
- Override.from_comment('Module#class_eval', '@yieldreceiver [Class<self>]'),
30
- Override.from_comment('Module#class_exec', '@yieldreceiver [Class<self>]'),
31
- Override.from_comment('Module#module_eval', '@yieldreceiver [Module<self>]'),
32
- Override.from_comment('Module#module_exec', '@yieldreceiver [Module<self>]'),
26
+ Override.from_comment('Module#define_method', '@yieldreceiver [::Object<self>]'),
27
+ Override.from_comment('Module#class_eval', '@yieldreceiver [::Class<self>]'),
28
+ Override.from_comment('Module#class_exec', '@yieldreceiver [::Class<self>]'),
29
+ Override.from_comment('Module#module_eval', '@yieldreceiver [::Module<self>]'),
30
+ Override.from_comment('Module#module_exec', '@yieldreceiver [::Module<self>]'),
33
31
  # RBS does not define Class with a generic, so all calls to
34
32
  # generic() return an 'untyped'. We can do better:
35
33
  Override.method_return('Class#allocate', 'self')
36
34
  ]
37
35
 
36
+ # @todo I don't see any direct link in RBS to build this from -
37
+ # presumably RBS is using duck typing to match interfaces
38
+ # against concrete classes
39
+ INCLUDES = [
40
+ Solargraph::Pin::Reference::Include.new(name: '_ToAry',
41
+ closure: Solargraph::Pin::Namespace.new(name: 'Array'),
42
+ generic_values: ['generic<Elem>'])
43
+ ]
44
+
38
45
  # HACK: Add Errno exception classes
39
46
  errno = Solargraph::Pin::Namespace.new(name: 'Errno')
40
47
  errnos = []
@@ -44,7 +51,7 @@ module Solargraph
44
51
  end
45
52
  ERRNOS = errnos
46
53
 
47
- ALL = KEYWORDS + MISSING + OVERRIDES + ERRNOS
54
+ ALL = KEYWORDS + MISSING + OVERRIDES + ERRNOS + INCLUDES
48
55
  end
49
56
  end
50
57
  end
@@ -64,6 +64,7 @@ module Solargraph
64
64
  @@rbs_maps_hash[library] ||= RbsMap.new(library)
65
65
  end
66
66
 
67
+ # @param gemspec [Gem::Specification]
67
68
  def self.from_gemspec(gemspec)
68
69
  RbsMap.new(gemspec.name, gemspec.version)
69
70
  end
@@ -89,7 +89,7 @@ module Solargraph
89
89
  )
90
90
  # @return [void]
91
91
  def clear
92
- puts "Deleting the cached documentation"
92
+ puts "Deleting all cached documentation (gems, core and stdlib)"
93
93
  Solargraph::Cache.clear
94
94
  end
95
95
  map 'clear-cache' => :clear
@@ -105,11 +105,27 @@ module Solargraph
105
105
  Cache.save('gems', "#{spec.name}-#{spec.version}.ser", pins)
106
106
  end
107
107
 
108
- desc 'uncache GEM [...GEM]', "Delete cached gem documentation"
108
+ desc 'uncache GEM [...GEM]', "Delete specific cached gem documentation"
109
+ long_desc %(
110
+ Specify one or more gem names to clear. 'core' or 'stdlib' may
111
+ also be specified to clear cached system documentation.
112
+ Documentation will be regenerated as needed.
113
+ )
114
+ # @param gems [Array<String>]
109
115
  # @return [void]
110
116
  def uncache *gems
111
117
  raise ArgumentError, 'No gems specified.' if gems.empty?
112
118
  gems.each do |gem|
119
+ if gem == 'core'
120
+ Cache.uncache("core.ser")
121
+ next
122
+ end
123
+
124
+ if gem == 'stdlib'
125
+ Cache.uncache("stdlib")
126
+ next
127
+ end
128
+
113
129
  spec = Gem::Specification.find_by_name(gem)
114
130
  Cache.uncache('gems', "#{spec.name}-#{spec.version}.ser")
115
131
  Cache.uncache('gems', "#{spec.name}-#{spec.version}.yardoc")
@@ -118,6 +134,7 @@ module Solargraph
118
134
 
119
135
  desc 'gems [GEM[=VERSION]]', 'Cache documentation for installed gems'
120
136
  option :rebuild, type: :boolean, desc: 'Rebuild existing documentation', default: false
137
+ # @param names [Array<String>]
121
138
  # @return [void]
122
139
  def gems *names
123
140
  if names.empty?
@@ -3,8 +3,9 @@ module Solargraph
3
3
  class Chain
4
4
  class Array < Literal
5
5
  # @param children [::Array<Chain>]
6
- def initialize children
7
- super('::Array')
6
+ # @param node [Parser::AST::Node]
7
+ def initialize children, node
8
+ super('::Array', node)
8
9
  @children = children
9
10
  end
10
11
 
@@ -14,17 +15,18 @@ module Solargraph
14
15
 
15
16
  # @param api_map [ApiMap]
16
17
  # @param name_pin [Pin::Base]
17
- # @param locals [Enumerable<Pin::LocalVariable>]
18
+ # @param locals [::Array<Pin::Parameter, Pin::LocalVariable>]
18
19
  def resolve api_map, name_pin, locals
19
20
  child_types = @children.map do |child|
20
- child.infer(api_map, name_pin, locals).tag
21
+ child.infer(api_map, name_pin, locals).simplify_literals
21
22
  end
22
- type = if child_types.uniq.length == 1 && child_types.first != 'undefined'
23
- "::Array<#{child_types.first}>"
23
+
24
+ type = if child_types.uniq.length == 1 && child_types.first.defined?
25
+ ComplexType::UniqueType.new('Array', [], child_types.uniq, rooted: true, parameters_type: :list)
24
26
  else
25
- '::Array'
27
+ ComplexType::UniqueType.new('Array', rooted: true)
26
28
  end
27
- [Pin::ProxyType.anonymous(ComplexType.try_parse(type))]
29
+ [Pin::ProxyType.anonymous(type)]
28
30
  end
29
31
  end
30
32
  end
@@ -5,7 +5,7 @@ module Solargraph
5
5
  class Chain
6
6
  class BlockSymbol < Link
7
7
  def resolve api_map, name_pin, locals
8
- [Pin::ProxyType.anonymous(ComplexType.try_parse('Proc'))]
8
+ [Pin::ProxyType.anonymous(ComplexType.try_parse('::Proc'))]
9
9
  end
10
10
  end
11
11
  end
@@ -5,7 +5,7 @@ module Solargraph
5
5
  class Chain
6
6
  class BlockVariable < Link
7
7
  def resolve api_map, name_pin, locals
8
- [Pin::ProxyType.anonymous(ComplexType.try_parse('Proc'))]
8
+ [Pin::ProxyType.anonymous(ComplexType.try_parse('::Proc'))]
9
9
  end
10
10
  end
11
11
  end