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,26 +1,26 @@
1
- # frozen_string_literal: true
2
-
3
- require 'open3'
4
-
5
- module Solargraph
6
- module LanguageServer
7
- module Message
8
- module TextDocument
9
- class FoldingRange < Base
10
- def process
11
- result = host.folding_ranges(params['textDocument']['uri']).map do |range|
12
- {
13
- startLine: range.start.line,
14
- startCharacter: 0,
15
- endLine: range.ending.line - 1,
16
- endCharacter: 0,
17
- kind: 'region'
18
- }
19
- end
20
- set_result result
21
- end
22
- end
23
- end
24
- end
25
- end
26
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'open3'
4
+
5
+ module Solargraph
6
+ module LanguageServer
7
+ module Message
8
+ module TextDocument
9
+ class FoldingRange < Base
10
+ def process
11
+ result = host.folding_ranges(params['textDocument']['uri']).map do |range|
12
+ {
13
+ startLine: range.start.line,
14
+ startCharacter: 0,
15
+ endLine: range.ending.line - 1,
16
+ endCharacter: 0,
17
+ kind: 'region'
18
+ }
19
+ end
20
+ set_result result
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,126 +1,131 @@
1
- # frozen_string_literal: true
2
-
3
- require 'securerandom'
4
- require 'tmpdir'
5
-
6
- module Solargraph
7
- module LanguageServer
8
- module Message
9
- module TextDocument
10
- class Formatting < Base
11
- include Solargraph::Diagnostics::RubocopHelpers
12
-
13
- def process
14
- file_uri = params['textDocument']['uri']
15
- config = config_for(file_uri)
16
- original = host.read_text(file_uri)
17
- args = cli_args(file_uri, config)
18
-
19
- require_rubocop(config['version'])
20
- options, paths = RuboCop::Options.new.parse(args)
21
- options[:stdin] = original
22
- corrections = redirect_stdout do
23
- RuboCop::Runner.new(options, RuboCop::ConfigStore.new).run(paths)
24
- end
25
- result = options[:stdin]
26
-
27
- log_corrections(corrections)
28
-
29
- format original, result
30
- rescue RuboCop::ValidationError, RuboCop::ConfigNotFoundError => e
31
- set_error(Solargraph::LanguageServer::ErrorCodes::INTERNAL_ERROR, "[#{e.class}] #{e.message}")
32
- end
33
-
34
- private
35
-
36
- def log_corrections(corrections)
37
- corrections = corrections&.strip
38
- return if corrections&.empty?
39
-
40
- Solargraph.logger.info('Formatting result:')
41
- corrections.each_line do |line|
42
- next if line.strip.empty?
43
- Solargraph.logger.info(line.strip)
44
- end
45
- end
46
-
47
- def config_for(file_uri)
48
- conf = host.formatter_config(file_uri)
49
- return {} unless conf.is_a?(Hash)
50
-
51
- conf['rubocop'] || {}
52
- end
53
-
54
- def cli_args file_uri, config
55
- file = UriHelpers.uri_to_file(file_uri)
56
- args = [
57
- config['cops'] == 'all' ? '--auto-correct-all' : '--auto-correct',
58
- '--cache', 'false',
59
- '--format', formatter_class(config).name,
60
- ]
61
-
62
- ['except', 'only'].each do |arg|
63
- cops = cop_list(config[arg])
64
- args += ["--#{arg}", cops] if cops
65
- end
66
-
67
- args += config['extra_args'] if config['extra_args']
68
- args + [file]
69
- end
70
-
71
- def formatter_class(config)
72
- if self.class.const_defined?('BlankRubocopFormatter')
73
- BlankRubocopFormatter
74
- else
75
- require_rubocop(config['version'])
76
- klass = Class.new(::RuboCop::Formatter::BaseFormatter)
77
- self.class.const_set 'BlankRubocopFormatter', klass
78
- end
79
- end
80
-
81
- def cop_list(value)
82
- value = value.join(',') if value.respond_to?(:join)
83
- return nil if value == '' || !value.is_a?(String)
84
- value
85
- end
86
-
87
- # @param original [String]
88
- # @param result [String]
89
- # @return [void]
90
- def format original, result
91
- ending = if original.end_with?("\n")
92
- {
93
- line: original.lines.length,
94
- character: 0
95
- }
96
- elsif original.lines.empty?
97
- {
98
- line: 0,
99
- character: 0
100
- }
101
- else
102
- {
103
- line: original.lines.length - 1,
104
- character: original.lines.last.length
105
- }
106
- end
107
- set_result(
108
- [
109
- {
110
- range: {
111
- start: {
112
- line: 0,
113
- character: 0
114
- },
115
- end: ending
116
- },
117
- newText: result
118
- }
119
- ]
120
- )
121
- end
122
- end
123
- end
124
- end
125
- end
126
- end
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+ require 'tmpdir'
5
+
6
+ module Solargraph
7
+ module LanguageServer
8
+ module Message
9
+ module TextDocument
10
+ class Formatting < Base
11
+ include Solargraph::Diagnostics::RubocopHelpers
12
+
13
+ def process
14
+ file_uri = params['textDocument']['uri']
15
+ config = config_for(file_uri)
16
+ original = host.read_text(file_uri)
17
+ args = cli_args(file_uri, config)
18
+
19
+ require_rubocop(config['version'])
20
+ options, paths = ::RuboCop::Options.new.parse(args)
21
+ options[:stdin] = original
22
+ corrections = redirect_stdout do
23
+ ::RuboCop::Runner.new(options, ::RuboCop::ConfigStore.new).run(paths)
24
+ end
25
+ result = options[:stdin]
26
+
27
+ log_corrections(corrections)
28
+
29
+ format original, result
30
+ rescue ::RuboCop::ValidationError, ::RuboCop::ConfigNotFoundError => e
31
+ set_error(Solargraph::LanguageServer::ErrorCodes::INTERNAL_ERROR, "[#{e.class}] #{e.message}")
32
+ end
33
+
34
+ private
35
+
36
+ # @param corrections [String]
37
+ def log_corrections(corrections)
38
+ corrections = corrections&.strip
39
+ return if corrections&.empty?
40
+
41
+ Solargraph.logger.info('Formatting result:')
42
+ corrections.each_line do |line|
43
+ next if line.strip.empty?
44
+ Solargraph.logger.info(line.strip)
45
+ end
46
+ end
47
+
48
+ def config_for(file_uri)
49
+ conf = host.formatter_config(file_uri)
50
+ return {} unless conf.is_a?(Hash)
51
+
52
+ conf['rubocop'] || {}
53
+ end
54
+
55
+ # @param config [Hash{String => String}]
56
+ def cli_args file_uri, config
57
+ file = UriHelpers.uri_to_file(file_uri)
58
+ args = [
59
+ config['cops'] == 'all' ? '-A' : '-a',
60
+ '--cache', 'false',
61
+ '--format', formatter_class(config).name,
62
+ ]
63
+
64
+ ['except', 'only'].each do |arg|
65
+ cops = cop_list(config[arg])
66
+ args += ["--#{arg}", cops] if cops
67
+ end
68
+
69
+ args += config['extra_args'] if config['extra_args']
70
+ args + [file]
71
+ end
72
+
73
+ # @param config [Hash{String => String}]
74
+ def formatter_class(config)
75
+ if self.class.const_defined?('BlankRubocopFormatter')
76
+ # @sg-ignore
77
+ BlankRubocopFormatter
78
+ else
79
+ require_rubocop(config['version'])
80
+ klass = Class.new(::RuboCop::Formatter::BaseFormatter)
81
+ self.class.const_set 'BlankRubocopFormatter', klass
82
+ end
83
+ end
84
+
85
+ # @param value [Array, String]
86
+ def cop_list(value)
87
+ value = value.join(',') if value.respond_to?(:join)
88
+ return nil if value == '' || !value.is_a?(String)
89
+ value
90
+ end
91
+
92
+ # @param original [String]
93
+ # @param result [String]
94
+ # @return [void]
95
+ def format original, result
96
+ ending = if original.end_with?("\n")
97
+ {
98
+ line: original.lines.length,
99
+ character: 0
100
+ }
101
+ elsif original.lines.empty?
102
+ {
103
+ line: 0,
104
+ character: 0
105
+ }
106
+ else
107
+ {
108
+ line: original.lines.length - 1,
109
+ character: original.lines.last.length
110
+ }
111
+ end
112
+ set_result(
113
+ [
114
+ {
115
+ range: {
116
+ start: {
117
+ line: 0,
118
+ character: 0
119
+ },
120
+ end: ending
121
+ },
122
+ newText: result
123
+ }
124
+ ]
125
+ )
126
+ end
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
@@ -1,54 +1,58 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module LanguageServer
5
- module Message
6
- module TextDocument
7
- class Hover < Base
8
- def process
9
- line = params['position']['line']
10
- col = params['position']['character']
11
- contents = []
12
- suggestions = host.definitions_at(params['textDocument']['uri'], line, col)
13
- last_link = nil
14
- suggestions.each do |pin|
15
- parts = []
16
- this_link = host.options['enablePages'] ? pin.link_documentation : pin.text_documentation
17
- if !this_link.nil? && this_link != last_link
18
- parts.push this_link
19
- end
20
- parts.push "`#{pin.detail}`" unless pin.is_a?(Pin::Namespace) || pin.detail.nil?
21
- parts.push pin.documentation unless pin.documentation.nil? || pin.documentation.empty?
22
- unless parts.empty?
23
- data = parts.join("\n\n")
24
- next if contents.last && contents.last.end_with?(data)
25
- contents.push data
26
- end
27
- last_link = this_link unless this_link.nil?
28
- end
29
- set_result(
30
- contents: {
31
- kind: 'markdown',
32
- value: value_or_nil(contents)
33
- }
34
- )
35
- rescue FileNotFoundError => e
36
- Logging.logger.warn "[#{e.class}] #{e.message}"
37
- Logging.logger.warn e.backtrace.join("\n")
38
- set_result nil
39
- end
40
-
41
- private
42
-
43
- def value_or_nil contents
44
- stripped = contents
45
- .map(&:strip)
46
- .reject { |c| c.empty? }
47
- return nil if stripped.empty?
48
- stripped.join("\n\n")
49
- end
50
- end
51
- end
52
- end
53
- end
54
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module LanguageServer
5
+ module Message
6
+ module TextDocument
7
+ class Hover < Base
8
+ def process
9
+ line = params['position']['line']
10
+ col = params['position']['character']
11
+ contents = []
12
+ suggestions = host.definitions_at(params['textDocument']['uri'], line, col)
13
+ last_link = nil
14
+ suggestions.each do |pin|
15
+ parts = []
16
+ this_link = host.options['enablePages'] ? pin.link_documentation : pin.text_documentation
17
+ if !this_link.nil? && this_link != last_link
18
+ parts.push this_link
19
+ end
20
+ parts.push "`#{pin.detail}`" unless pin.is_a?(Pin::Namespace) || pin.detail.nil?
21
+ parts.push pin.documentation unless pin.documentation.nil? || pin.documentation.empty?
22
+ unless parts.empty?
23
+ data = parts.join("\n\n")
24
+ next if contents.last&.end_with?(data)
25
+ contents.push data
26
+ end
27
+ last_link = this_link unless this_link.nil?
28
+ end
29
+ set_result(
30
+ contents_or_nil(contents)
31
+ )
32
+ rescue FileNotFoundError => e
33
+ Logging.logger.warn "[#{e.class}] #{e.message}"
34
+ Logging.logger.warn e.backtrace.join("\n")
35
+ set_result nil
36
+ end
37
+
38
+ private
39
+
40
+ # @param contents [Array<String>]
41
+ # @return [Hash{Symbol => Hash{Symbol => String}}, nil]
42
+ def contents_or_nil contents
43
+ stripped = contents
44
+ .map(&:strip)
45
+ .reject { |c| c.empty? }
46
+ return nil if stripped.empty?
47
+ {
48
+ contents: {
49
+ kind: 'markdown',
50
+ value: stripped.join("\n\n")
51
+ }
52
+ }
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -1,34 +1,34 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module LanguageServer
5
- module Message
6
- module TextDocument
7
- class OnTypeFormatting < Base
8
- def process
9
- # @todo Temporarily disabled due to conflicts with VSCode formatting on type
10
- # src = host.send(:library).checkout(uri_to_file(params['textDocument']['uri']))
11
- # fragment = src.fragment_at(params['position']['line'], params['position']['character'] - 1)
12
- # offset = fragment.send(:offset)
13
- # if fragment.string? and params['ch'] == '{' and src.code[offset - 1, 2] == '#{'
14
- # set_result(
15
- # [
16
- # {
17
- # range: {
18
- # start: params['position'],
19
- # end: params['position']
20
- # },
21
- # newText: '}'
22
- # }
23
- # ]
24
- # )
25
- # else
26
- # # @todo Is `nil` or `[]` more appropriate here?
27
- # set_result nil
28
- # end
29
- end
30
- end
31
- end
32
- end
33
- end
34
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module LanguageServer
5
+ module Message
6
+ module TextDocument
7
+ class OnTypeFormatting < Base
8
+ def process
9
+ # @todo Temporarily disabled due to conflicts with VSCode formatting on type
10
+ # src = host.send(:library).checkout(uri_to_file(params['textDocument']['uri']))
11
+ # fragment = src.fragment_at(params['position']['line'], params['position']['character'] - 1)
12
+ # offset = fragment.send(:offset)
13
+ # if fragment.string? and params['ch'] == '{' and src.code[offset - 1, 2] == '#{'
14
+ # set_result(
15
+ # [
16
+ # {
17
+ # range: {
18
+ # start: params['position'],
19
+ # end: params['position']
20
+ # },
21
+ # newText: '}'
22
+ # }
23
+ # ]
24
+ # )
25
+ # else
26
+ # # @todo Is `nil` or `[]` more appropriate here?
27
+ # set_result nil
28
+ # end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,11 +1,11 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph::LanguageServer::Message::TextDocument
4
- class PrepareRename < Base
5
- def process
6
- line = params['position']['line']
7
- col = params['position']['character']
8
- set_result host.sources.find(params['textDocument']['uri']).cursor_at(Solargraph::Position.new(line, col)).range.to_hash
9
- end
10
- end
11
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph::LanguageServer::Message::TextDocument
4
+ class PrepareRename < Base
5
+ def process
6
+ line = params['position']['line']
7
+ col = params['position']['character']
8
+ set_result host.sources.find(params['textDocument']['uri']).cursor_at(Solargraph::Position.new(line, col)).range.to_hash
9
+ end
10
+ end
11
+ end
@@ -1,16 +1,16 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph::LanguageServer::Message::TextDocument
4
- class References < Base
5
- def process
6
- locs = host.references_from(params['textDocument']['uri'], params['position']['line'], params['position']['character'])
7
- result = locs.map do |loc|
8
- {
9
- uri: file_to_uri(loc.filename),
10
- range: loc.range.to_hash
11
- }
12
- end
13
- set_result result
14
- end
15
- end
16
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph::LanguageServer::Message::TextDocument
4
+ class References < Base
5
+ def process
6
+ locs = host.references_from(params['textDocument']['uri'], params['position']['line'], params['position']['character'])
7
+ result = locs.map do |loc|
8
+ {
9
+ uri: file_to_uri(loc.filename),
10
+ range: loc.range.to_hash
11
+ }
12
+ end
13
+ set_result result
14
+ end
15
+ end
16
+ end
@@ -1,19 +1,19 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph::LanguageServer::Message::TextDocument
4
- class Rename < Base
5
- def process
6
- locs = host.references_from(params['textDocument']['uri'], params['position']['line'], params['position']['character'], strip: true)
7
- changes = {}
8
- locs.each do |loc|
9
- uri = file_to_uri(loc.filename)
10
- changes[uri] ||= []
11
- changes[uri].push({
12
- range: loc.range.to_hash,
13
- newText: params['newName']
14
- })
15
- end
16
- set_result changes: changes
17
- end
18
- end
19
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph::LanguageServer::Message::TextDocument
4
+ class Rename < Base
5
+ def process
6
+ locs = host.references_from(params['textDocument']['uri'], params['position']['line'], params['position']['character'], strip: true)
7
+ changes = {}
8
+ locs.each do |loc|
9
+ uri = file_to_uri(loc.filename)
10
+ changes[uri] ||= []
11
+ changes[uri].push({
12
+ range: loc.range.to_hash,
13
+ newText: params['newName']
14
+ })
15
+ end
16
+ set_result changes: changes
17
+ end
18
+ end
19
+ end
@@ -1,29 +1,24 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module LanguageServer
5
- module Message
6
- module TextDocument
7
- class SignatureHelp < TextDocument::Base
8
- def process
9
- line = params['position']['line']
10
- col = params['position']['character']
11
- suggestions = host.signatures_at(params['textDocument']['uri'], line, col)
12
- info = []
13
- suggestions.each do |pin|
14
- info.concat pin.overloads.map(&:signature_help)
15
- info.push pin.signature_help
16
- end
17
- set_result({
18
- signatures: info
19
- })
20
- rescue FileNotFoundError => e
21
- Logging.logger.warn "[#{e.class}] #{e.message}"
22
- Logging.logger.warn e.backtrace.join("\n")
23
- set_result nil
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module LanguageServer
5
+ module Message
6
+ module TextDocument
7
+ class SignatureHelp < TextDocument::Base
8
+ def process
9
+ line = params['position']['line']
10
+ col = params['position']['character']
11
+ suggestions = host.signatures_at(params['textDocument']['uri'], line, col)
12
+ set_result({
13
+ signatures: suggestions.flat_map { |pin| pin.signature_help }
14
+ })
15
+ rescue FileNotFoundError => e
16
+ Logging.logger.warn "[#{e.class}] #{e.message}"
17
+ Logging.logger.warn e.backtrace.join("\n")
18
+ set_result nil
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end