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