solargraph 0.51.2 → 0.54.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 (183) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/plugins.yml +40 -0
  3. data/.github/workflows/rspec.yml +1 -3
  4. data/.github/workflows/typecheck.yml +34 -0
  5. data/.yardopts +2 -2
  6. data/CHANGELOG.md +127 -5
  7. data/README.md +13 -16
  8. data/SPONSORS.md +1 -7
  9. data/lib/solargraph/api_map/cache.rb +50 -20
  10. data/lib/solargraph/api_map/source_to_yard.rb +17 -10
  11. data/lib/solargraph/api_map/store.rb +60 -15
  12. data/lib/solargraph/api_map.rb +282 -123
  13. data/lib/solargraph/bench.rb +3 -2
  14. data/lib/solargraph/cache.rb +29 -5
  15. data/lib/solargraph/complex_type/type_methods.rb +122 -39
  16. data/lib/solargraph/complex_type/unique_type.rb +310 -76
  17. data/lib/solargraph/complex_type.rb +166 -44
  18. data/lib/solargraph/convention.rb +0 -1
  19. data/lib/solargraph/converters/dd.rb +5 -0
  20. data/lib/solargraph/converters/dl.rb +3 -0
  21. data/lib/solargraph/converters/dt.rb +3 -0
  22. data/lib/solargraph/diagnostics/rubocop.rb +8 -7
  23. data/lib/solargraph/diagnostics/rubocop_helpers.rb +1 -0
  24. data/lib/solargraph/diagnostics/type_check.rb +1 -0
  25. data/lib/solargraph/diagnostics.rb +2 -2
  26. data/lib/solargraph/doc_map.rb +187 -0
  27. data/lib/solargraph/gem_pins.rb +72 -0
  28. data/lib/solargraph/language_server/host/diagnoser.rb +2 -2
  29. data/lib/solargraph/language_server/host/dispatch.rb +22 -5
  30. data/lib/solargraph/language_server/host/message_worker.rb +49 -5
  31. data/lib/solargraph/language_server/host/sources.rb +8 -65
  32. data/lib/solargraph/language_server/host.rb +65 -84
  33. data/lib/solargraph/language_server/message/base.rb +19 -12
  34. data/lib/solargraph/language_server/message/completion_item/resolve.rb +3 -1
  35. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +13 -1
  36. data/lib/solargraph/language_server/message/initialize.rb +19 -2
  37. data/lib/solargraph/language_server/message/text_document/completion.rb +0 -3
  38. data/lib/solargraph/language_server/message/text_document/definition.rb +3 -3
  39. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +3 -3
  40. data/lib/solargraph/language_server/message/text_document/formatting.rb +1 -0
  41. data/lib/solargraph/language_server/message/text_document/hover.rb +3 -1
  42. data/lib/solargraph/language_server/message/text_document/type_definition.rb +3 -3
  43. data/lib/solargraph/language_server/message/text_document.rb +0 -1
  44. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +5 -0
  45. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -2
  46. data/lib/solargraph/language_server/progress.rb +135 -0
  47. data/lib/solargraph/language_server/transport/adapter.rb +16 -1
  48. data/lib/solargraph/language_server/transport/data_reader.rb +2 -0
  49. data/lib/solargraph/language_server.rb +1 -0
  50. data/lib/solargraph/library.rb +207 -111
  51. data/lib/solargraph/location.rb +15 -1
  52. data/lib/solargraph/page.rb +6 -0
  53. data/lib/solargraph/parser/comment_ripper.rb +4 -0
  54. data/lib/solargraph/parser/node_methods.rb +47 -7
  55. data/lib/solargraph/parser/node_processor/base.rb +11 -1
  56. data/lib/solargraph/parser/node_processor.rb +1 -0
  57. data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +31 -9
  58. data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +3 -1
  59. data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +62 -43
  60. data/lib/solargraph/parser/parser_gem/node_methods.rb +495 -0
  61. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +1 -1
  62. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +57 -0
  63. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +1 -1
  64. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +3 -2
  65. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +2 -2
  66. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/cvasgn_node.rb +1 -1
  67. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/def_node.rb +7 -20
  68. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +2 -2
  69. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +1 -1
  70. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +2 -2
  71. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +4 -4
  72. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +53 -0
  73. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +2 -2
  74. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +1 -1
  75. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +3 -3
  76. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sclass_node.rb +1 -1
  77. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +8 -6
  78. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/sym_node.rb +1 -1
  79. data/lib/solargraph/parser/parser_gem/node_processors.rb +56 -0
  80. data/lib/solargraph/parser/parser_gem.rb +12 -0
  81. data/lib/solargraph/parser/region.rb +1 -1
  82. data/lib/solargraph/parser/snippet.rb +2 -0
  83. data/lib/solargraph/parser.rb +8 -12
  84. data/lib/solargraph/pin/base.rb +78 -10
  85. data/lib/solargraph/pin/base_variable.rb +40 -7
  86. data/lib/solargraph/pin/block.rb +69 -46
  87. data/lib/solargraph/pin/callable.rb +147 -0
  88. data/lib/solargraph/pin/closure.rb +23 -3
  89. data/lib/solargraph/pin/common.rb +6 -6
  90. data/lib/solargraph/pin/conversions.rb +36 -5
  91. data/lib/solargraph/pin/delegated_method.rb +6 -2
  92. data/lib/solargraph/pin/documenting.rb +25 -32
  93. data/lib/solargraph/pin/instance_variable.rb +6 -2
  94. data/lib/solargraph/pin/local_variable.rb +13 -1
  95. data/lib/solargraph/pin/method.rb +205 -32
  96. data/lib/solargraph/pin/namespace.rb +20 -7
  97. data/lib/solargraph/pin/parameter.rb +41 -36
  98. data/lib/solargraph/pin/proxy_type.rb +1 -1
  99. data/lib/solargraph/pin/reference/override.rb +2 -2
  100. data/lib/solargraph/pin/reference.rb +8 -0
  101. data/lib/solargraph/pin/search.rb +3 -3
  102. data/lib/solargraph/pin/signature.rb +8 -14
  103. data/lib/solargraph/pin.rb +4 -2
  104. data/lib/solargraph/range.rb +4 -6
  105. data/lib/solargraph/rbs_map/conversions.rb +326 -76
  106. data/lib/solargraph/rbs_map/core_fills.rb +16 -33
  107. data/lib/solargraph/rbs_map/core_map.rb +3 -13
  108. data/lib/solargraph/rbs_map/stdlib_map.rb +2 -8
  109. data/lib/solargraph/rbs_map.rb +32 -13
  110. data/lib/solargraph/shell.rb +95 -72
  111. data/lib/solargraph/source/chain/array.rb +33 -0
  112. data/lib/solargraph/source/chain/block_symbol.rb +13 -0
  113. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  114. data/lib/solargraph/source/chain/call.rb +152 -69
  115. data/lib/solargraph/source/chain/constant.rb +15 -1
  116. data/lib/solargraph/source/chain/if.rb +23 -0
  117. data/lib/solargraph/source/chain/link.rb +17 -2
  118. data/lib/solargraph/source/chain/or.rb +2 -2
  119. data/lib/solargraph/source/chain/z_super.rb +3 -3
  120. data/lib/solargraph/source/chain.rb +85 -26
  121. data/lib/solargraph/source/change.rb +3 -0
  122. data/lib/solargraph/source/cursor.rb +16 -2
  123. data/lib/solargraph/source/source_chainer.rb +8 -5
  124. data/lib/solargraph/source/updater.rb +1 -0
  125. data/lib/solargraph/source.rb +120 -148
  126. data/lib/solargraph/source_map/clip.rb +16 -27
  127. data/lib/solargraph/source_map/data.rb +30 -0
  128. data/lib/solargraph/source_map/mapper.rb +15 -3
  129. data/lib/solargraph/source_map.rb +48 -24
  130. data/lib/solargraph/type_checker/checks.rb +10 -2
  131. data/lib/solargraph/type_checker/rules.rb +6 -1
  132. data/lib/solargraph/type_checker.rb +150 -39
  133. data/lib/solargraph/version.rb +1 -1
  134. data/lib/solargraph/views/environment.erb +3 -5
  135. data/lib/solargraph/workspace/config.rb +9 -6
  136. data/lib/solargraph/workspace.rb +30 -3
  137. data/lib/solargraph/yard_map/cache.rb +6 -0
  138. data/lib/solargraph/yard_map/helpers.rb +1 -1
  139. data/lib/solargraph/yard_map/mapper/to_method.rb +16 -3
  140. data/lib/solargraph/yard_map/mapper.rb +1 -1
  141. data/lib/solargraph/yard_map/to_method.rb +11 -4
  142. data/lib/solargraph/yard_map.rb +1 -292
  143. data/lib/solargraph/yard_tags.rb +20 -0
  144. data/lib/solargraph/yardoc.rb +52 -0
  145. data/lib/solargraph.rb +6 -4
  146. data/solargraph.gemspec +7 -6
  147. metadata +71 -82
  148. data/lib/solargraph/api_map/bundler_methods.rb +0 -22
  149. data/lib/solargraph/documentor.rb +0 -76
  150. data/lib/solargraph/language_server/host/cataloger.rb +0 -56
  151. data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
  152. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
  153. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -50
  154. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
  155. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +0 -18
  156. data/lib/solargraph/parser/legacy/node_processors.rb +0 -55
  157. data/lib/solargraph/parser/legacy.rb +0 -12
  158. data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -153
  159. data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
  160. data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -317
  161. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
  162. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
  163. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -33
  164. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +0 -23
  165. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +0 -75
  166. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -68
  167. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
  168. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
  169. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
  170. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
  171. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
  172. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
  173. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
  174. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
  175. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -51
  176. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -32
  177. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
  178. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -279
  179. data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -64
  180. data/lib/solargraph/parser/rubyvm/node_wrapper.rb +0 -47
  181. data/lib/solargraph/parser/rubyvm.rb +0 -40
  182. data/lib/solargraph/rbs_map/core_signs.rb +0 -33
  183. data/lib/yard-solargraph.rb +0 -33
