solargraph 0.54.4 → 0.58.3

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 (238) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.github/workflows/linting.yml +127 -0
  4. data/.github/workflows/plugins.yml +185 -6
  5. data/.github/workflows/rspec.yml +55 -5
  6. data/.github/workflows/typecheck.yml +8 -3
  7. data/.gitignore +8 -0
  8. data/.overcommit.yml +72 -0
  9. data/.rspec +1 -0
  10. data/.rubocop.yml +66 -0
  11. data/.rubocop_todo.yml +1279 -0
  12. data/.yardopts +1 -0
  13. data/CHANGELOG.md +143 -0
  14. data/README.md +20 -6
  15. data/Rakefile +125 -13
  16. data/bin/solargraph +3 -0
  17. data/lib/solargraph/api_map/cache.rb +110 -109
  18. data/lib/solargraph/api_map/constants.rb +279 -0
  19. data/lib/solargraph/api_map/index.rb +193 -167
  20. data/lib/solargraph/api_map/source_to_yard.rb +97 -88
  21. data/lib/solargraph/api_map/store.rb +384 -241
  22. data/lib/solargraph/api_map.rb +945 -875
  23. data/lib/solargraph/bench.rb +45 -28
  24. data/lib/solargraph/complex_type/type_methods.rb +228 -217
  25. data/lib/solargraph/complex_type/unique_type.rb +482 -386
  26. data/lib/solargraph/complex_type.rb +444 -394
  27. data/lib/solargraph/convention/active_support_concern.rb +111 -0
  28. data/lib/solargraph/convention/base.rb +20 -3
  29. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
  30. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
  31. data/lib/solargraph/convention/data_definition.rb +105 -0
  32. data/lib/solargraph/convention/gemfile.rb +15 -15
  33. data/lib/solargraph/convention/gemspec.rb +23 -22
  34. data/lib/solargraph/convention/rakefile.rb +17 -17
  35. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
  36. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
  37. data/lib/solargraph/convention/struct_definition.rb +164 -0
  38. data/lib/solargraph/convention.rb +78 -47
  39. data/lib/solargraph/converters/dd.rb +17 -17
  40. data/lib/solargraph/converters/dl.rb +15 -15
  41. data/lib/solargraph/converters/dt.rb +15 -15
  42. data/lib/solargraph/converters/misc.rb +1 -1
  43. data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
  44. data/lib/solargraph/diagnostics/rubocop.rb +118 -113
  45. data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
  46. data/lib/solargraph/diagnostics/type_check.rb +55 -55
  47. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  48. data/lib/solargraph/doc_map.rb +439 -188
  49. data/lib/solargraph/environ.rb +9 -2
  50. data/lib/solargraph/equality.rb +34 -33
  51. data/lib/solargraph/gem_pins.rb +98 -72
  52. data/lib/solargraph/language_server/error_codes.rb +20 -20
  53. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  54. data/lib/solargraph/language_server/host/dispatch.rb +130 -128
  55. data/lib/solargraph/language_server/host/message_worker.rb +112 -106
  56. data/lib/solargraph/language_server/host/sources.rb +99 -99
  57. data/lib/solargraph/language_server/host.rb +878 -861
  58. data/lib/solargraph/language_server/message/base.rb +97 -96
  59. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  60. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -60
  61. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -112
  62. data/lib/solargraph/language_server/message/extended/document.rb +23 -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 -19
  65. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  66. data/lib/solargraph/language_server/message/initialize.rb +191 -191
  67. data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
  68. data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
  69. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  70. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
  71. data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -131
  72. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  73. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  74. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  75. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  76. data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
  77. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -24
  78. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -35
  79. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -40
  80. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +26 -24
  81. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
  82. data/lib/solargraph/language_server/message.rb +94 -94
  83. data/lib/solargraph/language_server/progress.rb +8 -0
  84. data/lib/solargraph/language_server/request.rb +27 -24
  85. data/lib/solargraph/language_server/transport/data_reader.rb +74 -74
  86. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  87. data/lib/solargraph/library.rb +683 -662
  88. data/lib/solargraph/location.rb +82 -58
  89. data/lib/solargraph/logging.rb +37 -27
  90. data/lib/solargraph/page.rb +92 -89
  91. data/lib/solargraph/parser/comment_ripper.rb +69 -56
  92. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
  93. data/lib/solargraph/parser/node_processor/base.rb +92 -87
  94. data/lib/solargraph/parser/node_processor.rb +62 -45
  95. data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -157
  96. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -18
  97. data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -164
  98. data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -495
  99. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
  100. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
  101. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -57
  102. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
  103. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -43
  104. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
  105. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
  106. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -50
  107. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +37 -36
  108. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
  109. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
  110. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -38
  111. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -28
  112. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -53
  113. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
  114. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
  115. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -16
  116. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -36
  117. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -42
  118. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -259
  119. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -1
  120. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
  121. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
  122. data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -56
  123. data/lib/solargraph/parser/parser_gem.rb +12 -12
  124. data/lib/solargraph/parser/region.rb +69 -66
  125. data/lib/solargraph/parser/snippet.rb +17 -15
  126. data/lib/solargraph/parser.rb +23 -22
  127. data/lib/solargraph/pin/base.rb +729 -378
  128. data/lib/solargraph/pin/base_variable.rb +126 -118
  129. data/lib/solargraph/pin/block.rb +104 -101
  130. data/lib/solargraph/pin/breakable.rb +9 -0
  131. data/lib/solargraph/pin/callable.rb +231 -147
  132. data/lib/solargraph/pin/closure.rb +72 -57
  133. data/lib/solargraph/pin/common.rb +79 -70
  134. data/lib/solargraph/pin/constant.rb +45 -43
  135. data/lib/solargraph/pin/conversions.rb +123 -123
  136. data/lib/solargraph/pin/delegated_method.rb +120 -101
  137. data/lib/solargraph/pin/documenting.rb +114 -98
  138. data/lib/solargraph/pin/instance_variable.rb +34 -34
  139. data/lib/solargraph/pin/keyword.rb +20 -15
  140. data/lib/solargraph/pin/local_variable.rb +75 -67
  141. data/lib/solargraph/pin/method.rb +672 -527
  142. data/lib/solargraph/pin/method_alias.rb +34 -31
  143. data/lib/solargraph/pin/namespace.rb +115 -107
  144. data/lib/solargraph/pin/parameter.rb +275 -212
  145. data/lib/solargraph/pin/proxy_type.rb +39 -29
  146. data/lib/solargraph/pin/reference/override.rb +47 -29
  147. data/lib/solargraph/pin/reference/require.rb +2 -2
  148. data/lib/solargraph/pin/reference/superclass.rb +15 -10
  149. data/lib/solargraph/pin/reference.rb +39 -22
  150. data/lib/solargraph/pin/search.rb +61 -56
  151. data/lib/solargraph/pin/signature.rb +61 -17
  152. data/lib/solargraph/pin/singleton.rb +1 -1
  153. data/lib/solargraph/pin/symbol.rb +53 -47
  154. data/lib/solargraph/pin/until.rb +18 -0
  155. data/lib/solargraph/pin/while.rb +18 -0
  156. data/lib/solargraph/pin.rb +44 -41
  157. data/lib/solargraph/pin_cache.rb +245 -0
  158. data/lib/solargraph/position.rb +132 -107
  159. data/lib/solargraph/range.rb +112 -98
  160. data/lib/solargraph/rbs_map/conversions.rb +823 -646
  161. data/lib/solargraph/rbs_map/core_fills.rb +84 -50
  162. data/lib/solargraph/rbs_map/core_map.rb +58 -28
  163. data/lib/solargraph/rbs_map/stdlib_map.rb +43 -33
  164. data/lib/solargraph/rbs_map.rb +163 -93
  165. data/lib/solargraph/server_methods.rb +16 -16
  166. data/lib/solargraph/shell.rb +363 -269
  167. data/lib/solargraph/source/chain/array.rb +37 -33
  168. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  169. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  170. data/lib/solargraph/source/chain/call.rb +337 -303
  171. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  172. data/lib/solargraph/source/chain/constant.rb +26 -89
  173. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  174. data/lib/solargraph/source/chain/hash.rb +34 -33
  175. data/lib/solargraph/source/chain/head.rb +1 -1
  176. data/lib/solargraph/source/chain/if.rb +28 -28
  177. data/lib/solargraph/source/chain/instance_variable.rb +13 -13
  178. data/lib/solargraph/source/chain/link.rb +109 -98
  179. data/lib/solargraph/source/chain/literal.rb +48 -28
  180. data/lib/solargraph/source/chain/or.rb +23 -23
  181. data/lib/solargraph/source/chain/q_call.rb +11 -11
  182. data/lib/solargraph/source/chain/variable.rb +13 -13
  183. data/lib/solargraph/source/chain/z_super.rb +30 -30
  184. data/lib/solargraph/source/chain.rb +291 -252
  185. data/lib/solargraph/source/change.rb +82 -82
  186. data/lib/solargraph/source/cursor.rb +166 -167
  187. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  188. data/lib/solargraph/source/source_chainer.rb +194 -194
  189. data/lib/solargraph/source/updater.rb +55 -55
  190. data/lib/solargraph/source.rb +498 -495
  191. data/lib/solargraph/source_map/clip.rb +226 -232
  192. data/lib/solargraph/source_map/data.rb +34 -30
  193. data/lib/solargraph/source_map/mapper.rb +259 -255
  194. data/lib/solargraph/source_map.rb +212 -217
  195. data/lib/solargraph/type_checker/checks.rb +124 -120
  196. data/lib/solargraph/type_checker/param_def.rb +37 -35
  197. data/lib/solargraph/type_checker/problem.rb +32 -32
  198. data/lib/solargraph/type_checker/rules.rb +84 -62
  199. data/lib/solargraph/type_checker.rb +814 -672
  200. data/lib/solargraph/version.rb +5 -5
  201. data/lib/solargraph/views/_method.erb +10 -10
  202. data/lib/solargraph/views/_namespace.erb +3 -3
  203. data/lib/solargraph/views/document.erb +10 -10
  204. data/lib/solargraph/workspace/config.rb +255 -239
  205. data/lib/solargraph/workspace/require_paths.rb +97 -0
  206. data/lib/solargraph/workspace.rb +220 -239
  207. data/lib/solargraph/yard_map/helpers.rb +44 -16
  208. data/lib/solargraph/yard_map/mapper/to_constant.rb +7 -5
  209. data/lib/solargraph/yard_map/mapper/to_method.rb +130 -94
  210. data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -28
  211. data/lib/solargraph/yard_map/mapper.rb +79 -78
  212. data/lib/solargraph/yard_map/to_method.rb +89 -86
  213. data/lib/solargraph/yard_tags.rb +20 -20
  214. data/lib/solargraph/yardoc.rb +87 -52
  215. data/lib/solargraph.rb +105 -72
  216. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  217. data/rbs/fills/open3/0/open3.rbs +172 -0
  218. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  219. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  220. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  221. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  222. data/rbs/fills/tuple/tuple.rbs +149 -0
  223. data/rbs/shims/ast/0/node.rbs +5 -0
  224. data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
  225. data/rbs/shims/ast/2.4/ast.rbs +73 -0
  226. data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  227. data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
  228. data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
  229. data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  230. data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  231. data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
  232. data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
  233. data/rbs_collection.yaml +19 -0
  234. data/solargraph.gemspec +27 -5
  235. metadata +215 -18
  236. data/lib/.rubocop.yml +0 -22
  237. data/lib/solargraph/cache.rb +0 -77
  238. data/lib/solargraph/parser/node_methods.rb +0 -83
