fix: use the current filepath when the filepath of code block cannot be found (#1319)
This commit is contained in:
@@ -378,15 +378,15 @@ end
|
|||||||
---@return { path: string, content: string, file_type: string }[]
|
---@return { path: string, content: string, file_type: string }[]
|
||||||
function FileSelector:get_selected_files_contents()
|
function FileSelector:get_selected_files_contents()
|
||||||
local contents = {}
|
local contents = {}
|
||||||
for _, file_path in ipairs(self.selected_filepaths) do
|
for _, filepath in ipairs(self.selected_filepaths) do
|
||||||
local lines, error = Utils.read_file_from_buf_or_disk(file_path)
|
local lines, error = Utils.read_file_from_buf_or_disk(filepath)
|
||||||
lines = lines or {}
|
lines = lines or {}
|
||||||
local filetype = Utils.get_filetype(file_path)
|
local filetype = Utils.get_filetype(filepath)
|
||||||
if error ~= nil then
|
if error ~= nil then
|
||||||
Utils.error("error reading file: " .. error)
|
Utils.error("error reading file: " .. error)
|
||||||
else
|
else
|
||||||
local content = table.concat(lines, "\n")
|
local content = table.concat(lines, "\n")
|
||||||
table.insert(contents, { path = file_path, content = content, file_type = filetype })
|
table.insert(contents, { path = filepath, content = content, file_type = filetype })
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return contents
|
return contents
|
||||||
|
|||||||
@@ -523,7 +523,7 @@ end
|
|||||||
---
|
---
|
||||||
---@param response_content string
|
---@param response_content string
|
||||||
---@return table<string, AvanteCodeSnippet[]>
|
---@return table<string, AvanteCodeSnippet[]>
|
||||||
local function extract_cursor_planning_code_snippets_map(response_content)
|
local function extract_cursor_planning_code_snippets_map(response_content, current_filepath, current_filetype)
|
||||||
local snippets = {}
|
local snippets = {}
|
||||||
local current_snippet = {}
|
local current_snippet = {}
|
||||||
local in_code_block = false
|
local in_code_block = false
|
||||||
@@ -540,8 +540,18 @@ local function extract_cursor_planning_code_snippets_map(response_content)
|
|||||||
if in_code_block then
|
if in_code_block then
|
||||||
in_code_block = false
|
in_code_block = false
|
||||||
if filepath == nil or filepath == "" then
|
if filepath == nil or filepath == "" then
|
||||||
Utils.warn("Failed to parse filepath from code block")
|
if lang == current_filetype then
|
||||||
goto continue
|
filepath = current_filepath
|
||||||
|
else
|
||||||
|
Utils.warn(
|
||||||
|
string.format(
|
||||||
|
"Failed to parse filepath from code block, and current_filetype `%s` is not the same as the filetype `%s` of the current code block, so ignore this code block",
|
||||||
|
current_filetype,
|
||||||
|
lang
|
||||||
|
)
|
||||||
|
)
|
||||||
|
goto continue
|
||||||
|
end
|
||||||
end
|
end
|
||||||
table.insert(snippets, {
|
table.insert(snippets, {
|
||||||
range = { 0, 0 },
|
range = { 0, 0 },
|
||||||
@@ -762,7 +772,7 @@ end
|
|||||||
|
|
||||||
---@param buf integer
|
---@param buf integer
|
||||||
---@return AvanteCodeblock[]
|
---@return AvanteCodeblock[]
|
||||||
local function parse_codeblocks(buf)
|
local function parse_codeblocks(buf, current_filepath, current_filetype)
|
||||||
local codeblocks = {}
|
local codeblocks = {}
|
||||||
local in_codeblock = false
|
local in_codeblock = false
|
||||||
local start_line = nil
|
local start_line = nil
|
||||||
@@ -782,6 +792,7 @@ local function parse_codeblocks(buf)
|
|||||||
if not filepath then
|
if not filepath then
|
||||||
if lines[i + 1] then filepath = lines[i + 1]:match("[Ff][Ii][Ll][Ee][Pp][Aa][Tt][Hh]:%s*(.*)$") end
|
if lines[i + 1] then filepath = lines[i + 1]:match("[Ff][Ii][Ll][Ee][Pp][Aa][Tt][Hh]:%s*(.*)$") end
|
||||||
end
|
end
|
||||||
|
if not filepath and lang_ == current_filetype then filepath = current_filepath end
|
||||||
if filepath then
|
if filepath then
|
||||||
lang = lang_
|
lang = lang_
|
||||||
start_line = i - 1
|
start_line = i - 1
|
||||||
@@ -862,9 +873,13 @@ end
|
|||||||
|
|
||||||
---@param current_cursor boolean
|
---@param current_cursor boolean
|
||||||
function Sidebar:apply(current_cursor)
|
function Sidebar:apply(current_cursor)
|
||||||
|
local buf_path = api.nvim_buf_get_name(self.code.bufnr)
|
||||||
|
local current_filepath = Utils.file.is_in_cwd(buf_path) and Utils.relative_path(buf_path) or buf_path
|
||||||
|
local current_filetype = Utils.get_filetype(current_filepath)
|
||||||
|
|
||||||
local response, response_start_line = self:get_content_between_separators()
|
local response, response_start_line = self:get_content_between_separators()
|
||||||
local all_snippets_map = Config.behaviour.enable_cursor_planning_mode
|
local all_snippets_map = Config.behaviour.enable_cursor_planning_mode
|
||||||
and extract_cursor_planning_code_snippets_map(response)
|
and extract_cursor_planning_code_snippets_map(response, current_filepath, current_filetype)
|
||||||
or extract_code_snippets_map(response)
|
or extract_code_snippets_map(response)
|
||||||
if not Config.behaviour.enable_cursor_planning_mode then
|
if not Config.behaviour.enable_cursor_planning_mode then
|
||||||
all_snippets_map = ensure_snippets_no_overlap(all_snippets_map)
|
all_snippets_map = ensure_snippets_no_overlap(all_snippets_map)
|
||||||
@@ -1515,10 +1530,14 @@ function Sidebar:on_mount(opts)
|
|||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
local buf_path = api.nvim_buf_get_name(self.code.bufnr)
|
||||||
|
local current_filepath = Utils.file.is_in_cwd(buf_path) and Utils.relative_path(buf_path) or buf_path
|
||||||
|
local current_filetype = Utils.get_filetype(current_filepath)
|
||||||
|
|
||||||
api.nvim_create_autocmd({ "BufEnter", "BufWritePost" }, {
|
api.nvim_create_autocmd({ "BufEnter", "BufWritePost" }, {
|
||||||
buffer = self.result_container.bufnr,
|
buffer = self.result_container.bufnr,
|
||||||
callback = function(ev)
|
callback = function(ev)
|
||||||
codeblocks = parse_codeblocks(ev.buf)
|
codeblocks = parse_codeblocks(ev.buf, current_filepath, current_filetype)
|
||||||
self:bind_sidebar_keys(codeblocks)
|
self:bind_sidebar_keys(codeblocks)
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@@ -1533,7 +1552,7 @@ function Sidebar:on_mount(opts)
|
|||||||
then
|
then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
codeblocks = parse_codeblocks(self.result_container.bufnr)
|
codeblocks = parse_codeblocks(self.result_container.bufnr, current_filepath, current_filetype)
|
||||||
self:bind_sidebar_keys(codeblocks)
|
self:bind_sidebar_keys(codeblocks)
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
@@ -1680,11 +1699,11 @@ function Sidebar:initialize()
|
|||||||
|
|
||||||
local buf_path = api.nvim_buf_get_name(self.code.bufnr)
|
local buf_path = api.nvim_buf_get_name(self.code.bufnr)
|
||||||
-- if the filepath is outside of the current working directory then we want the absolute path
|
-- if the filepath is outside of the current working directory then we want the absolute path
|
||||||
local file_path = Utils.file.is_in_cwd(buf_path) and Utils.relative_path(buf_path) or buf_path
|
local filepath = Utils.file.is_in_cwd(buf_path) and Utils.relative_path(buf_path) or buf_path
|
||||||
Utils.debug("Sidebar:initialize adding buffer to file selector", buf_path)
|
Utils.debug("Sidebar:initialize adding buffer to file selector", buf_path)
|
||||||
|
|
||||||
self.file_selector:reset()
|
self.file_selector:reset()
|
||||||
self.file_selector:add_selected_file(file_path)
|
self.file_selector:add_selected_file(filepath)
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -914,12 +914,12 @@ function M.get_filetype(filepath)
|
|||||||
return filetype
|
return filetype
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param file_path string
|
---@param filepath string
|
||||||
---@return string[]|nil lines
|
---@return string[]|nil lines
|
||||||
---@return string|nil error
|
---@return string|nil error
|
||||||
function M.read_file_from_buf_or_disk(file_path)
|
function M.read_file_from_buf_or_disk(filepath)
|
||||||
--- Lookup if the file is loaded in a buffer
|
--- Lookup if the file is loaded in a buffer
|
||||||
local bufnr = vim.fn.bufnr(file_path)
|
local bufnr = vim.fn.bufnr(filepath)
|
||||||
if bufnr ~= -1 and vim.api.nvim_buf_is_loaded(bufnr) then
|
if bufnr ~= -1 and vim.api.nvim_buf_is_loaded(bufnr) then
|
||||||
-- If buffer exists and is loaded, get buffer content
|
-- If buffer exists and is loaded, get buffer content
|
||||||
local lines = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false)
|
local lines = vim.api.nvim_buf_get_lines(bufnr, 0, -1, false)
|
||||||
@@ -927,13 +927,12 @@ function M.read_file_from_buf_or_disk(file_path)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Fallback: read file from disk
|
-- Fallback: read file from disk
|
||||||
local file, open_err = io.open(file_path, "r")
|
local file, open_err = io.open(filepath, "r")
|
||||||
if file then
|
if file then
|
||||||
local content = file:read("*all")
|
local content = file:read("*all")
|
||||||
file:close()
|
file:close()
|
||||||
return vim.split(content, "\n"), nil
|
return vim.split(content, "\n"), nil
|
||||||
else
|
else
|
||||||
-- M.error("failed to open file: " .. file_path .. " with error: " .. open_err)
|
|
||||||
return {}, open_err
|
return {}, open_err
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user