solargraph 0.56.2 → 0.57.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 (122) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/linting.yml +125 -0
  3. data/.github/workflows/plugins.yml +148 -6
  4. data/.github/workflows/rspec.yml +39 -4
  5. data/.github/workflows/typecheck.yml +5 -2
  6. data/.gitignore +5 -0
  7. data/.overcommit.yml +72 -0
  8. data/.rspec +1 -0
  9. data/.rubocop.yml +66 -0
  10. data/.rubocop_todo.yml +2627 -0
  11. data/.yardopts +1 -0
  12. data/CHANGELOG.md +42 -0
  13. data/README.md +8 -4
  14. data/Rakefile +125 -13
  15. data/lib/solargraph/api_map/cache.rb +3 -2
  16. data/lib/solargraph/api_map/constants.rb +218 -0
  17. data/lib/solargraph/api_map/index.rb +20 -26
  18. data/lib/solargraph/api_map/source_to_yard.rb +10 -4
  19. data/lib/solargraph/api_map/store.rb +126 -18
  20. data/lib/solargraph/api_map.rb +212 -234
  21. data/lib/solargraph/bench.rb +1 -0
  22. data/lib/solargraph/complex_type/type_methods.rb +1 -0
  23. data/lib/solargraph/complex_type/unique_type.rb +7 -7
  24. data/lib/solargraph/complex_type.rb +5 -1
  25. data/lib/solargraph/convention/active_support_concern.rb +111 -0
  26. data/lib/solargraph/convention/base.rb +17 -0
  27. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +1 -0
  28. data/lib/solargraph/convention/data_definition/data_definition_node.rb +3 -1
  29. data/lib/solargraph/convention/data_definition.rb +2 -1
  30. data/lib/solargraph/convention/gemspec.rb +1 -1
  31. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -0
  32. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +3 -1
  33. data/lib/solargraph/convention/struct_definition.rb +36 -13
  34. data/lib/solargraph/convention.rb +31 -2
  35. data/lib/solargraph/diagnostics/rubocop.rb +6 -1
  36. data/lib/solargraph/diagnostics/rubocop_helpers.rb +1 -1
  37. data/lib/solargraph/doc_map.rb +40 -12
  38. data/lib/solargraph/environ.rb +9 -2
  39. data/lib/solargraph/gem_pins.rb +17 -11
  40. data/lib/solargraph/language_server/host/dispatch.rb +2 -0
  41. data/lib/solargraph/language_server/host/message_worker.rb +3 -0
  42. data/lib/solargraph/language_server/host.rb +2 -1
  43. data/lib/solargraph/language_server/message/base.rb +2 -1
  44. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +1 -1
  45. data/lib/solargraph/language_server/message/text_document/definition.rb +2 -0
  46. data/lib/solargraph/language_server/message/text_document/formatting.rb +16 -2
  47. data/lib/solargraph/language_server/message/text_document/type_definition.rb +1 -0
  48. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
  49. data/lib/solargraph/language_server/progress.rb +8 -0
  50. data/lib/solargraph/language_server/request.rb +1 -0
  51. data/lib/solargraph/library.rb +8 -15
  52. data/lib/solargraph/location.rb +2 -0
  53. data/lib/solargraph/logging.rb +11 -2
  54. data/lib/solargraph/page.rb +4 -0
  55. data/lib/solargraph/parser/comment_ripper.rb +8 -1
  56. data/lib/solargraph/parser/flow_sensitive_typing.rb +32 -4
  57. data/lib/solargraph/parser/node_methods.rb +2 -2
  58. data/lib/solargraph/parser/node_processor/base.rb +1 -1
  59. data/lib/solargraph/parser/node_processor.rb +6 -2
  60. data/lib/solargraph/parser/parser_gem/class_methods.rb +1 -1
  61. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -0
  62. data/lib/solargraph/parser/parser_gem/node_chainer.rb +3 -1
  63. data/lib/solargraph/parser/parser_gem/node_methods.rb +4 -2
  64. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +3 -2
  65. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +2 -0
  66. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +3 -0
  67. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +35 -14
  68. data/lib/solargraph/parser/region.rb +3 -0
  69. data/lib/solargraph/parser/snippet.rb +2 -0
  70. data/lib/solargraph/pin/base.rb +50 -8
  71. data/lib/solargraph/pin/base_variable.rb +1 -2
  72. data/lib/solargraph/pin/callable.rb +9 -0
  73. data/lib/solargraph/pin/closure.rb +2 -0
  74. data/lib/solargraph/pin/common.rb +6 -2
  75. data/lib/solargraph/pin/constant.rb +2 -0
  76. data/lib/solargraph/pin/delegated_method.rb +1 -0
  77. data/lib/solargraph/pin/local_variable.rb +4 -1
  78. data/lib/solargraph/pin/method.rb +8 -5
  79. data/lib/solargraph/pin/method_alias.rb +3 -0
  80. data/lib/solargraph/pin/parameter.rb +18 -8
  81. data/lib/solargraph/pin/proxy_type.rb +1 -0
  82. data/lib/solargraph/pin/reference/override.rb +15 -1
  83. data/lib/solargraph/pin/reference/superclass.rb +5 -0
  84. data/lib/solargraph/pin/reference.rb +26 -0
  85. data/lib/solargraph/pin/search.rb +3 -1
  86. data/lib/solargraph/pin/signature.rb +2 -0
  87. data/lib/solargraph/pin/symbol.rb +5 -0
  88. data/lib/solargraph/pin_cache.rb +64 -4
  89. data/lib/solargraph/position.rb +2 -0
  90. data/lib/solargraph/range.rb +1 -0
  91. data/lib/solargraph/rbs_map/conversions.rb +7 -5
  92. data/lib/solargraph/rbs_map/core_map.rb +3 -0
  93. data/lib/solargraph/rbs_map.rb +15 -2
  94. data/lib/solargraph/shell.rb +3 -0
  95. data/lib/solargraph/source/chain/link.rb +10 -1
  96. data/lib/solargraph/source/chain.rb +9 -2
  97. data/lib/solargraph/source/change.rb +2 -2
  98. data/lib/solargraph/source/cursor.rb +2 -3
  99. data/lib/solargraph/source/source_chainer.rb +1 -1
  100. data/lib/solargraph/source.rb +5 -2
  101. data/lib/solargraph/source_map/clip.rb +1 -1
  102. data/lib/solargraph/source_map/data.rb +4 -0
  103. data/lib/solargraph/source_map/mapper.rb +4 -2
  104. data/lib/solargraph/source_map.rb +21 -14
  105. data/lib/solargraph/type_checker/param_def.rb +2 -0
  106. data/lib/solargraph/type_checker/rules.rb +8 -0
  107. data/lib/solargraph/type_checker.rb +173 -120
  108. data/lib/solargraph/version.rb +1 -1
  109. data/lib/solargraph/workspace/config.rb +0 -2
  110. data/lib/solargraph/workspace/require_paths.rb +98 -0
  111. data/lib/solargraph/workspace.rb +16 -48
  112. data/lib/solargraph/yard_map/mapper/to_method.rb +2 -2
  113. data/lib/solargraph/yardoc.rb +16 -3
  114. data/lib/solargraph.rb +2 -0
  115. data/rbs/fills/tuple.rbs +2 -3
  116. data/sig/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  117. data/sig/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  118. data/sig/shims/thor/1.2.0.1/manifest.yaml +7 -0
  119. data/sig/shims/thor/1.2.0.1/thor.rbs +17 -0
  120. data/solargraph.gemspec +14 -4
  121. metadata +123 -9
  122. data/lib/.rubocop.yml +0 -22
