Skip to content

Commit cf4e49b

Browse files
committedJun 24, 2022
diagnostic group
1 parent 2738409 commit cf4e49b

File tree

5 files changed

+106
-10
lines changed

5 files changed

+106
-10
lines changed
 

‎script/config/template.lua

+7-1
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,10 @@ local template = {
239239
'Warning',
240240
'Information',
241241
'Hint',
242+
'Error!',
243+
'Warning!',
244+
'Information!',
245+
'Hint!',
242246
}
243247
)
244248
>> util.deepCopy(define.DiagnosticDefaultSeverity),
@@ -248,6 +252,9 @@ local template = {
248252
'Any',
249253
'Opened',
250254
'None',
255+
'Any!',
256+
'Opened!',
257+
'None!',
251258
}
252259
)
253260
>> util.deepCopy(define.DiagnosticDefaultNeededFileStatus),
@@ -285,7 +292,6 @@ local template = {
285292
'Opened',
286293
'Disable',
287294
},
288-
['Lua.typeCheck.enable'] = Type.Boolean >> true,
289295
['Lua.workspace.ignoreDir'] = Type.Array(Type.String) >> {
290296
'.vscode',
291297
},

‎script/core/diagnostics/init.lua

+65-9
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ local config = require 'config'
44
local await = require 'await'
55
local vm = require "vm.vm"
66
local util = require 'utility'
7+
local diagd = require 'proto.diagnostic'
78

89
-- 把耗时最长的诊断放到最后面
910
local diagSort = {
@@ -50,6 +51,64 @@ local function checkSleep(uri, passed)
5051
sleepRest = sleepRest - sleeped
5152
end
5253

54+
---@param uri uri
55+
---@param name string
56+
---@return string
57+
local function getSeverity(uri, name)
58+
local severity = config.get(uri, 'Lua.diagnostics.severity')[name]
59+
or define.DiagnosticDefaultSeverity[name]
60+
if severity:sub(-1) == '!' then
61+
return severity:sub(1, -2)
62+
end
63+
local groupSeverity = config.get(uri, 'Lua.diagnostics.groupSeverity')
64+
local groups = diagd.getGroups(name)
65+
local groupLevel = 999
66+
for _, groupName in ipairs(groups) do
67+
local gseverity = groupSeverity[groupName]
68+
if gseverity ~= 'Fallback' then
69+
groupLevel = math.min(groupLevel, define.DiagnosticSeverity[gseverity])
70+
end
71+
end
72+
if groupLevel == 999 then
73+
return severity
74+
end
75+
for severityName, level in pairs(define.DiagnosticSeverity) do
76+
if level == groupLevel then
77+
return severityName
78+
end
79+
end
80+
return severity
81+
end
82+
83+
---@param uri uri
84+
---@param name string
85+
---@return string
86+
local function getStatus(uri, name)
87+
local status = config.get(uri, 'Lua.diagnostics.neededFileStatus')[name]
88+
or define.DiagnosticDefaultNeededFileStatus[name]
89+
if status:sub(-1) == '!' then
90+
return status:sub(1, -2)
91+
end
92+
local groupStatus = config.get(uri, 'Lua.diagnostics.groupFileStatus')
93+
local groups = diagd.getGroups(name)
94+
local groupLevel = 0
95+
for _, groupName in ipairs(groups) do
96+
local gstatus = groupStatus[groupName]
97+
if gstatus ~= 'Fallback' then
98+
groupLevel = math.max(groupLevel, define.DiagnosticFileStatus[gstatus])
99+
end
100+
end
101+
if groupLevel == 0 then
102+
return status
103+
end
104+
for statusName, level in pairs(define.DiagnosticFileStatus) do
105+
if level == groupLevel then
106+
return statusName
107+
end
108+
end
109+
return status
110+
end
111+
53112
---@async
54113
---@param uri uri
55114
---@param name string
@@ -60,21 +119,18 @@ local function check(uri, name, isScopeDiag, response)
60119
if util.arrayHas(disables, name) then
61120
return
62121
end
63-
local level = config.get(uri, 'Lua.diagnostics.severity')[name]
64-
or define.DiagnosticDefaultSeverity[name]
65-
66-
local neededFileStatus = config.get(uri, 'Lua.diagnostics.neededFileStatus')[name]
67-
or define.DiagnosticDefaultNeededFileStatus[name]
122+
local severity = getSeverity(uri, name)
123+
local status = getStatus(uri, name)
68124

69-
if neededFileStatus == 'None' then
125+
if status == 'None' then
70126
return
71127
end
72128

73-
if neededFileStatus == 'Opened' and not files.isOpen(uri) then
129+
if status == 'Opened' and not files.isOpen(uri) then
74130
return
75131
end
76132

77-
local severity = define.DiagnosticSeverity[level]
133+
local level = define.DiagnosticSeverity[severity]
78134
local clock = os.clock()
79135
local mark = {}
80136
---@async
@@ -90,7 +146,7 @@ local function check(uri, name, isScopeDiag, response)
90146
end
91147
mark[result.start] = true
92148

93-
result.level = severity or result.level
149+
result.level = level or result.level
94150
result.code = name
95151
response(result)
96152
end, name)

‎script/proto/define.lua

+6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,12 @@ m.DiagnosticSeverity = {
1010
Hint = 4,
1111
}
1212

13+
m.DiagnosticFileStatus = {
14+
Any = 1,
15+
Opened = 2,
16+
None = 3,
17+
}
18+
1319
--- 诊断类型与默认等级
1420
m.DiagnosticDefaultSeverity = diag.getDefaultSeverity()
1521

‎script/proto/diagnostic.lua

+15
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
local util = require 'utility'
2+
13
---@class proto.diagnostic
24
local m = {}
35

@@ -217,4 +219,17 @@ function m.getGroupStatus()
217219
return group
218220
end
219221

222+
---@param name string
223+
---@return string[]
224+
m.getGroups = util.catchReturn(function (name)
225+
local groups = {}
226+
for groupName, nameMap in pairs(m.diagnosticGroups) do
227+
if nameMap[name] then
228+
groups[#groups+1] = groupName
229+
end
230+
end
231+
table.sort(groups)
232+
return groups
233+
end)
234+
220235
return m

‎script/utility.lua

+13
Original file line numberDiff line numberDiff line change
@@ -832,4 +832,17 @@ m.MODE_K = { __mode = 'k' }
832832
m.MODE_V = { __mode = 'v' }
833833
m.MODE_KV = { __mode = 'kv' }
834834

835+
---@generic T: fun(param: any):any
836+
---@param func T
837+
---@return T
838+
function m.catchReturn(func)
839+
local cache = {}
840+
return function (param)
841+
if cache[param] == nil then
842+
cache[param] = func(param)
843+
end
844+
return cache[param]
845+
end
846+
end
847+
835848
return m

0 commit comments

Comments
 (0)
Please sign in to comment.