@@ -1,38 +1,40 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph::LanguageServer::Message::TextDocument
4
- class Definition < Base
5
- def process
6
- @line = params['position']['line']
7
- @column = params['position']['character']
8
- set_result(code_location || require_location || [])
9
- end
10
-
11
- private
12
-
13
- def code_location
14
- suggestions = host.definitions_at(params['textDocument']['uri'], @line, @column)
15
- return nil if suggestions.empty?
16
- suggestions.reject { |pin| pin.best_location.nil? || pin.best_location.filename.nil? }.map do |pin|
17
- {
18
- uri: file_to_uri(pin.best_location.filename),
19
- range: pin.best_location.range.to_hash
20
- }
21
- end
22
- end
23
-
24
- def require_location
25
- # @todo Terrible hack
26
- lib = host.library_for(params['textDocument']['uri'])
27
- rloc = Solargraph::Location.new(uri_to_file(params['textDocument']['uri']), Solargraph::Range.from_to(@line, @column, @line, @column))
28
- dloc = lib.locate_ref(rloc)
29
- return nil if dloc.nil?
30
- [
31
- {
32
- uri: file_to_uri(dloc.filename),
33
- range: dloc.range.to_hash
34
- }
35
- ]
36
- end
37
- end
38
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph::LanguageServer::Message::TextDocument
4
+ class Definition < Base
5
+ def process
6
+ @line = params['position']['line']
7
+ @column = params['position']['character']
8
+ set_result(code_location || require_location || [])
9
+ end
10
+
11
+ private
12
+
13
+ # @return [Array<Hash>, nil]
14
+ def code_location
15
+ suggestions = host.definitions_at(params['textDocument']['uri'], @line, @column)
16
+ return nil if suggestions.empty?
17
+ suggestions.reject { |pin| pin.best_location.nil? || pin.best_location.filename.nil? }.map do |pin|
18
+ {
19
+ uri: file_to_uri(pin.best_location.filename),
20
+ range: pin.best_location.range.to_hash
21
+ }
22
+ end
23
+ end
24
+
25
+ # @return [Array<Hash>, nil]
26
+ def require_location
27
+ # @todo Terrible hack
28
+ lib = host.library_for(params['textDocument']['uri'])
29
+ rloc = Solargraph::Location.new(uri_to_file(params['textDocument']['uri']), Solargraph::Range.from_to(@line, @column, @line, @column))
30
+ dloc = lib.locate_ref(rloc)
31
+ return nil if dloc.nil?
32
+ [
33
+ {
34
+ uri: file_to_uri(dloc.filename),
35
+ range: dloc.range.to_hash
36
+ }
37
+ ]
38
+ end
39
+ end
40
+ end
@@ -1,16 +1,16 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph::LanguageServer::Message::TextDocument
4
- class DocumentHighlight < Base
5
- def process
6
- locs = host.references_from(params['textDocument']['uri'], params['position']['line'], params['position']['character'], strip: true, only: true)
7
- result = locs.map do |loc|
8
- {
9
- range: loc.range.to_hash,
10
- kind: 1
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 DocumentHighlight < Base
5
+ def process
6
+ locs = host.references_from(params['textDocument']['uri'], params['position']['line'], params['position']['character'], strip: true, only: true)
7
+ result = locs.map do |loc|
8
+ {
9
+ range: loc.range.to_hash,
10
+ kind: 1
11
+ }
12
+ end
13
+ set_result result
14
+ end
15
+ end
16
+ end
@@ -1,26 +1,26 @@
1
- # frozen_string_literal: true
2
-
3
- class Solargraph::LanguageServer::Message::TextDocument::DocumentSymbol < Solargraph::LanguageServer::Message::Base
4
- include Solargraph::LanguageServer::UriHelpers
5
-
6
- def process
7
- pins = host.document_symbols params['textDocument']['uri']
8
- info = pins.map do |pin|
9
- next nil unless pin.best_location&.filename
10
-
11
- result = {
12
- name: pin.name,
13
- containerName: pin.namespace,
14
- kind: pin.symbol_kind,
15
- location: {
16
- uri: file_to_uri(pin.best_location.filename),
17
- range: pin.best_location.range.to_hash
18
- },
19
- deprecated: pin.deprecated?
20
- }
21
- result
22
- end.compact
23
-
24
- set_result info
25
- end
26
- end
1
+ # frozen_string_literal: true
2
+
3
+ class Solargraph::LanguageServer::Message::TextDocument::DocumentSymbol < Solargraph::LanguageServer::Message::Base
4
+ include Solargraph::LanguageServer::UriHelpers
5
+
6
+ def process
7
+ pins = host.document_symbols params['textDocument']['uri']
8
+ info = pins.map do |pin|
9
+ next nil unless pin.best_location&.filename
10
+
11
+ result = {
12
+ name: pin.name,
13
+ containerName: pin.namespace,
14
+ kind: pin.symbol_kind,
15
+ location: {
16
+ uri: file_to_uri(pin.best_location.filename),
17
+ range: pin.best_location.range.to_hash
18
+ },
19
+ deprecated: pin.deprecated?
20
+ }
21
+ result
22
+ end.compact
23
+
24
+ set_result info
25
+ end
26
+ end
@@ -1,131 +1,148 @@
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
+ # 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
+ # @sg-ignore Unresolved call to []=
22
+ options[:stdin] = original
23
+
24
+ # Ensure only one instance of RuboCop::Runner is running at
25
+ # a time - it uses 'chdir' to read config files with ERB,
26
+ # which can conflict with other chdirs.
27
+ corrections = Solargraph::CHDIR_MUTEX.synchronize do
28
+ redirect_stdout do
29
+ ::RuboCop::Runner.new(options, ::RuboCop::ConfigStore.new).run(paths)
30
+ end
31
+ end
32
+ # @sg-ignore Unresolved call to []=
33
+ result = options[:stdin]
34
+
35
+ log_corrections(corrections)
36
+
37
+ format original, result
38
+ rescue ::RuboCop::ValidationError, ::RuboCop::ConfigNotFoundError => e
39
+ set_error(Solargraph::LanguageServer::ErrorCodes::INTERNAL_ERROR, "[#{e.class}] #{e.message}")
40
+ end
41
+
42
+ private
43
+
44
+ # @param corrections [String]
45
+ # @return [void]
46
+ def log_corrections(corrections)
47
+ corrections = corrections&.strip
48
+ return if corrections&.empty?
49
+
50
+ Solargraph.logger.info('Formatting result:')
51
+ corrections.each_line do |line|
52
+ next if line.strip.empty?
53
+ Solargraph.logger.info(line.strip)
54
+ end
55
+ end
56
+
57
+ # @param file_uri [String]
58
+ # @return [Hash{String => undefined}]
59
+ def config_for(file_uri)
60
+ conf = host.formatter_config(file_uri)
61
+ return {} unless conf.is_a?(Hash)
62
+
63
+ conf['rubocop'] || {}
64
+ end
65
+
66
+ # @param file_uri [String]
67
+ # @param config [Hash{String => String}]
68
+ # @return [Array<String>]
69
+ def cli_args file_uri, config
70
+ file = UriHelpers.uri_to_file(file_uri)
71
+ args = [
72
+ config['cops'] == 'all' ? '-A' : '-a',
73
+ '--cache', 'false',
74
+ '--format', formatter_class(config).name,
75
+ ]
76
+
77
+ ['except', 'only'].each do |arg|
78
+ cops = cop_list(config[arg])
79
+ args += ["--#{arg}", cops] if cops
80
+ end
81
+
82
+ args += config['extra_args'] if config['extra_args']
83
+ args + [file]
84
+ end
85
+
86
+ # @param config [Hash{String => String}]
87
+ # @sg-ignore
88
+ # @return [Class<RuboCop::Formatter::BaseFormatter>]
89
+ def formatter_class(config)
90
+ if self.class.const_defined?('BlankRubocopFormatter')
91
+ # @sg-ignore
92
+ BlankRubocopFormatter
93
+ else
94
+ require_rubocop(config['version'])
95
+ klass = Class.new(::RuboCop::Formatter::BaseFormatter)
96
+ self.class.const_set 'BlankRubocopFormatter', klass
97
+ end
98
+ end
99
+
100
+ # @param value [Array, String]
101
+ # @return [String, nil]
102
+ def cop_list(value)
103
+ # @type [String]
104
+ value = value.join(',') if value.respond_to?(:join)
105
+ return nil if value == '' || !value.is_a?(String)
106
+ value
107
+ end
108
+
109
+ # @param original [String]
110
+ # @param result [String]
111
+ # @return [void]
112
+ def format original, result
113
+ ending = if original.end_with?("\n")
114
+ {
115
+ line: original.lines.length,
116
+ character: 0
117
+ }
118
+ elsif original.lines.empty?
119
+ {
120
+ line: 0,
121
+ character: 0
122
+ }
123
+ else
124
+ {
125
+ line: original.lines.length - 1,
126
+ character: original.lines.last.length
127
+ }
128
+ end
129
+ set_result(
130
+ [
131
+ {
132
+ range: {
133
+ start: {
134
+ line: 0,
135
+ character: 0
136
+ },
137
+ end: ending
138
+ },
139
+ newText: result
140
+ }
141
+ ]
142
+ )
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
@@ -1,58 +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&.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
+ # 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,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