solargraph 0.44.2 → 0.46.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 (246) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yml +41 -0
  3. data/.gitignore +9 -9
  4. data/.rspec +2 -2
  5. data/.travis.yml +19 -19
  6. data/CHANGELOG.md +1115 -1088
  7. data/Gemfile +0 -0
  8. data/LICENSE +0 -0
  9. data/README.md +128 -120
  10. data/Rakefile +0 -0
  11. data/SPONSORS.md +18 -15
  12. data/bin/solargraph +0 -0
  13. data/lib/solargraph/api_map/bundler_methods.rb +22 -22
  14. data/lib/solargraph/api_map/cache.rb +70 -70
  15. data/lib/solargraph/api_map/source_to_yard.rb +81 -81
  16. data/lib/solargraph/api_map/store.rb +256 -256
  17. data/lib/solargraph/api_map.rb +686 -681
  18. data/lib/solargraph/bench.rb +27 -27
  19. data/lib/solargraph/compat.rb +37 -37
  20. data/lib/solargraph/complex_type/type_methods.rb +130 -130
  21. data/lib/solargraph/complex_type/unique_type.rb +75 -75
  22. data/lib/solargraph/complex_type.rb +221 -221
  23. data/lib/solargraph/convention/base.rb +33 -33
  24. data/lib/solargraph/convention/gemfile.rb +15 -15
  25. data/lib/solargraph/convention/gemspec.rb +22 -22
  26. data/lib/solargraph/convention/rspec.rb +30 -21
  27. data/lib/solargraph/convention.rb +47 -47
  28. data/lib/solargraph/converters/dd.rb +12 -12
  29. data/lib/solargraph/converters/dl.rb +12 -12
  30. data/lib/solargraph/converters/dt.rb +12 -12
  31. data/lib/solargraph/converters/misc.rb +1 -1
  32. data/lib/solargraph/diagnostics/base.rb +29 -29
  33. data/lib/solargraph/diagnostics/require_not_found.rb +53 -37
  34. data/lib/solargraph/diagnostics/rubocop.rb +98 -98
  35. data/lib/solargraph/diagnostics/rubocop_helpers.rb +63 -63
  36. data/lib/solargraph/diagnostics/severities.rb +15 -15
  37. data/lib/solargraph/diagnostics/type_check.rb +54 -54
  38. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  39. data/lib/solargraph/diagnostics.rb +55 -55
  40. data/lib/solargraph/documentor.rb +76 -76
  41. data/lib/solargraph/environ.rb +45 -45
  42. data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
  43. data/lib/solargraph/language_server/error_codes.rb +20 -20
  44. data/lib/solargraph/language_server/host/cataloger.rb +56 -56
  45. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  46. data/lib/solargraph/language_server/host/dispatch.rb +111 -111
  47. data/lib/solargraph/language_server/host/message_worker.rb +59 -59
  48. data/lib/solargraph/language_server/host/sources.rb +156 -156
  49. data/lib/solargraph/language_server/host.rb +865 -865
  50. data/lib/solargraph/language_server/message/base.rb +89 -89
  51. data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
  52. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  53. data/lib/solargraph/language_server/message/client.rb +11 -11
  54. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -58
  55. data/lib/solargraph/language_server/message/completion_item.rb +11 -11
  56. data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
  57. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -100
  58. data/lib/solargraph/language_server/message/extended/document.rb +20 -20
  59. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  60. data/lib/solargraph/language_server/message/extended/download_core.rb +23 -23
  61. data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
  62. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  63. data/lib/solargraph/language_server/message/extended.rb +21 -21
  64. data/lib/solargraph/language_server/message/initialize.rb +162 -162
  65. data/lib/solargraph/language_server/message/initialized.rb +27 -27
  66. data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
  67. data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
  68. data/lib/solargraph/language_server/message/shutdown.rb +13 -13
  69. data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
  70. data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
  71. data/lib/solargraph/language_server/message/text_document/completion.rb +59 -59
  72. data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
  73. data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
  74. data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
  75. data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
  76. data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
  77. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  78. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -23
  79. data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
  80. data/lib/solargraph/language_server/message/text_document/formatting.rb +126 -126
  81. data/lib/solargraph/language_server/message/text_document/hover.rb +54 -44
  82. data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
  83. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  84. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  85. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  86. data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -29
  87. data/lib/solargraph/language_server/message/text_document.rb +28 -28
  88. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +30 -30
  89. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -33
  90. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
  91. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  92. data/lib/solargraph/language_server/message/workspace.rb +14 -14
  93. data/lib/solargraph/language_server/message.rb +93 -93
  94. data/lib/solargraph/language_server/message_types.rb +14 -14
  95. data/lib/solargraph/language_server/request.rb +24 -24
  96. data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
  97. data/lib/solargraph/language_server/transport/adapter.rb +53 -53
  98. data/lib/solargraph/language_server/transport/data_reader.rb +72 -72
  99. data/lib/solargraph/language_server/transport.rb +13 -13
  100. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  101. data/lib/solargraph/language_server.rb +19 -19
  102. data/lib/solargraph/library.rb +546 -546
  103. data/lib/solargraph/location.rb +37 -37
  104. data/lib/solargraph/logging.rb +27 -27
  105. data/lib/solargraph/page.rb +83 -83
  106. data/lib/solargraph/parser/comment_ripper.rb +52 -52
  107. data/lib/solargraph/parser/legacy/class_methods.rb +135 -140
  108. data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -16
  109. data/lib/solargraph/parser/legacy/node_chainer.rb +148 -148
  110. data/lib/solargraph/parser/legacy/node_methods.rb +325 -325
  111. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -23
  112. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -35
  113. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -15
  114. data/lib/solargraph/parser/legacy/node_processors/block_node.rb +42 -42
  115. data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -25
  116. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -23
  117. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -63
  118. data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -36
  119. data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -23
  120. data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -38
  121. data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -28
  122. data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -39
  123. data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -16
  124. data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -36
  125. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -21
  126. data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -257
  127. data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -18
  128. data/lib/solargraph/parser/legacy/node_processors.rb +54 -54
  129. data/lib/solargraph/parser/legacy.rb +12 -12
  130. data/lib/solargraph/parser/node_methods.rb +43 -43
  131. data/lib/solargraph/parser/node_processor/base.rb +77 -77
  132. data/lib/solargraph/parser/node_processor.rb +43 -43
  133. data/lib/solargraph/parser/region.rb +66 -66
  134. data/lib/solargraph/parser/rubyvm/class_methods.rb +144 -155
  135. data/lib/solargraph/parser/rubyvm/node_chainer.rb +160 -160
  136. data/lib/solargraph/parser/rubyvm/node_methods.rb +315 -315
  137. data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -23
  138. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +85 -85
  139. data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -15
  140. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +42 -42
  141. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -22
  142. data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -23
  143. data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +63 -64
  144. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -57
  145. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -23
  146. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -38
  147. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -39
  148. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -20
  149. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -27
  150. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -39
  151. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -26
  152. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -15
  153. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -45
  154. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -21
  155. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -15
  156. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -277
  157. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -18
  158. data/lib/solargraph/parser/rubyvm/node_processors.rb +63 -62
  159. data/lib/solargraph/parser/rubyvm.rb +40 -40
  160. data/lib/solargraph/parser/snippet.rb +13 -13
  161. data/lib/solargraph/parser.rb +26 -26
  162. data/lib/solargraph/pin/base.rb +296 -296
  163. data/lib/solargraph/pin/base_variable.rb +84 -84
  164. data/lib/solargraph/pin/block.rb +72 -72
  165. data/lib/solargraph/pin/class_variable.rb +8 -8
  166. data/lib/solargraph/pin/closure.rb +37 -37
  167. data/lib/solargraph/pin/common.rb +70 -70
  168. data/lib/solargraph/pin/constant.rb +43 -43
  169. data/lib/solargraph/pin/conversions.rb +96 -96
  170. data/lib/solargraph/pin/documenting.rb +105 -105
  171. data/lib/solargraph/pin/duck_method.rb +16 -16
  172. data/lib/solargraph/pin/global_variable.rb +8 -8
  173. data/lib/solargraph/pin/instance_variable.rb +30 -30
  174. data/lib/solargraph/pin/keyword.rb +15 -15
  175. data/lib/solargraph/pin/keyword_param.rb +8 -8
  176. data/lib/solargraph/pin/local_variable.rb +55 -55
  177. data/lib/solargraph/pin/method.rb +245 -245
  178. data/lib/solargraph/pin/method_alias.rb +31 -31
  179. data/lib/solargraph/pin/namespace.rb +91 -91
  180. data/lib/solargraph/pin/parameter.rb +201 -206
  181. data/lib/solargraph/pin/proxy_type.rb +29 -29
  182. data/lib/solargraph/pin/reference/extend.rb +10 -10
  183. data/lib/solargraph/pin/reference/include.rb +10 -10
  184. data/lib/solargraph/pin/reference/override.rb +29 -29
  185. data/lib/solargraph/pin/reference/prepend.rb +10 -10
  186. data/lib/solargraph/pin/reference/require.rb +14 -14
  187. data/lib/solargraph/pin/reference/superclass.rb +10 -10
  188. data/lib/solargraph/pin/reference.rb +14 -14
  189. data/lib/solargraph/pin/search.rb +56 -0
  190. data/lib/solargraph/pin/singleton.rb +11 -11
  191. data/lib/solargraph/pin/symbol.rb +47 -47
  192. data/lib/solargraph/pin.rb +37 -36
  193. data/lib/solargraph/position.rb +100 -100
  194. data/lib/solargraph/range.rb +95 -95
  195. data/lib/solargraph/server_methods.rb +16 -16
  196. data/lib/solargraph/shell.rb +226 -226
  197. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  198. data/lib/solargraph/source/chain/call.rb +204 -204
  199. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  200. data/lib/solargraph/source/chain/constant.rb +75 -75
  201. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  202. data/lib/solargraph/source/chain/hash.rb +28 -28
  203. data/lib/solargraph/source/chain/head.rb +19 -19
  204. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  205. data/lib/solargraph/source/chain/link.rb +71 -71
  206. data/lib/solargraph/source/chain/literal.rb +23 -23
  207. data/lib/solargraph/source/chain/or.rb +23 -23
  208. data/lib/solargraph/source/chain/q_call.rb +11 -11
  209. data/lib/solargraph/source/chain/variable.rb +13 -13
  210. data/lib/solargraph/source/chain/z_super.rb +30 -30
  211. data/lib/solargraph/source/chain.rb +164 -164
  212. data/lib/solargraph/source/change.rb +79 -79
  213. data/lib/solargraph/source/cursor.rb +164 -164
  214. data/lib/solargraph/source/source_chainer.rb +191 -191
  215. data/lib/solargraph/source/updater.rb +54 -54
  216. data/lib/solargraph/source.rb +522 -522
  217. data/lib/solargraph/source_map/clip.rb +224 -224
  218. data/lib/solargraph/source_map/completion.rb +23 -23
  219. data/lib/solargraph/source_map/mapper.rb +212 -212
  220. data/lib/solargraph/source_map.rb +180 -189
  221. data/lib/solargraph/type_checker/checks.rb +99 -99
  222. data/lib/solargraph/type_checker/param_def.rb +35 -35
  223. data/lib/solargraph/type_checker/problem.rb +32 -32
  224. data/lib/solargraph/type_checker/rules.rb +57 -57
  225. data/lib/solargraph/type_checker.rb +543 -510
  226. data/lib/solargraph/version.rb +5 -5
  227. data/lib/solargraph/views/environment.erb +58 -58
  228. data/lib/solargraph/workspace/config.rb +231 -231
  229. data/lib/solargraph/workspace.rb +215 -214
  230. data/lib/solargraph/yard_map/cache.rb +19 -19
  231. data/lib/solargraph/yard_map/core_docs.rb +170 -170
  232. data/lib/solargraph/yard_map/core_fills.rb +208 -203
  233. data/lib/solargraph/yard_map/core_gen.rb +76 -76
  234. data/lib/solargraph/yard_map/helpers.rb +16 -16
  235. data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -25
  236. data/lib/solargraph/yard_map/mapper/to_method.rb +78 -78
  237. data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -27
  238. data/lib/solargraph/yard_map/mapper.rb +77 -77
  239. data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -140
  240. data/lib/solargraph/yard_map/stdlib_fills.rb +43 -43
  241. data/lib/solargraph/yard_map/to_method.rb +79 -79
  242. data/lib/solargraph/yard_map.rb +460 -443
  243. data/lib/solargraph.rb +69 -69
  244. data/lib/yard-solargraph.rb +33 -33
  245. data/solargraph.gemspec +0 -0
  246. metadata +14 -12
@@ -1,226 +1,226 @@
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 '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,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