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
@@ -1,226 +1,269 @@
1
- # frozen_string_literal: true
2
-
3
- require 'thor'
4
-
5
- module Solargraph
6
- class Shell < Thor
7
- include Solargraph::ServerMethods
8
-
9
- map %w[--version -v] => :version
10
-
11
- desc "--version, -v", "Print the version"
12
- def version
13
- puts Solargraph::VERSION
14
- end
15
-
16
- desc 'socket', 'Run a Solargraph socket server'
17
- option :host, type: :string, aliases: :h, desc: 'The server host', default: '127.0.0.1'
18
- option :port, type: :numeric, aliases: :p, desc: 'The server port', default: 7658
19
- def socket
20
- require 'backport'
21
- port = options[:port]
22
- port = available_port if port.zero?
23
- Backport.run do
24
- Signal.trap("INT") do
25
- Backport.stop
26
- end
27
- Signal.trap("TERM") do
28
- Backport.stop
29
- end
30
- Backport.prepare_tcp_server host: options[:host], port: port, adapter: Solargraph::LanguageServer::Transport::Adapter
31
- STDERR.puts "Solargraph is listening PORT=#{port} PID=#{Process.pid}"
32
- end
33
- end
34
-
35
- desc 'stdio', 'Run a Solargraph stdio server'
36
- def stdio
37
- require 'backport'
38
- Backport.run do
39
- Signal.trap("INT") do
40
- Backport.stop
41
- end
42
- Signal.trap("TERM") do
43
- Backport.stop
44
- end
45
- Backport.prepare_stdio_server adapter: Solargraph::LanguageServer::Transport::Adapter
46
- STDERR.puts "Solargraph is listening on stdio PID=#{Process.pid}"
47
- end
48
- end
49
-
50
- desc 'config [DIRECTORY]', 'Create or overwrite a default configuration file'
51
- option :extensions, type: :boolean, aliases: :e, desc: 'Add installed extensions', default: true
52
- def config(directory = '.')
53
- matches = []
54
- if options[:extensions]
55
- Gem::Specification.each do |g|
56
- if g.name.match(/^solargraph\-[A-Za-z0-9_\-]*?\-ext/)
57
- require g.name
58
- matches.push g.name
59
- end
60
- end
61
- end
62
- conf = Solargraph::Workspace::Config.new.raw_data
63
- unless matches.empty?
64
- matches.each do |m|
65
- conf['extensions'].push m
66
- end
67
- end
68
- File.open(File.join(directory, '.solargraph.yml'), 'w') do |file|
69
- file.puts conf.to_yaml
70
- end
71
- STDOUT.puts "Configuration file initialized."
72
- end
73
-
74
- desc 'download-core [VERSION]', 'Download core documentation'
75
- def download_core version = nil
76
- ver = version || Solargraph::YardMap::CoreDocs.best_download
77
- if RUBY_VERSION != ver
78
- puts "Documentation for #{RUBY_VERSION} is not available. Reverting to closest match..."
79
- end
80
- puts "Downloading docs for #{ver}..."
81
- Solargraph::YardMap::CoreDocs.download ver
82
- # Clear cached documentation if it exists
83
- FileUtils.rm_rf Dir.glob(File.join(Solargraph::YardMap::CoreDocs.cache_dir, ver, '*.ser'))
84
- puts "Download complete."
85
- rescue ArgumentError => e
86
- STDERR.puts "ERROR: #{e.message}"
87
- STDERR.puts "Run `solargraph available-cores` for a list."
88
- exit 1
89
- end
90
-
91
- desc 'list-cores', 'List the local documentation versions'
92
- def list_cores
93
- puts Solargraph::YardMap::CoreDocs.versions.join("\n")
94
- end
95
-
96
- desc 'available-cores', 'List available documentation versions'
97
- def available_cores
98
- puts Solargraph::YardMap::CoreDocs.available.join("\n")
99
- end
100
-
101
- desc 'clear', 'Delete all cached documentation'
102
- long_desc %(
103
- This command will delete all core and gem documentation from the cache.
104
- You can also delete specific gem caches with the `uncache` command or
105
- update documentation for specific Ruby versions with the `download-core`
106
- command.
107
- )
108
- def clear
109
- puts "Deleting the cached documentation"
110
- Solargraph::YardMap::CoreDocs.clear
111
- end
112
- map 'clear-cache' => :clear
113
- map 'clear-cores' => :clear
114
-
115
- desc 'uncache GEM [...GEM]', "Delete cached gem documentation"
116
- def uncache *gems
117
- raise ArgumentError, 'No gems specified.' if gems.empty?
118
- gems.each do |gem|
119
- Dir[File.join(Solargraph::YardMap::CoreDocs.cache_dir, 'gems', "#{gem}-*")].each do |dir|
120
- puts "Deleting cache: #{dir}"
121
- FileUtils.remove_entry_secure dir
122
- end
123
- end
124
- end
125
-
126
- desc 'reporters', 'Get a list of diagnostics reporters'
127
- def reporters
128
- puts Solargraph::Diagnostics.reporters
129
- end
130
-
131
- desc 'typecheck [FILE(s)]', 'Run the type checker'
132
- long_desc %(
133
- Perform type checking on one or more files in a workspace. Check the
134
- entire workspace if no files are specified.
135
-
136
- Type checking levels are normal, typed, strict, and strong.
137
- )
138
- option :level, type: :string, aliases: [:mode, :m, :l], desc: 'Type checking level', default: 'normal'
139
- option :directory, type: :string, aliases: :d, desc: 'The workspace directory', default: '.'
140
- def typecheck *files
141
- directory = File.realpath(options[:directory])
142
- api_map = Solargraph::ApiMap.load(directory)
143
- if files.empty?
144
- files = api_map.source_maps.map(&:filename)
145
- else
146
- files.map! { |file| File.realpath(file) }
147
- end
148
- probcount = 0
149
- filecount = 0
150
- files.each do |file|
151
- checker = TypeChecker.new(file, api_map: api_map, level: options[:level].to_sym)
152
- problems = checker.problems
153
- next if problems.empty?
154
- problems.sort! { |a, b| a.location.range.start.line <=> b.location.range.start.line }
155
- puts problems.map { |prob| "#{prob.location.filename}:#{prob.location.range.start.line + 1} - #{prob.message}" }.join("\n")
156
- filecount += 1
157
- probcount += problems.length
158
- end
159
- puts "#{probcount} problem#{probcount != 1 ? 's' : ''} found#{files.length != 1 ? " in #{filecount} of #{files.length} files" : ''}."
160
- exit 1 if probcount > 0
161
- end
162
-
163
- desc 'scan', 'Test the workspace for problems'
164
- long_desc %(
165
- A scan loads the entire workspace to make sure that the ASTs and
166
- maps do not raise errors during analysis. It does not perform any type
167
- checking or validation; it only confirms that the analysis itself is
168
- error-free.
169
- )
170
- option :directory, type: :string, aliases: :d, desc: 'The workspace directory', default: '.'
171
- option :verbose, type: :boolean, aliases: :v, desc: 'Verbose output', default: false
172
- def scan
173
- require 'benchmark'
174
- directory = File.realpath(options[:directory])
175
- api_map = nil
176
- time = Benchmark.measure {
177
- api_map = Solargraph::ApiMap.load(directory)
178
- api_map.pins.each do |pin|
179
- begin
180
- puts pin_description(pin) if options[:verbose]
181
- pin.typify api_map
182
- pin.probe api_map
183
- rescue StandardError => e
184
- STDERR.puts "Error testing #{pin_description(pin)} #{pin.location ? "at #{pin.location.filename}:#{pin.location.range.start.line + 1}" : ''}"
185
- STDERR.puts "[#{e.class}]: #{e.message}"
186
- STDERR.puts e.backtrace.join("\n")
187
- exit 1
188
- end
189
- end
190
- }
191
- puts "Scanned #{directory} (#{api_map.pins.length} pins) in #{time.real} seconds."
192
- end
193
-
194
- desc 'bundle', 'Generate documentation for bundled gems'
195
- option :directory, type: :string, aliases: :d, desc: 'The workspace directory', default: '.'
196
- option :rebuild, type: :boolean, aliases: :r, desc: 'Rebuild existing documentation', default: false
197
- def bundle
198
- Documentor.new(options[:directory], rebuild: options[:rebuild], out: STDOUT).document
199
- end
200
-
201
- desc 'rdoc GEM [VERSION]', 'Use RDoc to cache documentation'
202
- def rdoc gem, version = '>= 0'
203
- spec = Gem::Specification.find_by_name(gem, version)
204
- puts "Caching #{spec.name} #{spec.version} from RDoc"
205
- Solargraph::YardMap::RdocToYard.run(spec)
206
- end
207
-
208
- private
209
-
210
- # @param pin [Solargraph::Pin::Base]
211
- # @return [String]
212
- def pin_description pin
213
- desc = if pin.path.nil? || pin.path.empty?
214
- if pin.closure
215
- "#{pin.closure.path} | #{pin.name}"
216
- else
217
- "#{pin.context.namespace} | #{pin.name}"
218
- end
219
- else
220
- pin.path
221
- end
222
- desc += " (#{pin.location.filename} #{pin.location.range.start.line})" if pin.location
223
- desc
224
- end
225
- end
226
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'benchmark'
4
+ require 'thor'
5
+ require 'yard'
6
+
7
+ module Solargraph
8
+ class Shell < Thor
9
+ include Solargraph::ServerMethods
10
+
11
+ # Tell Thor to ensure the process exits with status 1 if any error happens.
12
+ def self.exit_on_failure?
13
+ true
14
+ end
15
+
16
+ map %w[--version -v] => :version
17
+
18
+ desc "--version, -v", "Print the version"
19
+ # @return [void]
20
+ def version
21
+ puts Solargraph::VERSION
22
+ end
23
+
24
+ desc 'socket', 'Run a Solargraph socket server'
25
+ option :host, type: :string, aliases: :h, desc: 'The server host', default: '127.0.0.1'
26
+ option :port, type: :numeric, aliases: :p, desc: 'The server port', default: 7658
27
+ # @return [void]
28
+ def socket
29
+ require 'backport'
30
+ port = options[:port]
31
+ port = available_port if port.zero?
32
+ Backport.run do
33
+ Signal.trap("INT") do
34
+ Backport.stop
35
+ end
36
+ Signal.trap("TERM") do
37
+ Backport.stop
38
+ end
39
+ Backport.prepare_tcp_server host: options[:host], port: port, adapter: Solargraph::LanguageServer::Transport::Adapter
40
+ STDERR.puts "Solargraph is listening PORT=#{port} PID=#{Process.pid}"
41
+ end
42
+ end
43
+
44
+ desc 'stdio', 'Run a Solargraph stdio server'
45
+ # @return [void]
46
+ def stdio
47
+ require 'backport'
48
+ Backport.run do
49
+ Signal.trap("INT") do
50
+ Backport.stop
51
+ end
52
+ Signal.trap("TERM") do
53
+ Backport.stop
54
+ end
55
+ Backport.prepare_stdio_server adapter: Solargraph::LanguageServer::Transport::Adapter
56
+ STDERR.puts "Solargraph is listening on stdio PID=#{Process.pid}"
57
+ end
58
+ end
59
+
60
+ desc 'config [DIRECTORY]', 'Create or overwrite a default configuration file'
61
+ option :extensions, type: :boolean, aliases: :e, desc: 'Add installed extensions', default: true
62
+ # @param directory [String]
63
+ # @return [void]
64
+ def config(directory = '.')
65
+ matches = []
66
+ if options[:extensions]
67
+ Gem::Specification.each do |g|
68
+ if g.name.match(/^solargraph\-[A-Za-z0-9_\-]*?\-ext/)
69
+ require g.name
70
+ matches.push g.name
71
+ end
72
+ end
73
+ end
74
+ conf = Solargraph::Workspace::Config.new.raw_data
75
+ unless matches.empty?
76
+ matches.each do |m|
77
+ conf['extensions'].push m
78
+ end
79
+ end
80
+ File.open(File.join(directory, '.solargraph.yml'), 'w') do |file|
81
+ file.puts conf.to_yaml
82
+ end
83
+ STDOUT.puts "Configuration file initialized."
84
+ end
85
+
86
+ desc 'clear', 'Delete all cached documentation'
87
+ long_desc %(
88
+ This command will delete all core and gem documentation from the cache.
89
+ )
90
+ # @return [void]
91
+ def clear
92
+ puts "Deleting all cached documentation (gems, core and stdlib)"
93
+ Solargraph::Cache.clear
94
+ end
95
+ map 'clear-cache' => :clear
96
+ map 'clear-cores' => :clear
97
+
98
+ desc 'cache', 'Cache a gem', hide: true
99
+ # @return [void]
100
+ # @param gem [String]
101
+ # @param version [String, nil]
102
+ def cache gem, version = nil
103
+ spec = Gem::Specification.find_by_name(gem, version)
104
+ pins = GemPins.build(spec)
105
+ Cache.save('gems', "#{spec.name}-#{spec.version}.ser", pins)
106
+ end
107
+
108
+ desc 'uncache GEM [...GEM]', "Delete specific cached gem documentation"
109
+ long_desc %(
110
+ Specify one or more gem names to clear. 'core' or 'stdlib' may
111
+ also be specified to clear cached system documentation.
112
+ Documentation will be regenerated as needed.
113
+ )
114
+ # @param gems [Array<String>]
115
+ # @return [void]
116
+ def uncache *gems
117
+ raise ArgumentError, 'No gems specified.' if gems.empty?
118
+ gems.each do |gem|
119
+ if gem == 'core'
120
+ Cache.uncache("core.ser")
121
+ next
122
+ end
123
+
124
+ if gem == 'stdlib'
125
+ Cache.uncache("stdlib")
126
+ next
127
+ end
128
+
129
+ spec = Gem::Specification.find_by_name(gem)
130
+ Cache.uncache('gems', "#{spec.name}-#{spec.version}.ser")
131
+ Cache.uncache('gems', "#{spec.name}-#{spec.version}.yardoc")
132
+ end
133
+ end
134
+
135
+ desc 'gems [GEM[=VERSION]]', 'Cache documentation for installed gems'
136
+ option :rebuild, type: :boolean, desc: 'Rebuild existing documentation', default: false
137
+ # @param names [Array<String>]
138
+ # @return [void]
139
+ def gems *names
140
+ if names.empty?
141
+ Gem::Specification.to_a.each { |spec| do_cache spec }
142
+ else
143
+ names.each do |name|
144
+ spec = Gem::Specification.find_by_name(*name.split('='))
145
+ do_cache spec
146
+ rescue Gem::MissingSpecError
147
+ warn "Gem '#{name}' not found"
148
+ end
149
+ end
150
+ end
151
+
152
+ desc 'reporters', 'Get a list of diagnostics reporters'
153
+ # @return [void]
154
+ def reporters
155
+ puts Solargraph::Diagnostics.reporters
156
+ end
157
+
158
+ desc 'typecheck [FILE(s)]', 'Run the type checker'
159
+ long_desc %(
160
+ Perform type checking on one or more files in a workspace. Check the
161
+ entire workspace if no files are specified.
162
+
163
+ Type checking levels are normal, typed, strict, and strong.
164
+ )
165
+ option :level, type: :string, aliases: [:mode, :m, :l], desc: 'Type checking level', default: 'normal'
166
+ option :directory, type: :string, aliases: :d, desc: 'The workspace directory', default: '.'
167
+ # @return [void]
168
+ def typecheck *files
169
+ directory = File.realpath(options[:directory])
170
+ api_map = Solargraph::ApiMap.load_with_cache(directory, $stdout)
171
+ probcount = 0
172
+ if files.empty?
173
+ files = api_map.source_maps.map(&:filename)
174
+ else
175
+ files.map! { |file| File.realpath(file) }
176
+ end
177
+ filecount = 0
178
+
179
+ time = Benchmark.measure {
180
+ files.each do |file|
181
+ checker = TypeChecker.new(file, api_map: api_map, level: options[:level].to_sym)
182
+ problems = checker.problems
183
+ next if problems.empty?
184
+ problems.sort! { |a, b| a.location.range.start.line <=> b.location.range.start.line }
185
+ puts problems.map { |prob| "#{prob.location.filename}:#{prob.location.range.start.line + 1} - #{prob.message}" }.join("\n")
186
+ filecount += 1
187
+ probcount += problems.length
188
+ end
189
+ # "
190
+ }
191
+ puts "Typecheck finished in #{time.real} seconds."
192
+ puts "#{probcount} problem#{probcount != 1 ? 's' : ''} found#{files.length != 1 ? " in #{filecount} of #{files.length} files" : ''}."
193
+ # "
194
+ exit 1 if probcount > 0
195
+ end
196
+
197
+ desc 'scan', 'Test the workspace for problems'
198
+ long_desc %(
199
+ A scan loads the entire workspace to make sure that the ASTs and
200
+ maps do not raise errors during analysis. It does not perform any type
201
+ checking or validation; it only confirms that the analysis itself is
202
+ error-free.
203
+ )
204
+ option :directory, type: :string, aliases: :d, desc: 'The workspace directory', default: '.'
205
+ option :verbose, type: :boolean, aliases: :v, desc: 'Verbose output', default: false
206
+ # @return [void]
207
+ def scan
208
+ directory = File.realpath(options[:directory])
209
+ api_map = nil
210
+ time = Benchmark.measure {
211
+ api_map = Solargraph::ApiMap.load_with_cache(directory, $stdout)
212
+ api_map.pins.each do |pin|
213
+ begin
214
+ puts pin_description(pin) if options[:verbose]
215
+ pin.typify api_map
216
+ pin.probe api_map
217
+ rescue StandardError => e
218
+ STDERR.puts "Error testing #{pin_description(pin)} #{pin.location ? "at #{pin.location.filename}:#{pin.location.range.start.line + 1}" : ''}"
219
+ STDERR.puts "[#{e.class}]: #{e.message}"
220
+ STDERR.puts e.backtrace.join("\n")
221
+ exit 1
222
+ end
223
+ end
224
+ }
225
+ puts "Scanned #{directory} (#{api_map.pins.length} pins) in #{time.real} seconds."
226
+ end
227
+
228
+ desc 'list', 'List the files in the workspace and the total count'
229
+ option :count, type: :boolean, aliases: :c, desc: 'Display the file count only', default: false
230
+ option :directory, type: :string, aliases: :d, desc: 'The directory to read', default: '.'
231
+ # @return [void]
232
+ def list
233
+ workspace = Solargraph::Workspace.new(options[:directory])
234
+ puts workspace.filenames unless options[:count]
235
+ puts "#{workspace.filenames.length} files total."
236
+ end
237
+
238
+ private
239
+
240
+ # @param pin [Solargraph::Pin::Base]
241
+ # @return [String]
242
+ def pin_description pin
243
+ desc = if pin.path.nil? || pin.path.empty?
244
+ if pin.closure
245
+ "#{pin.closure.path} | #{pin.name}"
246
+ else
247
+ "#{pin.context.namespace} | #{pin.name}"
248
+ end
249
+ else
250
+ pin.path
251
+ end
252
+ desc += " (#{pin.location.filename} #{pin.location.range.start.line})" if pin.location
253
+ desc
254
+ end
255
+
256
+ # @param gemspec [Gem::Specification]
257
+ # @return [void]
258
+ def do_cache gemspec
259
+ cached = Yardoc.cached?(gemspec)
260
+ if cached && !options.rebuild
261
+ puts "Cache already exists for #{gemspec.name} #{gemspec.version}"
262
+ else
263
+ puts "#{cached ? 'Rebuilding' : 'Caching'} gem documentation for #{gemspec.name} #{gemspec.version}"
264
+ pins = GemPins.build(gemspec)
265
+ Cache.save('gems', "#{gemspec.name}-#{gemspec.version}.ser", pins)
266
+ end
267
+ end
268
+ end
269
+ end
@@ -0,0 +1,33 @@
1
+ module Solargraph
2
+ class Source
3
+ class Chain
4
+ class Array < Literal
5
+ # @param children [::Array<Chain>]
6
+ def initialize children
7
+ super('::Array')
8
+ @children = children
9
+ end
10
+
11
+ def word
12
+ @word ||= "<#{@type}>"
13
+ end
14
+
15
+ # @param api_map [ApiMap]
16
+ # @param name_pin [Pin::Base]
17
+ # @param locals [::Array<Pin::Parameter, Pin::LocalVariable>]
18
+ def resolve api_map, name_pin, locals
19
+ child_types = @children.map do |child|
20
+ child.infer(api_map, name_pin, locals)
21
+ end
22
+
23
+ type = if child_types.uniq.length == 1 && child_types.first.defined?
24
+ ComplexType::UniqueType.new('Array', [], child_types.uniq, rooted: true, parameters_type: :list)
25
+ else
26
+ ComplexType::UniqueType.new('Array', rooted: true)
27
+ end
28
+ [Pin::ProxyType.anonymous(type)]
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class BlockSymbol < Link
7
+ def resolve api_map, name_pin, locals
8
+ [Pin::ProxyType.anonymous(ComplexType.try_parse('::Proc'))]
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,13 +1,13 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class BlockVariable < Link
7
- def resolve api_map, name_pin, locals
8
- [Pin::ProxyType.anonymous(ComplexType.try_parse('Proc'))]
9
- end
10
- end
11
- end
12
- end
13
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class BlockVariable < Link
7
+ def resolve api_map, name_pin, locals
8
+ [Pin::ProxyType.anonymous(ComplexType.try_parse('::Proc'))]
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end