Skip to content

Commit 3b19675

Browse files
committed
feat: support lines insertion above and below the current line
1 parent a6a4f3f commit 3b19675

9 files changed

+112
-21
lines changed

lsp/copilot_ls.lua

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,6 @@ return {
3030
}),
3131
root_dir = vim.uv.cwd(),
3232
on_init = function(client)
33-
vim.api.nvim_set_hl(0, "CopilotLspNesAdd", { link = "DiffAdd", default = true })
34-
vim.api.nvim_set_hl(0, "CopilotLspNesDelete", { link = "DiffDelete", default = true })
35-
vim.api.nvim_set_hl(0, "CopilotLspNesApply", { link = "DiffText", default = true })
36-
3733
local au = vim.api.nvim_create_augroup("copilotlsp.init", { clear = true })
3834
--NOTE: Inline Completions
3935
--TODO: We dont currently use this code path, so comment for now until a UI is built

lua/copilot-lsp/nes/ui.lua

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ function M.caculate_preview(bufnr, edit)
146146
return {
147147
lines_insertion = {
148148
text = table.concat(vim.list_slice(new_lines, 1, num_new_lines - 1), "\n"),
149-
line = math.max(start_line - 1, 0),
149+
line = start_line,
150+
above = true,
150151
},
151152
}
152153
end
@@ -203,6 +204,7 @@ function M.display_inline_edit_preview(bufnr, ns_id, preview)
203204
require("copilot-lsp.util").hl_text_to_virt_lines(lines_insertion.text, vim.bo[bufnr].filetype)
204205
vim.api.nvim_buf_set_extmark(bufnr, ns_id, lines_insertion.line, 0, {
205206
virt_lines = virt_lines,
207+
virt_lines_above = lines_insertion.above,
206208
})
207209
end
208210
end
@@ -211,16 +213,16 @@ end
211213
---@param edits copilotlsp.InlineEdit[]
212214
---@param ns_id integer
213215
function M._display_next_suggestion(edits, ns_id)
214-
local bufnr = vim.uri_to_bufnr(edits[1].textDocument.uri)
215-
local state = vim.b[bufnr].nes_state
216-
if state then
217-
M.clear_suggestion(vim.api.nvim_get_current_buf(), ns_id)
218-
end
219-
220216
if not edits or #edits == 0 then
221217
-- vim.notify("No suggestion available", vim.log.levels.INFO)
222218
return
223219
end
220+
221+
local bufnr = vim.uri_to_bufnr(edits[1].textDocument.uri)
222+
local state = vim.b[bufnr].nes_state
223+
if state then
224+
M.clear_suggestion(bufnr, ns_id)
225+
end
224226
local suggestion = edits[1]
225227

226228
local preview = M.caculate_preview(bufnr, suggestion)

lua/copilot-lsp/types.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
---@class copilotlsp.nes.TextInsertion
4040
---@field text string
4141
---@field line integer insert lines at this line
42+
---@field above? boolean above the line
4243

4344
---@class copilotlsp.nes.InlineEditPreview
4445
---@field deletion? copilotlsp.nes.TextDeletion

plugin/copilot-lsp.lua

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
vim.api.nvim_set_hl(0, "CopilotLspNesAdd", { link = "DiffAdd", default = true })
2+
vim.api.nvim_set_hl(0, "CopilotLspNesDelete", { link = "DiffDelete", default = true })
3+
vim.api.nvim_set_hl(0, "CopilotLspNesApply", { link = "DiffText", default = true })

tests/nes/test_ui_preview.lua

Lines changed: 99 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
local ref = MiniTest.expect.reference_screenshot
2+
local eq = MiniTest.expect.equality
23

34
local child = MiniTest.new_child_neovim()
45