@@ -8,6 +8,7 @@ module Solargraph
8
8
  class Store
9
9
  # @param pinsets [Array<Enumerable<Pin::Base>>]
10
10
  def initialize *pinsets
11
+ @pinsets = pinsets
11
12
  catalog pinsets
12
13
  end
13
14
 
@@ -17,6 +18,11 @@ module Solargraph
17
18
  end
18
19
 
19
20
  # @param pinsets [Array<Enumerable<Pin::Base>>]
21
+ # - pinsets[0] = core Ruby pins
22
+ # - pinsets[1] = documentation/gem pins
23
+ # - pinsets[2] = convention pins
24
+ # - pinsets[3] = workspace source pins
25
+ # - pinsets[4] = currently open file pins
20
26
  # @return [Boolean] True if the index was updated
21
27
  def update *pinsets
22
28
  return catalog(pinsets) if pinsets.length != @pinsets.length
@@ -36,6 +42,8 @@ module Solargraph
36
42
  @indexes[changed + idx - 1].merge(pins)
37
43
  end
38
44
  end
45
+ constants.clear
46
+ cached_qualify_superclass.clear
39
47
  true
40
48
  end
41
49
 
@@ -67,35 +75,45 @@ module Solargraph
67
75
  GemPins.combine_method_pins_by_path(all_pins)
68
76
  end
69
77
 
70
- # @param fq_tag [String]
78
+ BOOLEAN_SUPERCLASS_PIN = Pin::Reference::Superclass.new(name: 'Boolean', closure: Pin::ROOT_PIN, source: :solargraph)
79
+ OBJECT_SUPERCLASS_PIN = Pin::Reference::Superclass.new(name: 'Object', closure: Pin::ROOT_PIN, source: :solargraph)
80
+
81
+ # @param fqns [String]
82
+ # @return [Pin::Reference::Superclass]
83
+ def get_superclass fqns
84
+ return nil if fqns.nil? || fqns.empty?
85
+ return BOOLEAN_SUPERCLASS_PIN if %w[TrueClass FalseClass].include?(fqns)
86
+
87
+ superclass_references[fqns].first || try_special_superclasses(fqns)
88
+ end
89
+
90
+ # @param fq_sub_tag [String]
71
91
  # @return [String, nil]
72
- def get_superclass fq_tag
73
- raise "Do not prefix fully qualified tags with '::' - #{fq_tag.inspect}" if fq_tag.start_with?('::')
74
- sub = ComplexType.parse(fq_tag)
75
- fqns = sub.namespace
76
- return superclass_references[fq_tag].first if superclass_references.key?(fq_tag)
77
- return superclass_references[fqns].first if superclass_references.key?(fqns)
78
- return 'Object' if fqns != 'BasicObject' && namespace_exists?(fqns)
79
- return 'Object' if fqns == 'Boolean'
80
- simplified_literal_name = ComplexType.parse("#{fqns}").simplify_literals.name
81
- return simplified_literal_name if simplified_literal_name != fqns
82
- nil
92
+ def qualify_superclass fq_sub_tag
93
+ cached_qualify_superclass[fq_sub_tag] || qualify_and_cache_superclass(fq_sub_tag)
94
+ type = ComplexType.try_parse(fq_sub_tag)
95
+ return type.simplify_literals.to_s if type.literal?
96
+ ref = get_superclass(fq_sub_tag)
97
+ return unless ref
98
+ res = constants.dereference(ref)
99
+ return unless res
100
+ res + type.substring
83
101
  end
84
102
 
85
103
  # @param fqns [String]
86
- # @return [Array<String>]
104
+ # @return [Array<Pin::Reference::Include>]
87
105
  def get_includes fqns
88
106
  include_references[fqns] || []
89
107
  end
90
108
 
91
109
  # @param fqns [String]
92
- # @return [Array<String>]
110
+ # @return [Array<Pin::Reference::Prepend>]
93
111
  def get_prepends fqns
94
112
  prepend_references[fqns] || []
95
113
  end
96
114
 
97
115
  # @param fqns [String]
98
- # @return [Array<String>]
116
+ # @return [Array<Pin::Reference::Extend>]
99
117
  def get_extends fqns
100
118
  extend_references[fqns] || []
101
119
  end
@@ -198,14 +216,62 @@ module Solargraph
198
216
  fqns_pins_map[[base, name]]
199
217
  end
200
218
 
219
+ # Get all ancestors (superclasses, includes, prepends, extends) for a namespace
220
+ # @param fqns [String] The fully qualified namespace
221
+ # @return [Array<String>] Array of ancestor namespaces including the original
222
+ def get_ancestors(fqns)
223
+ return [] if fqns.nil? || fqns.empty?
224
+
225
+ ancestors = [fqns]
226
+ visited = Set.new
227
+ queue = [fqns]
228
+
229
+ until queue.empty?
230
+ current = queue.shift
231
+ next if current.nil? || current.empty? || visited.include?(current)
232
+ visited.add(current)
233
+
234
+ current = current.gsub(/^::/, '')
235
+
236
+ # Add superclass
237
+ ref = get_superclass(current)
238
+ superclass = ref && constants.dereference(ref)
239
+ if superclass && !superclass.empty? && !visited.include?(superclass)
240
+ ancestors << superclass
241
+ queue << superclass
242
+ end
243
+
244
+ # Add includes, prepends, and extends
245
+ [get_includes(current), get_prepends(current), get_extends(current)].each do |refs|
246
+ next if refs.nil?
247
+ refs.map(&:parametrized_tag).map(&:to_s).each do |ref|
248
+ next if ref.nil? || ref.empty? || visited.include?(ref)
249
+ ancestors << ref
250
+ queue << ref
251
+ end
252
+ end
253
+ end
254
+
255
+ ancestors.compact.uniq
256
+ end
257
+
258
+ # @return [Constants]
259
+ def constants
260
+ @constants ||= Constants.new(self)
261
+ end
262
+
201
263
  private
202
264
 
265
+ # @return [Index]
203
266
  def index
204
267
  @indexes.last
205
268
  end
206
269
 
270
+ # @param pinsets [Array<Enumerable<Pin::Base>>]
271
+ # @return [Boolean]
207
272
  def catalog pinsets
208
273
  @pinsets = pinsets
274
+ # @type [Array<Index>]
209
275
  @indexes = []
210
276
  pinsets.each do |pins|
211
277
  if @indexes.last && pins.empty?
@@ -214,6 +280,8 @@ module Solargraph
214
280
  @indexes.push(@indexes.last&.merge(pins) || Solargraph::ApiMap::Index.new(pins))
215
281
  end
216
282
  end
283
+ constants.clear
284
+ cached_qualify_superclass.clear
217
285
  true
218
286
  end
219
287
 
@@ -235,17 +303,22 @@ module Solargraph
235
303
  index.superclass_references
236
304
  end
237
305
 
238
- # @return [Hash{String => Array<String>}]
306
+ # @return [Hash{String => Array<Pin::Reference::Include>}]
239
307
  def include_references
240
308
  index.include_references
241
309
  end
242
310
 
243
- # @return [Hash{String => Array<String>}]
311
+ # @return [Hash{String => Array<Solargraph::Pin::Reference::Include>}]
312
+ def include_reference_pins
313
+ index.include_reference_pins
314
+ end
315
+
316
+ # @return [Hash{String => Array<Pin::Reference::Prepend>}]
244
317
  def prepend_references
245
318
  index.prepend_references
246
319
  end
247
320
 
248
- # @return [Hash{String => Array<String>}]
321
+ # @return [Hash{String => Array<Pin::Reference::Extend>}]
249
322
  def extend_references
250
323
  index.extend_references
251
324
  end
@@ -261,6 +334,41 @@ module Solargraph
261
334
  def all_instance_variables
262
335
  index.pins_by_class(Pin::InstanceVariable)
263
336
  end
337
+
338
+ # @param fqns [String]
339
+ # @return [Pin::Reference::Superclass, nil]
340
+ def try_special_superclasses(fqns)
341
+ return OBJECT_SUPERCLASS_PIN if fqns == 'Boolean'
342
+ return OBJECT_SUPERCLASS_PIN if !%w[BasicObject Object].include?(fqns) && namespace_exists?(fqns)
343
+
344
+ sub = ComplexType.try_parse(fqns)
345
+ return get_superclass(sub.simplify_literals.name) if sub.literal?
346
+
347
+ get_superclass(sub.namespace) if sub.namespace != fqns
348
+ end
349
+
350
+ # @param fq_sub_tag [String]
351
+ # @return [String, nil]
352
+ def qualify_and_cache_superclass fq_sub_tag
353
+ cached_qualify_superclass[fq_sub_tag] = uncached_qualify_superclass(fq_sub_tag)
354
+ end
355
+
356
+ # @return [Hash{String => String, nil}]
357
+ def cached_qualify_superclass
358
+ @cached_qualify_superclass ||= {}
359
+ end
360
+
361
+ # @param fq_sub_tag [String]
362
+ # @return [String, nil]
363
+ def uncached_qualify_superclass fq_sub_tag
364
+ type = ComplexType.try_parse(fq_sub_tag)
365
+ return type.simplify_literals.to_s if type.literal?
366
+ ref = get_superclass(fq_sub_tag)
367
+ return unless ref
368
+ res = constants.dereference(ref)
369
+ return unless res
370
+ res + type.substring
371
+ end
264
372
  end
265
373
  end
266
374
  end