solargraph 0.52.0 → 0.53.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 (155) 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/CHANGELOG.md +30 -0
  6. data/README.md +13 -16
  7. data/SPONSORS.md +1 -7
  8. data/lib/solargraph/api_map/cache.rb +59 -21
  9. data/lib/solargraph/api_map/store.rb +45 -9
  10. data/lib/solargraph/api_map.rb +152 -93
  11. data/lib/solargraph/bench.rb +2 -2
  12. data/lib/solargraph/cache.rb +29 -5
  13. data/lib/solargraph/complex_type/type_methods.rb +53 -8
  14. data/lib/solargraph/complex_type/unique_type.rb +149 -59
  15. data/lib/solargraph/complex_type.rb +62 -9
  16. data/lib/solargraph/convention.rb +0 -1
  17. data/lib/solargraph/converters/dd.rb +5 -0
  18. data/lib/solargraph/converters/dl.rb +3 -0
  19. data/lib/solargraph/converters/dt.rb +3 -0
  20. data/lib/solargraph/diagnostics/rubocop.rb +8 -7
  21. data/lib/solargraph/diagnostics/rubocop_helpers.rb +1 -0
  22. data/lib/solargraph/diagnostics/type_check.rb +1 -0
  23. data/lib/solargraph/diagnostics.rb +2 -2
  24. data/lib/solargraph/doc_map.rb +146 -0
  25. data/lib/solargraph/gem_pins.rb +64 -0
  26. data/lib/solargraph/language_server/host/cataloger.rb +1 -0
  27. data/lib/solargraph/language_server/host/diagnoser.rb +2 -2
  28. data/lib/solargraph/language_server/host/dispatch.rb +10 -4
  29. data/lib/solargraph/language_server/host/message_worker.rb +4 -0
  30. data/lib/solargraph/language_server/host/sources.rb +7 -4
  31. data/lib/solargraph/language_server/host.rb +15 -6
  32. data/lib/solargraph/language_server/message/completion_item/resolve.rb +3 -1
  33. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +13 -1
  34. data/lib/solargraph/language_server/message/initialize.rb +5 -2
  35. data/lib/solargraph/language_server/message/text_document/hover.rb +2 -0
  36. data/lib/solargraph/language_server/message/text_document.rb +0 -1
  37. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +5 -0
  38. data/lib/solargraph/language_server/transport/adapter.rb +16 -1
  39. data/lib/solargraph/language_server/transport/data_reader.rb +2 -0
  40. data/lib/solargraph/library.rb +58 -11
  41. data/lib/solargraph/location.rb +1 -0
  42. data/lib/solargraph/parser/comment_ripper.rb +3 -0
  43. data/lib/solargraph/parser/node_methods.rb +47 -8
  44. data/lib/solargraph/parser/node_processor/base.rb +9 -0
  45. data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +29 -3
  46. data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +3 -1
  47. data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +42 -34
  48. data/lib/solargraph/parser/{legacy → parser_gem}/node_methods.rb +201 -29
  49. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +1 -1
  50. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/args_node.rb +4 -1
  51. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +1 -1
  52. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +3 -2
  53. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +2 -2
  54. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/cvasgn_node.rb +1 -1
  55. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/def_node.rb +1 -1
  56. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +2 -2
  57. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +1 -1
  58. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +2 -2
  59. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +2 -2
  60. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +2 -2
  61. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +1 -1
  62. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +3 -3
  63. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sclass_node.rb +1 -1
  64. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +2 -2
  65. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/sym_node.rb +1 -1
  66. data/lib/solargraph/parser/parser_gem/node_processors.rb +54 -0
  67. data/lib/solargraph/parser/parser_gem.rb +12 -0
  68. data/lib/solargraph/parser/snippet.rb +2 -0
  69. data/lib/solargraph/parser.rb +8 -11
  70. data/lib/solargraph/pin/base.rb +63 -8
  71. data/lib/solargraph/pin/base_variable.rb +6 -2
  72. data/lib/solargraph/pin/block.rb +11 -6
  73. data/lib/solargraph/pin/closure.rb +17 -2
  74. data/lib/solargraph/pin/common.rb +7 -3
  75. data/lib/solargraph/pin/conversions.rb +33 -3
  76. data/lib/solargraph/pin/documenting.rb +25 -34
  77. data/lib/solargraph/pin/instance_variable.rb +4 -0
  78. data/lib/solargraph/pin/local_variable.rb +13 -1
  79. data/lib/solargraph/pin/method.rb +109 -15
  80. data/lib/solargraph/pin/namespace.rb +16 -10
  81. data/lib/solargraph/pin/parameter.rb +41 -10
  82. data/lib/solargraph/pin/reference/override.rb +2 -2
  83. data/lib/solargraph/pin/reference.rb +8 -0
  84. data/lib/solargraph/pin/search.rb +3 -3
  85. data/lib/solargraph/pin/signature.rb +114 -2
  86. data/lib/solargraph/pin.rb +0 -1
  87. data/lib/solargraph/range.rb +2 -2
  88. data/lib/solargraph/rbs_map/conversions.rb +212 -25
  89. data/lib/solargraph/rbs_map/core_fills.rb +4 -26
  90. data/lib/solargraph/rbs_map/core_map.rb +1 -0
  91. data/lib/solargraph/rbs_map/core_signs.rb +2 -0
  92. data/lib/solargraph/rbs_map/stdlib_map.rb +2 -8
  93. data/lib/solargraph/rbs_map.rb +19 -9
  94. data/lib/solargraph/shell.rb +62 -59
  95. data/lib/solargraph/source/chain/array.rb +4 -1
  96. data/lib/solargraph/source/chain/block_symbol.rb +13 -0
  97. data/lib/solargraph/source/chain/call.rb +95 -26
  98. data/lib/solargraph/source/chain/constant.rb +15 -1
  99. data/lib/solargraph/source/chain/if.rb +23 -0
  100. data/lib/solargraph/source/chain/link.rb +7 -1
  101. data/lib/solargraph/source/chain/or.rb +1 -1
  102. data/lib/solargraph/source/chain/z_super.rb +2 -2
  103. data/lib/solargraph/source/chain.rb +20 -4
  104. data/lib/solargraph/source/change.rb +3 -0
  105. data/lib/solargraph/source/cursor.rb +2 -0
  106. data/lib/solargraph/source/source_chainer.rb +6 -5
  107. data/lib/solargraph/source.rb +15 -16
  108. data/lib/solargraph/source_map/clip.rb +11 -7
  109. data/lib/solargraph/source_map/mapper.rb +10 -0
  110. data/lib/solargraph/source_map.rb +13 -3
  111. data/lib/solargraph/type_checker/checks.rb +10 -2
  112. data/lib/solargraph/type_checker.rb +74 -19
  113. data/lib/solargraph/version.rb +1 -1
  114. data/lib/solargraph/workspace/config.rb +8 -6
  115. data/lib/solargraph/workspace.rb +1 -1
  116. data/lib/solargraph/yard_map/cache.rb +6 -0
  117. data/lib/solargraph/yard_map/helpers.rb +1 -1
  118. data/lib/solargraph/yard_map/mapper/to_method.rb +11 -1
  119. data/lib/solargraph/yard_map/to_method.rb +11 -4
  120. data/lib/solargraph/yard_map.rb +0 -292
  121. data/lib/solargraph/yardoc.rb +52 -0
  122. data/lib/solargraph.rb +4 -1
  123. data/solargraph.gemspec +2 -2
  124. metadata +35 -57
  125. data/lib/solargraph/api_map/bundler_methods.rb +0 -22
  126. data/lib/solargraph/documentor.rb +0 -76
  127. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
  128. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
  129. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +0 -18
  130. data/lib/solargraph/parser/legacy/node_processors.rb +0 -55
  131. data/lib/solargraph/parser/legacy.rb +0 -12
  132. data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -151
  133. data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -163
  134. data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -317
  135. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
  136. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
  137. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -33
  138. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +0 -23
  139. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +0 -75
  140. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -68
  141. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
  142. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
  143. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
  144. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
  145. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
  146. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
  147. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
  148. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
  149. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -51
  150. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -32
  151. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
  152. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -279
  153. data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -64
  154. data/lib/solargraph/parser/rubyvm/node_wrapper.rb +0 -47
  155. data/lib/solargraph/parser/rubyvm.rb +0 -40
