solargraph 0.59.0.dev.1 → 0.59.0.dev.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 (169) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/plugins.yml +4 -1
  3. data/.github/workflows/rspec.yml +3 -14
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +32 -5
  6. data/.rubocop_todo.yml +37 -931
  7. data/CHANGELOG.md +7 -1
  8. data/Gemfile +3 -1
  9. data/Rakefile +25 -23
  10. data/bin/solargraph +2 -1
  11. data/lib/solargraph/api_map/index.rb +5 -11
  12. data/lib/solargraph/api_map/source_to_yard.rb +9 -8
  13. data/lib/solargraph/api_map/store.rb +22 -20
  14. data/lib/solargraph/api_map.rb +50 -37
  15. data/lib/solargraph/bench.rb +44 -45
  16. data/lib/solargraph/complex_type/type_methods.rb +12 -15
  17. data/lib/solargraph/complex_type/unique_type.rb +54 -43
  18. data/lib/solargraph/complex_type.rb +69 -61
  19. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  20. data/lib/solargraph/convention/data_definition/data_definition_node.rb +4 -4
  21. data/lib/solargraph/convention/data_definition.rb +1 -1
  22. data/lib/solargraph/convention/gemfile.rb +15 -15
  23. data/lib/solargraph/convention/gemspec.rb +23 -23
  24. data/lib/solargraph/convention/rakefile.rb +17 -17
  25. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -1
  26. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +3 -3
  27. data/lib/solargraph/convention/struct_definition.rb +3 -3
  28. data/lib/solargraph/convention.rb +78 -78
  29. data/lib/solargraph/converters/dd.rb +19 -17
  30. data/lib/solargraph/converters/dl.rb +17 -15
  31. data/lib/solargraph/converters/dt.rb +17 -15
  32. data/lib/solargraph/converters/misc.rb +3 -1
  33. data/lib/solargraph/diagnostics/rubocop.rb +10 -10
  34. data/lib/solargraph/diagnostics/rubocop_helpers.rb +3 -3
  35. data/lib/solargraph/diagnostics/type_check.rb +10 -10
  36. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  37. data/lib/solargraph/doc_map.rb +9 -10
  38. data/lib/solargraph/equality.rb +3 -3
  39. data/lib/solargraph/gem_pins.rb +7 -5
  40. data/lib/solargraph/language_server/error_codes.rb +20 -20
  41. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  42. data/lib/solargraph/language_server/host/dispatch.rb +2 -3
  43. data/lib/solargraph/language_server/host/message_worker.rb +2 -2
  44. data/lib/solargraph/language_server/host/sources.rb +1 -1
  45. data/lib/solargraph/language_server/host.rb +24 -21
  46. data/lib/solargraph/language_server/message/base.rb +97 -97
  47. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  48. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  49. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +10 -11
  50. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  51. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  52. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  53. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  54. data/lib/solargraph/language_server/message/text_document/completion.rb +8 -8
  55. data/lib/solargraph/language_server/message/text_document/definition.rb +41 -34
  56. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  57. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -21
  58. data/lib/solargraph/language_server/message/text_document/formatting.rb +6 -6
  59. data/lib/solargraph/language_server/message/text_document/hover.rb +3 -5
  60. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  61. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  62. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  63. data/lib/solargraph/language_server/message/text_document/signature_help.rb +2 -2
  64. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -19
  65. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  66. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  67. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  68. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -19
  69. data/lib/solargraph/language_server/message.rb +94 -94
  70. data/lib/solargraph/language_server/request.rb +29 -27
  71. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  72. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  73. data/lib/solargraph/library.rb +28 -33
  74. data/lib/solargraph/location.rb +10 -12
  75. data/lib/solargraph/logging.rb +4 -4
  76. data/lib/solargraph/page.rb +92 -92
  77. data/lib/solargraph/parser/comment_ripper.rb +12 -4
  78. data/lib/solargraph/parser/flow_sensitive_typing.rb +32 -42
  79. data/lib/solargraph/parser/node_processor/base.rb +4 -4
  80. data/lib/solargraph/parser/node_processor.rb +1 -1
  81. data/lib/solargraph/parser/parser_gem/class_methods.rb +4 -4
  82. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  83. data/lib/solargraph/parser/parser_gem/node_chainer.rb +20 -20
  84. data/lib/solargraph/parser/parser_gem/node_methods.rb +66 -65
  85. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +12 -12
  86. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +1 -1
  87. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +3 -3
  88. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  89. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +3 -3
  90. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +2 -1
  91. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +1 -1
  92. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +3 -5
  93. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +118 -112
  94. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  95. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +1 -1
  96. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +1 -1
  97. data/lib/solargraph/parser/parser_gem.rb +14 -12
  98. data/lib/solargraph/parser/snippet.rb +2 -0
  99. data/lib/solargraph/parser.rb +25 -23
  100. data/lib/solargraph/pin/base.rb +78 -64
  101. data/lib/solargraph/pin/base_variable.rb +28 -71
  102. data/lib/solargraph/pin/block.rb +3 -2
  103. data/lib/solargraph/pin/breakable.rb +2 -0
  104. data/lib/solargraph/pin/callable.rb +23 -26
  105. data/lib/solargraph/pin/closure.rb +5 -4
  106. data/lib/solargraph/pin/common.rb +5 -2
  107. data/lib/solargraph/pin/compound_statement.rb +3 -3
  108. data/lib/solargraph/pin/constant.rb +43 -45
  109. data/lib/solargraph/pin/conversions.rb +9 -4
  110. data/lib/solargraph/pin/delegated_method.rb +4 -4
  111. data/lib/solargraph/pin/documenting.rb +3 -2
  112. data/lib/solargraph/pin/local_variable.rb +4 -4
  113. data/lib/solargraph/pin/method.rb +71 -70
  114. data/lib/solargraph/pin/namespace.rb +13 -12
  115. data/lib/solargraph/pin/parameter.rb +28 -27
  116. data/lib/solargraph/pin/proxy_type.rb +2 -0
  117. data/lib/solargraph/pin/reference.rb +17 -0
  118. data/lib/solargraph/pin/search.rb +2 -2
  119. data/lib/solargraph/pin/signature.rb +9 -14
  120. data/lib/solargraph/pin/symbol.rb +1 -0
  121. data/lib/solargraph/pin/until.rb +1 -3
  122. data/lib/solargraph/pin/while.rb +1 -3
  123. data/lib/solargraph/pin_cache.rb +16 -19
  124. data/lib/solargraph/position.rb +35 -17
  125. data/lib/solargraph/range.rb +10 -9
  126. data/lib/solargraph/rbs_map/conversions.rb +312 -206
  127. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  128. data/lib/solargraph/rbs_map/stdlib_map.rb +0 -1
  129. data/lib/solargraph/rbs_map.rb +3 -12
  130. data/lib/solargraph/server_methods.rb +16 -16
  131. data/lib/solargraph/shell.rb +63 -53
  132. data/lib/solargraph/source/chain/array.rb +39 -37
  133. data/lib/solargraph/source/chain/call.rb +49 -44
  134. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  135. data/lib/solargraph/source/chain/constant.rb +3 -1
  136. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  137. data/lib/solargraph/source/chain/hash.rb +8 -6
  138. data/lib/solargraph/source/chain/if.rb +11 -10
  139. data/lib/solargraph/source/chain/instance_variable.rb +3 -1
  140. data/lib/solargraph/source/chain/link.rb +99 -109
  141. data/lib/solargraph/source/chain/literal.rb +4 -6
  142. data/lib/solargraph/source/chain/or.rb +2 -4
  143. data/lib/solargraph/source/chain/q_call.rb +13 -11
  144. data/lib/solargraph/source/chain/variable.rb +15 -13
  145. data/lib/solargraph/source/chain/z_super.rb +28 -30
  146. data/lib/solargraph/source/chain.rb +24 -16
  147. data/lib/solargraph/source/change.rb +3 -3
  148. data/lib/solargraph/source/cursor.rb +18 -18
  149. data/lib/solargraph/source/encoding_fixes.rb +6 -7
  150. data/lib/solargraph/source/source_chainer.rb +46 -32
  151. data/lib/solargraph/source/updater.rb +1 -1
  152. data/lib/solargraph/source.rb +27 -29
  153. data/lib/solargraph/source_map/clip.rb +38 -30
  154. data/lib/solargraph/source_map/mapper.rb +52 -46
  155. data/lib/solargraph/source_map.rb +8 -4
  156. data/lib/solargraph/type_checker/rules.rb +8 -8
  157. data/lib/solargraph/type_checker.rb +95 -101
  158. data/lib/solargraph/version.rb +1 -1
  159. data/lib/solargraph/workspace/config.rb +10 -9
  160. data/lib/solargraph/workspace/gemspecs.rb +1 -1
  161. data/lib/solargraph/workspace.rb +21 -44
  162. data/lib/solargraph/yard_map/helpers.rb +6 -2
  163. data/lib/solargraph/yard_map/mapper/to_method.rb +8 -6
  164. data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -1
  165. data/lib/solargraph/yard_map/mapper.rb +12 -12
  166. data/lib/solargraph/yard_tags.rb +20 -20
  167. data/lib/solargraph.rb +5 -5
  168. data/solargraph.gemspec +35 -34
  169. metadata +28 -28