@@ -7,9 +8,6 @@ T["ui_preview"] = MiniTest.new_set({
78
hooks = {
89
pre_case = function()
910
child.restart({ "-u", "scripts/minimal_init.lua" })
10-
child.api.nvim_set_hl(0, "CopilotLspNesAdd", { link = "DiffAdd", default = true })
11-
child.api.nvim_set_hl(0, "CopilotLspNesDelete", { link = "DiffDelete", default = true })
12-
child.api.nvim_set_hl(0, "CopilotLspNesApply", { link = "DiffText", default = true })
1311
child.bo.filetype = "txt"
1412
end,
1513
post_once = child.stop,
@@ -32,6 +30,14 @@ local cases = {
3230
},
3331
newText = "XYZ",
3432
},
33+
preview = {
34+
inline_insertion = {
35+
text = "XYZ",
36+
line = 1,
37+
character = 2,
38+
},
39+
},
40+
final = "123456\nabXYZcdefg\nhijklmn",
3541
},
3642
["inline deletion"] = {
3743
content = "123456\nabcdefg\nhijklmn",
@@ -48,8 +54,23 @@ local cases = {
4854
},
4955
newText = "",
5056
},
57+
preview = {
58+
deletion = {
59+
range = {
60+
start = {
61+
line = 1,
62+
character = 2,
63+
},
64+
["end"] = {
65+
line = 1,
66+
character = 5,
67+
},
68+
},
69+
},
70+
},
71+
final = "123456\nabfg\nhijklmn",
5172
},
52-
["insert lines after line end"] = {
73+
["insert lines below"] = {
5374
content = "123456\nabcdefg\nhijklmn",
5475
edit = {
5576
range = {
@@ -64,8 +85,15 @@ local cases = {
6485
},
6586
newText = "\nXXXX\nYYY",
6687
},
88+
preview = {
89+
lines_insertion = {
90+
text = "XXXX\nYYY",
91+
line = 1,
92+
},
93+
},
94+
final = "123456\nabcdefg\nXXXX\nYYY\nhijklmn",
6795
},
68-
["insert lines at the beginning"] = {
96+
["insert lines above"] = {
6997
content = "123456\nabcdefg\nhijklmn",
7098
edit = {
7199
range = {
@@ -80,6 +108,14 @@ local cases = {
80108
},
81109
newText = "XXXX\nYYY\n",
82110
},
111+
preview = {
112+
lines_insertion = {
113+
text = "XXXX\nYYY",
114+
line = 1,
115+
above = true,
116+
},
117+
},
118+
final = "123456\nXXXX\nYYY\nabcdefg\nhijklmn",
83119
},
84120
["inline replacement"] = {
85121
content = "123456\nabcdefg\nhijklmn",
@@ -96,6 +132,25 @@ local cases = {
96132
},
97133
newText = "XXXX\nYYY",
98134
},
135+
preview = {
136+
deletion = {
137+
range = {
138+
["end"] = {
139+
character = 6,
140+
line = 1,
141+
},
142+
start = {
143+
character = 0,
144+
line = 0,
145+
},
146+
},
147+
},
148+
lines_insertion = {
149+
line = 1,
150+
text = "123XXXX\nYYYefg",
151+
},
152+
},
153+
final = "123XXXX\nYYYefg\nhijklmn",
99154
},
100155
["single line replacement"] = {
101156
content = "123456\nabcdefg\nhijklmn",
@@ -112,28 +167,62 @@ local cases = {
112167
},
113168
newText = "XXXX",
114169
},
170+
preview = {
171+
deletion = {
172+
range = {
173+
["end"] = {
174+
character = 6,
175+
line = 1,
176+
},
177+
start = {
178+
character = 0,
179+
line = 1,
180+
},
181+
},
182+
},
183+
lines_insertion = {
184+
line = 1,
185+
text = "XXXX",
186+
},
187+
},
188+
final = "123456\nXXXX\nhijklmn",
115189
},
116190
}
117191

118192
local function set_content(content)
119193
child.api.nvim_buf_set_lines(0, 0, -1, false, vim.split(content, "\n", { plain = true }))
120194
end
121195

196+
local function get_content()
197+
return table.concat(child.api.nvim_buf_get_lines(0, 0, -1, false), "\n")
198+
end
199+
122200
do
123201
for name, case in pairs(cases) do
124202
T["ui_preview"][name] = function()
125203
set_content(case.content)
126204
ref(child.get_screenshot())
127205

128206
child.g.inline_edit = case.edit
129-
local _preview = child.lua_func(function()
207+
local preview = child.lua_func(function()
208+
return require("copilot-lsp.nes.ui").caculate_preview(0, vim.g.inline_edit)
209+
end)
210+
eq(preview, case.preview)
211+
212+
child.g.inline_preview = preview
213+
child.lua_func(function()
130214
local ns_id = vim.api.nvim_create_namespace("nes")
131-
local bufnr = vim.api.nvim_get_current_buf()
132-
local preview = require("copilot-lsp.nes.ui").caculate_preview(bufnr, vim.g.inline_edit)
133-
require("copilot-lsp.nes.ui").display_inline_edit_preview(bufnr, ns_id, preview)
134-
return preview
215+
require("copilot-lsp.nes.ui").display_inline_edit_preview(0, ns_id, vim.g.inline_preview)
135216
end)
136217
ref(child.get_screenshot())
218+
219+
child.lua_func(function()
220+
local bufnr = vim.api.nvim_get_current_buf()
221+
vim.lsp.util.apply_text_edits({ vim.g.inline_edit }, bufnr, "utf-16")
222+
end)
223+
224+
local final = get_content()
225+
eq(final, case.final)
137226
end
138227
end
139228
end
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)