Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Saving is blocked forever when RuboCop::Runner::InfiniteCorrectionLoop is raised in the server #21

Open
henrahmagix opened this issue Dec 27, 2023 · 0 comments

Comments

@henrahmagix
Copy link

henrahmagix commented Dec 27, 2023

To replicate, use the file example here: standardrb/standard#598

# infinite.rb
class MyClass
  def thing
    @thing ||= class << Object.new
      puts "self: #{self}"
    end
  end
end

MyClass.new.thing

I'm running v0.0.16 of this extension – which is fab otherwise!

Basically, when saving this file with this extension auto-formatting it, the file never saves and VS Code shows a popup that this extension is still formatting it. The output of the server shows the error is raised almost immediately, and then nothing, so it must mean that VS Code is waiting for some output, or cancellation. I have to click "cancel" in the popup for the file to then get saved.
image

Is there anything this extension can do if an error is raised by file correction, to just allow the file to be saved without formatting?


Extension output - click/toggle to expand
[client] Restarting language server...
[client] Stopping language server...
[server] Client asked to shutdown Standard LSP server.
[server] Exiting...
[client] Starting language server: bundle exec standardrb --lsp
[server] Standard Ruby v1.32.1 LSP server initialized, pid 21237
[server] Error RuboCop::Runner::InfiniteCorrectionLoop Infinite loop detected in /me/standardrb-infinite-loop-test/infinite.rb and caused by Layout/EndAlignme
[server] ["/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/runner.rb:332:in `check_for_infinite_loop'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/runner.rb:315:in `block in iterate_until_no_changes'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/runner.rb:314:in `loop'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/runner.rb:314:in `iterate_until_no_changes'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/runner.rb:283:in `do_inspection_loop'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/runner.rb:164:in `block in file_offenses'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/runner.rb:189:in `file_offense_cache'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/runner.rb:163:in `file_offenses'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/runner.rb:154:in `process_file'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/runner.rb:135:in `block in each_inspected_file'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/runner.rb:134:in `each'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/runner.rb:134:in `reduce'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/runner.rb:134:in `each_inspected_file'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/runner.rb:120:in `inspect_files'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/runner.rb:73:in `run'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/cli/command/execute_runner.rb:26:in `block in execute_runner'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/cli/command/execute_runner.rb:52:in `with_redirect'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/cli/command/execute_runner.rb:25:in `execute_runner'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/rubocop-1.57.2/lib/rubocop/cli/command/execute_runner.rb:17:in `run'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/standard-1.32.1/lib/standard/runners/rubocop.rb:15:in `call'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/standard-1.32.1/lib/standard/lsp/standardizer.rb:62:in `capture_rubocop_stdout'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/standard-1.32.1/lib/standard/lsp/standardizer.rb:25:in `format'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/standard-1.32.1/lib/standard/lsp/routes.rb:150:in `format_file'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/standard-1.32.1/lib/standard/lsp/routes.rb:78:in `block in <class:Routes>'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/standard-1.32.1/lib/standard/lsp/server.rb:25:in `call'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/standard-1.32.1/lib/standard/lsp/server.rb:25:in `block in start'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/language_server-protocol-3.17.0.3/lib/language_server/protocol/transport/io/reader.rb:20:in `read'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/standard-1.32.1/lib/standard/lsp/server.rb:21:in `start'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/standard-1.32.1/lib/standard/runners/lsp.rb:7:in `call'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/standard-1.32.1/lib/standard/cli.rb:14:in `run'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/standard-1.32.1/exe/standardrb:7:in `<top (required)>'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/bin/standardrb:25:in `load'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/bin/standardrb:25:in `<top (required)>'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/bundler-2.4.19/lib/bundler/cli/exec.rb:58:in `load'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/bundler-2.4.19/lib/bundler/cli/exec.rb:58:in `kernel_load'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/bundler-2.4.19/lib/bundler/cli/exec.rb:23:in `run'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/bundler-2.4.19/lib/bundler/cli.rb:492:in `exec'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/bundler-2.4.19/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/bundler-2.4.19/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/bundler-2.4.19/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/bundler-2.4.19/lib/bundler/cli.rb:34:in `dispatch'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/bundler-2.4.19/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/bundler-2.4.19/lib/bundler/cli.rb:28:in `start'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/bundler-2.4.19/exe/bundle:37:in `block in <top (required)>'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/bundler-2.4.19/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/gems/bundler-2.4.19/exe/bundle:29:in `<top (required)>'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/bin/bundle:25:in `load'", "/me/.rbenv/versions/3.2.2/gemsets/standardrb-infinite-loop-test/bin/bundle:25:in `<main>'"]

My workspace settings:

		"standardRuby.mode": "enableUnconditionally",
		"[ruby]": {
			"editor.formatOnSave": true,
			"editor.defaultFormatter": "testdouble.vscode-standard-ruby"
		},

In the extension output, the error gets cut off in different ways, so it's not a typo or mis-copy on my behalf when the output above shows:

... caused by Layout/EndAlignme

In previous runs it's printed

... caused by L

which meant it took me a while to debug and figure out the cop causing the infinite loop, which I was able to do and created standardrb/standard#598 to track a fix for the infinite loop itself.

So this issue is just related to unblocking VS Code file saving in this extension when it receives an error from standardrb/standard =)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant