feat: improved diff

This commit is contained in:
Barrett Ruth 2023-01-02 20:56:31 -06:00
parent 85c2659ea3
commit 4f1834d34b
4 changed files with 51 additions and 65 deletions

View file

@ -3,22 +3,30 @@ local M = {}
local ic, job, util =
require 'import-cost', require 'import-cost.job', require 'import-cost.util'
local visible_strings = {}
local cache = {}
local function update_visible_strings(bufnr, data, extmark_id)
if not visible_strings[bufnr] then
visible_strings[bufnr] = {}
local function update_cache(bufnr, data, extmark_id)
if not cache[bufnr] then
cache[bufnr] = {}
end
visible_strings[bufnr][data.string] = data
visible_strings[bufnr][data.string].extmark_id = extmark_id
cache[bufnr][data.string] = data
cache[bufnr][data.string].extmark_id = extmark_id
end
local function string_visible(bufnr, string)
return visible_strings[bufnr] and visible_strings[bufnr][string]
local function set_extmark(bufnr, data)
local string = util.normalize_string(data.string)
if cache[bufnr] and cache[bufnr][string] then
return
end
data.string = string
local extmark_id = job.render_extmark(bufnr, data)
update_cache(bufnr, data, extmark_id)
end
function M.set_missing_extmarks(bufnr)
function M.set_extmarks(bufnr)
local path = vim.api.nvim_buf_get_name(bufnr)
local filetype = vim.api.nvim_buf_get_option(bufnr, 'filetype')
@ -35,16 +43,8 @@ function M.set_missing_extmarks(bufnr)
for _, chunk in ipairs(chunks) do
local data = util.parse_data(chunk)
if util.is_ok(data) then
local string = util.normalize_string(data.string)
if not string_visible(bufnr, string) then
data.string = string
local extmark_id = job.set_extmark(bufnr, data)
update_visible_strings(bufnr, data, extmark_id)
end
if data and data.size then
set_extmark(bufnr, data)
end
end
end,
@ -55,49 +55,30 @@ function M.set_missing_extmarks(bufnr)
end
function M.clear_extmarks(bufnr)
if visible_strings[bufnr] then
visible_strings[bufnr] = nil
if cache[bufnr] then
cache[bufnr] = nil
end
vim.api.nvim_buf_clear_namespace(bufnr, ic.ns_id, 0, -1)
end
function M.update_extmarks(bufnr)
local buffer_strings = M.move_existing_extmarks(bufnr)
M.delete_remaining_extmarks(bufnr, buffer_strings)
M.set_missing_extmarks(bufnr)
end
function M.move_existing_extmarks(bufnr)
local buffer_strings = {}
for nr, raw_string in ipairs(vim.api.nvim_buf_get_lines(bufnr, 0, -1, true)) do
if util.is_import_string(raw_string) then
local string = util.normalize_string(raw_string)
local data = visible_strings[bufnr][string]
buffer_strings[string] = true
if data and data.string == string then
if data.line ~= nr then
data.line = nr
job.set_extmark(bufnr, data, data.extmark_id)
end
end
end
function M.delete_extmarks(bufnr)
if not cache[bufnr] then
return
end
return buffer_strings
end
function M.delete_remaining_extmarks(bufnr, buffer_strings)
for string, data in pairs(visible_strings[bufnr]) do
if not buffer_strings[string] then
for string, data in pairs(cache[bufnr]) do
if
string
== util.normalize_string(vim.fn.getbufoneline(bufnr, data.line))
then
goto continue
else
vim.api.nvim_buf_del_extmark(bufnr, ic.ns_id, data.extmark_id)
visible_strings[bufnr][string] = nil
cache[bufnr][string] = nil
end
::continue::
end
end