@@ -23,7 +23,7 @@ module Solargraph
23
23
  end
24
24
 
25
25
  # @param loader [RBS::EnvironmentLoader]
26
- def initialize(loader:)
26
+ def initialize loader:
27
27
  @loader = loader
28
28
  @pins = []
29
29
  load_environment_to_pins(loader)
@@ -43,12 +43,14 @@ module Solargraph
43
43
  end
44
44
 
45
45
  # @param loader [RBS::EnvironmentLoader]
46
+ #
46
47
  # @return [void]
47
- def load_environment_to_pins(loader)
48
+ def load_environment_to_pins loader
48
49
  environment = RBS::Environment.from_loader(loader).resolve_type_names
49
- cursor = pins.length
50
50
  if environment.declarations.empty?
51
- Solargraph.logger.info "No RBS declarations found in environment for core_root #{loader.core_root.inspect}, libraries #{loader.libs} and directories #{loader.dirs}"
51
+ Solargraph.logger.info 'No RBS declarations found in environment for core_root ' \
52
+ "#{loader.core_root.inspect}, libraries #{loader.libs} and " \
53
+ "directories #{loader.dirs}"
52
54
  return
53
55
  end
54
56
  environment.declarations.each { |decl| convert_decl_to_pin(decl, Solargraph::Pin::ROOT_PIN) }
@@ -60,22 +62,57 @@ module Solargraph
60
62
  def convert_decl_to_pin decl, closure
61
63
  case decl
62
64
  when RBS::AST::Declarations::Class
65
+ # @sg-ignore flow sensitive typing should support case/when
66
+ unless closure.name == '' || decl.name.absolute?
67
+ Solargraph.assert_or_log(:rbs_closure, "Ignoring closure #{closure.inspect} on class #{decl.inspect}")
68
+ end
63
69
  class_decl_to_pin decl
64
70
  when RBS::AST::Declarations::Interface
71
+ # @sg-ignore flow sensitive typing should support case/when
72
+ unless closure.name == '' || decl.name.absolute?
73
+ Solargraph.assert_or_log(:rbs_closure, "Ignoring closure #{closure.inspect} on interface #{decl.inspect}")
74
+ end
65
75
  # STDERR.puts "Skipping interface #{decl.name.relative!}"
66
- interface_decl_to_pin decl, closure
76
+ interface_decl_to_pin decl
67
77
  when RBS::AST::Declarations::TypeAlias
78
+ # @sg-ignore flow sensitive typing should support case/when
79
+ unless closure.name == '' || decl.name.absolute?
80
+ Solargraph.assert_or_log(:rbs_closure,
81
+ # @sg-ignore flow sensitive typing should support case/when
82
+ "Ignoring closure #{closure.inspect} on alias type name #{decl.name}")
83
+ end
68
84
  # @sg-ignore flow sensitive typing should support case/when
69
85
  type_aliases[decl.name.to_s] = decl
70
86
  when RBS::AST::Declarations::Module
87
+ # @sg-ignore flow sensitive typing should support case/when
88
+ unless closure.name == '' || decl.name.absolute?
89
+ Solargraph.assert_or_log(:rbs_closure,
90
+ # @sg-ignore flow sensitive typing should support case/when
91
+ "Ignoring closure #{closure.inspect} on alias type name #{decl.name}")
92
+ end
71
93
  module_decl_to_pin decl
72
94
  when RBS::AST::Declarations::Constant
95
+ # @sg-ignore flow sensitive typing should support case/when
96
+ unless closure.name == '' || decl.name.absolute?
97
+ Solargraph.assert_or_log(:rbs_closure, "Ignoring closure #{closure.inspect} on constant #{decl.inspect}")
98
+ end
73
99
  constant_decl_to_pin decl
74
100
  when RBS::AST::Declarations::ClassAlias
101
+ # @sg-ignore flow sensitive typing should support case/when
102
+ unless closure.name == '' || decl.new_name.absolute?
103
+ Solargraph.assert_or_log(:rbs_closure, "Ignoring closure #{closure.inspect} on class alias #{decl.inspect}")
104
+ end
75
105
  class_alias_decl_to_pin decl
76
106
  when RBS::AST::Declarations::ModuleAlias
107
+ unless closure.name == ''
108
+ Solargraph.assert_or_log(:rbs_closure,
109
+ "Ignoring closure #{closure.inspect} on module alias #{decl.inspect}")
110
+ end
77
111
  module_alias_decl_to_pin decl
78
112
  when RBS::AST::Declarations::Global
113
+ unless closure.name == ''
114
+ Solargraph.assert_or_log(:rbs_closure, "Ignoring closure #{closure.inspect} on global decl #{decl.inspect}")
115
+ end
79
116
  global_decl_to_pin decl
80
117
  else
81
118
  Solargraph.logger.warn "Skipping declaration #{decl.class}"
@@ -86,7 +123,61 @@ module Solargraph
86
123
  # @param module_pin [Pin::Namespace]
87
124
  # @return [void]
88
125
  def convert_self_types_to_pins decl, module_pin
