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