@@ -4,6 +4,7 @@ local config = require 'config'
4
4
local await = require ' await'
5
5
local vm = require " vm.vm"
6
6
local util = require ' utility'
7
+ local diagd = require ' proto.diagnostic'
7
8
8
9
-- 把耗时最长的诊断放到最后面
9
10
local diagSort = {
@@ -50,6 +51,64 @@ local function checkSleep(uri, passed)
50
51
sleepRest = sleepRest - sleeped
51
52
end
52
53
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
+
53
112
--- @async
54
113
--- @param uri uri
55
114
--- @param name string
@@ -60,21 +119,18 @@ local function check(uri, name, isScopeDiag, response)
60
119
if util .arrayHas (disables , name ) then
61
120
return
62
121
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 )
68
124
69
- if neededFileStatus == ' None' then
125
+ if status == ' None' then
70
126
return
71
127
end
72
128
73
- if neededFileStatus == ' Opened' and not files .isOpen (uri ) then
129
+ if status == ' Opened' and not files .isOpen (uri ) then
74
130
return
75
131
end
76
132
77
- local severity = define .DiagnosticSeverity [level ]
133
+ local level = define .DiagnosticSeverity [severity ]
78
134
local clock = os.clock ()
79
135
local mark = {}
80
136
--- @async
@@ -90,7 +146,7 @@ local function check(uri, name, isScopeDiag, response)
90
146
end
91
147
mark [result .start ] = true
92
148
93
- result .level = severity or result .level
149
+ result .level = level or result .level
94
150
result .code = name
95
151
response (result )
96
152
end , name )
0 commit comments