89
- decl.self_types.each { |self_type| context = convert_self_type_to_pins(self_type, module_pin) }
126
+ decl.self_types.each { |self_type| convert_self_type_to_pins(self_type, module_pin) }
127
+ end
128
+
129
+ # @type [Hash{String => String}]
130
+ RBS_TO_CLASS = {
131
+ 'bool' => 'Boolean',
132
+ 'string' => 'String',
133
+ 'int' => 'Integer'
134
+ }.freeze
135
+ private_constant :RBS_TO_CLASS
136
+
137
+ # rooted names (namespaces) use the prefix of :: when they are
138
+ # relative to the root namespace, or not if they are relative to
139
+ # the current namespace.
140
+ #
141
+ # @param type_name [RBS::TypeName]
142
+ #
143
+ # @return [String]
144
+ def rooted_name type_name
145
+ name = type_name.to_s
146
+ RBS_TO_CLASS.fetch(name, name)
147
+ end
148
+
149
+ # fqns names are implicitly fully qualified - they are relative
150
+ # to the root namespace and are not prefixed with ::
151
+ #
152
+ # @param type_name [RBS::TypeName]
153
+ #
154
+ # @return [String]
155
+ def fqns type_name
156
+ unless type_name.absolute?
157
+ Solargraph.assert_or_log(:rbs_fqns, "Received unexpected unqualified type name: #{type_name}")
158
+ end
159
+ ns = type_name.relative!.to_s
160
+ RBS_TO_CLASS.fetch(ns, ns)
161
+ end
162
+
163
+ # @param type_name [RBS::TypeName]
164
+ # @param type_args [Enumerable<RBS::Types::Bases::Base>]
165
+ # @return [ComplexType::UniqueType]
166
+ def build_type type_name, type_args = []
167
+ # we use .absolute? below to tell the type object what to
168
+ # expect
169
+ rbs_name = type_name.relative!.to_s
170
+ base = RBS_TO_CLASS.fetch(rbs_name, rbs_name)
171
+
172
+ params = type_args.map { |a| other_type_to_type(a) }
173
+ # tuples have their own class and are handled in other_type_to_type
174
+ if base == 'Hash' && params.length == 2
175
+ ComplexType::UniqueType.new(base, [params.first], [params.last], rooted: type_name.absolute?,
176
+ parameters_type: :hash)
177
+ else
178
+ ComplexType::UniqueType.new(base, [], params.reject(&:undefined?), rooted: type_name.absolute?,
179
+ parameters_type: :list)
180
+ end
90
181
  end
91
182
 
92
183
  # @param decl [RBS::AST::Declarations::Module::Self]
@@ -94,9 +185,9 @@ module Solargraph
94
185
  # @return [void]
95
186
  def convert_self_type_to_pins decl, closure
96
187
  type = build_type(decl.name, decl.args)