@@ -27,7 +27,7 @@ module Solargraph
27
27
 
28
28
  private
29
29
 
30
- # @return Hash{String => RBS::AST::Declarations::TypeAlias}
30
+ # @return [Hash{String => RBS::AST::Declarations::TypeAlias}]
31
31
  def type_aliases
32
32
  @type_aliases ||= {}
33
33
  end
@@ -42,7 +42,7 @@ module Solargraph
42
42
  add_back_implicit_pins(added_pins)
43
43
  end
44
44
 
45
- # @param added_pins [Range<Pin>]
45
+ # @param added_pins [::Enumerable<Pin>]
46
46
  # @return [void]
47
47
  def add_back_implicit_pins(added_pins)
48
48
  added_pins.each do |pin|
@@ -68,7 +68,7 @@ module Solargraph
68
68
  class_decl_to_pin decl
69
69
  when RBS::AST::Declarations::Interface
70
70
  # STDERR.puts "Skipping interface #{decl.name.relative!}"
71
- interface_decl_to_pin decl
71
+ interface_decl_to_pin decl, closure
72
72
  when RBS::AST::Declarations::TypeAlias
73
73
  type_aliases[decl.name.to_s] = decl
74
74
  when RBS::AST::Declarations::Module
@@ -77,16 +77,46 @@ module Solargraph
77
77
  constant_decl_to_pin decl
