11local table = _G .table
2+ local table_insert = table.insert
23local type = type
34local ipairs = ipairs
45local tostring = tostring
@@ -89,7 +90,8 @@ return function(META--[[#: any]])
8990
9091 function META :ReportDiagnostic (
9192 msg --[[ #: {reasons = {[number] = string}} | {[number] = string}]] ,
92- severity --[[ #: "warning" | "error"]] ,
93+ severity --[[ #: "warning" | "error" | "fatal"]] ,
94+ level --[[ #: number | nil]] ,
9395 node --[[ #: any]] ,
9496 code --[[ #: any]] ,
9597 start --[[ #: number]] ,
@@ -109,10 +111,22 @@ return function(META--[[#: any]])
109111
110112 local msg_str = error_messages .ErrorMessageToString (msg )
111113
114+ if
115+ severity == " error" and
116+ (
117+ msg_str :find (" does not exist" , nil , true ) or
118+ msg_str :find (" has no key" , nil , true )
119+ )
120+ then
121+ severity = " warning"
122+ level = 1
123+ end
124+
112125 if self .processing_deferred_calls then
113126 msg_str = " DEFERRED CALL: " .. msg_str
114127 end
115128
129+ --[[
116130 if
117131 self.expect_diagnostic and
118132 self.expect_diagnostic[1] and
@@ -127,9 +141,18 @@ return function(META--[[#: any]])
127141 table.remove(self.expect_diagnostic, 1)
128142 return
129143 end
130-
144+ ]]
131145 do
132- local key = msg_str .. " -" .. " severity" .. start .. " -" .. stop
146+ local key = msg_str .. " -" .. (
147+ severity or
148+ " error"
149+ ) .. " -" .. (
150+ start or
151+ 0
152+ ) .. " -" .. (
153+ stop or
154+ 0
155+ )
133156 self .diagnostics_map = self .diagnostics_map or {}
134157
135158 if self .diagnostics_map [key ] then return end
@@ -138,10 +161,10 @@ return function(META--[[#: any]])
138161 end
139162
140163 if self .OnDiagnostic and not self :IsTypeProtectedCall () then
141- self :OnDiagnostic (code , msg_str , severity , start , stop , node )
164+ self :OnDiagnostic (code , msg_str , severity , start , stop , node , level )
142165 end
143166
144- table.insert (
167+ table_insert (
145168 self .diagnostics ,
146169 {
147170 node = node ,
@@ -150,6 +173,7 @@ return function(META--[[#: any]])
150173 stop = stop ,
151174 msg = msg_str ,
152175 severity = severity ,
176+ level = level ,
153177 traceback = callstack .traceback (),
154178 protected_call = self :IsTypeProtectedCall (),
155179 }
@@ -172,19 +196,55 @@ return function(META--[[#: any]])
172196 end
173197 end
174198
175- function META :Error (msg , node )
199+ function META :Error (msg , level_or_node , node )
200+ local level
201+
202+ if type (level_or_node ) == " number" then
203+ level = level_or_node
204+ else
205+ node = level_or_node
206+ end
207+
176208 node = node or self :GetCurrentExpression () or self :GetCurrentStatement ()
177- self :ReportDiagnostic (msg , " error" , node , node .Code , node :GetStartStop ())
209+ local start , stop = 0 , 0
210+
211+ if node then start , stop = node :GetStartStop () end
212+
213+ self :ReportDiagnostic (msg , " error" , level , node , node and node .Code , start , stop )
178214 end
179215
180- function META :Warning (msg , node )
216+ function META :Warning (msg , level_or_node , node )
217+ local level
218+
219+ if type (level_or_node ) == " number" then
220+ level = level_or_node
221+ else
222+ node = level_or_node
223+ end
224+
181225 node = node or self :GetCurrentExpression () or self :GetCurrentStatement ()
182- self :ReportDiagnostic (msg , " warning" , node , node .Code , node :GetStartStop ())
226+ local start , stop = 0 , 0
227+
228+ if node then start , stop = node :GetStartStop () end
229+
230+ self :ReportDiagnostic (msg , " warning" , level , node , node and node .Code , start , stop )
183231 end
184232
185- function META :FatalError (msg )
186- local node = self :GetCurrentExpression () or self :GetCurrentStatement ()
187- self :ReportDiagnostic (msg , " fatal" , node , node .Code , node :GetStartStop ())
233+ function META :FatalError (msg , level_or_node , node )
234+ local level
235+
236+ if type (level_or_node ) == " number" then
237+ level = level_or_node
238+ else
239+ node = level_or_node
240+ end
241+
242+ local node = node or self :GetCurrentExpression () or self :GetCurrentStatement ()
243+ local start , stop = 0 , 0
244+
245+ if node then start , stop = node :GetStartStop () end
246+
247+ self :ReportDiagnostic (msg , " fatal" , level , node , node and node .Code , start , stop )
188248 error (msg , 2 )
189249 end
190250
0 commit comments