97
- generic_values = type.all_params.map(&:to_s)
188
+ generic_values = type.all_params.map(&:rooted_tags)
98
189
  include_pin = Solargraph::Pin::Reference::Include.new(
99
- name: type.rooted_name,
190
+ name: type.name,
100
191
  type_location: location_decl_to_pin_location(decl.location),
101
192
  generic_values: generic_values,
102
193
  closure: closure,
@@ -165,18 +256,31 @@ module Solargraph
165
256
  context
166
257
  end
167
258
 
259
+ # Pull the name of type variables for a generic - not the
260
+ # values, the names (e.g., T, U, V). As such, "rooting" isn't a
261
+ # thing, these are all in the global namespace.
262
+ #
263
+ # @param decl [RBS::AST::Declarations::Class, RBS::AST::Declarations::Interface,
264
+ # RBS::AST::Declarations::Module, RBS::MethodType]
265
+ #
266
+ # @return [Array<String>]
267
+ def type_parameter_names decl
268
+ decl.type_params.map(&:name).map(&:to_s)
269
+ end
270
+
168
271
  # @param decl [RBS::AST::Declarations::Class]
169
272
  # @return [void]
170
273
  def class_decl_to_pin decl
171
- generics = decl.type_params.map(&:name).map(&:to_s)
274
+ # @type [Hash{String => ComplexType, ComplexType::UniqueType}]
172
275
  generic_defaults = {}
173
276
  decl.type_params.each do |param|
174
- if param.default_type
175
- tag = other_type_to_tag param.default_type
176
- generic_defaults[param.name.to_s] = ComplexType.parse(tag).force_rooted
177
- end
277
+ generic_defaults[param.name.to_s] = other_type_to_type param.default_type if param.default_type
178
278
  end
179
- class_name = decl.name.relative!.to_s
279
+
280
+ class_name = fqns(decl.name)
281
+
282
+ generics = type_parameter_names(decl)
283
+
180
284
  class_pin = Solargraph::Pin::Namespace.new(
181
285
  type: :class,
182
286
  name: class_name,
@@ -193,13 +297,12 @@ module Solargraph
193
297
  pins.push class_pin
194
298
  if decl.super_class
195
299
  type = build_type(decl.super_class.name, decl.super_class.args)
196
- generic_values = type.all_params.map(&:to_s)
197
- superclass_name = decl.super_class.name.to_s
300
+ generic_values = type.all_params.map(&:rooted_tags)
198
301
  pins.push Solargraph::Pin::Reference::Superclass.new(
199
302
  type_location: location_decl_to_pin_location(decl.super_class.location),
200
303
  closure: class_pin,
201
304
  generic_values: generic_values,
202
- name: superclass_name,
305
+ name: type.rooted_name, # reference pins use rooted names
203
306
  source: :rbs
204
307
  )
205
308
  end
@@ -208,16 +311,15 @@ module Solargraph
208
311
  end
209
312
 
210
313
  # @param decl [RBS::AST::Declarations::Interface]
211
- # @param closure [Pin::Closure]
212
314
  # @return [void]
213
- def interface_decl_to_pin decl, closure
315
+ def interface_decl_to_pin decl
214
316
  class_pin = Solargraph::Pin::Namespace.new(
215
317
  type: :module,
216
318
  type_location: location_decl_to_pin_location(decl.location),
217
- name: decl.name.relative!.to_s,
319
+ name: fqns(decl.name),
218
320
  closure: Solargraph::Pin::ROOT_PIN,
219
321
  comments: decl.comment&.string,
220
- generics: decl.type_params.map(&:name).map(&:to_s),
322
+ generics: type_parameter_names(decl),
221
323
  # HACK: Using :hidden to keep interfaces from appearing in
222
324
  # autocompletion
223
325
  visibility: :hidden,
@@ -233,11 +335,11 @@ module Solargraph
233
335
  def module_decl_to_pin decl
234
336
  module_pin = Solargraph::Pin::Namespace.new(
235
337
  type: :module,
236
- name: decl.name.relative!.to_s,
338
+ name: fqns(decl.name),
237
339
  type_location: location_decl_to_pin_location(decl.location),
238
340
  closure: Solargraph::Pin::ROOT_PIN,
239
341
  comments: decl.comment&.string,
240
- generics: decl.type_params.map(&:name).map(&:to_s),
342
+ generics: type_parameter_names(decl),
241
343
  source: :rbs
242
344
  )
243
345
  pins.push module_pin
@@ -249,32 +351,35 @@ module Solargraph
249
351
  add_mixins decl, module_pin.closure
250
352
  end
251
353
 
252
- # @param name [String]
253
- # @param tag [String]
354
+ # @param fqns [String]
355
+ # @param type [ComplexType, ComplexType::UniqueType]
254
356
  # @param comments [String, nil]
255
- # @param decl [RBS::AST::Declarations::ClassAlias, RBS::AST::Declarations::Constant, RBS::AST::Declarations::ModuleAlias]
256
- # @param base [String, nil] Optional conversion of tag to base<tag>
357
+ # @param decl [RBS::AST::Declarations::ClassAlias,
358
+ # RBS::AST::Declarations::Constant,
359
+ # RBS::AST::Declarations::ModuleAlias]
360
+ # @param base [String, nil] Optional conversion of tag to
361
+ # base<tag> - valid values are Class and Module
257
362
  #
258
363
  # @return [Solargraph::Pin::Constant]
259
- def create_constant(name, tag, comments, decl, base = nil)
260
- parts = name.split('::')
364
+ def create_constant fqns, type, comments, decl, base = nil
365
+ parts = fqns.split('::')
261
366
  if parts.length > 1
262
- name = parts.last
367
+ fqns = parts.last
263
368
  # @sg-ignore Need to add nil check here
264
369
  closure = pins.select { |pin| pin && pin.path == parts[0..-2].join('::') }.first
265
370
  else
266
- name = parts.first
371
+ fqns = parts.first
267
372
  closure = Solargraph::Pin::ROOT_PIN
268
373
  end
269
374
  constant_pin = Solargraph::Pin::Constant.new(
270
- name: name,
375
+ name: fqns,
271
376
  closure: closure,
272
377
  type_location: location_decl_to_pin_location(decl.location),
273
378
  comments: comments,
274
379
  source: :rbs
275
380
  )
276
- tag = "#{base}<#{tag}>" if base
277
- rooted_tag = ComplexType.parse(tag).force_rooted.rooted_tags
381
+ rooted_tag = type.rooted_tags
382
+ rooted_tag = "#{base}<#{rooted_tag}>" if base
278
383
  constant_pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', rooted_tag))
279
384
  constant_pin
280
385
  end
@@ -283,27 +388,27 @@ module Solargraph
283
388
  # @return [void]
284
389
  def class_alias_decl_to_pin decl
285
390
  # See https://www.rubydoc.info/gems/rbs/3.4.3/RBS/AST/Declarations/ClassAlias
286
- new_name = decl.new_name.relative!.to_s
287
- old_name = decl.old_name.relative!.to_s
288
-
289
- pins.push create_constant(new_name, old_name, decl.comment&.string, decl, 'Class')
391
+ new_name = fqns(decl.new_name)
392
+ old_type = build_type(decl.old_name)
393
+ pins.push create_constant(new_name, old_type, decl.comment&.string, decl, '::Class')
290
394
  end
291
395
 
292
396
  # @param decl [RBS::AST::Declarations::ModuleAlias]
293
397
  # @return [void]
294
398
  def module_alias_decl_to_pin decl
295
399
  # See https://www.rubydoc.info/gems/rbs/3.4.3/RBS/AST/Declarations/ModuleAlias
296
- new_name = decl.new_name.relative!.to_s
297
- old_name = decl.old_name.relative!.to_s
400
+ new_name = fqns(decl.new_name)
401
+ old_type = build_type(decl.old_name)
298
402
 
299
- pins.push create_constant(new_name, old_name, decl.comment&.string, decl, 'Module')
403
+ pins.push create_constant(new_name, old_type, decl.comment&.string, decl, '::Module')
300
404
  end
301
405
 
302
406
  # @param decl [RBS::AST::Declarations::Constant]
303
407
  # @return [void]
304
408
  def constant_decl_to_pin decl
305
- tag = other_type_to_tag(decl.type)
306
- pins.push create_constant(decl.name.relative!.to_s, tag, decl.comment&.string, decl)
409
+ target_type = other_type_to_type(decl.type)
410
+ constant_name = fqns(decl.name)
411
+ pins.push create_constant(constant_name, target_type, decl.comment&.string, decl)
307
412
  end
308
413
 
309
414
  # @param decl [RBS::AST::Declarations::Global]
@@ -318,12 +423,11 @@ module Solargraph
318
423
  type_location: location_decl_to_pin_location(decl.location),
319
424
  source: :rbs
320
425
  )
321
- rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
426
+ rooted_tag = other_type_to_type(decl.type).rooted_tags
322
427
  pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
323
428
  pins.push pin
324
429
  end
325
430
 
326
-
327
431
  # Visibility overrides that will allow the Solargraph project
328
432
  # and plugins to pass typechecking using SOLARGRAPH_ASSERTS=on,
329
433
  # so that we can detect any regressions/issues elsewhere in the
@@ -339,41 +443,45 @@ module Solargraph
339
443
  # allow that to be extended via .solargraph.yml
340
444
  # @type [Hash{Array(String, Symbol, String) => Symbol}
341
445
  VISIBILITY_OVERRIDE = {
342
- ["Rails::Engine", :instance, "run_tasks_blocks"] => :protected,
446
+ ['Rails::Engine', :instance, 'run_tasks_blocks'] => :protected,
343
447
  # Should have been marked as both instance and class method in module -e.g., 'module_function'
344
- ["Kernel", :instance, "pretty_inspect"] => :private,
448
+ ['Kernel', :instance, 'pretty_inspect'] => :private,
345
449
  # marked incorrectly in RBS
346
- ["WEBrick::HTTPUtils::FormData", :instance, "next_data"] => :protected,
347
- ["Rails::Command", :class, "command_type"] => :private,
348
- ["Rails::Command", :class, "lookup_paths"] => :private,
349
- ["Rails::Command", :class, "file_lookup_paths"] => :private,
350
- ["Rails::Railtie", :instance, "run_console_blocks"] => :protected,
351
- ["Rails::Railtie", :instance, "run_generators_blocks"] => :protected,
352
- ["Rails::Railtie", :instance, "run_runner_blocks"] => :protected,
353
- ["Rails::Railtie", :instance, "run_tasks_blocks"] => :protected,
354
- ["ActionController::Base", :instance, "_protected_ivars"] => :private,
355
- ["ActionView::Template", :instance, "method_name"] => :public,
356
- ["Module", :instance, "ruby2_keywords"] => :private,
357
- ["Nokogiri::XML::Node", :instance, "coerce"] => :protected,
358
- ["Nokogiri::XML::Document", :class, "empty_doc?"] => :private,
359
- ["Nokogiri::Decorators::Slop", :instance, "respond_to_missing?"] => :public,
360
- ["RuboCop::Cop::RangeHelp", :instance, "source_range"] => :private,
361
- ["AST::Node", :instance, "original_dup"] => :private,
362
- ["Rainbow::Presenter", :instance, "wrap_with_sgr"] => :private,
363
- }
364
-
365
- # @param decl [RBS::AST::Members::MethodDefinition, RBS::AST::Members::AttrReader, RBS::AST::Members::AttrWriter, RBS::AST::Members::AttrAccessor]
450
+ ['WEBrick::HTTPUtils::FormData', :instance, 'next_data'] => :protected,
451
+ ['Rails::Command', :class, 'command_type'] => :private,
452
+ ['Rails::Command', :class, 'lookup_paths'] => :private,
453
+ ['Rails::Command', :class, 'file_lookup_paths'] => :private,
454
+ ['Rails::Railtie', :instance, 'run_console_blocks'] => :protected,
455
+ ['Rails::Railtie', :instance, 'run_generators_blocks'] => :protected,
456
+ ['Rails::Railtie', :instance, 'run_runner_blocks'] => :protected,
457
+ ['Rails::Railtie', :instance, 'run_tasks_blocks'] => :protected,
458
+ ['ActionController::Base', :instance, '_protected_ivars'] => :private,
459
+ ['ActionView::Template', :instance, 'method_name'] => :public,
460
+ ['Module', :instance, 'ruby2_keywords'] => :private,
461
+ ['Nokogiri::XML::Node', :instance, 'coerce'] => :protected,
462
+ ['Nokogiri::XML::Document', :class, 'empty_doc?'] => :private,
463
+ ['Nokogiri::Decorators::Slop', :instance, 'respond_to_missing?'] => :public,
464
+ ['RuboCop::Cop::RangeHelp', :instance, 'source_range'] => :private,
465
+ ['AST::Node', :instance, 'original_dup'] => :private,
466
+ ['Rainbow::Presenter', :instance, 'wrap_with_sgr'] => :private
467
+ }.freeze
468
+ private_constant :VISIBILITY_OVERRIDE
469
+
470
+ # @param decl [RBS::AST::Members::MethodDefinition, RBS::AST::Members::AttrReader,
471
+ # RBS::AST::Members::AttrWriter, RBS::AST::Members::AttrAccessor]
366
472
  # @param closure [Pin::Closure]
367
473
  # @param context [Context]
368
474
  # @param scope [Symbol] :instance or :class
369
475
  # @param name [String] The name of the method
370
476
  # @return [Symbol]
371
- def calculate_method_visibility(decl, context, closure, scope, name)
477
+ def calculate_method_visibility decl, context, closure, scope, name
372
478
  override_key = [closure.path, scope, name]
373
479
  visibility = VISIBILITY_OVERRIDE[override_key]
374
480
  simple_override_key = [closure.path, scope]
375
481
  visibility ||= VISIBILITY_OVERRIDE[simple_override_key]
376
- visibility ||= :private if closure.path == 'Kernel' && Kernel.private_instance_methods(false).include?(decl.name)
482
+ if closure.path == 'Kernel' && Kernel.private_instance_methods(false).include?(decl.name)
483
+ visibility ||= :private
484
+ end
377
485
  if decl.kind == :singleton_instance
378
486
  # this is a 'module function'
379
487
  visibility ||= :private
@@ -393,7 +501,9 @@ module Solargraph
393
501
  # having different type params / orders - we may need to match
394
502
  # this data model and have generics live in signatures to
395
503
  # handle those correctly
396
- generics = decl.overloads.map(&:method_type).flat_map(&:type_params).map(&:name).map(&:to_s).uniq
504
+ generics = decl.overloads.map(&:method_type).map do |method_type|
505
+ type_parameter_names method_type
506
+ end
397
507
 
398
508
  if decl.instance?
399
509
  name = decl.name.to_s
@@ -417,24 +527,23 @@ module Solargraph
417
527
  pin.instance_variable_set(:@return_type, ComplexType::VOID)
418
528
  end
419
529
  end
420
- if decl.singleton?
421
- final_scope = :class
422
- name = decl.name.to_s
423
- visibility = calculate_method_visibility(decl, context, closure, final_scope, name)
424
- pin = Solargraph::Pin::Method.new(
425
- name: name,
426
- closure: closure,
427
- comments: decl.comment&.string,
428
- type_location: location_decl_to_pin_location(decl.location),
429
- visibility: visibility,
430
- scope: final_scope,
431
- signatures: [],
432
- generics: generics,
433
- source: :rbs
434
- )
435
- pin.signatures.concat method_def_to_sigs(decl, pin)
436
- pins.push pin
437
- end
530
+ return unless decl.singleton?
531
+ final_scope = :class
532
+ name = decl.name.to_s
533
+ visibility = calculate_method_visibility(decl, context, closure, final_scope, name)
534
+ pin = Solargraph::Pin::Method.new(
535
+ name: name,
536
+ closure: closure,
537
+ comments: decl.comment&.string,
538
+ type_location: location_decl_to_pin_location(decl.location),
539
+ visibility: visibility,
540
+ scope: final_scope,
541
+ signatures: [],
542
+ generics: generics,
543
+ source: :rbs
544
+ )
545
+ pin.signatures.concat method_def_to_sigs(decl, pin)
546
+ pins.push pin
438
547
  end
439
548
 
440
549
  # @param decl [RBS::AST::Members::MethodDefinition]
@@ -444,22 +553,24 @@ module Solargraph
444
553
  # @param overload [RBS::AST::Members::MethodDefinition::Overload]
445
554
  decl.overloads.map do |overload|
446
555
  type_location = location_decl_to_pin_location(overload.method_type.location)
447
- generics = overload.method_type.type_params.map(&:name).map(&:to_s)
556
+ generics = type_parameter_names(overload.method_type)
448
557
  signature_parameters, signature_return_type = parts_of_function(overload.method_type, pin)
449
558
  rbs_block = overload.method_type.block
450
559
  block = if rbs_block
451
560
  block_parameters, block_return_type = parts_of_function(rbs_block, pin)
452
- Pin::Signature.new(generics: generics, parameters: block_parameters, return_type: block_return_type, source: :rbs,
561
+ Pin::Signature.new(generics: generics, parameters: block_parameters,
562
+ return_type: block_return_type, source: :rbs,
453
563
  type_location: type_location, closure: pin)
454
564
  end
455
- Pin::Signature.new(generics: generics, parameters: signature_parameters, return_type: signature_return_type, block: block, source: :rbs,
565
+ Pin::Signature.new(generics: generics, parameters: signature_parameters,
566
+ return_type: signature_return_type, block: block, source: :rbs,
456
567
  type_location: type_location, closure: pin)
457
568
  end
458
569
  end
459
570
 
460
571
  # @param location [RBS::Location, nil]
461
572
  # @return [Solargraph::Location, nil]
462
- def location_decl_to_pin_location(location)
573
+ def location_decl_to_pin_location location
463
574
  return nil if location&.name.nil?
464
575
 
465
576
  # @sg-ignore flow sensitive typing should handle return nil if location&.name.nil?
@@ -471,15 +582,16 @@ module Solargraph
471
582
  Location.new(location.name.to_s, range)
472
583
  end
473
584
 
474
- # @param type [RBS::MethodType,RBS::Types::Block]
585
+ # @param type [RBS::MethodType, RBS::Types::Block]
475
586
  # @param pin [Pin::Method]
476
587
  # @return [Array(Array<Pin::Parameter>, ComplexType)]
477
588
  def parts_of_function type, pin
478
589
  type_location = pin.type_location
479
590
  if defined?(RBS::Types::UntypedFunction) && type.type.is_a?(RBS::Types::UntypedFunction)
480
591
  return [
481
- [Solargraph::Pin::Parameter.new(decl: :restarg, name: 'arg', closure: pin, source: :rbs, type_location: type_location)],
482
- ComplexType.try_parse(method_type_to_tag(type)).force_rooted
592
+ [Solargraph::Pin::Parameter.new(decl: :restarg, name: 'arg', closure: pin, source: :rbs,
593
+ type_location: type_location)],
594
+ method_type_to_type(type)
483
595
  ]
484
596
  end
485
597
 
@@ -488,41 +600,43 @@ module Solargraph
488
600
  type.type.required_positionals.each do |param|
489
601
  # @sg-ignore RBS generic type understanding issue
490
602
  name = param.name ? param.name.to_s : "arg_#{arg_num += 1}"
491
- # @sg-ignore RBS generic type understanding issue
492
- parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin, return_type: ComplexType.try_parse(other_type_to_tag(param.type)).force_rooted, source: :rbs, type_location: type_location)
603
+ parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin,
604
+ # @sg-ignore RBS generic type understanding issue
605
+ return_type: other_type_to_type(param.type),
606
+ source: :rbs, type_location: type_location)
493
607
  end
494
608
  type.type.optional_positionals.each do |param|
495
609
  # @sg-ignore RBS generic type understanding issue
496
610
  name = param.name ? param.name.to_s : "arg_#{arg_num += 1}"
497
611
  parameters.push Solargraph::Pin::Parameter.new(decl: :optarg, name: name, closure: pin,
498
612
  # @sg-ignore RBS generic type understanding issue
499
- return_type: ComplexType.try_parse(other_type_to_tag(param.type)).force_rooted,
613
+ return_type: other_type_to_type(param.type),
500
614
  type_location: type_location,
501
615
  source: :rbs)
502
616
  end
503
617
  if type.type.rest_positionals
504
618
  name = type.type.rest_positionals.name ? type.type.rest_positionals.name.to_s : "arg_#{arg_num += 1}"
505
- inner_rest_positional_type =
506
- ComplexType.try_parse(other_type_to_tag(type.type.rest_positionals.type))
619
+ inner_rest_positional_type = other_type_to_type(type.type.rest_positionals.type)
507
620
  rest_positional_type = ComplexType::UniqueType.new('Array',
508
621
  [],
509
622
  [inner_rest_positional_type],
510
623
  rooted: true, parameters_type: :list)
511
624
  parameters.push Solargraph::Pin::Parameter.new(decl: :restarg, name: name, closure: pin,
512
625
  source: :rbs, type_location: type_location,
513
- return_type: rest_positional_type,)
626
+ return_type: rest_positional_type)
514
627
  end