78
78
  when RBS::AST::Declarations::ClassAlias
79
79
  class_alias_decl_to_pin decl
80
+ when RBS::AST::Declarations::ModuleAlias
81
+ module_alias_decl_to_pin decl
82
+ when RBS::AST::Declarations::Global
83
+ global_decl_to_pin decl
80
84
  else
81
- Solargraph.logger.info "Skipping declaration #{decl.class}"
85
+ Solargraph.logger.warn "Skipping declaration #{decl.class}"
82
86
  end
83
87
  end
84
88
 
85
- def convert_members_to_pin decl, closure
89
+ # @param decl [RBS::AST::Declarations::Module]
90
+ # @param module_pin [Pin::Namespace]
91
+ # @return [void]
92
+ def convert_self_types_to_pins decl, module_pin
93
+ decl.self_types.each { |self_type| context = convert_self_type_to_pins(self_type, module_pin) }
94
+ end
95
+
96
+ # @param decl [RBS::AST::Declarations::Module::Self]
97
+ # @param closure [Pin::Namespace]
98
+ # @return [void]
99
+ def convert_self_type_to_pins decl, closure
100
+ include_pin = Solargraph::Pin::Reference::Include.new(
101
+ name: decl.name.relative!.to_s,
102
+ location: rbs_location_to_location(decl.location),
103
+ closure: closure
104
+ )
105
+ pins.push include_pin
106
+ end
107
+
108
+ # @param decl [RBS::AST::Declarations::Module,RBS::AST::Declarations::Class,RBS::AST::Declarations::Interface]
109
+ # @param closure [Pin::Namespace]
110
+ # @return [void]
111
+ def convert_members_to_pins decl, closure
86
112
  context = Context.new
87
113
  decl.members.each { |m| context = convert_member_to_pin(m, closure, context) }
88
114
  end
89
115
 
116
+ # @param member [RBS::AST::Members::Base,RBS::AST::Declarations::Base]
117
+ # @param closure [Pin::Namespace]
118
+ # @param context [Context]
119
+ # @return [void]
90
120
  def convert_member_to_pin member, closure, context
91
121
  case member
92
122
  when RBS::AST::Members::MethodDefinition
@@ -105,6 +135,10 @@ module Solargraph
105
135
  extend_to_pin(member, closure)
106
136
  when RBS::AST::Members::Alias
107
137
  alias_to_pin(member, closure)
138
+ when RBS::AST::Members::ClassInstanceVariable
139
+ civar_to_pin(member, closure)
140
+ when RBS::AST::Members::ClassVariable
141
+ cvar_to_pin(member, closure)
108
142
  when RBS::AST::Members::InstanceVariable
109
143
  ivar_to_pin(member, closure)
110
144
  when RBS::AST::Members::Public
@@ -114,7 +148,7 @@ module Solargraph
114
148
  when RBS::AST::Declarations::Base
115
149
  convert_decl_to_pin(member, closure)
116
150
  else
117
- Solargraph.logger.warn "Skipping member #{member.class}"
151
+ Solargraph.logger.warn "Skipping member type #{member.class}"
118
152
  end
119
153
  context
120
154
  end
@@ -127,6 +161,9 @@ module Solargraph
127
161
  name: decl.name.relative!.to_s,
128
162
  closure: Solargraph::Pin::ROOT_PIN,
129
163
  comments: decl.comment&.string,
164
+ # @todo some type parameters in core/stdlib have default
165
+ # values; Solargraph doesn't support that yet as so these
166
+ # get treated as undefined if not specified
130
167
  generics: decl.type_params.map(&:name).map(&:to_s)
131
168
  )
132
169
  pins.push class_pin
@@ -136,24 +173,27 @@ module Solargraph
136
173
  name: decl.super_class.name.relative!.to_s
137
174
  )
138
175
  end
139
- convert_members_to_pin decl, class_pin
176
+ add_mixins decl, class_pin.closure
177
+ convert_members_to_pins decl, class_pin
140
178
  end
