summaryrefslogtreecommitdiff
path: root/script/cli/check.lua
blob: 3902c4aaefead2929df4e4c5f90a7598939f34e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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 'plugin'
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
rootUri = rootUri:gsub("/$", "")

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 = {}

local function errorhandler(err)
	print(err)
	print(debug.traceback())
end

---@async
xpcall(lclient.start, errorhandler, lclient, 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.getChildFiles(rootUri)
    local max  = #uris
    for i, uri in ipairs(uris) do
        files.open(uri)
        diag.doDiagnostic(uri, true)
		-- Print regularly but always print the last entry to ensure that logs written to files don't look incomplete.
        if os.clock() - lastClock > 0.2 or i == #uris then
            lastClock = os.clock()
			client:update()
            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)
			local filesWithErrors = 0
			local errors = 0
			for _, diags in pairs(results) do
				filesWithErrors = filesWithErrors + 1
				errors = errors + #diags
			end
			if errors > 0 then
				local errorDetails = ' [' .. lang.script('CLI_CHECK_PROGRESS', errors, filesWithErrors) .. ']'
				io.write(errorDetails)
			end
            io.flush()
        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 = CHECK_OUT_PATH
    if outpath == nil then
        outpath = LOGPATH .. '/check.json'
    end
    util.saveFile(outpath, jsonb.beautify(results))

    print(lang.script('CLI_CHECK_RESULTS', count, outpath))
end