@@ -1,11 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'set'
4
3
 
5
4
  module Solargraph
6
5
  class ApiMap
6
+ # Queryable collection of Pins representing a Workspace, gems and the Ruby
7
+ # core.
8
+ #
7
9
  class Store
8
- # @return [Enumerable<Solargraph::Pin::Base>]
10
+ # @return [Array<Solargraph::Pin::Base>]
9
11
  attr_reader :pins
10
12
 
11
13
  # @param pins [Enumerable<Solargraph::Pin::Base>]
@@ -26,7 +28,7 @@ module Solargraph
26
28
  # @param fqns [String]
27
29
  # @param scope [Symbol]
28
30
  # @param visibility [Array<Symbol>]
29
- # @return [Enumerable<Solargraph::Pin::Base>]
31
+ # @return [Enumerable<Solargraph::Pin::Method>]
30
32
  def get_methods fqns, scope: :instance, visibility: [:public]
31
33
  namespace_children(fqns).select do |pin|
32
34
  pin.is_a?(Pin::Method) && pin.scope == scope && visibility.include?(pin.visibility)
@@ -36,6 +38,7 @@ module Solargraph
36
38
  # @param fqns [String]
37
39
  # @return [String, nil]
38
40
  def get_superclass fqns
41
+ raise "Do not prefix fully qualified namespaces with '::' - #{fqns.inspect}" if fqns.start_with?('::')
39
42
  return superclass_references[fqns].first if superclass_references.key?(fqns)