141
179
 
142
180
  # @param decl [RBS::AST::Declarations::Interface]
181
+ # @param closure [Pin::Closure]
143
182
  # @return [void]
144
- def interface_decl_to_pin decl
183
+ def interface_decl_to_pin decl, closure
145
184
  class_pin = Solargraph::Pin::Namespace.new(
146
185
  type: :module,
147
186
  name: decl.name.relative!.to_s,
148
187
  closure: Solargraph::Pin::ROOT_PIN,
149
188
  comments: decl.comment&.string,
189
+ generics: decl.type_params.map(&:name).map(&:to_s),
150
190
  # HACK: Using :hidden to keep interfaces from appearing in
151
191
  # autocompletion
152
192
  visibility: :hidden
153
193
  )
154
194
  class_pin.docstring.add_tag(YARD::Tags::Tag.new(:abstract, '(RBS interface)'))
155
195
  pins.push class_pin
156
- convert_members_to_pin decl, class_pin
196
+ convert_members_to_pins decl, class_pin
157
197
  end
158
198
 
159
199
  # @param decl [RBS::AST::Declarations::Module]
@@ -167,15 +207,19 @@ module Solargraph
167
207
  generics: decl.type_params.map(&:name).map(&:to_s),
168
208
  )
169
209
  pins.push module_pin
170
- convert_members_to_pin decl, module_pin
210
+ convert_self_types_to_pins decl, module_pin
211
+ convert_members_to_pins decl, module_pin
212
+
213
+ add_mixins decl, module_pin.closure
171
214
  end
172
215
 
173
216
  # @param name [String]
174
217
  # @param tag [String]
175
218
  # @param comments [String]
219
+ # @param base [String, nil] Optional conversion of tag to base<tag>
176
220
  #
177
221
  # @return [Solargraph::Pin::Constant]
178
- def create_constant(name, tag, comments)
222
+ def create_constant(name, tag, comments, base = nil)
179
223
  parts = name.split('::')
180
224
  if parts.length > 1
181
225
  name = parts.last
@@ -189,8 +233,8 @@ module Solargraph
189
233
  closure: closure,
190
234
  comments: comments
191
235
  )
192
- # @todo Class or Module?
193
- constant_pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', "Class<#{tag}>"))
236
+ tag = "#{base}<#{tag}>" if base
237
+ constant_pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', tag))
194
238
  constant_pin
195
239
  end
196
240
 
@@ -201,7 +245,17 @@ module Solargraph
201
245
  new_name = decl.new_name.relative!.to_s
202
246
  old_name = decl.old_name.relative!.to_s
203
247
 
204
- pins.push create_constant(new_name, old_name, decl.comment&.string)
248
+ pins.push create_constant(new_name, old_name, decl.comment&.string, 'Class')
249
+ end
250
+
251
+ # @param decl [RBS::AST::Declarations::ModuleAlias]
252
+ # @return [void]
253
+ def module_alias_decl_to_pin decl
254
+ # See https://www.rubydoc.info/gems/rbs/3.4.3/RBS/AST/Declarations/ModuleAlias
255
+ new_name = decl.new_name.relative!.to_s
256
+ old_name = decl.old_name.relative!.to_s
257
+
258
+ pins.push create_constant(new_name, old_name, decl.comment&.string, 'Module')
205
259
  end
206
260
 
207
261
  # @param decl [RBS::AST::Declarations::Constant]
@@ -211,17 +265,40 @@ module Solargraph
211
265
  pins.push create_constant(decl.name.relative!.to_s, tag, decl.comment&.string)
212
266
  end
213
267
 
268
+ # @param decl [RBS::AST::Declarations::Global]
269
+ # @return [void]
270
+ def global_decl_to_pin decl
271
+ closure = Solargraph::Pin::ROOT_PIN
272
+ name = decl.name.to_s
273
+ tag = other_type_to_tag(decl.type)
274
+ pin = Solargraph::Pin::GlobalVariable.new(
275
+ name: name,
276
+ closure: closure,
277
+ comments: decl.comment&.string,
278
+ )
279
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', tag))
280
+ pins.push pin
281
+ end
282
+
214
283
  # @param decl [RBS::AST::Members::MethodDefinition]
215
284
  # @param closure [Pin::Closure]
216
285
  # @return [void]
217
286
  def method_def_to_pin decl, closure
287
+ # there may be edge cases here around different signatures
288
+ # having different type params / orders - we may need to match
289
+ # this data model and have generics live in signatures to
290
+ # handle those correctly
291
+ generics = decl.overloads.map(&:method_type).flat_map(&:type_params).map(&:name).map(&:to_s).uniq
218
292
  if decl.instance?
