cosmicgraph 0.49.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 (259) hide show
  1. checksums.yaml +7 -0
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/rspec.yml +41 -0
  4. data/.gitignore +9 -0
  5. data/.rspec +2 -0
  6. data/.yardopts +2 -0
  7. data/CHANGELOG.md +1150 -0
  8. data/Gemfile +7 -0
  9. data/LICENSE +21 -0
  10. data/README.md +136 -0
  11. data/Rakefile +25 -0
  12. data/SPONSORS.md +15 -0
  13. data/bin/solargraph +5 -0
  14. data/cosmicgraph.gemspec +44 -0
  15. data/lib/.rubocop.yml +22 -0
  16. data/lib/solargraph/api_map/bundler_methods.rb +22 -0
  17. data/lib/solargraph/api_map/cache.rb +70 -0
  18. data/lib/solargraph/api_map/source_to_yard.rb +81 -0
  19. data/lib/solargraph/api_map/store.rb +268 -0
  20. data/lib/solargraph/api_map.rb +704 -0
  21. data/lib/solargraph/bench.rb +27 -0
  22. data/lib/solargraph/cache.rb +51 -0
  23. data/lib/solargraph/complex_type/type_methods.rb +134 -0
  24. data/lib/solargraph/complex_type/unique_type.rb +132 -0
  25. data/lib/solargraph/complex_type.rb +254 -0
  26. data/lib/solargraph/convention/base.rb +33 -0
  27. data/lib/solargraph/convention/gemfile.rb +15 -0
  28. data/lib/solargraph/convention/gemspec.rb +22 -0
  29. data/lib/solargraph/convention/rakefile.rb +17 -0
  30. data/lib/solargraph/convention/rspec.rb +30 -0
  31. data/lib/solargraph/convention.rb +49 -0
  32. data/lib/solargraph/converters/dd.rb +12 -0
  33. data/lib/solargraph/converters/dl.rb +12 -0
  34. data/lib/solargraph/converters/dt.rb +12 -0
  35. data/lib/solargraph/converters/misc.rb +1 -0
  36. data/lib/solargraph/diagnostics/base.rb +29 -0
  37. data/lib/solargraph/diagnostics/require_not_found.rb +53 -0
  38. data/lib/solargraph/diagnostics/rubocop.rb +112 -0
  39. data/lib/solargraph/diagnostics/rubocop_helpers.rb +65 -0
  40. data/lib/solargraph/diagnostics/severities.rb +15 -0
  41. data/lib/solargraph/diagnostics/type_check.rb +54 -0
  42. data/lib/solargraph/diagnostics/update_errors.rb +41 -0
  43. data/lib/solargraph/diagnostics.rb +55 -0
  44. data/lib/solargraph/documentor.rb +76 -0
  45. data/lib/solargraph/environ.rb +45 -0
  46. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -0
  47. data/lib/solargraph/language_server/error_codes.rb +20 -0
  48. data/lib/solargraph/language_server/host/cataloger.rb +56 -0
  49. data/lib/solargraph/language_server/host/diagnoser.rb +89 -0
  50. data/lib/solargraph/language_server/host/dispatch.rb +111 -0
  51. data/lib/solargraph/language_server/host/message_worker.rb +59 -0
  52. data/lib/solargraph/language_server/host/sources.rb +156 -0
  53. data/lib/solargraph/language_server/host.rb +869 -0
  54. data/lib/solargraph/language_server/message/base.rb +89 -0
  55. data/lib/solargraph/language_server/message/cancel_request.rb +13 -0
  56. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -0
  57. data/lib/solargraph/language_server/message/client.rb +11 -0
  58. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -0
  59. data/lib/solargraph/language_server/message/completion_item.rb +11 -0
  60. data/lib/solargraph/language_server/message/exit_notification.rb +13 -0
  61. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -0
  62. data/lib/solargraph/language_server/message/extended/document.rb +20 -0
  63. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -0
  64. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -0
  65. data/lib/solargraph/language_server/message/extended/environment.rb +25 -0
  66. data/lib/solargraph/language_server/message/extended/search.rb +20 -0
  67. data/lib/solargraph/language_server/message/extended.rb +21 -0
  68. data/lib/solargraph/language_server/message/initialize.rb +164 -0
  69. data/lib/solargraph/language_server/message/initialized.rb +27 -0
  70. data/lib/solargraph/language_server/message/method_not_found.rb +16 -0
  71. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -0
  72. data/lib/solargraph/language_server/message/shutdown.rb +13 -0
  73. data/lib/solargraph/language_server/message/text_document/base.rb +19 -0
  74. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -0
  75. data/lib/solargraph/language_server/message/text_document/completion.rb +59 -0
  76. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -0
  77. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -0
  78. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -0
  79. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -0
  80. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -0
  81. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -0
  82. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -0
  83. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -0
  84. data/lib/solargraph/language_server/message/text_document/formatting.rb +126 -0
  85. data/lib/solargraph/language_server/message/text_document/hover.rb +56 -0
  86. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -0
  87. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -0
  88. data/lib/solargraph/language_server/message/text_document/references.rb +16 -0
  89. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -0
  90. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -0
  91. data/lib/solargraph/language_server/message/text_document.rb +28 -0
  92. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +30 -0
  93. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -0
  94. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -0
  95. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -0
  96. data/lib/solargraph/language_server/message/workspace.rb +14 -0
  97. data/lib/solargraph/language_server/message.rb +93 -0
  98. data/lib/solargraph/language_server/message_types.rb +14 -0
  99. data/lib/solargraph/language_server/request.rb +24 -0
  100. data/lib/solargraph/language_server/symbol_kinds.rb +36 -0
  101. data/lib/solargraph/language_server/transport/adapter.rb +53 -0
  102. data/lib/solargraph/language_server/transport/data_reader.rb +72 -0
  103. data/lib/solargraph/language_server/transport.rb +13 -0
  104. data/lib/solargraph/language_server/uri_helpers.rb +49 -0
  105. data/lib/solargraph/language_server.rb +19 -0
  106. data/lib/solargraph/library.rb +547 -0
  107. data/lib/solargraph/location.rb +37 -0
  108. data/lib/solargraph/logging.rb +27 -0
  109. data/lib/solargraph/page.rb +83 -0
  110. data/lib/solargraph/parser/comment_ripper.rb +52 -0
  111. data/lib/solargraph/parser/legacy/class_methods.rb +135 -0
  112. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -0
  113. data/lib/solargraph/parser/legacy/node_chainer.rb +148 -0
  114. data/lib/solargraph/parser/legacy/node_methods.rb +325 -0
  115. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -0
  116. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -0
  117. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -0
  118. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +42 -0
  119. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +35 -0
  120. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -0
  121. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -0
  122. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -0
  123. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -0
  124. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -0
  125. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -0
  126. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -0
  127. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -0
  128. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -0
  129. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +42 -0
  130. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -0
  131. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -0
  132. data/lib/solargraph/parser/legacy/node_processors.rb +54 -0
  133. data/lib/solargraph/parser/legacy.rb +12 -0
  134. data/lib/solargraph/parser/node_methods.rb +43 -0
  135. data/lib/solargraph/parser/node_processor/base.rb +77 -0
  136. data/lib/solargraph/parser/node_processor.rb +43 -0
  137. data/lib/solargraph/parser/region.rb +66 -0
  138. data/lib/solargraph/parser/rubyvm/class_methods.rb +149 -0
  139. data/lib/solargraph/parser/rubyvm/node_chainer.rb +160 -0
  140. data/lib/solargraph/parser/rubyvm/node_methods.rb +315 -0
  141. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -0
  142. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +85 -0
  143. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -0
  144. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +42 -0
  145. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +33 -0
  146. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -0
  147. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +75 -0
  148. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +68 -0
  149. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -0
  150. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -0
  151. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -0
  152. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -0
  153. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -0
  154. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -0
  155. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -0
  156. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -0
  157. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -0
  158. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +32 -0
  159. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -0
  160. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +279 -0
  161. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -0
  162. data/lib/solargraph/parser/rubyvm/node_processors.rb +63 -0
  163. data/lib/solargraph/parser/rubyvm/node_wrapper.rb +47 -0
  164. data/lib/solargraph/parser/rubyvm.rb +40 -0
  165. data/lib/solargraph/parser/snippet.rb +13 -0
  166. data/lib/solargraph/parser.rb +26 -0
  167. data/lib/solargraph/pin/base.rb +299 -0
  168. data/lib/solargraph/pin/base_variable.rb +84 -0
  169. data/lib/solargraph/pin/block.rb +73 -0
  170. data/lib/solargraph/pin/class_variable.rb +8 -0
  171. data/lib/solargraph/pin/closure.rb +37 -0
  172. data/lib/solargraph/pin/common.rb +70 -0
  173. data/lib/solargraph/pin/constant.rb +43 -0
  174. data/lib/solargraph/pin/conversions.rb +92 -0
  175. data/lib/solargraph/pin/documenting.rb +105 -0
  176. data/lib/solargraph/pin/duck_method.rb +16 -0
  177. data/lib/solargraph/pin/global_variable.rb +8 -0
  178. data/lib/solargraph/pin/instance_variable.rb +30 -0
  179. data/lib/solargraph/pin/keyword.rb +15 -0
  180. data/lib/solargraph/pin/keyword_param.rb +8 -0
  181. data/lib/solargraph/pin/local_variable.rb +55 -0
  182. data/lib/solargraph/pin/method.rb +335 -0
  183. data/lib/solargraph/pin/method_alias.rb +31 -0
  184. data/lib/solargraph/pin/namespace.rb +94 -0
  185. data/lib/solargraph/pin/parameter.rb +206 -0
  186. data/lib/solargraph/pin/proxy_type.rb +29 -0
  187. data/lib/solargraph/pin/reference/extend.rb +10 -0
  188. data/lib/solargraph/pin/reference/include.rb +10 -0
  189. data/lib/solargraph/pin/reference/override.rb +29 -0
  190. data/lib/solargraph/pin/reference/prepend.rb +10 -0
  191. data/lib/solargraph/pin/reference/require.rb +14 -0
  192. data/lib/solargraph/pin/reference/superclass.rb +10 -0
  193. data/lib/solargraph/pin/reference.rb +14 -0
  194. data/lib/solargraph/pin/search.rb +56 -0
  195. data/lib/solargraph/pin/signature.rb +23 -0
  196. data/lib/solargraph/pin/singleton.rb +11 -0
  197. data/lib/solargraph/pin/symbol.rb +47 -0
  198. data/lib/solargraph/pin.rb +38 -0
  199. data/lib/solargraph/position.rb +100 -0
  200. data/lib/solargraph/range.rb +95 -0
  201. data/lib/solargraph/rbs_map/conversions.rb +394 -0
  202. data/lib/solargraph/rbs_map/core_fills.rb +61 -0
  203. data/lib/solargraph/rbs_map/core_map.rb +38 -0
  204. data/lib/solargraph/rbs_map/core_signs.rb +33 -0
  205. data/lib/solargraph/rbs_map/stdlib_map.rb +36 -0
  206. data/lib/solargraph/rbs_map.rb +73 -0
  207. data/lib/solargraph/server_methods.rb +16 -0
  208. data/lib/solargraph/shell.rb +234 -0
  209. data/lib/solargraph/source/chain/block_variable.rb +13 -0
  210. data/lib/solargraph/source/chain/call.rb +215 -0
  211. data/lib/solargraph/source/chain/class_variable.rb +13 -0
  212. data/lib/solargraph/source/chain/constant.rb +75 -0
  213. data/lib/solargraph/source/chain/global_variable.rb +13 -0
  214. data/lib/solargraph/source/chain/hash.rb +28 -0
  215. data/lib/solargraph/source/chain/head.rb +19 -0
  216. data/lib/solargraph/source/chain/instance_variable.rb +13 -0
  217. data/lib/solargraph/source/chain/link.rb +71 -0
  218. data/lib/solargraph/source/chain/literal.rb +23 -0
  219. data/lib/solargraph/source/chain/or.rb +23 -0
  220. data/lib/solargraph/source/chain/q_call.rb +11 -0
  221. data/lib/solargraph/source/chain/variable.rb +13 -0
  222. data/lib/solargraph/source/chain/z_super.rb +30 -0
  223. data/lib/solargraph/source/chain.rb +179 -0
  224. data/lib/solargraph/source/change.rb +79 -0
  225. data/lib/solargraph/source/cursor.rb +164 -0
  226. data/lib/solargraph/source/encoding_fixes.rb +23 -0
  227. data/lib/solargraph/source/source_chainer.rb +191 -0
  228. data/lib/solargraph/source/updater.rb +54 -0
  229. data/lib/solargraph/source.rb +522 -0
  230. data/lib/solargraph/source_map/clip.rb +229 -0
  231. data/lib/solargraph/source_map/completion.rb +23 -0
  232. data/lib/solargraph/source_map/mapper.rb +241 -0
  233. data/lib/solargraph/source_map.rb +180 -0
  234. data/lib/solargraph/type_checker/checks.rb +112 -0
  235. data/lib/solargraph/type_checker/param_def.rb +35 -0
  236. data/lib/solargraph/type_checker/problem.rb +32 -0
  237. data/lib/solargraph/type_checker/rules.rb +57 -0
  238. data/lib/solargraph/type_checker.rb +549 -0
  239. data/lib/solargraph/version.rb +5 -0
  240. data/lib/solargraph/views/_method.erb +62 -0
  241. data/lib/solargraph/views/_name_type_tag.erb +10 -0
  242. data/lib/solargraph/views/_namespace.erb +24 -0
  243. data/lib/solargraph/views/document.erb +23 -0
  244. data/lib/solargraph/views/environment.erb +58 -0
  245. data/lib/solargraph/views/layout.erb +44 -0
  246. data/lib/solargraph/views/search.erb +11 -0
  247. data/lib/solargraph/workspace/config.rb +231 -0
  248. data/lib/solargraph/workspace.rb +212 -0
  249. data/lib/solargraph/yard_map/cache.rb +19 -0
  250. data/lib/solargraph/yard_map/helpers.rb +16 -0
  251. data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -0
  252. data/lib/solargraph/yard_map/mapper/to_method.rb +81 -0
  253. data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -0
  254. data/lib/solargraph/yard_map/mapper.rb +77 -0
  255. data/lib/solargraph/yard_map/to_method.rb +79 -0
  256. data/lib/solargraph/yard_map.rb +301 -0
  257. data/lib/solargraph.rb +69 -0
  258. data/lib/yard-solargraph.rb +33 -0
  259. metadata +587 -0
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ # A pair of positions that compose a section of text.
5
+ #
6
+ class Range
7
+ # @return [Position]
8
+ attr_reader :start
9
+
10
+ # @return [Position]
11
+ attr_reader :ending
12
+
13
+ # @param start [Position]
14
+ # @param ending [Position]
15
+ def initialize start, ending
16
+ @start = start
17
+ @ending = ending
18
+ end
19
+
20
+ # Get a hash of the range. This representation is suitable for use in
21
+ # the language server protocol.
22
+ #
23
+ # @return [Hash<Symbol, Position>]
24
+ def to_hash
25
+ {
26
+ start: start.to_hash,
27
+ end: ending.to_hash
28
+ }
29
+ end
30
+
31
+ # True if the specified position is inside the range.
32
+ #
33
+ # @param position [Position, Array(Integer, Integer)]
34
+ # @return [Boolean]
35
+ def contain? position
36
+ position = Position.normalize(position)
37
+ return false if position.line < start.line || position.line > ending.line
38
+ return false if position.line == start.line && position.character < start.character
39
+ return false if position.line == ending.line && position.character > ending.character
40
+ true
41
+ end
42
+
43
+ # True if the range contains the specified position and the position does not precede it.
44
+ #
45
+ # @param position [Position, Array(Integer, Integer)]
46
+ # @return [Boolean]
47
+ def include? position
48
+ position = Position.normalize(position)
49
+ contain?(position) && !(position.line == start.line && position.character == start.character)
50
+ end
51
+
52
+ # Create a range from a pair of lines and characters.
53
+ #
54
+ # @param l1 [Integer] Starting line
55
+ # @param c1 [Integer] Starting character
56
+ # @param l2 [Integer] Ending line
57
+ # @param c2 [Integer] Ending character
58
+ # @return [Range]
59
+ def self.from_to l1, c1, l2, c2
60
+ Range.new(Position.new(l1, c1), Position.new(l2, c2))
61
+ end
62
+
63
+ # Get a range from a node.
64
+ #
65
+ # @param node [RubyVM::AbstractSyntaxTree::Node, Parser::AST::Node]
66
+ # @return [Range]
67
+ def self.from_node node
68
+ if defined?(RubyVM::AbstractSyntaxTree::Node)
69
+ if node.is_a?(RubyVM::AbstractSyntaxTree::Node)
70
+ Solargraph::Range.from_to(node.first_lineno - 1, node.first_column, node.last_lineno - 1, node.last_column)
71
+ end
72
+ elsif node&.loc && node.loc.expression
73
+ from_expr(node.loc.expression)
74
+ end
75
+ end
76
+
77
+ # Get a range from a Parser range, usually found in
78
+ # Parser::AST::Node#location#expression.
79
+ #
80
+ # @param expr [Parser::Source::Range]
81
+ # @return [Range]
82
+ def self.from_expr expr
83
+ from_to(expr.line, expr.column, expr.last_line, expr.last_column)
84
+ end
85
+
86
+ def == other
87
+ return false unless other.is_a?(Range)
88
+ start == other.start && ending == other.ending
89
+ end
90
+
91
+ def inspect
92
+ "#<#{self.class} #{start.inspect} to #{ending.inspect}>"
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,394 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class RbsMap
5
+ # Functions for converting RBS declarations to Solargraph pins
6
+ #
7
+ module Conversions
8
+ # A container for tracking the current context of the RBS conversion
9
+ # process, e.g., what visibility is declared for methods in the current
10
+ # scope
11
+ #
12
+ class Context
13
+ attr_reader :visibility
14
+
15
+ # @param visibility [Symbol]
16
+ def initialize visibility = :public
17
+ @visibility = visibility
18
+ end
19
+ end
20
+
21
+ # @return [Array<Pin::Base>]
22
+ def pins
23
+ @pins ||= []
24
+ end
25
+
26
+ private
27
+
28
+ def type_aliases
29
+ @type_aliases ||= {}
30
+ end
31
+
32
+ # @param decl [RBS::AST::Declarations::Base]
33
+ # @param closure [Pin::Closure]
34
+ # @return [void]
35
+ def convert_decl_to_pin decl, closure
36
+ cursor = pins.length
37
+ case decl
38
+ when RBS::AST::Declarations::Class
39
+ class_decl_to_pin decl
40
+ when RBS::AST::Declarations::Interface
41
+ # STDERR.puts "Skipping interface #{decl.name.relative!}"
42
+ interface_decl_to_pin decl
43
+ when RBS::AST::Declarations::Alias
44
+ type_aliases[decl.name.to_s] = decl
45
+ when RBS::AST::Declarations::Module
46
+ module_decl_to_pin decl
47
+ when RBS::AST::Declarations::Constant
48
+ constant_decl_to_pin decl
49
+ end
50
+ pins[cursor..-1].each do |pin|
51
+ pin.source = :rbs
52
+ next unless pin.is_a?(Pin::Namespace) && pin.type == :class
53
+ next if pins.any? { |p| p.path == "#{pin.path}.new"}
54
+ pins.push Solargraph::Pin::Method.new(
55
+ location: nil,
56
+ closure: pin.closure,
57
+ name: 'new',
58
+ comments: pin.comments,
59
+ scope: :class
60
+ )
61
+ end
62
+ end
63
+
64
+ def convert_members_to_pin decl, closure
65
+ context = Context.new
66
+ decl.members.each { |m| context = convert_member_to_pin(m, closure, context) }
67
+ end
68
+
69
+ def convert_member_to_pin member, closure, context
70
+ case member
71
+ when RBS::AST::Members::MethodDefinition
72
+ method_def_to_pin(member, closure)
73
+ when RBS::AST::Members::AttrReader
74
+ attr_reader_to_pin(member, closure)
75
+ when RBS::AST::Members::AttrWriter
76
+ attr_writer_to_pin(member, closure)
77
+ when RBS::AST::Members::AttrAccessor
78
+ attr_accessor_to_pin(member, closure)
79
+ when RBS::AST::Members::Include
80
+ include_to_pin(member, closure)
81
+ when RBS::AST::Members::Prepend
82
+ prepend_to_pin(member, closure)
83
+ when RBS::AST::Members::Extend
84
+ extend_to_pin(member, closure)
85
+ when RBS::AST::Members::Alias
86
+ alias_to_pin(member, closure)
87
+ when RBS::AST::Members::InstanceVariable
88
+ ivar_to_pin(member, closure)
89
+ when RBS::AST::Members::Public
90
+ return Context.new(visibility: :public)
91
+ when RBS::AST::Members::Private
92
+ return Context.new(visibility: :private)
93
+ when RBS::AST::Declarations::Base
94
+ convert_decl_to_pin(member, closure)
95
+ else
96
+ Solargraph.logger.warn "Skipping member #{member.class}"
97
+ end
98
+ context
99
+ end
100
+
101
+ # @param decl [RBS::AST::Declarations::Class]
102
+ # @return [void]
103
+ def class_decl_to_pin decl
104
+ class_pin = Solargraph::Pin::Namespace.new(
105
+ type: :class,
106
+ name: decl.name.relative!.to_s,
107
+ closure: Solargraph::Pin::ROOT_PIN,
108
+ comments: decl.comment&.string,
109
+ parameters: decl.type_params.map(&:name).map(&:to_s)
110
+ )
111
+ pins.push class_pin
112
+ if decl.super_class
113
+ pins.push Solargraph::Pin::Reference::Superclass.new(
114
+ closure: class_pin,
115
+ name: decl.super_class.name.relative!.to_s
116
+ )
117
+ end
118
+ convert_members_to_pin decl, class_pin
119
+ end
120
+
121
+ # @param decl [RBS::AST::Declarations::Interface]
122
+ # @return [void]
123
+ def interface_decl_to_pin decl
124
+ class_pin = Solargraph::Pin::Namespace.new(
125
+ type: :module,
126
+ name: decl.name.relative!.to_s,
127
+ closure: Solargraph::Pin::ROOT_PIN,
128
+ comments: decl.comment&.string,
129
+ # HACK: Using :hidden to keep interfaces from appearing in
130
+ # autocompletion
131
+ visibility: :hidden
132
+ )
133
+ class_pin.docstring.add_tag(YARD::Tags::Tag.new(:abstract, '(RBS interface)'))
134
+ pins.push class_pin
135
+ convert_members_to_pin decl, class_pin
136
+ end
137
+
138
+ # @param decl [RBS::AST::Declarations::Module]
139
+ # @return [void]
140
+ def module_decl_to_pin decl
141
+ module_pin = Solargraph::Pin::Namespace.new(
142
+ type: :module,
143
+ name: decl.name.relative!.to_s,
144
+ closure: Solargraph::Pin::ROOT_PIN,
145
+ comments: decl.comment&.string
146
+ )
147
+ pins.push module_pin
148
+ convert_members_to_pin decl, module_pin
149
+ end
150
+
151
+ # @param decl [RBS::AST::Declarations::Constant]
152
+ # @return [void]
153
+ def constant_decl_to_pin decl
154
+ parts = decl.name.relative!.to_s.split('::')
155
+ if parts.length > 1
156
+ name = parts.last
157
+ closure = pins.select { |pin| pin && pin.path == parts[0..-2].join('::') }.first
158
+ else
159
+ name = parts.first
160
+ closure = Solargraph::Pin::ROOT_PIN
161
+ end
162
+ pin = Solargraph::Pin::Constant.new(
163
+ name: name,
164
+ closure: closure,
165
+ comments: decl.comment&.string
166
+ )
167
+ tag = other_type_to_tag(decl.type)
168
+ # @todo Class or Module?
169
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', "Class<#{tag}>"))
170
+ pins.push pin
171
+ end
172
+
173
+ # @param decl [RBS::AST::Members::MethodDefinition]
174
+ # @param closure [Pin::Closure]
175
+ # @return [void]
176
+ def method_def_to_pin decl, closure
177
+ if decl.instance?
178
+ pin = Solargraph::Pin::Method.new(
179
+ name: decl.name.to_s,
180
+ closure: closure,
181
+ comments: decl.comment&.string,
182
+ scope: :instance,
183
+ signatures: []
184
+ )
185
+ pin.signatures.concat method_def_to_sigs(decl, pin)
186
+ pins.push pin
187
+ if pin.name == 'initialize'
188
+ pins.push Solargraph::Pin::Method.new(
189
+ location: pin.location,
190
+ closure: pin.closure,
191
+ name: 'new',
192
+ comments: pin.comments,
193
+ scope: :class,
194
+ signatures: pin.signatures
195
+ )
196
+ pins.last.signatures.replace(
197
+ pin.signatures.map do |p|
198
+ Pin::Signature.new(
199
+ p.parameters,
200
+ ComplexType::SELF
201
+ )
202
+ end
203
+ )
204
+ # @todo Is this necessary?
205
+ # pin.instance_variable_set(:@visibility, :private)
206
+ # pin.instance_variable_set(:@return_type, ComplexType::VOID)
207
+ end
208
+ end
209
+ if decl.singleton?
210
+ pin = Solargraph::Pin::Method.new(
211
+ name: decl.name.to_s,
212
+ closure: closure,
213
+ comments: decl.comment&.string,
214
+ scope: :class,
215
+ signatures: []
216
+ )
217
+ pin.signatures.concat method_def_to_sigs(decl, pin)
218
+ pins.push pin
219
+ end
220
+ end
221
+
222
+ # @param decl [RBS::AST::Members::MethodDefinition]
223
+ # @param pin [Pin::Method]
224
+ def method_def_to_sigs decl, pin
225
+ decl.types.map do |type|
226
+ parameters, return_type = parts_of_function(type, pin)
227
+ block = if type.block
228
+ Pin::Signature.new(*parts_of_function(type.block, pin))
229
+ end
230
+ return_type = ComplexType.try_parse(method_type_to_tag(type))
231
+ Pin::Signature.new(parameters, return_type, block)
232
+ end
233
+ end
234
+
235
+ def parts_of_function type, pin
236
+ parameters = []
237
+ arg_num = -1
238
+ type.type.required_positionals.each do |param|
239
+ name = param.name ? param.name.to_s : "arg#{arg_num += 1}"
240
+ parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin, return_type: ComplexType.try_parse(other_type_to_tag(param.type)))
241
+ end
242
+ type.type.optional_positionals.each do |param|
243
+ name = param.name ? param.name.to_s : "arg#{arg_num += 1}"
244
+ parameters.push Solargraph::Pin::Parameter.new(decl: :optarg, name: name, closure: pin)
245
+ end
246
+ if type.type.rest_positionals
247
+ name = type.type.rest_positionals.name ? type.type.rest_positionals.name.to_s : "arg#{arg_num += 1}"
248
+ parameters.push Solargraph::Pin::Parameter.new(decl: :restarg, name: name, closure: pin)
249
+ end
250
+ type.type.trailing_positionals.each do |param|
251
+ name = param.name ? param.name.to_s : "arg#{arg_num += 1}"
252
+ parameters.push Solargraph::Pin::Parameter.new(decl: :arg, name: name, closure: pin)
253
+ end
254
+ type.type.required_keywords.each do |orig, _param|
255
+ name = orig ? orig.to_s : "arg#{arg_num += 1}"
256
+ parameters.push Solargraph::Pin::Parameter.new(decl: :kwarg, name: name, closure: pin)
257
+ end
258
+ type.type.optional_keywords.each do |orig, _param|
259
+ name = orig ? orig.to_s : "arg#{arg_num += 1}"
260
+ parameters.push Solargraph::Pin::Parameter.new(decl: :kwoptarg, name: name, closure: pin)
261
+ end
262
+ if type.type.rest_keywords
263
+ name = type.type.rest_keywords.name ? type.type.rest_keywords.name.to_s : "arg#{arg_num += 1}"
264
+ parameters.push Solargraph::Pin::Parameter.new(decl: :kwrestarg, name: type.type.rest_keywords.name.to_s, closure: pin)
265
+ end
266
+ return_type = ComplexType.try_parse(method_type_to_tag(type))
267
+ [parameters, return_type]
268
+ end
269
+
270
+ def attr_reader_to_pin(decl, closure)
271
+ pin = Solargraph::Pin::Method.new(
272
+ name: decl.name.to_s,
273
+ closure: closure,
274
+ comments: decl.comment&.string,
275
+ scope: :instance,
276
+ attribute: true
277
+ )
278
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', other_type_to_tag(decl.type)))
279
+ pins.push pin
280
+ end
281
+
282
+ def attr_writer_to_pin(decl, closure)
283
+ pin = Solargraph::Pin::Method.new(
284
+ name: "#{decl.name.to_s}=",
285
+ closure: closure,
286
+ comments: decl.comment&.string,
287
+ scope: :instance,
288
+ attribute: true
289
+ )
290
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', other_type_to_tag(decl.type)))
291
+ pins.push pin
292
+ end
293
+
294
+ def attr_accessor_to_pin(decl, closure)
295
+ attr_reader_to_pin(decl, closure)
296
+ attr_writer_to_pin(decl, closure)
297
+ end
298
+
299
+ def ivar_to_pin(decl, closure)
300
+ pin = Solargraph::Pin::InstanceVariable.new(
301
+ name: decl.name.to_s,
302
+ closure: closure,
303
+ comments: decl.comment&.string
304
+ )
305
+ pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', other_type_to_tag(decl.type)))
306
+ pins.push pin
307
+ end
308
+
309
+ def include_to_pin decl, closure
310
+ pins.push Solargraph::Pin::Reference::Include.new(
311
+ name: decl.name.relative!.to_s,
312
+ closure: closure
313
+ )
314
+ end
315
+
316
+ def prepend_to_pin decl, closure
317
+ pins.push Solargraph::Pin::Reference::Prepend.new(
318
+ name: decl.name.relative!.to_s,
319
+ closure: closure
320
+ )
321
+ end
322
+
323
+ def extend_to_pin decl, closure
324
+ pins.push Solargraph::Pin::Reference::Extend.new(
325
+ name: decl.name.relative!.to_s,
326
+ closure: closure
327
+ )
328
+ end
329
+
330
+ def alias_to_pin decl, closure
331
+ pins.push Solargraph::Pin::MethodAlias.new(
332
+ name: decl.new_name.to_s,
333
+ original: decl.old_name.to_s,
334
+ closure: closure
335
+ )
336
+ end
337
+
338
+ RBS_TO_YARD_TYPE = {
339
+ 'bool' => 'Boolean',
340
+ 'string' => 'String',
341
+ 'int' => 'Integer',
342
+ 'untyped' => '',
343
+ 'NilClass' => 'nil'
344
+ }
345
+
346
+ def method_type_to_tag type
347
+ if type_aliases.key?(type.type.return_type.to_s)
348
+ other_type_to_tag(type_aliases[type.type.return_type.to_s].type)
349
+ else
350
+ other_type_to_tag type.type.return_type
351
+ end
352
+ end
353
+
354
+ # @return [String]
355
+ def other_type_to_tag type
356
+ if type.is_a?(RBS::Types::Optional)
357
+ "#{other_type_to_tag(type.type)}, nil"
358
+ elsif type.is_a?(RBS::Types::Bases::Any)
359
+ # @todo Not sure what to do with Any yet
360
+ 'BasicObject'
361
+ elsif type.is_a?(RBS::Types::Bases::Bool)
362
+ 'Boolean'
363
+ elsif type.is_a?(RBS::Types::Tuple)
364
+ "Array(#{type.types.map { |t| other_type_to_tag(t) }.join(', ')})"
365
+ elsif type.is_a?(RBS::Types::Literal)
366
+ "#{type.literal}"
367
+ elsif type.is_a?(RBS::Types::Union)
368
+ type.types.map { |t| other_type_to_tag(t) }.join(', ')
369
+ elsif type.is_a?(RBS::Types::Record)
370
+ # @todo Better record support
371
+ 'Hash'
372
+ elsif type.is_a?(RBS::Types::Bases::Nil)
373
+ 'nil'
374
+ elsif type.is_a?(RBS::Types::Bases::Self)
375
+ 'self'
376
+ elsif type.is_a?(RBS::Types::Bases::Void)
377
+ 'void'
378
+ elsif type.is_a?(RBS::Types::Variable)
379
+ "param<#{type.name}>"
380
+ elsif type.is_a?(RBS::Types::ClassInstance) #&& !type.args.empty?
381
+ base = RBS_TO_YARD_TYPE[type.name.relative!.to_s] || type.name.relative!.to_s
382
+ params = type.args.map { |a| other_type_to_tag(a) }.reject { |t| t == 'undefined' }
383
+ return base if params.empty?
384
+ "#{base}<#{params.join(', ')}>"
385
+ elsif type.respond_to?(:name) && type.name.respond_to?(:relative!)
386
+ RBS_TO_YARD_TYPE[type.name.relative!.to_s] || type.name.relative!.to_s
387
+ else
388
+ Solargraph.logger.warn "Unrecognized RBS type: #{type.class} #{type}"
389
+ 'undefined'
390
+ end
391
+ end
392
+ end
393
+ end
394
+ end
@@ -0,0 +1,61 @@
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
+ YIELDPARAMS = [
19
+ Override.from_comment('Object#tap', %(
20
+ @return [self]
21
+ @yieldparam [self]
22
+ )),
23
+ Override.from_comment('String#each_line', %(
24
+ @yieldparam [String]
25
+ )),
26
+ ]
27
+
28
+ methods_with_yieldparam_subtypes = %w[
29
+ Array#each Array#map Array#map! Array#any? Array#all? Array#index
30
+ Array#keep_if Array#delete_if
31
+ Enumerable#each_entry Enumerable#map Enumerable#any? Enumerable#all?
32
+ Enumerable#select Enumerable#reject
33
+ Set#each
34
+ ]
35
+
36
+ YIELDPARAM_SINGLE_PARAMETERS = methods_with_yieldparam_subtypes.map do |path|
37
+ Override.from_comment(path, %(
38
+ @yieldparam_single_parameter
39
+ ))
40
+ end
41
+
42
+ CLASS_RETURN_TYPES = [
43
+ Override.method_return('Class#new', 'self'),
44
+ Override.method_return('Class.new', 'Class<BasicObject>'),
45
+ Override.method_return('Class#allocate', 'self'),
46
+ Override.method_return('Class.allocate', 'Class<BasicObject>'),
47
+ ]
48
+
49
+ # HACK: Add Errno exception classes
50
+ errno = Solargraph::Pin::Namespace.new(name: 'Errno')
51
+ errnos = []
52
+ Errno.constants.each do |const|
53
+ errnos.push Solargraph::Pin::Namespace.new(type: :class, name: const.to_s, closure: errno)
54
+ errnos.push Solargraph::Pin::Reference::Superclass.new(closure: errnos.last, name: 'SystemCallError')
55
+ end
56
+ ERRNOS = errnos
57
+
58
+ ALL = KEYWORDS + YIELDPARAMS + YIELDPARAM_SINGLE_PARAMETERS + CLASS_RETURN_TYPES + ERRNOS
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class RbsMap
5
+ # Ruby core pins
6
+ #
7
+ class CoreMap
8
+ include Conversions
9
+
10
+ def initialize
11
+ cache = Cache.load('core.ser')
12
+ if cache
13
+ pins.replace cache
14
+ else
15
+ loader = RBS::EnvironmentLoader.new(repository: RBS::Repository.new(no_stdlib: true))
16
+ environment = RBS::Environment.from_loader(loader).resolve_type_names
17
+ environment.declarations.each { |decl| convert_decl_to_pin(decl, Solargraph::Pin::ROOT_PIN) }
18
+ pins.concat RbsMap::CoreFills::ALL
19
+ processed = ApiMap::Store.new(pins).pins.reject { |p| p.is_a?(Solargraph::Pin::Reference::Override) }
20
+ pins.replace processed
21
+
22
+ Cache.save('core.ser', pins)
23
+ end
24
+ end
25
+
26
+ def method_def_to_sigs decl, pin
27
+ stubs = CoreSigns.sign(pin.path)
28
+ return super unless stubs
29
+ stubs.map do |stub|
30
+ Pin::Signature.new(
31
+ [],
32
+ ComplexType.try_parse(stub.return_type)
33
+ )
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,33 @@
1
+ module Solargraph
2
+ class RbsMap
3
+ module CoreSigns
4
+ Override = Pin::Reference::Override
5
+
6
+ class Stub
7
+ attr_reader :parameters
8
+
9
+ attr_reader :return_type
10
+
11
+ def initialize parameters, return_type
12
+ @parameters = parameters
13
+ @return_type = return_type
14
+ end
15
+ end
16
+
17
+ SIGNATURE_MAP = {
18
+ 'Object#class' => [
19
+ Stub.new(
20
+ [],
21
+ 'Class<self>'
22
+ )
23
+ ]
24
+ }
25
+
26
+ # @param path [String]
27
+ # @return [Array<Stub>]
28
+ def self.sign path
29
+ SIGNATURE_MAP[path]
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rbs'
4
+ require 'set'
5
+
6
+ module Solargraph
7
+ class RbsMap
8
+ # Ruby stdlib pins
9
+ #
10
+ class StdlibMap < RbsMap
11
+ # @type [Hash{String => RbsMap}]
12
+ @stdlib_maps_hash = {}
13
+
14
+ # @param library [String]
15
+ def initialize library
16
+ cache = Cache.load('stdlib', "#{library}.ser")
17
+ if cache
18
+ pins.replace cache
19
+ else
20
+ super
21
+ Cache.save('stdlib', "#{library}.ser", pins)
22
+ end
23
+ end
24
+
25
+ # @param library [String]
26
+ # @return [StdlibMap]
27
+ def self.load library
28
+ @stdlib_maps_hash[library] ||= StdlibMap.new(library)
29
+ end
30
+
31
+ def repository
32
+ @repository ||= RBS::Repository.new
33
+ end
34
+ end
35
+ end
36
+ end