nixos/lua-lsp/script/core/modifyRequirePath.lua

75 lines
2.1 KiB
Lua

local files = require 'files'
local await = require 'await'
local guide = require 'parser.guide'
local rpath = require 'workspace.require-path'
local furi = require 'file-uri'
local util = require 'utility'
local client = require 'client'
local lang = require 'language'
---@alias rename { oldUri: uri, newUri: uri }
---@param changes table[]
---@param uri uri
---@param renames rename[]
local function checkConvert(changes, uri, renames)
local state = files.getState(uri)
if not state then
return
end
guide.eachSpecialOf(state.ast, 'require', function (source)
local call = source.parent
if call.type ~= 'call' then
return
end
local nameObj = call.args and call.args[1]
if not nameObj then
return
end
local name = nameObj.type == 'string' and nameObj[1]
if type(name) ~= 'string' then
return
end
for _, rename in ipairs(renames) do
if rpath.isMatchedUri(uri, rename.oldUri, name) then
local visibles = rpath.getVisiblePath(uri, furi.decode(rename.newUri))
if #visibles > 0 then
local newName = visibles[1].name
changes[#changes+1] = {
uri = uri,
start = nameObj.start,
finish = nameObj.finish,
text = util.viewString(newName, nameObj[2]),
}
return
end
end
end
end)
end
---@async
---@param renames rename[]
return function (renames)
if #renames == 0 then
return
end
local changes = {}
for uri in files.eachFile() do
checkConvert(changes, uri, renames)
await.delay()
end
if #changes == 0 then
return
end
local _, index = client.awaitRequestMessage('Info', lang.script.WINDOW_MODIFY_REQUIRE_PATH, {
lang.script.WINDOW_MODIFY_REQUIRE_OK
})
if index == 1 then
client.editMultiText(changes)
end
end