solargraph 0.46.0 → 0.54.5

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 (279) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/plugins.yml +40 -0
  4. data/.github/workflows/rspec.yml +37 -41
  5. data/.github/workflows/typecheck.yml +34 -0
  6. data/.gitignore +9 -9
  7. data/.rspec +2 -2
  8. data/.yardopts +2 -2
  9. data/CHANGELOG.md +1338 -1115
  10. data/Gemfile +0 -0
  11. data/LICENSE +1 -1
  12. data/README.md +131 -128
  13. data/Rakefile +0 -0
  14. data/SPONSORS.md +10 -18
  15. data/bin/solargraph +0 -0
  16. data/lib/solargraph/api_map/cache.rb +109 -70
  17. data/lib/solargraph/api_map/index.rb +167 -0
  18. data/lib/solargraph/api_map/source_to_yard.rb +88 -81
  19. data/lib/solargraph/api_map/store.rb +260 -256
  20. data/lib/solargraph/api_map.rb +870 -686
  21. data/lib/solargraph/bench.rb +44 -27
  22. data/lib/solargraph/cache.rb +77 -0
  23. data/lib/solargraph/complex_type/type_methods.rb +217 -130
  24. data/lib/solargraph/complex_type/unique_type.rb +386 -75
  25. data/lib/solargraph/complex_type.rb +394 -221
  26. data/lib/solargraph/convention/base.rb +33 -33
  27. data/lib/solargraph/convention/gemfile.rb +15 -15
  28. data/lib/solargraph/convention/gemspec.rb +22 -22
  29. data/lib/solargraph/convention/rakefile.rb +17 -0
  30. data/lib/solargraph/convention.rb +47 -47
  31. data/lib/solargraph/converters/dd.rb +17 -12
  32. data/lib/solargraph/converters/dl.rb +15 -12
  33. data/lib/solargraph/converters/dt.rb +15 -12
  34. data/lib/solargraph/converters/misc.rb +1 -1
  35. data/lib/solargraph/diagnostics/base.rb +29 -29
  36. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  37. data/lib/solargraph/diagnostics/rubocop.rb +113 -98
  38. data/lib/solargraph/diagnostics/rubocop_helpers.rb +66 -63
  39. data/lib/solargraph/diagnostics/severities.rb +15 -15
  40. data/lib/solargraph/diagnostics/type_check.rb +55 -54
  41. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  42. data/lib/solargraph/diagnostics.rb +55 -55
  43. data/lib/solargraph/doc_map.rb +188 -0
  44. data/lib/solargraph/environ.rb +45 -45
  45. data/lib/solargraph/equality.rb +33 -0
  46. data/lib/solargraph/gem_pins.rb +72 -0
  47. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
  48. data/lib/solargraph/language_server/error_codes.rb +20 -20
  49. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  50. data/lib/solargraph/language_server/host/dispatch.rb +128 -111
  51. data/lib/solargraph/language_server/host/message_worker.rb +106 -59
  52. data/lib/solargraph/language_server/host/sources.rb +99 -156
  53. data/lib/solargraph/language_server/host.rb +861 -865
  54. data/lib/solargraph/language_server/message/base.rb +96 -89
  55. data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
  56. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  57. data/lib/solargraph/language_server/message/client.rb +11 -11
  58. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -58
  59. data/lib/solargraph/language_server/message/completion_item.rb +11 -11
  60. data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
  61. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +112 -100
  62. data/lib/solargraph/language_server/message/extended/document.rb +20 -20
  63. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  64. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -23
  65. data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
  66. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  67. data/lib/solargraph/language_server/message/extended.rb +21 -21
  68. data/lib/solargraph/language_server/message/initialize.rb +191 -162
  69. data/lib/solargraph/language_server/message/initialized.rb +28 -27
  70. data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
  71. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
  72. data/lib/solargraph/language_server/message/shutdown.rb +13 -13
  73. data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
  74. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
  75. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -59
  76. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
  77. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
  78. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
  79. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
  80. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
  81. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  82. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -23
  83. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
  84. data/lib/solargraph/language_server/message/text_document/formatting.rb +131 -126
  85. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -54
  86. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
  87. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  88. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  89. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  90. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -29
  91. data/lib/solargraph/language_server/message/text_document/type_definition.rb +24 -0
  92. data/lib/solargraph/language_server/message/text_document.rb +28 -28
  93. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -30
  94. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -33
  95. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
  96. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  97. data/lib/solargraph/language_server/message/workspace.rb +14 -14
  98. data/lib/solargraph/language_server/message.rb +94 -93
  99. data/lib/solargraph/language_server/message_types.rb +14 -14
  100. data/lib/solargraph/language_server/progress.rb +135 -0
  101. data/lib/solargraph/language_server/request.rb +24 -24
  102. data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
  103. data/lib/solargraph/language_server/transport/adapter.rb +68 -53
  104. data/lib/solargraph/language_server/transport/data_reader.rb +74 -72
  105. data/lib/solargraph/language_server/transport.rb +13 -13
  106. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  107. data/lib/solargraph/language_server.rb +20 -19
  108. data/lib/solargraph/library.rb +663 -546
  109. data/lib/solargraph/location.rb +58 -37
  110. data/lib/solargraph/logging.rb +27 -27
  111. data/lib/solargraph/page.rb +89 -83
  112. data/lib/solargraph/parser/comment_ripper.rb +56 -52
  113. data/lib/solargraph/parser/node_methods.rb +83 -43
  114. data/lib/solargraph/parser/node_processor/base.rb +87 -77
  115. data/lib/solargraph/parser/node_processor.rb +45 -43
  116. data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +153 -135
  117. data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +18 -16
  118. data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +164 -148
  119. data/lib/solargraph/parser/parser_gem/node_methods.rb +495 -0
  120. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +23 -23
  121. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +57 -0
  122. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +15 -15
  123. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +43 -42
  124. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +35 -25
  125. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/cvasgn_node.rb +23 -23
  126. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/def_node.rb +50 -63
  127. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +36 -36
  128. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +23 -23
  129. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +38 -38
  130. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +28 -28
  131. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +53 -0
  132. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +39 -39
  133. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +16 -16
  134. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +36 -36
  135. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +42 -0
  136. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +259 -257
  137. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sym_node.rb +18 -18
  138. data/lib/solargraph/parser/parser_gem/node_processors.rb +56 -0
  139. data/lib/solargraph/parser/parser_gem.rb +12 -0
  140. data/lib/solargraph/parser/region.rb +66 -66
  141. data/lib/solargraph/parser/snippet.rb +15 -13
  142. data/lib/solargraph/parser.rb +22 -26
  143. data/lib/solargraph/pin/base.rb +378 -296
  144. data/lib/solargraph/pin/base_variable.rb +118 -84
  145. data/lib/solargraph/pin/block.rb +101 -72
  146. data/lib/solargraph/pin/callable.rb +147 -0
  147. data/lib/solargraph/pin/class_variable.rb +8 -8
  148. data/lib/solargraph/pin/closure.rb +57 -37
  149. data/lib/solargraph/pin/common.rb +70 -70
  150. data/lib/solargraph/pin/constant.rb +43 -43
  151. data/lib/solargraph/pin/conversions.rb +123 -96
  152. data/lib/solargraph/pin/delegated_method.rb +101 -0
  153. data/lib/solargraph/pin/documenting.rb +98 -105
  154. data/lib/solargraph/pin/duck_method.rb +16 -16
  155. data/lib/solargraph/pin/global_variable.rb +8 -8
  156. data/lib/solargraph/pin/instance_variable.rb +34 -30
  157. data/lib/solargraph/pin/keyword.rb +15 -15
  158. data/lib/solargraph/pin/keyword_param.rb +8 -8
  159. data/lib/solargraph/pin/local_variable.rb +67 -55
  160. data/lib/solargraph/pin/method.rb +527 -245
  161. data/lib/solargraph/pin/method_alias.rb +31 -31
  162. data/lib/solargraph/pin/namespace.rb +107 -91
  163. data/lib/solargraph/pin/parameter.rb +212 -201
  164. data/lib/solargraph/pin/proxy_type.rb +29 -29
  165. data/lib/solargraph/pin/reference/extend.rb +10 -10
  166. data/lib/solargraph/pin/reference/include.rb +10 -10
  167. data/lib/solargraph/pin/reference/override.rb +29 -29
  168. data/lib/solargraph/pin/reference/prepend.rb +10 -10
  169. data/lib/solargraph/pin/reference/require.rb +14 -14
  170. data/lib/solargraph/pin/reference/superclass.rb +10 -10
  171. data/lib/solargraph/pin/reference.rb +22 -14
  172. data/lib/solargraph/pin/search.rb +56 -56
  173. data/lib/solargraph/pin/signature.rb +17 -0
  174. data/lib/solargraph/pin/singleton.rb +11 -11
  175. data/lib/solargraph/pin/symbol.rb +47 -47
  176. data/lib/solargraph/pin.rb +41 -37
  177. data/lib/solargraph/position.rb +107 -100
  178. data/lib/solargraph/range.rb +98 -95
  179. data/lib/solargraph/rbs_map/conversions.rb +646 -0
  180. data/lib/solargraph/rbs_map/core_fills.rb +50 -0
  181. data/lib/solargraph/rbs_map/core_map.rb +28 -0
  182. data/lib/solargraph/rbs_map/stdlib_map.rb +33 -0
  183. data/lib/solargraph/rbs_map.rb +93 -0
  184. data/lib/solargraph/server_methods.rb +16 -16
  185. data/lib/solargraph/shell.rb +269 -226
  186. data/lib/solargraph/source/chain/array.rb +33 -0
  187. data/lib/solargraph/source/chain/block_symbol.rb +13 -0
  188. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  189. data/lib/solargraph/source/chain/call.rb +303 -204
  190. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  191. data/lib/solargraph/source/chain/constant.rb +89 -75
  192. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  193. data/lib/solargraph/source/chain/hash.rb +33 -28
  194. data/lib/solargraph/source/chain/head.rb +19 -19
  195. data/lib/solargraph/source/chain/if.rb +28 -0
  196. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  197. data/lib/solargraph/source/chain/link.rb +98 -71
  198. data/lib/solargraph/source/chain/literal.rb +28 -23
  199. data/lib/solargraph/source/chain/or.rb +23 -23
  200. data/lib/solargraph/source/chain/q_call.rb +11 -11
  201. data/lib/solargraph/source/chain/variable.rb +13 -13
  202. data/lib/solargraph/source/chain/z_super.rb +30 -30
  203. data/lib/solargraph/source/chain.rb +252 -164
  204. data/lib/solargraph/source/change.rb +82 -79
  205. data/lib/solargraph/source/cursor.rb +167 -164
  206. data/lib/solargraph/source/source_chainer.rb +194 -191
  207. data/lib/solargraph/source/updater.rb +55 -54
  208. data/lib/solargraph/source.rb +495 -522
  209. data/lib/solargraph/source_map/clip.rb +232 -224
  210. data/lib/solargraph/source_map/completion.rb +23 -23
  211. data/lib/solargraph/source_map/data.rb +30 -0
  212. data/lib/solargraph/source_map/mapper.rb +255 -212
  213. data/lib/solargraph/source_map.rb +217 -180
  214. data/lib/solargraph/type_checker/checks.rb +120 -99
  215. data/lib/solargraph/type_checker/param_def.rb +35 -35
  216. data/lib/solargraph/type_checker/problem.rb +32 -32
  217. data/lib/solargraph/type_checker/rules.rb +62 -57
  218. data/lib/solargraph/type_checker.rb +672 -543
  219. data/lib/solargraph/version.rb +5 -5
  220. data/lib/solargraph/views/environment.erb +56 -58
  221. data/lib/solargraph/workspace/config.rb +239 -231
  222. data/lib/solargraph/workspace.rb +239 -215
  223. data/lib/solargraph/yard_map/cache.rb +25 -19
  224. data/lib/solargraph/yard_map/helpers.rb +16 -16
  225. data/lib/solargraph/yard_map/mapper/to_constant.rb +26 -25
  226. data/lib/solargraph/yard_map/mapper/to_method.rb +94 -78
  227. data/lib/solargraph/yard_map/mapper/to_namespace.rb +28 -27
  228. data/lib/solargraph/yard_map/mapper.rb +78 -77
  229. data/lib/solargraph/yard_map/to_method.rb +86 -79
  230. data/lib/solargraph/yard_map.rb +18 -460
  231. data/lib/solargraph/yard_tags.rb +20 -0
  232. data/lib/solargraph/yardoc.rb +52 -0
  233. data/lib/solargraph.rb +72 -69
  234. data/solargraph.gemspec +21 -10
  235. metadata +184 -115
  236. data/.travis.yml +0 -19
  237. data/lib/solargraph/api_map/bundler_methods.rb +0 -22
  238. data/lib/solargraph/compat.rb +0 -37
  239. data/lib/solargraph/convention/rspec.rb +0 -30
  240. data/lib/solargraph/documentor.rb +0 -76
  241. data/lib/solargraph/language_server/host/cataloger.rb +0 -56
  242. data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
  243. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
  244. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -35
  245. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
  246. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +0 -63
  247. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +0 -21
  248. data/lib/solargraph/parser/legacy/node_processors.rb +0 -54
  249. data/lib/solargraph/parser/legacy.rb +0 -12
  250. data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -144
  251. data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
  252. data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -315
  253. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
  254. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
  255. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -22
  256. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +0 -23
  257. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -57
  258. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
  259. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
  260. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
  261. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
  262. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
  263. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
  264. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
  265. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
  266. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -45
  267. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -21
  268. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
  269. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -277
  270. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +0 -18
  271. data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -63
  272. data/lib/solargraph/parser/rubyvm.rb +0 -40
  273. data/lib/solargraph/yard_map/core_docs.rb +0 -170
  274. data/lib/solargraph/yard_map/core_fills.rb +0 -208
  275. data/lib/solargraph/yard_map/core_gen.rb +0 -76
  276. data/lib/solargraph/yard_map/rdoc_to_yard.rb +0 -140
  277. data/lib/solargraph/yard_map/stdlib_fills.rb +0 -43
  278. data/lib/yard-solargraph.rb +0 -33
  279. data/yardoc/2.2.2.tar.gz +0 -0
