LuaLS / LuaLS/lua-language-server

Swap Params codeAction breaks code

未關閉
#3,413 1 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

還沒有人認領這個 Issue。

主要語言
Lua
星號
4.4k
分支
442
PR 合併指標
30 天內沒有已合併 PR

描述

How are you using the lua-language-server?

NeoVim

Which OS are you using?

MacOS

What is the issue affecting?

Formatting

Expected Behaviour

Write lua code in neovim with codeActions triggered on buffer save. The lua code looks like the following:

vim.api.nvim_create_autocmd('BufWritePre', {})

and save, it will remain unchanged.

Actual Behaviour

It changes the code to the following:

vim.api.nvim_create_autocmd({}, 'BufWritePre')
Reproduction steps
  1. Install lua-language-server
  2. Setup lua lsp in neovim (can expand if needed)
  3. Add the following autocmd to run codeactions on save
vim.api.nvim_create_autocmd('BufWritePre', {
	group = vim.api.nvim_create_augroup('auto-format', { clear = false }),
	buffer = ev.buf,
	callback = function(evt)
		local params = vim.lsp.util.make_range_params()
		params.context = { }
		local result = vim.lsp.buf_request_sync(evt.buf, "textDocument/codeAction", params)
		for _, res in pairs(result or {}) do
			for _, r in pairs(res.result or {}) do
				if r.edit then
					local enc = client.offset_encoding or "utf-16"
					vim.lsp.util.apply_workspace_edit(r.edit, enc)
				end
			end
		end

		vim.lsp.buf.format({ bufnr = ev.buf, id = client.id, timeout_ms = 1000, async = false })
	end,
})
  1. Write some lua code and save that lua code with the cursor still on the same line.
Additional Notes

I was editing my neovim config and the lsp kept switching params like the following:

vim.api.nvim_create_autocmd('BufWritePre', {})

And after my PreWrite autocmd calls codeActions

vim.api.nvim_create_autocmd({}, 'BufWritePre')

which immediately breaks the code because the params are position sensitive.

It only does this if the cursor is on the line of the method call which I suppose makes sense since the code action is called with a range. My full autocmd works like this:

vim.api.nvim_create_autocmd('BufWritePre', {
	group = vim.api.nvim_create_augroup('auto-format', { clear = false }),
	buffer = ev.buf,
	callback = function(evt)
		local params = vim.lsp.util.make_range_params()
		params.context = { }
		local result = vim.lsp.buf_request_sync(evt.buf, "textDocument/codeAction", params)
		for _, res in pairs(result or {}) do
			for _, r in pairs(res.result or {}) do
				if r.edit then
					local enc = client.offset_encoding or "utf-16"
					vim.lsp.util.apply_workspace_edit(r.edit, enc)
				end
			end
		end

		vim.lsp.buf.format({ bufnr = ev.buf, id = client.id, timeout_ms = 1000, async = false })
	end,
})

I narrowed it down to this code action here https://github.com/LuaLS/lua-language-server/blob/b5e57c36a9a27b89eb283861fb8946fa787e37d8/script/core/code-action.lua#L462

Maybe I am holding it wrong and it is not supposed to be used in this way but I don't have a problem with other LSPs.

Log File

No log entry was added during this behaviour.

貢獻指南

開啟貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

研究方向

首先,使用報告中的位置引數範例,在儲存時觸發程式碼動作的 NeoVim 中重現此問題。接著檢查第 462 行附近的 script/core/code-action.lua,並追蹤 Swap Params 編輯;程式碼動作執行後範例維持不變即表示完成。

由索引模型根據 Issue 內容生成。

評估

技術堆疊
lua, neovim
領域
devtools, tooling
Issue 類型
缺陷
難度
3/5
預估耗時
1-2 天
活躍度
冷清
描述清晰度
描述清楚
新手友好度
68/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。