solargraph 0.53.4 → 0.54.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 (80) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +41 -0
  3. data/lib/solargraph/api_map/cache.rb +2 -12
  4. data/lib/solargraph/api_map/store.rb +14 -5
  5. data/lib/solargraph/api_map.rb +67 -24
  6. data/lib/solargraph/complex_type/type_methods.rb +70 -39
  7. data/lib/solargraph/complex_type/unique_type.rb +187 -73
  8. data/lib/solargraph/complex_type.rb +105 -40
  9. data/lib/solargraph/doc_map.rb +19 -3
  10. data/lib/solargraph/gem_pins.rb +9 -1
  11. data/lib/solargraph/language_server/host/dispatch.rb +8 -1
  12. data/lib/solargraph/language_server/host/message_worker.rb +29 -3
  13. data/lib/solargraph/language_server/host/sources.rb +1 -61
  14. data/lib/solargraph/language_server/host.rb +21 -68
  15. data/lib/solargraph/language_server/message/base.rb +1 -1
  16. data/lib/solargraph/language_server/message/initialize.rb +14 -0
  17. data/lib/solargraph/language_server/message/text_document/definition.rb +3 -3
  18. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +3 -3
  19. data/lib/solargraph/language_server/message/text_document/formatting.rb +1 -0
  20. data/lib/solargraph/language_server/message/text_document/hover.rb +1 -1
  21. data/lib/solargraph/language_server/message/text_document/type_definition.rb +3 -3
  22. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -2
  23. data/lib/solargraph/language_server/progress.rb +135 -0
  24. data/lib/solargraph/language_server.rb +1 -0
  25. data/lib/solargraph/library.rb +144 -113
  26. data/lib/solargraph/location.rb +14 -1
  27. data/lib/solargraph/parser/node_processor/base.rb +3 -2
  28. data/lib/solargraph/parser/node_processor.rb +1 -0
  29. data/lib/solargraph/parser/parser_gem/class_methods.rb +3 -7
  30. data/lib/solargraph/parser/parser_gem/node_chainer.rb +13 -7
  31. data/lib/solargraph/parser/parser_gem/node_methods.rb +1 -5
  32. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +23 -19
  33. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +2 -2
  34. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +53 -0
  35. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +6 -4
  36. data/lib/solargraph/parser/parser_gem/node_processors.rb +2 -0
  37. data/lib/solargraph/parser.rb +2 -5
  38. data/lib/solargraph/pin/base.rb +15 -1
  39. data/lib/solargraph/pin/base_variable.rb +35 -6
  40. data/lib/solargraph/pin/block.rb +48 -11
  41. data/lib/solargraph/pin/callable.rb +147 -0
  42. data/lib/solargraph/pin/closure.rb +8 -3
  43. data/lib/solargraph/pin/common.rb +2 -6
  44. data/lib/solargraph/pin/conversions.rb +3 -2
  45. data/lib/solargraph/pin/delegated_method.rb +5 -1
  46. data/lib/solargraph/pin/documenting.rb +2 -0
  47. data/lib/solargraph/pin/instance_variable.rb +2 -2
  48. data/lib/solargraph/pin/method.rb +54 -32
  49. data/lib/solargraph/pin/namespace.rb +4 -4
  50. data/lib/solargraph/pin/parameter.rb +14 -39
  51. data/lib/solargraph/pin/proxy_type.rb +1 -1
  52. data/lib/solargraph/pin/signature.rb +3 -129
  53. data/lib/solargraph/pin.rb +4 -1
  54. data/lib/solargraph/range.rb +2 -4
  55. data/lib/solargraph/rbs_map/conversions.rb +79 -42
  56. data/lib/solargraph/rbs_map/core_fills.rb +6 -6
  57. data/lib/solargraph/rbs_map.rb +11 -3
  58. data/lib/solargraph/shell.rb +35 -15
  59. data/lib/solargraph/source/chain/array.rb +6 -5
  60. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  61. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  62. data/lib/solargraph/source/chain/call.rb +78 -50
  63. data/lib/solargraph/source/chain/link.rb +9 -0
  64. data/lib/solargraph/source/chain/or.rb +1 -1
  65. data/lib/solargraph/source/chain.rb +60 -16
  66. data/lib/solargraph/source/cursor.rb +13 -2
  67. data/lib/solargraph/source/updater.rb +1 -0
  68. data/lib/solargraph/source.rb +102 -129
  69. data/lib/solargraph/source_map/clip.rb +4 -4
  70. data/lib/solargraph/source_map/data.rb +30 -0
  71. data/lib/solargraph/source_map/mapper.rb +3 -2
  72. data/lib/solargraph/source_map.rb +37 -15
  73. data/lib/solargraph/type_checker/rules.rb +6 -1
  74. data/lib/solargraph/type_checker.rb +50 -25
  75. data/lib/solargraph/version.rb +1 -1
  76. data/lib/solargraph/views/environment.erb +3 -5
  77. data/lib/solargraph/workspace/config.rb +2 -1
  78. data/lib/solargraph/workspace.rb +13 -0
  79. metadata +6 -3
  80. data/lib/solargraph/language_server/host/cataloger.rb +0 -57
@@ -90,11 +90,11 @@ module Solargraph
90
90
  def method_return_type_problems_for pin
91
91
  return [] if pin.is_a?(Pin::MethodAlias)
92
92
  result = []
93
- declared = pin.typify(api_map).self_to(pin.full_context.namespace)
93
+ declared = pin.typify(api_map).self_to_type(pin.full_context).qualify(api_map, pin.full_context.tag)
94
94
  if declared.undefined?
95
95
  if pin.return_type.undefined? && rules.require_type_tags?
96
96
  if pin.attribute?
97
- inferred = pin.probe(api_map).self_to(pin.full_context.namespace)
97
+ inferred = pin.probe(api_map).self_to_type(pin.full_context)
98
98
  result.push Problem.new(pin.location, "Missing @return tag for #{pin.path}", pin: pin) unless inferred.defined?
99
99
  else
100
100
  result.push Problem.new(pin.location, "Missing @return tag for #{pin.path}", pin: pin)
@@ -106,14 +106,14 @@ module Solargraph
106
106
  end
107
107
  elsif rules.validate_tags?
108
108
  unless pin.node.nil? || declared.void? || virtual_pin?(pin) || abstract?(pin)
109
- inferred = pin.probe(api_map).self_to(pin.full_context.namespace)
109
+ inferred = pin.probe(api_map).self_to_type(pin.full_context)
110
110
  if inferred.undefined?
111
111
  unless rules.ignore_all_undefined? || external?(pin)
112
112
  result.push Problem.new(pin.location, "#{pin.path} return type could not be inferred", pin: pin)
113
113
  end
114
114
  else
115
- unless (rules.rank > 1 ? all_types_match?(api_map, inferred, declared) : any_types_match?(api_map, declared, inferred))
116
- result.push Problem.new(pin.location, "Declared return type #{declared} does not match inferred type #{inferred} for #{pin.path}", pin: pin)
115
+ unless (rules.require_all_return_types_match_inferred? ? all_types_match?(api_map, inferred, declared) : any_types_match?(api_map, declared, inferred))
116
+ result.push Problem.new(pin.location, "Declared return type #{declared.rooted_tags} does not match inferred type #{inferred.rooted_tags} for #{pin.path}", pin: pin)
117
117
  end
118
118
  end
119
119
  end
@@ -154,7 +154,7 @@ module Solargraph
154
154
  break if par.decl == :restarg || par.decl == :kwrestarg || par.decl == :blockarg
155
155
  unless params[par.name]
156
156
  if pin.attribute?
157
- inferred = pin.probe(api_map).self_to(pin.full_context.namespace)
157
+ inferred = pin.probe(api_map).self_to_type(pin.full_context)
158
158
  if inferred.undefined?
159
159
  result.push Problem.new(pin.location, "Missing @param tag for #{par.name} on #{pin.path}", pin: pin)
160
160
  end
@@ -291,13 +291,19 @@ module Solargraph
291
291
  result = []
292
292
  base = chain
293
293
  until base.links.length == 1 && base.undefined?
294
+ last_base_link = base.links.last
295
+ break unless last_base_link.is_a?(Solargraph::Source::Chain::Call)
296
+
297
+ arguments = last_base_link.arguments
298
+
294
299
  pins = base.define(api_map, block_pin, locals)
295
300
 
296
- if pins.first.is_a?(Pin::DelegatedMethod) && !pins.first.resolvable?(api_map)
301
+ first_pin = pins.first
302
+ if first_pin.is_a?(Pin::DelegatedMethod) && !first_pin.resolvable?(api_map)
297
303
  # Do nothing, as we can't find the actual method implementation
298
- elsif pins.first.is_a?(Pin::Method)
304
+ elsif first_pin.is_a?(Pin::Method)
299
305
  # @type [Pin::Method]
300
- pin = pins.first
306
+ pin = first_pin
301
307
  ap = if base.links.last.is_a?(Solargraph::Source::Chain::ZSuper)
302
308
  arity_problems_for(pin, fake_args_for(block_pin), location)
303
309
  elsif pin.path == 'Class#new'
@@ -307,9 +313,9 @@ module Solargraph
307
313
  base.base.infer(api_map, block_pin, locals).namespace
308
314
  end
309
315
  init = api_map.get_method_stack(fqns, 'initialize').first
310
- init ? arity_problems_for(init, base.links.last.arguments, location) : []
316
+ init ? arity_problems_for(init, arguments, location) : []
311
317
  else
312
- arity_problems_for(pin, base.links.last.arguments, location)
318
+ arity_problems_for(pin, arguments, location)
313
319
  end
314
320
  unless ap.empty?
315
321
  result.concat ap
@@ -322,24 +328,26 @@ module Solargraph
322
328
  all_errors = []
323
329
  pin.signatures.sort { |sig| sig.parameters.length }.each do |sig|
324
330
  errors = []
325
- # @todo these should be able to be probed
326
- # @param par [Parameter]
327
- # @param idx [Integer]
328
331
  sig.parameters.each_with_index do |par, idx|
329
- argchain = base.links.last.arguments[idx]
332
+ # @todo add logic mapping up restarg parameters with
333
+ # arguments (including restarg arguments). Use tuples
334
+ # when possible, and when not, ensure provably
335
+ # incorrect situations are detected.
336
+ break if par.decl == :restarg # bail out pending better arg processing
337
+ argchain = arguments[idx]
330
338
  if argchain.nil?
331
339
  if par.decl == :arg
332
- last = base.links.last.arguments.last
333
- if last && last.node.type == :splat
334
- argchain = last
340
+ final_arg = arguments.last
341
+ if final_arg && final_arg.node.type == :splat
342
+ argchain = final_arg
335
343
  next # don't try to apply the type of the splat - unlikely to be specific enough
336
344
  else
337
345
  errors.push Problem.new(location, "Not enough arguments to #{pin.path}")
338
346
  next
339
347
  end
340
348
  else
341
- last = base.links.last.arguments.last
342
- argchain = last if last && [:kwsplat, :hash].include?(last.node.type)
349
+ final_arg = arguments.last
350
+ argchain = final_arg if final_arg && [:kwsplat, :hash].include?(final_arg.node.type)
343
351
  end
344
352
  end
345
353
  if argchain
@@ -347,12 +355,29 @@ module Solargraph
347
355
  errors.concat kwarg_problems_for sig, argchain, api_map, block_pin, locals, location, pin, params, idx
348
356
  next
349
357
  else
350
- last = base.links.last.arguments.last
351
- if last && last.node.type == :splat
352
- next # don't try to apply the type of the splat - unlikely to be specific enough
358
+ if argchain.node.type == :splat && argchain == arguments.last
359
+ final_arg = argchain
360
+ end
361
+ if (final_arg && final_arg.node.type == :splat)
362
+ # The final argument given has been seen and was a
363
+ # splat, which doesn't give us useful types or
364
+ # arities against positional parameters, so let's
365
+ # continue on in case there are any required
366
+ # kwargs we should warn about
367
+ next
368
+ end
369
+
370
+ if argchain.node.type == :splat && par != sig.parameters.last
371
+ # we have been given a splat and there are more
372
+ # arguments to come.
373
+
374
+ # @todo Improve this so that we can skip past the
375
+ # rest of the positional parameters here but still
376
+ # process the kwargs
377
+ break
353
378
  end
354
379
  ptype = params.key?(par.name) ? params[par.name][:qualified] : ComplexType::UNDEFINED
355
- ptype = ptype.self_to(par.context.namespace)
380
+ ptype = ptype.self_to_type(par.context)
356
381
  if ptype.nil?
357
382
  # @todo Some level (strong, I guess) should require the param here
358
383
  else
@@ -462,7 +487,7 @@ module Solargraph
462
487
  def first_param_hash(pins)
463
488
  pins.each do |pin|
464
489
  # @todo this assignment from parametric use of Hash should not lose its generic
465
- # @type [Hash{String => Hash{Symbol => BasicObject}]
490
+ # @type [Hash{String => Hash{Symbol => BasicObject}}]
466
491
  result = param_hash(pin)
467
492
  return result unless result.empty?
468
493
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Solargraph
4
- VERSION = '0.53.4'
4
+ VERSION = '0.54.1'
5
5
  end
@@ -35,11 +35,9 @@
35
35
  <li>
36
36
  Core Cache Directory: N/A <%# @todo Fix %>
37
37
  </li>
38
- <% unless Solargraph::Parser.rubyvm? %>
39
- <li>
40
- Parser Target Version: <%= Solargraph::Parser.version %>
41
- </li>
42
- <% end %>
38
+ <li>
39
+ Parser Target Version: <%= Solargraph::Parser.version %>
40
+ </li>
43
41
  <li>