@@ -0,0 +1,646 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rbs'
4
+
5
+ module Solargraph
6
+ class RbsMap
7
+ # Functions for converting RBS declarations to Solargraph pins
8
+ #
9
+ module Conversions
10
+ # A container for tracking the current context of the RBS conversion
11
+ # process, e.g., what visibility is declared for methods in the current
12
+ # scope
13
+ #
14
+ class Context
15
+ attr_reader :visibility
16
+
17
+ # @param visibility [Symbol]
18
+ def initialize visibility = :public
19
+ @visibility = visibility
20
+ end
21
+ end
22
+
23
+ # @return [Array<Pin::Base>]
24
+ def pins
25
+ @pins ||= []
26
+ end
27
+
28
+ private
29
+
30
+ # @return [Hash{String => RBS::AST::Declarations::TypeAlias}]
31
+ def type_aliases
32
+ @type_aliases ||= {}
33
+ end
34
+
35
+ # @param loader [RBS::EnvironmentLoader]
36
+ # @return [void]
37
+ def load_environment_to_pins(loader)
38
+ environment = RBS::Environment.from_loader(loader).resolve_type_names
39
+ cursor = pins.length
40
+ environment.declarations.each { |decl| convert_decl_to_pin(decl, Solargraph::Pin::ROOT_PIN) }
41
+ added_pins = pins[cursor..-1]
42
+ added_pins.each { |pin| pin.source = :rbs }
43
+ end
44
+
45
+ # @param decl [RBS::AST::Declarations::Base]
46
+ # @param closure [Pin::Closure]
47
+ # @return [void]
48
+ def convert_decl_to_pin decl, closure
49
+ case decl
50
+ when RBS::AST::Declarations::Class
51
+ class_decl_to_pin decl
52
+ when RBS::AST::Declarations::Interface
53
+ # STDERR.puts "Skipping interface #{decl.name.relative!}"
54
+ interface_decl_to_pin decl, closure
55
+ when RBS::AST::Declarations::TypeAlias
56
+ type_aliases[decl.name.to_s] = decl
57
+ when RBS::AST::Declarations::Module
58
+ module_decl_to_pin decl
59
+ when RBS::AST::Declarations::Constant
60
+ constant_decl_to_pin decl
61
+ when RBS::AST::Declarations::ClassAlias
62
+ class_alias_decl_to_pin decl
63
+ when RBS::AST::Declarations::ModuleAlias
64
+ module_alias_decl_to_pin decl
65
+ when RBS::AST::Declarations::Global
66
+ global_decl_to_pin decl
67
+ else
68
+ Solargraph.logger.warn "Skipping declaration #{decl.class}"
69
+ end
70
+ end
71
+
72
+ # @param decl [RBS::AST::Declarations::Module]
73
+ # @param module_pin [Pin::Namespace]
74
+ # @return [void]
75
+ def convert_self_types_to_pins decl, module_pin
76
+ decl.self_types.each { |self_type| context = convert_self_type_to_pins(self_type, module_pin) }
77
+ end
78
+
79
+ # @param decl [RBS::AST::Declarations::Module::Self]
80
+ # @param closure [Pin::Namespace]
81
+ # @return [void]
82
+ def convert_self_type_to_pins decl, closure
83
+ type = build_type(decl.name, decl.args)
84
+ generic_values = type.all_params.map(&:to_s)
85
+ include_pin = Solargraph::Pin::Reference::Include.new(
86
+ name: decl.name.relative!.to_s,
87
+ type_location: location_decl_to_pin_location(decl.location),
88
+ generic_values: generic_values,
89
+ closure: closure
90
+ )
91
+ pins.push include_pin
92
+ end
93
+
94
+ # @param decl [RBS::AST::Declarations::Module,RBS::AST::Declarations::Class,RBS::AST::Declarations::Interface]
95
+ # @param closure [Pin::Namespace]
96
+ # @return [void]
97
+ def convert_members_to_pins decl, closure
98
+ context = Context.new
99
+ decl.members.each { |m| context = convert_member_to_pin(m, closure, context) }
100
+ end
101
+
102
+ # @param member [RBS::AST::Members::Base,RBS::AST::Declarations::Base]
103
+ # @param closure [Pin::Namespace]
104
+ # @param context [Context]
105
+ # @return [void]
106
+ def convert_member_to_pin member, closure, context
107
+ case member
108
+ when RBS::AST::Members::MethodDefinition
109
+ method_def_to_pin(member, closure)
110
+ when RBS::AST::Members::AttrReader
111
+ attr_reader_to_pin(member, closure)
112
+ when RBS::AST::Members::AttrWriter
113
+ attr_writer_to_pin(member, closure)
114
+ when RBS::AST::Members::AttrAccessor
115
+ attr_accessor_to_pin(member, closure)
116
+ when RBS::AST::Members::Include
117
+ include_to_pin(member, closure)
118
+ when RBS::AST::Members::Prepend
119
+ prepend_to_pin(member, closure)
120
+ when RBS::AST::Members::Extend
121
+ extend_to_pin(member, closure)
122
+ when RBS::AST::Members::Alias
123
+ alias_to_pin(member, closure)
124
+ when RBS::AST::Members::ClassInstanceVariable
125
+ civar_to_pin(member, closure)
126
+ when RBS::AST::Members::ClassVariable
127
+ cvar_to_pin(member, closure)
128
+ when RBS::AST::Members::InstanceVariable
129
+ ivar_to_pin(member, closure)
130
+ when RBS::AST::Members::Public
131
+ return Context.new(visibility: :public)
132
+ when RBS::AST::Members::Private
133
+ return Context.new(visibility: :private)
134
+ when RBS::AST::Declarations::Base
135
+ convert_decl_to_pin(member, closure)
136
+ else
137
+ Solargraph.logger.warn "Skipping member type #{member.class}"
138
+ end
139
+ context
140
+ end
141
+
142
+ # @param decl [RBS::AST::Declarations::Class]
143
+ # @return [void]
144
+ def class_decl_to_pin decl
145
+ class_pin = Solargraph::Pin::Namespace.new(
146
+ type: :class,
147
+ name: decl.name.relative!.to_s,
148
+ closure: Solargraph::Pin::ROOT_PIN,
149
+ comments: decl.comment&.string,
150
+ type_location: location_decl_to_pin_location(decl.location),
151
+ # @todo some type parameters in core/stdlib have default
152
+ # values; Solargraph doesn't support that yet as so these
153
+ # get treated as undefined if not specified
154
+ generics: decl.type_params.map(&:name).map(&:to_s)
155
+ )
156
+ pins.push class_pin
157
+ if decl.super_class
158
+ pins.push Solargraph::Pin::Reference::Superclass.new(
159
+ type_location: location_decl_to_pin_location(decl.super_class.location),
160
+ closure: class_pin,
161
+ name: decl.super_class.name.relative!.to_s
162
+ )
163
+ end
164
+ add_mixins decl, class_pin
165
+ convert_members_to_pins decl, class_pin
166
+ end
167
+
168
+ # @param decl [RBS::AST::Declarations::Interface]
169
+ # @param closure [Pin::Closure]
170
+ # @return [void]
171
+ def interface_decl_to_pin decl, closure
172
+ class_pin = Solargraph::Pin::Namespace.new(
173
+ type: :module,
174
+ type_location: location_decl_to_pin_location(decl.location),
175
+ name: decl.name.relative!.to_s,
176
+ closure: Solargraph::Pin::ROOT_PIN,
177
+ comments: decl.comment&.string,
178
+ generics: decl.type_params.map(&:name).map(&:to_s),
179
+ # HACK: Using :hidden to keep interfaces from appearing in
180
+ # autocompletion
181
+ visibility: :hidden
182
+ )
183
+ class_pin.docstring.add_tag(YARD::Tags::Tag.new(:abstract, '(RBS interface)'))
184
+ pins.push class_pin
185
+ convert_members_to_pins decl, class_pin
186
+ end
187
+
188
+ # @param decl [RBS::AST::Declarations::Module]
189
+ # @return [void]
190
+ def module_decl_to_pin decl
191
+ module_pin = Solargraph::Pin::Namespace.new(
192
+ type: :module,
193
+ name: decl.name.relative!.to_s,
194
+ type_location: location_decl_to_pin_location(decl.location),
195
+ closure: Solargraph::Pin::ROOT_PIN,
196
+ comments: decl.comment&.string,
197
+ generics: decl.type_params.map(&:name).map(&:to_s),
198
+ )
199
+ pins.push module_pin
200
+ convert_self_types_to_pins decl, module_pin
201
+ convert_members_to_pins decl, module_pin
202
+
203
+ add_mixins decl, module_pin.closure
204
+ end
205
+
206
+ # @param name [String]
207
+ # @param tag [String]
208
+ # @param comments [String]
209
+ # @param decl [RBS::AST::Declarations::ClassAlias, RBS::AST::Declarations::Constant, RBS::AST::Declarations::ModuleAlias]
210
+ # @param base [String, nil] Optional conversion of tag to base<tag>
211
+ #
212
+ # @return [Solargraph::Pin::Constant]
213
+ def create_constant(name, tag, comments, decl, base = nil)
214
+ parts = name.split('::')
215
+ if parts.length > 1
216
+ name = parts.last
217
+ closure = pins.select { |pin| pin && pin.path == parts[0..-2].join('::') }.first
218
+ else
219
+ name = parts.first
220
+ closure = Solargraph::Pin::ROOT_PIN
221
+ end
222
+ constant_pin = Solargraph::Pin::Constant.new(
223
+ name: name,
224
+ closure: closure,
225
+ type_location: location_decl_to_pin_location(decl.location),
226
+ comments: comments
227
+ )
228
+ tag = "#{base}<#{tag}>" if base
229
+ rooted_tag = ComplexType.parse(tag).force_rooted.rooted_tags
230
+ constant_pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', rooted_tag))
231
+ constant_pin
232
+ end
233
+
234
+ # @param decl [RBS::AST::Declarations::ClassAlias]
235
+ # @return [void]
236
+ def class_alias_decl_to_pin decl
237
+ # See https://www.rubydoc.info/gems/rbs/3.4.3/RBS/AST/Declarations/ClassAlias
238
+ new_name = decl.new_name.relative!.to_s
239
+ old_name = decl.old_name.relative!.to_s
240
+
241
+ pins.push create_constant(new_name, old_name, decl.comment&.string, decl, 'Class')
242
+ end
243
+
244
+ # @param decl [RBS::AST::Declarations::ModuleAlias]
245
+ # @return [void]
246
+ def module_alias_decl_to_pin decl
247
+ # See https://www.rubydoc.info/gems/rbs/3.4.3/RBS/AST/Declarations/ModuleAlias
248
+ new_name = decl.new_name.relative!.to_s
249
+ old_name = decl.old_name.relative!.to_s
250
+
251
+ pins.push create_constant(new_name, old_name, decl.comment&.string, decl, 'Module')
252
+ end
253
+
254
+ # @param decl [RBS::AST::Declarations::Constant]
255
+ # @return [void]
256
+ def constant_decl_to_pin decl
257
+ tag = other_type_to_tag(decl.type)
258
+ pins.push create_constant(decl.name.relative!.to_s, tag, decl.comment&.string, decl)
259
+ end
260
+
261
+ # @param decl [RBS::AST::Declarations::Global]
262
+ # @return [void]
263
+ def global_decl_to_pin decl
264
+ closure = Solargraph::Pin::ROOT_PIN
265
+ name = decl.name.to_s
266
+ pin = Solargraph::Pin::GlobalVariable.new(
267
+ name: name,
268
+ closure: closure,
269
+ comments: decl.comment&.string,
270
+ )
271
+ rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
272
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
273
+ pins.push pin
274
+ end
275
+
276
+ # @param decl [RBS::AST::Members::MethodDefinition]
277
+ # @param closure [Pin::Closure]
278
+ # @return [void]
279
+ def method_def_to_pin decl, closure
280
+ # there may be edge cases here around different signatures
281
+ # having different type params / orders - we may need to match
282
+ # this data model and have generics live in signatures to
283
+ # handle those correctly
284
+ generics = decl.overloads.map(&:method_type).flat_map(&:type_params).map(&:name).map(&:to_s).uniq
285
+ if decl.instance?
286
+ pin = Solargraph::Pin::Method.new(
287
+ name: decl.name.to_s,
288
+ closure: closure,
289
+ type_location: location_decl_to_pin_location(decl.location),
290
+ comments: decl.comment&.string,
291
+ scope: :instance,
292
+ signatures: [],
293
+ generics: generics,
294
+ # @todo RBS core has unreliable visibility definitions
295
+ visibility: closure.path == 'Kernel' && Kernel.private_instance_methods(false).include?(decl.name) ? :private : :public
296
+ )
297
+ pin.signatures.concat method_def_to_sigs(decl, pin)
298
+ pins.push pin
299
+ if pin.name == 'initialize'
300
+ pin.instance_variable_set(:@visibility, :private)
301
+ pin.instance_variable_set(:@return_type, ComplexType::VOID)
302
+ end
303
+ end
304
+ if decl.singleton?
305
+ pin = Solargraph::Pin::Method.new(
306
+ name: decl.name.to_s,
307
+ closure: closure,
308
+ comments: decl.comment&.string,
309
+ type_location: location_decl_to_pin_location(decl.location),
310
+ scope: :class,
311
+ signatures: [],
312
+ generics: generics
313
+ )
314
+ pin.signatures.concat method_def_to_sigs(decl, pin)
315
+ pins.push pin
316
+ end
317
+ end
318
+
319
+ # @param decl [RBS::AST::Members::MethodDefinition]
320
+ # @param pin [Pin::Method]
321
+ # @return [void]
322
+ def method_def_to_sigs decl, pin
323
+ decl.overloads.map do |overload|
324
+ generics = overload.method_type.type_params.map(&:name).map(&:to_s)
325
+ signature_parameters, signature_return_type = parts_of_function(overload.method_type, pin)
326
+ block = if overload.method_type.block
327
+ block_parameters, block_return_type = parts_of_function(overload.method_type.block, pin)
328
+ Pin::Signature.new(generics: generics, parameters: block_parameters, return_type: block_return_type)
329
+ end
330
+ Pin::Signature.new(generics: generics, parameters: signature_parameters, return_type: signature_return_type, block: block)
331
+ end
332
+ end
333
+
334
+ # @param location [RBS::Location, nil]
335
+ # @return [Solargraph::Location, nil]
336
+ def location_decl_to_pin_location(location)
337
+ return nil if location&.name.nil?
338
+
339
+ start_pos = Position.new(location.start_line - 1, location.start_column)
340
+ end_pos = Position.new(location.end_line - 1, location.end_column)
341
+ range = Range.new(start_pos, end_pos)
342
+ Location.new(location.name.to_s, range)
343
+ end
344
+
345
+ # @param type [RBS::MethodType,RBS::Types::Block]
346
+ # @param pin [Pin::Method]
347
+ # @return [Array(Array<Pin::Parameter>, ComplexType)]
348
+ def parts_of_function type, pin
349
+ return [[Solargraph::Pin::Parameter.new(decl: :restarg, name: 'arg', closure: pin)], ComplexType.try_parse(method_type_to_tag(type)).force_rooted] if defined?(RBS::Types::UntypedFunction) && type.type.is_a?(RBS::Types::UntypedFunction)
350
+
351
+ parameters = []
352
+ arg_num = -1
353
+ type.type.required_positionals.each do |param|
354
+ name = param.name ? param.name.to_s : "arg#{arg_num += 1}"
355
+ 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)
356
+ end
357
+ type.type.optional_positionals.each do |param|
358
+ name = param.name ? param.name.to_s : "arg#{arg_num += 1}"
359
+ parameters.push Solargraph::Pin::Parameter.new(decl: :optarg, name: name, closure: pin,
360
+ return_type: ComplexType.try_parse(other_type_to_tag(param.type)).force_rooted)
361
+ end
362
+ if type.type.rest_positionals
363
+ name = type.type.rest_positionals.name ? type.type.rest_positionals.name.to_s : "arg#{arg_num += 1}"
364
+ parameters.push Solargraph::Pin::Parameter.new(decl: :restarg, name: name, closure: pin)
365
+ end
366
+ type.type.trailing_positionals.each do |param|
367
+ name = param.name ? param.name.to_s : "arg#{arg_num += 1}"
368
+ parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin)
369
+ end
370
+ type.type.required_keywords.each do |orig, param|
371
+ name = orig ? orig.to_s : "arg#{arg_num += 1}"
372
+ parameters.push Solargraph::Pin::Parameter.new(decl: :kwarg, name: name, closure: pin,
373
+ return_type: ComplexType.try_parse(other_type_to_tag(param.type)).force_rooted)
374
+ end
375
+ type.type.optional_keywords.each do |orig, param|
376
+ name = orig ? orig.to_s : "arg#{arg_num += 1}"
377
+ parameters.push Solargraph::Pin::Parameter.new(decl: :kwoptarg, name: name, closure: pin,
378
+ return_type: ComplexType.try_parse(other_type_to_tag(param.type)).force_rooted)
379
+ end
380
+ if type.type.rest_keywords
381
+ name = type.type.rest_keywords.name ? type.type.rest_keywords.name.to_s : "arg#{arg_num += 1}"
382
+ parameters.push Solargraph::Pin::Parameter.new(decl: :kwrestarg, name: type.type.rest_keywords.name.to_s, closure: pin)
383
+ end
384
+
385
+ rooted_tag = method_type_to_tag(type)
386
+ return_type = ComplexType.try_parse(rooted_tag).force_rooted
387
+ [parameters, return_type]
388
+ end
389
+
390
+ # @param decl [RBS::AST::Members::AttrReader,RBS::AST::Members::AttrAccessor]
391
+ # @param closure [Pin::Namespace]
392
+ # @return [void]
393
+ def attr_reader_to_pin(decl, closure)
394
+ pin = Solargraph::Pin::Method.new(
395
+ name: decl.name.to_s,
396
+ type_location: location_decl_to_pin_location(decl.location),
397
+ closure: closure,
398
+ comments: decl.comment&.string,
399
+ scope: :instance,
400
+ attribute: true
401
+ )
402
+ rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
403
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', rooted_tag))
404
+ pins.push pin
405
+ end
406
+
407
+ # @param decl [RBS::AST::Members::AttrWriter, RBS::AST::Members::AttrAccessor]
408
+ # @param closure [Pin::Namespace]
409
+ # @return [void]
410
+ def attr_writer_to_pin(decl, closure)
411
+ pin = Solargraph::Pin::Method.new(
412
+ name: "#{decl.name.to_s}=",
413
+ type_location: location_decl_to_pin_location(decl.location),
414
+ closure: closure,
415
+ comments: decl.comment&.string,
416
+ scope: :instance,
417
+ attribute: true
418
+ )
419
+ rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
420
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', rooted_tag))
421
+ pins.push pin
422
+ end
423
+
424
+ # @param decl [RBS::AST::Members::AttrAccessor]
425
+ # @param closure [Pin::Namespace]
426
+ # @return [void]
427
+ def attr_accessor_to_pin(decl, closure)
428
+ attr_reader_to_pin(decl, closure)
429
+ attr_writer_to_pin(decl, closure)
430
+ end
431
+
432
+ # @param decl [RBS::AST::Members::InstanceVariable]
433
+ # @param closure [Pin::Namespace]
434
+ # @return [void]
435
+ def ivar_to_pin(decl, closure)
436
+ pin = Solargraph::Pin::InstanceVariable.new(
437
+ name: decl.name.to_s,
438
+ closure: closure,
439
+ type_location: location_decl_to_pin_location(decl.location),
440
+ comments: decl.comment&.string
441
+ )
442
+ rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
443
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
444
+ pins.push pin
445
+ end
446
+
447
+ # @param decl [RBS::AST::Members::ClassVariable]
448
+ # @param closure [Pin::Namespace]
449
+ # @return [void]
450
+ def cvar_to_pin(decl, closure)
451
+ name = decl.name.to_s
452
+ pin = Solargraph::Pin::ClassVariable.new(
453
+ name: name,
454
+ closure: closure,
455
+ comments: decl.comment&.string
456
+ )
457
+ rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
458
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
459
+ pins.push pin
460
+ end
461
+
462
+ # @param decl [RBS::AST::Members::ClassInstanceVariable]
463
+ # @param closure [Pin::Namespace]
464
+ # @return [void]
465
+ def civar_to_pin(decl, closure)
466
+ name = decl.name.to_s
467
+ pin = Solargraph::Pin::InstanceVariable.new(
468
+ name: name,
469
+ closure: closure,
470
+ comments: decl.comment&.string
471
+ )
472
+ rooted_tag = ComplexType.parse(other_type_to_tag(decl.type)).force_rooted.rooted_tags
473
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', rooted_tag))
474
+ pins.push pin
475
+ end
476
+
477
+ # @param decl [RBS::AST::Members::Include]
478
+ # @param closure [Pin::Namespace]
479
+ # @return [void]
480
+ def include_to_pin decl, closure
481
+ type = build_type(decl.name, decl.args)
482
+ generic_values = type.all_params.map(&:to_s)
483
+ pins.push Solargraph::Pin::Reference::Include.new(
484
+ name: decl.name.relative!.to_s,
485
+ type_location: location_decl_to_pin_location(decl.location),
486
+ generic_values: generic_values,
487
+ closure: closure
488
+ )
489
+ end
490
+
491
+ # @param decl [RBS::AST::Members::Prepend]
492
+ # @param closure [Pin::Namespace]
493
+ # @return [void]
494
+ def prepend_to_pin decl, closure
495
+ pins.push Solargraph::Pin::Reference::Prepend.new(
496
+ name: decl.name.relative!.to_s,
497
+ type_location: location_decl_to_pin_location(decl.location),
498
+ closure: closure
499
+ )
500
+ end
501
+
502
+ # @param decl [RBS::AST::Members::Extend]
503
+ # @param closure [Pin::Namespace]
504
+ # @return [void]
505
+ def extend_to_pin decl, closure
506
+ pins.push Solargraph::Pin::Reference::Extend.new(
507
+ name: decl.name.relative!.to_s,
508
+ type_location: location_decl_to_pin_location(decl.location),
509
+ closure: closure
510
+ )
511
+ end
512
+
513
+ # @param decl [RBS::AST::Members::Alias]
514
+ # @param closure [Pin::Namespace]
515
+ # @return [void]
516
+ def alias_to_pin decl, closure
517
+ pins.push Solargraph::Pin::MethodAlias.new(
518
+ name: decl.new_name.to_s,
519
+ type_location: location_decl_to_pin_location(decl.location),
520
+ original: decl.old_name.to_s,
521
+ closure: closure
522
+ )
523
+ end
524
+
525
+ RBS_TO_YARD_TYPE = {
526
+ 'bool' => 'Boolean',
527
+ 'string' => 'String',
528
+ 'int' => 'Integer',
529
+ 'untyped' => '',
530
+ 'NilClass' => 'nil'
531
+ }
532
+
533
+ # @param type [RBS::MethodType]
534
+ # @return [String]
535
+ def method_type_to_tag type
536
+ if type_aliases.key?(type.type.return_type.to_s)
537
+ other_type_to_tag(type_aliases[type.type.return_type.to_s].type)
538
+ else
539
+ other_type_to_tag type.type.return_type
540
+ end
541
+ end
542
+
543
+ # @param type_name [RBS::TypeName]
544
+ # @param type_args [Enumerable<RBS::Types::Bases::Base>]
545
+ # @return [ComplexType::UniqueType]
546
+ def build_type(type_name, type_args = [])
547
+ base = RBS_TO_YARD_TYPE[type_name.relative!.to_s] || type_name.relative!.to_s
548
+ params = type_args.map { |a| other_type_to_tag(a) }.reject { |t| t == 'undefined' }.map do |t|
549
+ ComplexType.try_parse(t).force_rooted
550
+ end
551
+ if base == 'Hash' && params.length == 2
552
+ ComplexType::UniqueType.new(base, [params.first], [params.last], rooted: true, parameters_type: :hash)
553
+ else
554
+ ComplexType::UniqueType.new(base, [], params, rooted: true, parameters_type: :list)
555
+ end
556
+ end
557
+
558
+ # @param type_name [RBS::TypeName]
559
+ # @param type_args [Enumerable<RBS::Types::Bases::Base>]
560
+ # @return [String]
561
+ def type_tag(type_name, type_args = [])
562
+ build_type(type_name, type_args).tags
563
+ end
564
+
565
+ # @param type [RBS::Types::Bases::Base]
566
+ # @return [String]
567
+ def other_type_to_tag type
568
+ if type.is_a?(RBS::Types::Optional)
569
+ "#{other_type_to_tag(type.type)}, nil"
570
+ elsif type.is_a?(RBS::Types::Bases::Any)
571
+ # @todo Not sure what to do with Any yet
572
+ 'BasicObject'
573
+ elsif type.is_a?(RBS::Types::Bases::Bool)
574
+ 'Boolean'
575
+ elsif type.is_a?(RBS::Types::Tuple)
576
+ "Array(#{type.types.map { |t| other_type_to_tag(t) }.join(', ')})"
577
+ elsif type.is_a?(RBS::Types::Literal)
578
+ type.literal.to_s
579
+ elsif type.is_a?(RBS::Types::Union)
580
+ type.types.map { |t| other_type_to_tag(t) }.join(', ')
581
+ elsif type.is_a?(RBS::Types::Record)
582
+ # @todo Better record support
583
+ 'Hash'
584
+ elsif type.is_a?(RBS::Types::Bases::Nil)
585
+ 'nil'
586
+ elsif type.is_a?(RBS::Types::Bases::Self)
587
+ 'self'
588
+ elsif type.is_a?(RBS::Types::Bases::Void)
589
+ 'void'
590
+ elsif type.is_a?(RBS::Types::Variable)
591
+ "#{Solargraph::ComplexType::GENERIC_TAG_NAME}<#{type.name}>"
592
+ elsif type.is_a?(RBS::Types::ClassInstance) #&& !type.args.empty?
593
+ type_tag(type.name, type.args)
594
+ elsif type.is_a?(RBS::Types::Bases::Instance)
595
+ 'self'
596
+ elsif type.is_a?(RBS::Types::Bases::Top)
597
+ # top is the most super superclass
598
+ 'BasicObject'
599
+ elsif type.is_a?(RBS::Types::Bases::Bottom)
600
+ # bottom is used in contexts where nothing will ever return
601
+ # - e.g., it could be the return type of 'exit()' or 'raise'
602
+ #
603
+ # @todo define a specific bottom type and use it to
604
+ # determine dead code
605
+ 'undefined'
606
+ elsif type.is_a?(RBS::Types::Intersection)
607
+ type.types.map { |member| other_type_to_tag(member) }.join(', ')
608
+ elsif type.is_a?(RBS::Types::Proc)
609
+ 'Proc'
610
+ elsif type.is_a?(RBS::Types::Alias)
611
+ # type-level alias use - e.g., 'bool' in "type bool = true | false"
612
+ # @todo ensure these get resolved after processing all aliases
613
+ # @todo handle recursive aliases
614
+ type_tag(type.name, type.args)
615
+ elsif type.is_a?(RBS::Types::Interface)
616
+ # represents a mix-in module which can be considered a
617
+ # subtype of a consumer of it
618
+ type_tag(type.name, type.args)
619
+ elsif type.is_a?(RBS::Types::ClassSingleton)
620
+ # e.g., singleton(String)
621
+ type_tag(type.name)
622
+ else
623
+ Solargraph.logger.warn "Unrecognized RBS type: #{type.class} at #{type.location}"
624
+ 'undefined'
625
+ end
626
+ end
627
+
628
+ # @param decl [RBS::AST::Declarations::Class, RBS::AST::Declarations::Module]
629
+ # @param namespace [Pin::Namespace]
630
+ # @return [void]
631
+ def add_mixins decl, namespace
632
+ decl.each_mixin do |mixin|
633
+ klass = mixin.is_a?(RBS::AST::Members::Include) ? Pin::Reference::Include : Pin::Reference::Extend
634
+ type = build_type(mixin.name, mixin.args)
635
+ generic_values = type.all_params.map(&:to_s)
636
+ pins.push klass.new(
637
+ name: mixin.name.relative!.to_s,
638
+ type_location: location_decl_to_pin_location(mixin.location),
639
+ generic_values: generic_values,
640
+ closure: namespace
641
+ )
642
+ end
643
+ end
644
+ end
645
+ end
646
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class RbsMap
5
+ # Override pins to fill gaps in RbsMap::CoreMap coverage
6
+ #
7
+ module CoreFills
8
+ Override = Pin::Reference::Override
9
+
10
+ KEYWORDS = [
11
+ '__ENCODING__', '__LINE__', '__FILE__', 'BEGIN', 'END', 'alias', 'and',
12
+ 'begin', 'break', 'case', 'class', 'def', 'defined?', 'do', 'else',
13
+ 'elsif', 'end', 'ensure', 'false', 'for', 'if', 'in', 'module', 'next',
14
+ 'nil', 'not', 'or', 'redo', 'rescue', 'retry', 'return', 'self', 'super',
15
+ 'then', 'true', 'undef', 'unless', 'until', 'when', 'while', 'yield'
16
+ ].map { |k| Pin::Keyword.new(k) }
17
+
18
+ MISSING = [
19
+ Solargraph::Pin::Method.new(name: 'tap', scope: :instance,
20
+ closure: Solargraph::Pin::Namespace.new(name: 'Object')),
21
+ Solargraph::Pin::Method.new(name: 'class', scope: :instance,
22
+ closure: Solargraph::Pin::Namespace.new(name: 'Object'), comments: '@return [::Class<self>]')
23
+ ]
24
+
25
+ OVERRIDES = [
26
+ Override.from_comment('BasicObject#instance_eval', '@yieldreceiver [self]'),
27
+ Override.from_comment('BasicObject#instance_exec', '@yieldreceiver [self]'),
28
+ Override.from_comment('Module#define_method', '@yieldreceiver [::Object<self>]'),
29
+ Override.from_comment('Module#class_eval', '@yieldreceiver [::Class<self>]'),
30
+ Override.from_comment('Module#class_exec', '@yieldreceiver [::Class<self>]'),
31
+ Override.from_comment('Module#module_eval', '@yieldreceiver [::Module<self>]'),
32
+ Override.from_comment('Module#module_exec', '@yieldreceiver [::Module<self>]'),
33
+ # RBS does not define Class with a generic, so all calls to
34
+ # generic() return an 'untyped'. We can do better:
35
+ Override.method_return('Class#allocate', 'self')
36
+ ]
37
+
38
+ # HACK: Add Errno exception classes
39
+ errno = Solargraph::Pin::Namespace.new(name: 'Errno')
40
+ errnos = []
41
+ Errno.constants.each do |const|
42
+ errnos.push Solargraph::Pin::Namespace.new(type: :class, name: const.to_s, closure: errno)
43
+ errnos.push Solargraph::Pin::Reference::Superclass.new(closure: errnos.last, name: 'SystemCallError')
44
+ end
45
+ ERRNOS = errnos
46
+
47
+ ALL = KEYWORDS + MISSING + OVERRIDES + ERRNOS
48
+ end
49
+ end
50
+ end