LuaLS / LuaLS/lua-language-server

Swap Params codeAction breaks code

Đang mở
#3,413 1 bình luận 0 reaction 0 người được giao Xem trên GitHub

Chưa có ai nhận issue này.

Ngôn ngữ chính
Lua
Star
4.4k
Fork
442
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

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.

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Hướng nghiên cứu

Bắt đầu bằng cách tái hiện vấn đề trong NeoVim với các tác vụ mã được kích hoạt khi lưu, sử dụng ví dụ về đối số vị trí trong báo cáo. Sau đó kiểm tra script/core/code-action.lua quanh dòng 462 và lần theo chỉnh sửa «Swap Params»; được xem là hoàn tất khi ví dụ vẫn không thay đổi sau khi tác vụ mã chạy.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
lua, neovim
Lĩnh vực
devtools, tooling
Loại issue
Lỗi
Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức độ hoạt động
Ít trao đổi
Độ rõ ràng
Đặc tả rõ ràng
Mức phù hợp với người mới
68/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.