40
43
  return 'Object' if fqns != 'BasicObject' && namespace_exists?(fqns)
41
44
  return 'Object' if fqns == 'Boolean'
@@ -61,11 +64,15 @@ module Solargraph
61
64
  end
62
65
 
63
66
  # @param path [String]
64
- # @return [Enumerable<Solargraph::Pin::Base>]
67
+ # @return [Array<Solargraph::Pin::Base>]
65
68
  def get_path_pins path
66
69
  path_pin_hash[path] || []
67
70
  end
68
71
 
72
+ def cacheable_pins
73
+ @cacheable_pins ||= pins_by_class(Pin::Namespace) + pins_by_class(Pin::Constant) + pins_by_class(Pin::Method) + pins_by_class(Pin::Reference)
74
+ end
75
+
69
76
  # @param fqns [String]
70
77
  # @param scope [Symbol] :class or :instance
71
78
  # @return [Enumerable<Solargraph::Pin::Base>]
@@ -117,7 +124,7 @@ module Solargraph
117
124
  result
118
125
  end
119
126
 
120
- # @return [Hash]
127
+ # @return [Hash{String => YARD::Tags::MacroDirective}]
121
128
  def named_macros
122
129
  @named_macros ||= begin
123
130
  result = {}
@@ -141,14 +148,15 @@ module Solargraph
141
148
  to_s
142
149
  end
143
150
 
144
- # @param klass [Class]
145
- # @return [Enumerable<Solargraph::Pin::Base>]
151
+ # @generic T
152
+ # @param klass [Class<T>]
153
+ # @return [Set<T>]
146
154
  def pins_by_class klass
147
- @pin_select_cache[klass] ||= @pin_class_hash.each_with_object(Set.new) { |(key, o), n| n.merge(o) if key <= klass }
155
+ # @type [Set<Solargraph::Pin::Base>]
156
+ s = Set.new
157
+ @pin_select_cache[klass] ||= @pin_class_hash.each_with_object(s) { |(key, o), n| n.merge(o) if key <= klass }
148
158
  end
149
159
 
150
- private
151
-
152
160
  # @param fqns [String]
153
161
  # @return [Array<Solargraph::Pin::Namespace>]
154
162
  def fqns_pins fqns
@@ -164,6 +172,9 @@ module Solargraph
164
172
  fqns_pins_map[[base, name]]
165
173
  end
166
174
 
175
+ private
176
+
177
+ # @return [Hash{::Array(String, String) => ::Array<Pin::Namespace>}]
167
178
  def fqns_pins_map
