solargraph 0.58.0 → 0.59.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 (219) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.gitattributes +2 -0
  4. data/.github/workflows/linting.yml +6 -5
  5. data/.github/workflows/plugins.yml +48 -35
  6. data/.github/workflows/rspec.yml +15 -28
  7. data/.github/workflows/typecheck.yml +3 -2
  8. data/.gitignore +1 -0
  9. data/.rubocop.yml +38 -6
  10. data/.rubocop_todo.yml +53 -966
  11. data/CHANGELOG.md +24 -0
  12. data/Gemfile +3 -1
  13. data/README.md +3 -3
  14. data/Rakefile +26 -23
  15. data/bin/solargraph +9 -8
  16. data/lib/solargraph/api_map/cache.rb +110 -110
  17. data/lib/solargraph/api_map/constants.rb +288 -279
  18. data/lib/solargraph/api_map/index.rb +204 -193
  19. data/lib/solargraph/api_map/source_to_yard.rb +110 -97
  20. data/lib/solargraph/api_map/store.rb +395 -384
  21. data/lib/solargraph/api_map.rb +1029 -945
  22. data/lib/solargraph/bench.rb +44 -45
  23. data/lib/solargraph/complex_type/conformance.rb +176 -0
  24. data/lib/solargraph/complex_type/type_methods.rb +240 -228
  25. data/lib/solargraph/complex_type/unique_type.rb +641 -482
  26. data/lib/solargraph/complex_type.rb +557 -444
  27. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  28. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  29. data/lib/solargraph/convention/data_definition.rb +108 -105
  30. data/lib/solargraph/convention/gemfile.rb +15 -15
  31. data/lib/solargraph/convention/gemspec.rb +23 -23
  32. data/lib/solargraph/convention/rakefile.rb +17 -17
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  35. data/lib/solargraph/convention/struct_definition.rb +168 -164
  36. data/lib/solargraph/convention.rb +78 -78
  37. data/lib/solargraph/converters/dd.rb +19 -17
  38. data/lib/solargraph/converters/dl.rb +17 -15
  39. data/lib/solargraph/converters/dt.rb +17 -15
  40. data/lib/solargraph/converters/misc.rb +3 -1
  41. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  42. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  43. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  44. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  45. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  46. data/lib/solargraph/doc_map.rb +438 -439
  47. data/lib/solargraph/equality.rb +34 -34
  48. data/lib/solargraph/gem_pins.rb +98 -98
  49. data/lib/solargraph/language_server/error_codes.rb +20 -20
  50. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  51. data/lib/solargraph/language_server/host/dispatch.rb +130 -130
  52. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  53. data/lib/solargraph/language_server/host/sources.rb +100 -99
  54. data/lib/solargraph/language_server/host.rb +886 -878
  55. data/lib/solargraph/language_server/message/base.rb +97 -97
  56. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  57. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  58. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +108 -114
  59. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  60. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  61. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  62. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  63. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  64. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  65. data/lib/solargraph/language_server/message/text_document/definition.rb +49 -40
  66. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  67. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +36 -26
  68. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  69. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  70. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  71. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  72. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  73. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  74. data/lib/solargraph/language_server/message/text_document/type_definition.rb +33 -25
  75. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  76. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  77. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  78. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +33 -23
  79. data/lib/solargraph/language_server/message.rb +94 -94
  80. data/lib/solargraph/language_server/request.rb +29 -27
  81. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  82. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  83. data/lib/solargraph/library.rb +702 -683
  84. data/lib/solargraph/location.rb +85 -82
  85. data/lib/solargraph/logging.rb +55 -37
  86. data/lib/solargraph/page.rb +92 -92
  87. data/lib/solargraph/parser/comment_ripper.rb +84 -69
  88. data/lib/solargraph/parser/flow_sensitive_typing.rb +471 -255
  89. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  90. data/lib/solargraph/parser/node_processor.rb +63 -62
  91. data/lib/solargraph/parser/parser_gem/class_methods.rb +165 -149
  92. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  93. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  94. data/lib/solargraph/parser/parser_gem/node_methods.rb +507 -486
  95. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  96. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  97. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  98. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +45 -46
  99. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  100. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  101. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  102. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +42 -40
  103. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  104. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  105. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  106. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  107. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  108. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  109. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +51 -52
  110. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +302 -291
  111. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  112. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  113. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  114. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  115. data/lib/solargraph/parser/parser_gem.rb +14 -12
  116. data/lib/solargraph/parser/region.rb +75 -69
  117. data/lib/solargraph/parser/snippet.rb +19 -17
  118. data/lib/solargraph/parser.rb +25 -23
  119. data/lib/solargraph/pin/base.rb +773 -729
  120. data/lib/solargraph/pin/base_variable.rb +375 -126
  121. data/lib/solargraph/pin/block.rb +127 -104
  122. data/lib/solargraph/pin/breakable.rb +15 -9
  123. data/lib/solargraph/pin/callable.rb +275 -231
  124. data/lib/solargraph/pin/closure.rb +69 -72
  125. data/lib/solargraph/pin/common.rb +97 -79
  126. data/lib/solargraph/pin/compound_statement.rb +55 -0
  127. data/lib/solargraph/pin/constant.rb +43 -45
  128. data/lib/solargraph/pin/conversions.rb +129 -123
  129. data/lib/solargraph/pin/delegated_method.rb +131 -120
  130. data/lib/solargraph/pin/documenting.rb +116 -114
  131. data/lib/solargraph/pin/instance_variable.rb +38 -34
  132. data/lib/solargraph/pin/keyword.rb +16 -20
  133. data/lib/solargraph/pin/local_variable.rb +31 -75
  134. data/lib/solargraph/pin/method.rb +724 -672
  135. data/lib/solargraph/pin/method_alias.rb +42 -34
  136. data/lib/solargraph/pin/namespace.rb +122 -115
  137. data/lib/solargraph/pin/parameter.rb +339 -275
  138. data/lib/solargraph/pin/proxy_type.rb +42 -39
  139. data/lib/solargraph/pin/reference/override.rb +47 -47
  140. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  141. data/lib/solargraph/pin/reference/type_alias.rb +16 -0
  142. data/lib/solargraph/pin/reference.rb +59 -39
  143. data/lib/solargraph/pin/search.rb +62 -61
  144. data/lib/solargraph/pin/signature.rb +64 -61
  145. data/lib/solargraph/pin/symbol.rb +54 -53
  146. data/lib/solargraph/pin/until.rb +16 -18
  147. data/lib/solargraph/pin/while.rb +16 -18
  148. data/lib/solargraph/pin.rb +46 -44
  149. data/lib/solargraph/pin_cache.rb +248 -245
  150. data/lib/solargraph/position.rb +139 -119
  151. data/lib/solargraph/range.rb +113 -112
  152. data/lib/solargraph/rbs_map/conversions.rb +952 -823
  153. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  154. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  155. data/lib/solargraph/rbs_map/stdlib_map.rb +71 -43
  156. data/lib/solargraph/rbs_map.rb +207 -163
  157. data/lib/solargraph/server_methods.rb +16 -16
  158. data/lib/solargraph/shell.rb +555 -352
  159. data/lib/solargraph/source/chain/array.rb +39 -37
  160. data/lib/solargraph/source/chain/call.rb +377 -337
  161. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  162. data/lib/solargraph/source/chain/constant.rb +30 -26
  163. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  164. data/lib/solargraph/source/chain/hash.rb +37 -34
  165. data/lib/solargraph/source/chain/if.rb +30 -28
  166. data/lib/solargraph/source/chain/instance_variable.rb +36 -13
  167. data/lib/solargraph/source/chain/link.rb +99 -109
  168. data/lib/solargraph/source/chain/literal.rb +51 -48
  169. data/lib/solargraph/source/chain/or.rb +29 -23
  170. data/lib/solargraph/source/chain/q_call.rb +13 -11
  171. data/lib/solargraph/source/chain/variable.rb +15 -13
  172. data/lib/solargraph/source/chain/z_super.rb +28 -30
  173. data/lib/solargraph/source/chain.rb +304 -291
  174. data/lib/solargraph/source/change.rb +89 -82
  175. data/lib/solargraph/source/cursor.rb +172 -166
  176. data/lib/solargraph/source/encoding_fixes.rb +22 -23
  177. data/lib/solargraph/source/source_chainer.rb +218 -194
  178. data/lib/solargraph/source/updater.rb +59 -55
  179. data/lib/solargraph/source.rb +522 -498
  180. data/lib/solargraph/source_map/clip.rb +245 -226
  181. data/lib/solargraph/source_map/data.rb +37 -34
  182. data/lib/solargraph/source_map/mapper.rb +286 -259
  183. data/lib/solargraph/source_map.rb +224 -212
  184. data/lib/solargraph/type_checker/problem.rb +34 -32
  185. data/lib/solargraph/type_checker/rules.rb +157 -84
  186. data/lib/solargraph/type_checker.rb +888 -814
  187. data/lib/solargraph/version.rb +5 -5
  188. data/lib/solargraph/workspace/config.rb +258 -255
  189. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  190. data/lib/solargraph/workspace/require_paths.rb +98 -97
  191. data/lib/solargraph/workspace.rb +242 -220
  192. data/lib/solargraph/yard_map/helpers.rb +49 -44
  193. data/lib/solargraph/yard_map/mapper/to_method.rb +136 -130
  194. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  195. data/lib/solargraph/yard_map/mapper.rb +84 -79
  196. data/lib/solargraph/yard_map.rb +17 -18
  197. data/lib/solargraph/yard_tags.rb +20 -20
  198. data/lib/solargraph/yardoc.rb +90 -87
  199. data/lib/solargraph.rb +128 -105
  200. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  201. data/rbs/fills/tuple/tuple.rbs +28 -0
  202. data/rbs/shims/ast/0/node.rbs +5 -0
  203. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  204. data/rbs_collection.yaml +1 -1
  205. data/solargraph.gemspec +37 -35
  206. metadata +52 -51
  207. data/lib/solargraph/type_checker/checks.rb +0 -124
  208. data/lib/solargraph/type_checker/param_def.rb +0 -37
  209. data/lib/solargraph/yard_map/to_method.rb +0 -89
  210. data/sig/shims/ast/0/node.rbs +0 -5
  211. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  212. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  213. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  214. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  215. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  216. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  217. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  218. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  219. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,40 +1,49 @@
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
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module LanguageServer
5
+ module Message
6
+ module TextDocument
7
+ class Definition < Base
8
+ def process
9
+ @line = params['position']['line']
10
+ @column = params['position']['character']
11
+ set_result(code_location || require_location || [])
12
+ end
13
+
14
+ private
15
+
16
+ # @return [Array<Hash>, nil]
17
+ def code_location
18
+ suggestions = host.definitions_at(params['textDocument']['uri'], @line, @column)
19
+ # @sg-ignore Need to add nil check here
20
+ return nil if suggestions.empty?
21
+ # @sg-ignore Need to add nil check here
22
+ suggestions.reject { |pin| pin.best_location.nil? || pin.best_location.filename.nil? }.map do |pin|
23
+ {
24
+ uri: file_to_uri(pin.best_location.filename),
25
+ range: pin.best_location.range.to_hash
26
+ }
27
+ end
28
+ end
29
+
30
+ # @return [Array<Hash>, nil]
31
+ def require_location
32
+ # @todo Terrible hack
33
+ lib = host.library_for(params['textDocument']['uri'])
34
+ rloc = Solargraph::Location.new(uri_to_file(params['textDocument']['uri']),
35
+ Solargraph::Range.from_to(@line, @column, @line, @column))
36
+ dloc = lib.locate_ref(rloc)
37
+ return nil if dloc.nil?
38
+ [
39
+ {
40
+ uri: file_to_uri(dloc.filename),
41
+ range: dloc.range.to_hash
42
+ }
43
+ ]
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -1,16 +1,23 @@
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
4
+ module LanguageServer
5
+ module Message
6
+ module TextDocument
7
+ class DocumentHighlight < Base
8
+ def process
9
+ locs = host.references_from(params['textDocument']['uri'], params['position']['line'],
10
+ params['position']['character'], strip: true, only: true)
11
+ result = locs.map do |loc|
12
+ {
13
+ range: loc.range.to_hash,
14
+ kind: 1
15
+ }
16
+ end
17
+ set_result result
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,26 +1,36 @@
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
+ module Solargraph
4
+ module LanguageServer
5
+ module Message
6
+ module TextDocument
7
+ class DocumentSymbol < Solargraph::LanguageServer::Message::Base
8
+ include Solargraph::LanguageServer::UriHelpers
9
+
10
+ def process
11
+ pins = host.document_symbols params['textDocument']['uri']
12
+ info = pins.map do |pin|
13
+ next nil unless pin.best_location&.filename
14
+
15
+ result = {
16
+ name: pin.name,
17
+ containerName: pin.namespace,
18
+ kind: pin.symbol_kind,
19
+ location: {
20
+ # @sg-ignore Need to add nil check here
21
+ uri: file_to_uri(pin.best_location.filename),
22
+ # @sg-ignore Need to add nil check here
23
+ range: pin.best_location.range.to_hash
24
+ },
25
+ deprecated: pin.deprecated?
26
+ }
27
+ result
28
+ end.compact
29
+
30
+ set_result info
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -1,148 +1,150 @@
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
+ # 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
+ %w[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
+ #
102
+ # @return [String, nil]
103
+ def cop_list value
104
+ # @type [String]
105
+ # @sg-ignore Translate to something flow sensitive typing understands
106
+ value = value.join(',') if value.respond_to?(:join)
107
+ return nil if value == '' || !value.is_a?(String)
108
+ value
109
+ end
110
+
111
+ # @param original [String]
112
+ # @param result [String]
113
+ # @return [void]
114
+ def format original, result
115
+ ending = if original.end_with?("\n")
116
+ {
117
+ line: original.lines.length,
118
+ character: 0
119
+ }
120
+ elsif original.lines.empty?
121
+ {
122
+ line: 0,
123
+ character: 0
124
+ }
125
+ else
126
+ {
127
+ line: original.lines.length - 1,
128
+ character: original.lines.last.length
129
+ }
130
+ end
131
+ set_result(
132
+ [
133
+ {
134
+ range: {
135
+ start: {
136
+ line: 0,
137
+ character: 0
138
+ },
139
+ end: ending
140
+ },
141
+ newText: result
142
+ }
143
+ ]
144
+ )
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
150
+ 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
+ # @sg-ignore Need to add nil check here
15
+ suggestions.each do |pin|
16
+ parts = []
17
+ this_link = host.options['enablePages'] ? pin.link_documentation : pin.text_documentation
18
+ parts.push this_link if !this_link.nil? && this_link != last_link
19
+ parts.push "`#{pin.detail}`" unless pin.is_a?(Pin::Namespace) || pin.detail.nil?
20
+ parts.push pin.documentation unless pin.documentation.nil? || pin.documentation.empty?
21
+ unless parts.empty?
22
+ data = parts.join("\n\n")
23
+ next if contents.last&.end_with?(data)
24
+ contents.push data
25
+ end
26
+ last_link = this_link unless this_link.nil?
27
+ end
28
+ set_result(
29
+ contents_or_nil(contents)
30
+ )
31
+ rescue FileNotFoundError => e
32
+ Logging.logger.warn "[#{e.class}] #{e.message}"
33
+ # @sg-ignore Need to add nil check here
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(&: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,18 @@
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
4
+ module LanguageServer
5
+ module Message
6
+ module TextDocument
7
+ class PrepareRename < Base
8
+ def process
9
+ line = params['position']['line']
10
+ col = params['position']['character']
11
+ set_result host.sources.find(params['textDocument']['uri']).cursor_at(Solargraph::Position.new(line,
12
+ col)).range.to_hash
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end