219
293
  pin = Solargraph::Pin::Method.new(
220
294
  name: decl.name.to_s,
221
295
  closure: closure,
222
296
  comments: decl.comment&.string,
223
297
  scope: :instance,
224
- signatures: []
298
+ signatures: [],
299
+ generics: generics,
300
+ # @todo RBS core has unreliable visibility definitions
301
+ visibility: closure.path == 'Kernel' && Kernel.private_instance_methods(false).include?(decl.name) ? :private : :public
225
302
  )
226
303
  pin.signatures.concat method_def_to_sigs(decl, pin)
227
304
  pins.push pin
@@ -237,6 +314,7 @@ module Solargraph
237
314
  pins.last.signatures.replace(
238
315
  pin.signatures.map do |p|
239
316
  Pin::Signature.new(
317
+ p.generics,
240
318
  p.parameters,
241
319
  ComplexType::SELF
242
320
  )
@@ -253,7 +331,8 @@ module Solargraph
253
331
  closure: closure,
254
332
  comments: decl.comment&.string,
255
333
  scope: :class,
256
- signatures: []
334
+ signatures: [],
335
+ generics: generics
257
336
  )
258
337
  pin.signatures.concat method_def_to_sigs(decl, pin)
259
338
  pins.push pin
@@ -262,17 +341,33 @@ module Solargraph
262
341
 
263
342
  # @param decl [RBS::AST::Members::MethodDefinition]
264
343
  # @param pin [Pin::Method]
344
+ # @return [void]
265
345
  def method_def_to_sigs decl, pin
266
346
  decl.overloads.map do |overload|
347
+ generics = overload.method_type.type_params.map(&:to_s)
267
348
  parameters, return_type = parts_of_function(overload.method_type, pin)
268
349
  block = if overload.method_type.block
269
- Pin::Signature.new(*parts_of_function(overload.method_type.block, pin))
350
+ Pin::Signature.new(generics, *parts_of_function(overload.method_type.block, pin))
270
351
  end
271
352
  return_type = ComplexType.try_parse(method_type_to_tag(overload.method_type))
272
- Pin::Signature.new(parameters, return_type, block)
353
+ Pin::Signature.new(generics, parameters, return_type, block)
273
354
  end
274
355
  end
275
356
 
357
+ # @param location [RBS::Location, nil]
358
+ # @return [Solargraph::Location, nil]
359
+ def rbs_location_to_location(location)
360
+ return nil if location&.name.nil?
361
+
362
+ start_pos = Position.new(location.start_line - 1, location.start_column)
363
+ end_pos = Position.new(location.end_line - 1, location.end_column)
364
+ range = Range.new(start_pos, end_pos)
365
+ Location.new(location.name, range)
366
+ end
367
+
368
+ # @param type [RBS::MethodType,RBS::Types::Block]
369
+ # @param pin [Pin::Method]
370
+ # @return [Array<Array<Pin::Parameter>, ComplexType>]
276
371
  def parts_of_function type, pin
277
372
  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)
278
373
 
@@ -313,6 +408,9 @@ module Solargraph
313
408
  [parameters, return_type]
314
409
  end
315
410
 
411
+ # @param decl [RBS::AST::Members::AttrReader,RBS::AST::Members::AttrAccessor]
412
+ # @param closure [Pin::Namespace]
413
+ # @return [void]
316
414
  def attr_reader_to_pin(decl, closure)