515
628
  type.type.trailing_positionals.each do |param|
516
629
  # @sg-ignore RBS generic type understanding issue
517
630
  name = param.name ? param.name.to_s : "arg_#{arg_num += 1}"
518
- parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin, source: :rbs, type_location: type_location)
631
+ parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin, source: :rbs,
632
+ type_location: type_location)
519
633
  end
520
634
  type.type.required_keywords.each do |orig, param|
521
635
  # @sg-ignore RBS generic type understanding issue
522
636
  name = orig ? orig.to_s : "arg_#{arg_num += 1}"
523
637
  parameters.push Solargraph::Pin::Parameter.new(decl: :kwarg, name: name, closure: pin,
524
638
  # @sg-ignore RBS generic type understanding issue
525
- return_type: ComplexType.try_parse(other_type_to_tag(param.type)).force_rooted,
639
+ return_type: other_type_to_type(param.type),
526
640
  source: :rbs, type_location: type_location)
527
641
  end
528
642
  type.type.optional_keywords.each do |orig, param|
@@ -530,18 +644,18 @@ module Solargraph
530
644
  name = orig ? orig.to_s : "arg_#{arg_num += 1}"
531
645
  parameters.push Solargraph::Pin::Parameter.new(decl: :kwoptarg, name: name, closure: pin,
532
646
  # @sg-ignore RBS generic type understanding issue
533
- return_type: ComplexType.try_parse(other_type_to_tag(param.type)).force_rooted,
647
+ return_type: other_type_to_type(param.type),
534
648
  type_location: type_location,
535
649
  source: :rbs)
