lexical-lsp / lexical

Lexical is a next-generation elixir language server
888 stars 82 forks source link

While find/replacing in VSCode across many files formatting save takes a long time and bungles replace. #815

Open krainboltgreene opened 3 months ago

krainboltgreene commented 3 months ago

I did a search/replace in VSCode for "Core" to "Dashboard" across many files (200~) and VSCode hangs while letting Lexical format it. This also seems to result in future search/replace issues as a replace of Core.AccountAuth to Dashboard.AccountAuth turns Core.AccountAuth, :ensure_authenticated into Dashboard.AccountAuthure_authenticated. While the below screenshot shows them being saved each "save" takes ~3s and actually finishes (it's not locked up). That said the file is already saved, regardless of what the indicator says.

Screenshot 2024-08-13 at 10 18 30 AM

Metadata:

Version: 1.92.1 (Universal)
Commit: eaa41d57266683296de7d118f574d0c2652e1fc4
Date: 2024-08-07T20:16:39.455Z (5 days ago)
Electron: 30.1.2
ElectronBuildId: 9870757
Chromium: 124.0.6367.243
Node.js: 20.14.0
V8: 12.4.254.20-electron.0
OS: Darwin arm64 22.6.0
Lexical Extension: lexical-lsp.lexical v0.0.18
Erlang/OTP 27 [erts-15.0] [source] [64-bit] [smp:10:10] [ds:10:10:10] [async-threads:1] [jit]
Elixir 1.17.1 (compiled with Erlang/OTP 27)
scohen commented 3 months ago

I've been able to replicate this, going to play around with this a bit and see if I can make this perform better.

crbelaus commented 2 months ago

This happens to me frequently as well. I have the format on save setting enabled and Lexical seems to be formatting the file and rebuilding the application for each saved file.

I wonder if it would make sense to have some kind of "debounce" to delay the application rebuild for a few milliseconds after saving a file. This way it would be triggered only after saving all the files instead of once for every file.

scohen commented 2 months ago

The build presently already has a debounce, but format doesn't. Things get a little tricky with debounces, because format requests expect a response within some amount of time, and they operate on an unsaved document. Thus, if you miss that window, there's no way that I know of to actually format the document.

scohen commented 2 months ago

@krainboltgreene @crbelaus can you check out the branch in #826, and see if that helps?

krainboltgreene commented 2 months ago

Will do.

krainboltgreene commented 2 months ago

Queuing this up for tonight, sorry was super busy yesterday.

Moosieus commented 1 week ago

I gave this a quick spot-check on main since #826 was merged, and it seems like this issue's resolved.

If someone may verify, I'll mark this issue as completed.

scohen commented 4 days ago

@krainboltgreene Can you verify?

krainboltgreene commented 4 days ago

It's very simple to test, I will do so in 14h when I start work again. (In case I fall off the earth the test is this: (1) turn on format-on-save in vscode, (2) turn on auto-save on unfocus, (3) search-and-replace for something small fooooooooooooooooooo and replace it with something absurdly long fooooooooooooooooooo, this will cause a multiline format, and if this change works you won't lose any code)