317
415
  pin = Solargraph::Pin::Method.new(
318
416
  name: decl.name.to_s,
@@ -325,6 +423,9 @@ module Solargraph
325
423
  pins.push pin
326
424
  end
327
425
 
426
+ # @param decl [RBS::AST::Members::AttrWriter, RBS::AST::Members::AttrAccessor]
427
+ # @param closure [Pin::Namespace]
428
+ # @return [void]
328
429
  def attr_writer_to_pin(decl, closure)
329
430
  pin = Solargraph::Pin::Method.new(
330
431
  name: "#{decl.name.to_s}=",
@@ -337,11 +438,17 @@ module Solargraph
337
438
  pins.push pin
338
439
  end
339
440
 
441
+ # @param decl [RBS::AST::Members::AttrAccessor]
442
+ # @param closure [Pin::Namespace]
443
+ # @return [void]
340
444
  def attr_accessor_to_pin(decl, closure)
341
445
  attr_reader_to_pin(decl, closure)
342
446
  attr_writer_to_pin(decl, closure)
343
447
  end
344
448
 
449
+ # @param decl [RBS::AST::Members::InstanceVariable]
450
+ # @param closure [Pin::Namespace]
451
+ # @return [void]
345
452
  def ivar_to_pin(decl, closure)
346
453
  pin = Solargraph::Pin::InstanceVariable.new(
347
454
  name: decl.name.to_s,
@@ -352,13 +459,50 @@ module Solargraph
352
459
  pins.push pin
353
460
  end
354
461
 
462
+ # @param decl [RBS::AST::Members::ClassVariable]
463
+ # @param closure [Pin::Namespace]
464
+ # @return [void]
465
+ def cvar_to_pin(decl, closure)
466
+ name = decl.name.to_s
467
+ pin = Solargraph::Pin::ClassVariable.new(
468
+ name: name,
469
+ closure: closure,
470
+ comments: decl.comment&.string
471
+ )
472
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', other_type_to_tag(decl.type)))
473
+ pins.push pin
474
+ end
475
+
476
+ # @param decl [RBS::AST::Members::ClassInstanceVariable]
477
+ # @param closure [Pin::Namespace]
478
+ # @return [void]
479
+ def civar_to_pin(decl, closure)
480
+ name = decl.name.to_s
481
+ pin = Solargraph::Pin::InstanceVariable.new(
482
+ name: name,
483
+ closure: closure,
484
+ comments: decl.comment&.string
485
+ )
486
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', other_type_to_tag(decl.type)))
487
+ pins.push pin
488
+ end
489
+
490
+ # @param decl [RBS::AST::Members::Include]
491
+ # @param closure [Pin::Namespace]
492
+ # @return [void]
355
493
  def include_to_pin decl, closure
494
+ type = generic_type(decl.name, decl.args)
495
+ generic_values = type.all_params.map(&:to_s)
356
496
  pins.push Solargraph::Pin::Reference::Include.new(
357
497
  name: decl.name.relative!.to_s,
498
+ generic_values: generic_values,
358
499
  closure: closure
359
500
  )
360
501
  end
361
502
 
503
+ # @param decl [RBS::AST::Members::Prepend]
504
+ # @param closure [Pin::Namespace]
505
+ # @return [void]
362
506
  def prepend_to_pin decl, closure
363
507
  pins.push Solargraph::Pin::Reference::Prepend.new(
364
508
  name: decl.name.relative!.to_s,
@@ -366,6 +510,9 @@ module Solargraph
366
510
  )
367
511
  end
368
512
 
513
+ # @param decl [RBS::AST::Members::Extend]
514
+ # @param closure [Pin::Namespace]
515
+ # @return [void]
369
516
  def extend_to_pin decl, closure
370
517
  pins.push Solargraph::Pin::Reference::Extend.new(
371
518
  name: decl.name.relative!.to_s,
@@ -374,6 +521,8 @@ module Solargraph
374
521
  end
375
522
 
376
523
  # @param decl [RBS::AST::Members::Alias]
524
+ # @param closure [Pin::Namespace]
525
+ # @return [void]
377
526
  def alias_to_pin decl, closure
378
527
  pins.push Solargraph::Pin::MethodAlias.new(
379
528
  name: decl.new_name.to_s,
@@ -390,7 +539,7 @@ module Solargraph
390
539
  'NilClass' => 'nil'
391
540
  }
392
541
 
393
- # @param type [RBS::AST::Members::MethodDefinition::Overload]
542
+ # @param type [RBS::MethodType]
394
543
  # @return [String]
395
544
  def method_type_to_tag type
396
545
  if type_aliases.key?(type.type.return_type.to_s)
@@ -400,6 +549,25 @@ module Solargraph
400
549
  end
401
550
  end
402
551
 
552
+ # @param type_name [RBS::TypeName]
553
+ # @param type_args [Enumerable<RBS::Types::Bases::Base>]
554
+ # @return [ComplexType]
555
+ def generic_type(type_name, type_args)
556
+ base = RBS_TO_YARD_TYPE[type_name.relative!.to_s] || type_name.relative!.to_s
557
+ params = type_args.map { |a| other_type_to_tag(a) }.reject { |t| t == 'undefined' }
558
+ params_str = params.empty? ? '' : "<#{params.join(', ')}>"
559
+ type_string = "#{base}#{params_str}"
560
+ ComplexType.parse(type_string)
561
+ end
562
+
563
+ # @param type_name [RBS::TypeName]
564
+ # @param type_args [Enumerable<RBS::Types::Bases::Base>]
565
+ # @return [String]
566
+ def generic_type_tag(type_name, type_args)
567
+ generic_type(type_name, type_args).tag
568
+ end
569
+
570
+ # @param type [RBS::Types::Bases::Base]
403
571
  # @return [String]
404
572
  def other_type_to_tag type
405
573
  if type.is_a?(RBS::Types::Optional)
@@ -427,14 +595,19 @@ module Solargraph
427
595
  elsif type.is_a?(RBS::Types::Variable)
428
596
  "#{Solargraph::ComplexType::GENERIC_TAG_NAME}<#{type.name}>"
429
597
  elsif type.is_a?(RBS::Types::ClassInstance) #&& !type.args.empty?
430
- base = RBS_TO_YARD_TYPE[type.name.relative!.to_s] || type.name.relative!.to_s
431
- params = type.args.map { |a| other_type_to_tag(a) }.reject { |t| t == 'undefined' }
432
- return base if params.empty?
433
- "#{base}<#{params.join(', ')}>"
598
+ generic_type_tag(type.name, type.args)
434
599
  elsif type.is_a?(RBS::Types::Bases::Instance)
435
600
  'self'
436
- elsif type.is_a?(RBS::Types::Bases::Top) || type.is_a?(RBS::Types::Bases::Bottom)
437
- 'self'
601
+ elsif type.is_a?(RBS::Types::Bases::Top)
602
+ # top is the most super superclass
603
+ 'BasicObject'
604
+ elsif type.is_a?(RBS::Types::Bases::Bottom)
605
+ # bottom is used in contexts where nothing will ever return
606
+ # - e.g., it could be the return type of 'exit()' or 'raise'
607
+ #
608
+ # @todo define a specific bottom type and use it to
609
+ # determine dead code
610
+ 'undefined'
438
611
  elsif type.is_a?(RBS::Types::Intersection)
439
612
  type.types.map { |member| other_type_to_tag(member) }.join(', ')
440
613
  elsif type.is_a?(RBS::Types::Proc)
@@ -446,6 +619,20 @@ module Solargraph
446
619
  'undefined'
447
620
  end
448
621
  end
622
+
623
+ # @param decl [RBS::AST::Declarations::Class, RBS::AST::Declarations::Module]
624
+ # @param closure [Pin::Closure]
625
+ # @return [void]
626
+ def add_mixins decl, closure
627
+ decl.each_mixin do |mixin|
628
+ klass = mixin.is_a?(RBS::AST::Members::Include) ? Pin::Reference::Include : Pin::Reference::Extend
629
+ pins.push klass.new(
630
+ name: mixin.name.relative!.to_s,
631
+ location: rbs_location_to_location(mixin.location),
632
+ closure: closure
633
+ )
634
+ end
635
+ end
449
636
  end
450
637
  end
451
638
  end
@@ -22,33 +22,11 @@ module Solargraph
22
22
  closure: Solargraph::Pin::Namespace.new(name: 'Object'), comments: '@return [Class<self>]')
23
23
  ]
24
24
 
25
- YIELDPARAMS = [
26
- Override.from_comment('Object#tap', %(
27
- @return [self]
28
- @yieldparam [self]
29
- )),
30
- Override.from_comment('String#each_line', %(
31
- @yieldparam [String]
32
- ))
33
- ]
34
-
35
- methods_with_yieldparam_subtypes = %w[
36
- Array#each Array#map Array#map! Array#any? Array#all? Array#index
37
- Array#keep_if Array#delete_if
38
- Enumerable#each_entry Enumerable#map Enumerable#any? Enumerable#all?
39
- Enumerable#select Enumerable#reject
40
- Set#each
41
- ]
42
-
43
- YIELDPARAM_SINGLE_PARAMETERS = methods_with_yieldparam_subtypes.map do |path|
44
- Override.from_comment(path, <<~DOC
45
- @yieldparam [generic<Elem>]
46
- DOC
47
- )
48
- end
49
-
50
25
  CLASS_RETURN_TYPES = [
26
+ Override.method_return('Class#new', 'self'),
27
+ Override.method_return('Class.new', 'Class<BasicObject>'),
51
28
  Override.method_return('Class#allocate', 'self'),
29
+ Override.method_return('Class.allocate', 'Class<BasicObject>')
52
30
  ]
53
31
 
54
32
  # HACK: Add Errno exception classes
@@ -60,7 +38,7 @@ module Solargraph
60
38
  end
61
39
  ERRNOS = errnos
62
40
 
63
- ALL = KEYWORDS + MISSING + YIELDPARAMS + YIELDPARAM_SINGLE_PARAMETERS + CLASS_RETURN_TYPES + ERRNOS
41
+ ALL = KEYWORDS + MISSING + CLASS_RETURN_TYPES + ERRNOS
64
42
  end
65
43
  end
66
44
  end
@@ -28,6 +28,7 @@ module Solargraph
28
28
  return super unless stubs
29
29
  stubs.map do |stub|
30
30
  Pin::Signature.new(
31
+ [],
31
32
  [],
32
33
  ComplexType.try_parse(stub.return_type)
33
34
  )
@@ -8,6 +8,8 @@ module Solargraph
8
8
 
9
9
  attr_reader :return_type
10
10
 
11
+ # @param parameters [Array<Hash>]
12
+ # @param return_type [String]
11
13
  def initialize parameters, return_type
12
14
  @parameters = parameters
13
15
  @return_type = return_type
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rbs'
4
- require 'set'
5
4
 
6
5
  module Solargraph
7
6
  class RbsMap
@@ -16,11 +15,10 @@ module Solargraph
16
15
  cache = Cache.load('stdlib', "#{library}.ser")
17
16
  if cache
18
17
  pins.replace cache
18
+ @resolved = true
19
19
  else
20
20
  super
21
- if library == 'yaml'
22
- pins.push Solargraph::Pin::Constant.new(name: 'YAML', comments: '@return [Module<Psych>]', closure: Pin::ROOT_PIN)
23
- end
21
+ return unless resolved?
24
22
  Cache.save('stdlib', "#{library}.ser", pins)
25
23
  end
26
24
  end
@@ -30,10 +28,6 @@ module Solargraph
30
28
  def self.load library
31
29
  @stdlib_maps_hash[library] ||= StdlibMap.new(library)
32
30
  end
33
-
34
- def repository
35
- @repository ||= RBS::Repository.new
36
- end
37
31
  end
38
32
  end
39
33
  end
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rbs'
4
- require 'set'
5
4
 
6
5
  module Solargraph
7
6
  class RbsMap
@@ -19,18 +18,24 @@ module Solargraph
19
18
  attr_reader :library
20
19
 
21
20
  # @param library [String]
22
- def initialize library
21
+ def initialize library, version = nil
23
22
  @library = library
23
+ @version = version
24
+ @collection = nil
24
25
  loader = RBS::EnvironmentLoader.new(core_root: nil, repository: repository)
25
- add_library loader, library
26
+ add_library loader, library, version
26
27
  return unless resolved?
27
28
  load_environment_to_pins(loader)
28
29
  end
29
30
 
31
+ # @param path [String]
32
+ # @return [Pin::Base, nil]
30
33
  def path_pin path
31
34
  pins.find { |p| p.path == path }
32
35
  end
33
36
 
37
+ # @param path [String]
38
+ # @return [Array<Pin::Base>]
34
39
  def path_pins path
35
40
  pins.select { |p| p.path == path }
36
41
  end
@@ -39,14 +44,18 @@ module Solargraph
39
44
  @resolved
40
45
  end
41
46
 
47
+ def repository
48
+ @repository ||= RBS::Repository.new(no_stdlib: false)
49
+ end
50
+
42
51
  # @param library [String]
43
52
  # @return [RbsMap]
44
53
  def self.load library
45
54
  @@rbs_maps_hash[library] ||= RbsMap.new(library)
46
55
  end
47
56
 
48
- def repository
49
- @repository ||= RBS::Repository.new(no_stdlib: true)
57
+ def self.from_gemspec(gemspec)
58
+ RbsMap.new(gemspec.name, gemspec.version)
50
59
  end
51
60
 
52
61
  private
@@ -54,17 +63,18 @@ module Solargraph
54
63
  # @param loader [RBS::EnvironmentLoader]
55
64
  # @param library [String]
56
65
  # @return [Boolean] true if adding the library succeeded
57
- def add_library loader, library
58
- @resolved = if loader.has_library?(library: library, version: nil)
59
- loader.add library: library, version: nil
66
+ def add_library loader, library, version
67
+ @resolved = if loader.has_library?(library: library, version: version)
68
+ loader.add library: library, version: version
60
69
  Solargraph.logger.info "#{short_name} successfully loaded library #{library}"
61
70
  true
62
71
  else
63
- Solargraph.logger.info "#{short_name} failed to load library #{library}"
72
+ Solargraph.logger.debug "#{short_name} failed to load library #{library}"
64
73
  false
65
74
  end
66
75
  end
67
76
 
77
+ # @return [String]
68
78
  def short_name
69
79
  self.class.name.split('::').last
70
80
  end