168
179
  @fqns_pins_map ||= Hash.new do |h, (base, name)|
169
180
  value = namespace_children(base).select { |pin| pin.name == name && pin.is_a?(Pin::Namespace) }
@@ -176,18 +187,22 @@ module Solargraph
176
187
  pins_by_class(Pin::Symbol)
177
188
  end
178
189
 
190
+ # @return [Hash{String => Array<String>}]
179
191
  def superclass_references
180
192
  @superclass_references ||= {}
181
193
  end
182
194
 
195
+ # @return [Hash{String => Array<String>}]
183
196
  def include_references
184
197
  @include_references ||= {}
185
198
  end
186
199
 
200
+ # @return [Hash{String => Array<String>}]
187
201
  def prepend_references
188
202
  @prepend_references ||= {}
189
203
  end
190
204
 
205
+ # @return [Hash{String => Array<String>}]
191
206
  def extend_references
192
207
  @extend_references ||= {}
193
208
  end
@@ -198,31 +213,58 @@ module Solargraph
198
213
  namespace_map[name] || []
199
214
  end
200
215
 
201
- # @return [Hash]
216
+ # @return [Hash{String => Enumerable<Pin::Base>}
202
217
  def namespace_map
203
218
  @namespace_map ||= {}
204
219
  end
205
220
 
221
+ # @return [Enumerable<Pin::InstanceVariable>]
206
222
  def all_instance_variables
207
223
  pins_by_class(Pin::InstanceVariable)
208
224
  end
209
225
 
226
+ # @return [Hash{String => Array<Pin::Base>}]
210
227
  def path_pin_hash
211
228
  @path_pin_hash ||= {}
212
229
  end
213
230
 
231
+ # Add references to a map
232
+ #
233
+ # @param h [Hash{String => Pin:Base}]
234
+ # @param reference_pin [Pin::Reference]
235
+ #
236
+ # @return [void]
237
+ def store_parametric_reference(h, reference_pin)
238
+ referenced_ns = reference_pin.name
239
+ referenced_tag_params = reference_pin.generic_values
240
+ referenced_tag = referenced_ns +
241
+ if referenced_tag_params && referenced_tag_params.length > 0
242
+ "<" + referenced_tag_params.join(', ') + ">"
243
+ else
244
+ ''
245
+ end
246
+ referencing_ns = reference_pin.namespace
247
+ h[referencing_ns] ||= []
248
+ h[referencing_ns].push referenced_tag
249
+ end
250
+
214
251
  # @return [void]
215
252
  def index
216
253
  set = pins.to_set
217
254
  @pin_class_hash = set.classify(&:class).transform_values(&:to_a)
255
+ # @type [Hash{Class => ::Array<Solargraph::Pin::Base>}]
218
256
  @pin_select_cache = {}
219
257
  @namespace_map = set.classify(&:namespace)
220
258
  @path_pin_hash = set.classify(&:path)
221
259
  @namespaces = @path_pin_hash.keys.compact.to_set
222
260
  pins_by_class(Pin::Reference::Include).each do |pin|
223
- include_references[pin.namespace] ||= []
224
- include_references[pin.namespace].push pin.name
261
+ store_parametric_reference(include_references, pin)
225
262
  end
263
+ # @todo move the rest of these reference pins over to use
264
+ # generic types, adding rbs_map/conversions.rb code to
265
+ # populate type parameters and adding related specs ensuring
266
+ # the generics get resolved, along with any api_map.rb
267
+ # changes needed in
226
268
  pins_by_class(Pin::Reference::Prepend).each do |pin|
227
269
  prepend_references[pin.namespace] ||= []
228
270
  prepend_references[pin.namespace].push pin.name
@@ -242,8 +284,8 @@ module Solargraph
242
284
  get_path_pins(pin.path.sub(/#initialize/, '.new')).first
243
285
  end
244
286
  (ovr.tags.map(&:tag_name) + ovr.delete).uniq.each do |tag|
245
- pin.docstring.delete_tags tag.to_sym
246
- new_pin.docstring.delete_tags tag.to_sym if new_pin
287
+ pin.docstring.delete_tags tag
288
+ new_pin.docstring.delete_tags tag if new_pin
247
289
  end
248
290
  ovr.tags.each do |tag|
249
291
  pin.docstring.add_tag(tag)
@@ -256,6 +298,9 @@ module Solargraph
256
298
  end
257
299
  end
258
300
 
301
+ # @param pin [Pin::Base]
302
+ # @param tag [String]
303
+ # @return [void]
259
304
  def redefine_return_type pin, tag
260
305
  return unless pin && tag.tag_name == 'return'
261
306
  pin.instance_variable_set(:@return_type, ComplexType.try_parse(tag.type))