536
650
  end
537
651
  if type.type.rest_keywords
538
652
  name = type.type.rest_keywords.name ? type.type.rest_keywords.name.to_s : "arg_#{arg_num += 1}"
539
- parameters.push Solargraph::Pin::Parameter.new(decl: :kwrestarg, name: type.type.rest_keywords.name.to_s, closure: pin,
653
+ parameters.push Solargraph::Pin::Parameter.new(decl: :kwrestarg,
654
+ name: type.type.rest_keywords.name.to_s, closure: pin,
540
655
  source: :rbs, type_location: type_location)
541
656
  end
542
657
 
543
- rooted_tag = method_type_to_tag(type)
544
- return_type = ComplexType.try_parse(rooted_tag).force_rooted
658
+ return_type = method_type_to_type(type)
545
659
  [parameters, return_type]
546
660
  end
547
661
 
@@ -549,7 +663,7 @@ module Solargraph
549
663
  # @param closure [Pin::Namespace]
550
664
  # @param context [Context]
551
665
  # @return [void]
552
- def attr_reader_to_pin(decl, closure, context)
666
+ def attr_reader_to_pin decl, closure, context
553
667
  name = decl.name.to_s
554
668
  final_scope = decl.kind == :instance ? :instance : :class
555
669
  visibility = calculate_method_visibility(decl, context, closure, final_scope, name)
@@ -563,9 +677,11 @@ module Solargraph
563
677
  visibility: visibility,
564
678
  source: :rbs
565
679
  )
566
- rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
680
+ rooted_tag = other_type_to_type(decl.type).rooted_tags
567
681
  pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', rooted_tag))
568
- logger.debug { "Conversions#attr_reader_to_pin(name=#{name.inspect}, visibility=#{visibility.inspect}) => #{pin.inspect}" }
682
+ logger.debug do
683
+ "Conversions#attr_reader_to_pin(name=#{name.inspect}, visibility=#{visibility.inspect}) => #{pin.inspect}"
684
+ end
569
685
  pins.push pin
570
686
  end
571
687
 
@@ -573,9 +689,9 @@ module Solargraph
573
689
  # @param closure [Pin::Namespace]
574
690
  # @param context [Context]
575
691
  # @return [void]
576
- def attr_writer_to_pin(decl, closure, context)
692
+ def attr_writer_to_pin decl, closure, context
577
693
  final_scope = decl.kind == :instance ? :instance : :class
578
- name = "#{decl.name.to_s}="
694
+ name = "#{decl.name}="
579
695
  visibility = calculate_method_visibility(decl, context, closure, final_scope, name)
580
696
  type_location = location_decl_to_pin_location(decl.location)