44
42
  Using Bundler: <%= ENV.key?('BUNDLE_BIN_PATH') %>
45
43
  </li>
@@ -14,7 +14,8 @@ module Solargraph
14
14
  # @return [String]
15
15
  attr_reader :directory
16
16
 
17
- # @return [Hash{String => BasicObject}]
17
+ # @todo To make this strongly typed we'll need a record syntax
18
+ # @return [Hash{String => undefined}]
18
19
  attr_reader :raw_data
19
20
 
20
21
  # @param directory [String]
@@ -128,6 +128,11 @@ module Solargraph
128
128
  end
129
129
  end
130
130
 
131
+ # @return [String, nil]
132
+ def rbs_collection_path
133
+ @gem_rbs_collection ||= read_rbs_collection_path
134
+ end
135
+
131
136
  # Synchronize the workspace from the provided updater.
132
137
  #
133
138
  # @param updater [Source::Updater]
@@ -222,5 +227,13 @@ module Solargraph
222
227
  end
223
228
  end
224
229
  end
230
+
231
+ # @return [String, nil]
232
+ def read_rbs_collection_path
233
+ yaml_file = File.join(directory, 'rbs_collection.yaml')
234
+ return unless File.file?(yaml_file)
235
+
236
+ YAML.load_file(yaml_file)&.fetch('path')
237
+ end
225
238
  end
226
239
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solargraph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.53.4
4
+ version: 0.54.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fred Snyder
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-03-30 00:00:00.000000000 Z
11
+ date: 2025-04-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backport
@@ -428,7 +428,6 @@ files:
428
428
  - lib/solargraph/language_server/completion_item_kinds.rb
429
429
  - lib/solargraph/language_server/error_codes.rb
430
430
  - lib/solargraph/language_server/host.rb
431
- - lib/solargraph/language_server/host/cataloger.rb
432
431
  - lib/solargraph/language_server/host/diagnoser.rb
433
432
  - lib/solargraph/language_server/host/dispatch.rb
434
433
  - lib/solargraph/language_server/host/message_worker.rb
@@ -479,6 +478,7 @@ files:
479
478
  - lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb
480
479
  - lib/solargraph/language_server/message/workspace/workspace_symbol.rb
481
480
  - lib/solargraph/language_server/message_types.rb
481
+ - lib/solargraph/language_server/progress.rb
482
482
  - lib/solargraph/language_server/request.rb
483
483
  - lib/solargraph/language_server/symbol_kinds.rb
484
484
  - lib/solargraph/language_server/transport.rb
@@ -511,6 +511,7 @@ files:
511
511
  - lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb
512
512
  - lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb
513
513
  - lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb
514
+ - lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb
514
515
  - lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb
515
516
  - lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb
516
517
  - lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb
@@ -523,6 +524,7 @@ files:
523
524
  - lib/solargraph/pin/base.rb
524
525
  - lib/solargraph/pin/base_variable.rb
525
526
  - lib/solargraph/pin/block.rb
527
+ - lib/solargraph/pin/callable.rb
526
528
  - lib/solargraph/pin/class_variable.rb
527
529
  - lib/solargraph/pin/closure.rb
528
530
  - lib/solargraph/pin/common.rb
@@ -588,6 +590,7 @@ files:
588
590
  - lib/solargraph/source_map.rb
589
591
  - lib/solargraph/source_map/clip.rb
590
592
  - lib/solargraph/source_map/completion.rb
593
+ - lib/solargraph/source_map/data.rb
591
594
  - lib/solargraph/source_map/mapper.rb
592
595
  - lib/solargraph/type_checker.rb
593
596
  - lib/solargraph/type_checker/checks.rb
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module LanguageServer
5
- class Host
6
- # An asynchronous library cataloging handler.
7
- #
8
- class Cataloger
9
- # @param host [Host]
10
- def initialize host
11
- @host = host
12
- @stopped = true
13
- end
14
-
15
- # Stop the catalog thread.
16
- #
17
- # @return [void]
18
- def stop
19
- @stopped = true
20
- end
21
-
22
- # True if the cataloger is stopped.
23
- #
24
- # @return [Boolean]
25
- def stopped?
26
- @stopped
27
- end
28
-
29
- # Start the catalog thread.
30
- #
31
- # @return [void]
32
- def start
33
- return unless stopped?
34
- @stopped = false
35
- Thread.new do
36
- until stopped?
37
- tick
38
- sleep 0.1
39
- end
40
- end
41
- end
42
-
43
- # Perform cataloging.
44
- #
45
- # @return [void]
46
- def tick
47
- host.catalog
48
- end
49
-
50
- private
51
-
52
- # @return [Host]
53
- attr_reader :host
54
- end
55
- end
56
- end
57
- end