.dotfiles/nvim/mason/packages/lua-language-server/libexec/script/cli/check.lua

107 lines
3.0 KiB
Lua

local lclient = require 'lclient'
local furi = require 'file-uri'
local ws = require 'workspace'
local files = require 'files'
local diag = require 'provider.diagnostic'
local util = require 'utility'
local jsonb = require 'json-beautify'
local lang = require 'language'
local define = require 'proto.define'
local config = require 'config.config'
local fs = require 'bee.filesystem'
local provider = require 'provider'
require 'vm'
lang(LOCALE)
if type(CHECK) ~= 'string' then
print(lang.script('CLI_CHECK_ERROR_TYPE', type(CHECK)))
return
end
local rootPath = fs.absolute(fs.path(CHECK)):string()
local rootUri = furi.encode(rootPath)
if not rootUri then
print(lang.script('CLI_CHECK_ERROR_URI', rootPath))
return
end
if CHECKLEVEL then
if not define.DiagnosticSeverity[CHECKLEVEL] then
print(lang.script('CLI_CHECK_ERROR_LEVEL', 'Error, Warning, Information, Hint'))
return
end
end
local checkLevel = define.DiagnosticSeverity[CHECKLEVEL] or define.DiagnosticSeverity.Warning
util.enableCloseFunction()
local lastClock = os.clock()
local results = {}
---@async
lclient():start(function (client)
client:registerFakers()
client:initialize {
rootUri = rootUri,
}
client:register('textDocument/publishDiagnostics', function (params)
results[params.uri] = params.diagnostics
end)
io.write(lang.script('CLI_CHECK_INITING'))
provider.updateConfig(rootUri)
ws.awaitReady(rootUri)
local disables = util.arrayToHash(config.get(rootUri, 'Lua.diagnostics.disable'))
for name, serverity in pairs(define.DiagnosticDefaultSeverity) do
serverity = config.get(rootUri, 'Lua.diagnostics.severity')[name] or 'Warning'
if serverity:sub(-1) == '!' then
serverity = serverity:sub(1, -2)
end
if define.DiagnosticSeverity[serverity] > checkLevel then
disables[name] = true
end
end
config.set(rootUri, 'Lua.diagnostics.disable', util.getTableKeys(disables, true))
local uris = files.getAllUris(rootUri)
local max = #uris
for i, uri in ipairs(uris) do
files.open(uri)
diag.doDiagnostic(uri, true)
if os.clock() - lastClock > 0.2 then
lastClock = os.clock()
local output = '\x0D'
.. ('>'):rep(math.ceil(i / max * 20))
.. ('='):rep(20 - math.ceil(i / max * 20))
.. ' '
.. ('0'):rep(#tostring(max) - #tostring(i))
.. tostring(i) .. '/' .. tostring(max)
io.write(output)
end
end
io.write('\x0D')
end)
local count = 0
for uri, result in pairs(results) do
count = count + #result
if #result == 0 then
results[uri] = nil
end
end
if count == 0 then
print(lang.script('CLI_CHECK_SUCCESS'))
else
local outpath = LOGPATH .. '/check.json'
util.saveFile(outpath, jsonb.beautify(results))
print(lang.script('CLI_CHECK_RESULTS', count, outpath))
end