581
697
  pin = Solargraph::Pin::Method.new(
@@ -592,13 +708,13 @@ module Solargraph
592
708
  pin.parameters <<
593
709
  Solargraph::Pin::Parameter.new(
594
710
  name: 'value',
595
- return_type: ComplexType.try_parse(other_type_to_tag(decl.type)).force_rooted,
711
+ return_type: other_type_to_type(decl.type),
596
712
  source: :rbs,
597
713
  closure: pin,
598
714
  type_location: type_location
599
715
  )
600
- rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
601
- pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', rooted_tag))
716
+ rooted_tags = other_type_to_type(decl.type).rooted_tags
717
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', rooted_tags))
602
718
  pins.push pin
603
719
  end
604
720
 
@@ -606,7 +722,7 @@ module Solargraph
606
722
  # @param closure [Pin::Namespace]
607
723
  # @param context [Context]
608
724
  # @return [void]
609
- def attr_accessor_to_pin(decl, closure, context)
725
+ def attr_accessor_to_pin decl, closure, context
610
726
  attr_reader_to_pin(decl, closure, context)
611
727
  attr_writer_to_pin(decl, closure, context)
612
728
  end
@@ -614,7 +730,7 @@ module Solargraph
614
730
  # @param decl [RBS::AST::Members::InstanceVariable]
615
731
  # @param closure [Pin::Namespace]
616
732
  # @return [void]
617
- def ivar_to_pin(decl, closure)
733
+ def ivar_to_pin decl, closure
618
734
  pin = Solargraph::Pin::InstanceVariable.new(
619
735
  name: decl.name.to_s,
620
736
  closure: closure,
@@ -622,7 +738,7 @@ module Solargraph
622
738
  comments: decl.comment&.string,
623
739
  source: :rbs
624
740
  )
625
- rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
741
+ rooted_tag = other_type_to_type(decl.type).rooted_tags
626
742
  pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
627
743
  pins.push pin
628
744
  end
@@ -630,7 +746,7 @@ module Solargraph
630
746
  # @param decl [RBS::AST::Members::ClassVariable]
631
747
  # @param closure [Pin::Namespace]
632
748
  # @return [void]
633
- def cvar_to_pin(decl, closure)
749
+ def cvar_to_pin decl, closure
634
750
  name = decl.name.to_s
635
751
  pin = Solargraph::Pin::ClassVariable.new(
636
752
  name: name,
@@ -639,7 +755,7 @@ module Solargraph
639
755
  type_location: location_decl_to_pin_location(decl.location),
640
756
  source: :rbs
641
757
  )
642
- rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
758
+ rooted_tag = other_type_to_type(decl.type).rooted_tags
643
759
  pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
644
760
  pins.push pin
645
761
  end
@@ -647,7 +763,7 @@ module Solargraph
647
763
  # @param decl [RBS::AST::Members::ClassInstanceVariable]
648
764
  # @param closure [Pin::Namespace]
649
765
  # @return [void]
650
- def civar_to_pin(decl, closure)
766
+ def civar_to_pin decl, closure
651
767
  name = decl.name.to_s
652
768
  pin = Solargraph::Pin::InstanceVariable.new(
653
769
  name: name,
@@ -656,7 +772,7 @@ module Solargraph
656
772
  type_location: location_decl_to_pin_location(decl.location),
657
773
  source: :rbs
658
774
  )
659
- rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
775
+ rooted_tag = other_type_to_type(decl.type).rooted_tags
660
776
  pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
661
777
  pins.push pin
662
778
  end
@@ -666,9 +782,9 @@ module Solargraph
666
782
  # @return [void]
667
783
  def include_to_pin decl, closure
668
784
  type = build_type(decl.name, decl.args)
669
- generic_values = type.all_params.map(&:to_s)
785
+ generic_values = type.all_params.map(&:rooted_tags)
670
786
  pins.push Solargraph::Pin::Reference::Include.new(
671
- name: decl.name.relative!.to_s,
787
+ name: type.rooted_name, # reference pins use rooted names
672
788
  type_location: location_decl_to_pin_location(decl.location),
673
789
  generic_values: generic_values,
674
790
  closure: closure,
@@ -680,9 +796,12 @@ module Solargraph
680
796
  # @param closure [Pin::Namespace]
681
797
  # @return [void]
682
798
  def prepend_to_pin decl, closure
799
+ type = build_type(decl.name, decl.args)
800
+ generic_values = type.all_params.map(&:rooted_tags)
683
801
  pins.push Solargraph::Pin::Reference::Prepend.new(
684
- name: decl.name.relative!.to_s,
802
+ name: type.rooted_name, # reference pins use rooted names
685
803
  type_location: location_decl_to_pin_location(decl.location),
804
+ generic_values: generic_values,
686
805
  closure: closure,
687
806
  source: :rbs
688
807
  )
@@ -692,9 +811,12 @@ module Solargraph
692
811
  # @param closure [Pin::Namespace]
693
812
  # @return [void]
694
813
  def extend_to_pin decl, closure
814
+ type = build_type(decl.name, decl.args)
815
+ generic_values = type.all_params.map(&:rooted_tags)
695
816
  pins.push Solargraph::Pin::Reference::Extend.new(
696
- name: decl.name.relative!.to_s,
817
+ name: type.rooted_name, # reference pins use rooted names
697
818
  type_location: location_decl_to_pin_location(decl.location),
819
+ generic_values: generic_values,
698
820
  closure: closure,
699
821
  source: :rbs
700
822
  )
@@ -711,114 +833,98 @@ module Solargraph
711
833
  original: decl.old_name.to_s,
712
834
  closure: closure,
713
835
  scope: final_scope,
714
- source: :rbs,
836
+ source: :rbs
715
837
  )
716
838
  end
717
839
 
718
- RBS_TO_YARD_TYPE = {
719
- 'bool' => 'Boolean',
720
- 'string' => 'String',
721
- 'int' => 'Integer',
722
- 'untyped' => '',
723
- 'NilClass' => 'nil'
724
- }
725
-
726
840
  # @param type [RBS::MethodType, RBS::Types::Block]
727
- # @return [String]
728
- def method_type_to_tag type
841
+ # @return [ComplexType, ComplexType::UniqueType]
842
+ def method_type_to_type type
729
843
  if type_aliases.key?(type.type.return_type.to_s)
730
- other_type_to_tag(type_aliases[type.type.return_type.to_s].type)
731
- else
732
- other_type_to_tag type.type.return_type
733
- end
734
- end
735
-
736
- # @param type_name [RBS::TypeName]
737
- # @param type_args [Enumerable<RBS::Types::Bases::Base>]
738
- # @return [ComplexType::UniqueType]
739
- def build_type(type_name, type_args = [])
740
- base = RBS_TO_YARD_TYPE[type_name.relative!.to_s] || type_name.relative!.to_s
741
- params = type_args.map { |a| other_type_to_tag(a) }.map do |t|
742
- ComplexType.try_parse(t).force_rooted
743
- end
744
- if base == 'Hash' && params.length == 2
745
- ComplexType::UniqueType.new(base, [params.first], [params.last], rooted: true, parameters_type: :hash)
844
+ other_type_to_type(type_aliases[type.type.return_type.to_s].type)
746
845
  else
747
- ComplexType::UniqueType.new(base, [], params.reject(&:undefined?), rooted: true, parameters_type: :list)
846
+ other_type_to_type type.type.return_type
748
847
  end
749
848
  end
750
849
 
751
- # @param type_name [RBS::TypeName]
752
- # @param type_args [Enumerable<RBS::Types::Bases::Base>]
753
- # @return [String]
754
- def type_tag(type_name, type_args = [])
755
- build_type(type_name, type_args).tags
756
- end
757
-
758
850
  # @param type [RBS::Types::Bases::Base,Object] RBS type object.
759
851
  # Note: Generally these extend from RBS::Types::Bases::Base,
760
852
  # but not all.
761
- # @return [String]
762
- def other_type_to_tag type
763
- if type.is_a?(RBS::Types::Optional)
764
- "#{other_type_to_tag(type.type)}, nil"
765
- elsif type.is_a?(RBS::Types::Bases::Any)
766
- 'undefined'
767
- elsif type.is_a?(RBS::Types::Bases::Bool)
768
- 'Boolean'
769
- elsif type.is_a?(RBS::Types::Tuple)
770
- "Array(#{type.types.map { |t| other_type_to_tag(t) }.join(', ')})"
771
- elsif type.is_a?(RBS::Types::Literal)
772
- type.literal.inspect
773
- elsif type.is_a?(RBS::Types::Union)
774
- type.types.map { |t| other_type_to_tag(t) }.join(', ')
775
- elsif type.is_a?(RBS::Types::Record)
853
+ #
854
+ # @return [ComplexType, ComplexType::UniqueType]
855
+ def other_type_to_type type
856
+ case type
857
+ when RBS::Types::Optional
858
+ # @sg-ignore flow based typing needs to understand case when class pattern
859
+ ComplexType.new([other_type_to_type(type.type),
860
+ ComplexType::UniqueType::NIL])
861
+ when RBS::Types::Bases::Any
862
+ ComplexType::UNDEFINED
863
+ when RBS::Types::Bases::Bool
864
+ ComplexType::BOOLEAN
865
+ when RBS::Types::Tuple
866
+ # @sg-ignore flow based typing needs to understand case when class pattern
867
+ tuple_types = type.types.map { |t| other_type_to_type(t) }
868
+ ComplexType::UniqueType.new('Array', [], tuple_types, rooted: true, parameters_type: :fixed)
869
+ when RBS::Types::Literal
870
+ # @sg-ignore flow based typing needs to understand case when class pattern
871
+ ComplexType.try_parse(type.literal.inspect).force_rooted
872
+ when RBS::Types::Union
873
+ # @sg-ignore flow based typing needs to understand case when class pattern
874
+ ComplexType.new(type.types.map { |t| other_type_to_type(t) })
875
+ when RBS::Types::Record
776
876
  # @todo Better record support
777
- 'Hash'
778
- elsif type.is_a?(RBS::Types::Bases::Nil)
779
- 'nil'
780
- elsif type.is_a?(RBS::Types::Bases::Self)
781
- 'self'
782
- elsif type.is_a?(RBS::Types::Bases::Void)
783
- 'void'
784
- elsif type.is_a?(RBS::Types::Variable)
785
- "#{Solargraph::ComplexType::GENERIC_TAG_NAME}<#{type.name}>"
786
- elsif type.is_a?(RBS::Types::ClassInstance) #&& !type.args.empty?
787
- type_tag(type.name, type.args)
788
- elsif type.is_a?(RBS::Types::Bases::Instance)
789
- 'self'
790
- elsif type.is_a?(RBS::Types::Bases::Top)
877
+ ComplexType::UniqueType.new('Hash', rooted: true)
878
+ when RBS::Types::Bases::Nil
879
+ ComplexType::NIL
880
+ when RBS::Types::Bases::Self
881
+ ComplexType::SELF
882
+ when RBS::Types::Bases::Void
883
+ ComplexType::VOID
884
+ when RBS::Types::Variable
885
+ # @sg-ignore flow based typing needs to understand case when class pattern
886
+ ComplexType.parse("generic<#{type.name}>").force_rooted
887
+ when RBS::Types::ClassInstance # && !type.args.empty?
888
+ # @sg-ignore flow based typing needs to understand case when class pattern
889
+ build_type(type.name, type.args)
890
+ when RBS::Types::Bases::Instance
891
+ ComplexType::SELF
892
+ when RBS::Types::Bases::Top
791
893
  # top is the most super superclass
792
- 'BasicObject'
793
- elsif type.is_a?(RBS::Types::Bases::Bottom)
894
+ ComplexType::UniqueType.new('BasicObject', rooted: true)
895
+ when RBS::Types::Bases::Bottom
794
896
  # bottom is used in contexts where nothing will ever return
795
897
  # - e.g., it could be the return type of 'exit()' or 'raise'
796
898
  #
797
899
  # @todo define a specific bottom type and use it to
798
900
  # determine dead code
799
- 'undefined'
800
- elsif type.is_a?(RBS::Types::Intersection)
801
- type.types.map { |member| other_type_to_tag(member) }.join(', ')
802
- elsif type.is_a?(RBS::Types::Proc)
803
- 'Proc'
804
- elsif type.is_a?(RBS::Types::Alias)
901
+ ComplexType::UNDEFINED
902
+ when RBS::Types::Intersection
903
+ # @sg-ignore flow based typing needs to understand case when class pattern
904
+ ComplexType.new(type.types.map { |member| other_type_to_type(member) })
905
+ when RBS::Types::Proc
906
+ ComplexType::UniqueType.new('Proc', rooted: true)
907
+ when RBS::Types::Alias
805
908
  # type-level alias use - e.g., 'bool' in "type bool = true | false"
806
909
  # @todo ensure these get resolved after processing all aliases
807
910
  # @todo handle recursive aliases
808
- type_tag(type.name, type.args)
809
- elsif type.is_a?(RBS::Types::Interface)
911
+ # @sg-ignore flow based typing needs to understand case when class pattern
912
+ build_type(type.name, type.args)
913
+ when RBS::Types::Interface
810
914
  # represents a mix-in module which can be considered a
811
915
  # subtype of a consumer of it
812
- type_tag(type.name, type.args)
813
- elsif type.is_a?(RBS::Types::ClassSingleton)
916
+ # @sg-ignore flow based typing needs to understand case when class pattern
917
+ build_type(type.name, type.args)
918
+ when RBS::Types::ClassSingleton
814
919
  # e.g., singleton(String)
815
- type_tag(type.name)
920
+ # @sg-ignore flow based typing needs to understand case when class pattern
921
+ build_type(type.name)
816
922
  else
817
923
  # RBS doesn't provide a common base class for its type AST nodes
818
924
  #
819
925
  # @sg-ignore all types should include location
820
926
  Solargraph.logger.warn "Unrecognized RBS type: #{type.class} at #{type.location}"
821
- 'undefined'
927
+ ComplexType::UNDEFINED
822
928
  end
823
929
  end
824
930
 
@@ -831,9 +937,9 @@ module Solargraph
831
937
  # @todo are we handling prepend correctly?
832
938
  klass = mixin.is_a?(RBS::AST::Members::Include) ? Pin::Reference::Include : Pin::Reference::Extend
833
939
  type = build_type(mixin.name, mixin.args)
834
- generic_values = type.all_params.map(&:to_s)
940
+ generic_values = type.all_params.map(&:rooted_tags)
835
941
  pins.push klass.new(
836
- name: mixin.name.relative!.to_s,
942
+ name: type.rooted_name, # reference pins use rooted names
837
943
  type_location: location_decl_to_pin_location(mixin.location),
838
944
  generic_values: generic_values,
839
945
  closure: namespace,