Skip to content

Commit 67caf23

Browse files
committed
refactoring
1 parent 23db2ff commit 67caf23

File tree

10 files changed

+66
-92
lines changed

10 files changed

+66
-92
lines changed

nattlua/analyzer/base/base_analyzer.lua

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,8 @@ return function(META)
357357
return tostring(msg)
358358
end
359359

360+
local traceback = nil
361+
360362
local function on_error_safe(msg)
361363
local ok, ret = pcall(on_error, msg)
362364

@@ -368,7 +370,8 @@ return function(META)
368370
ret = "error in nattlua error handling"
369371
end
370372

371-
return ret, debug.traceback()
373+
traceback = callstack.traceback()
374+
return ret
372375
end
373376

374377
function META:CallLuaTypeFunction(func, scope, args)
@@ -378,8 +381,8 @@ return function(META)
378381
current_func = nil
379382

380383
if not ok then
381-
local err = a
382-
local trace = b
384+
local err = assert(a)
385+
local trace = traceback
383386
local stack = self:GetCallStack()
384387

385388
if stack[1] then self:PushCurrentExpression(stack[#stack].call_node) end

nattlua/analyzer/base/error_handling.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ return function(META)
8080
return ok, err, ...
8181
end
8282

83-
function META:ErrorAssert(ok, err)
83+
function META:AssertFatal(ok, err)
8484
if not ok then
8585
error(error_messages.ErrorMessageToString(err or "assertion failed!"), 2)
8686
end

nattlua/analyzer/operators/call.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ end
113113
local function table_call(self, analyzer, input, call_node)
114114
if not self:GetMetaTable() then
115115
return false,
116-
error_messages.because(error_messages.table_index(self, "__call"), "it has no metatable")
116+
error_messages.because(error_messages.table_index(self, "__call"), {"it has no metatable"})
117117
end
118118

119119
local __call, reason = self:GetMetaTable():Get(ConstString("__call"))

nattlua/analyzer/operators/function_call_analyzer.lua

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -181,12 +181,7 @@ return function(analyzer, obj, input)
181181
if errors then
182182
for _, error in ipairs(errors) do
183183
local reason, a, b, i = table.unpack(error)
184-
analyzer:Error(
185-
error_messages.context(
186-
"argument #" .. i .. ":",
187-
error_messages.because(error_messages.subset(a, b), reason)
188-
)
189-
)
184+
analyzer:Error(error_messages.argument(i, error_messages.because(error_messages.subset(a, b), reason)))
190185
end
191186
end
192187

@@ -243,10 +238,7 @@ return function(analyzer, obj, input)
243238
for i, v in ipairs(err) do
244239
local reason, a, b, i = table.unpack(v)
245240
analyzer:Error(
246-
error_messages.context(
247-
"return #" .. i .. ":",
248-
error_messages.because(error_messages.subset(a, b), reason)
249-
)
241+
error_messages.return_(i, error_messages.because(error_messages.subset(a, b), reason))
250242
)
251243
end
252244
end

nattlua/analyzer/operators/function_call_body.lua

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,7 @@ local function check_argument_against_contract(self, arg, contract, i)
6262
ok, reason = arg:IsSubsetOf(contract)
6363
end
6464

65-
if not ok then
66-
return false, error_messages.context("argument #" .. i .. ":", reason)
67-
end
65+
if not ok then return false, error_messages.argument(i, reason) end
6866

6967
return true
7068
end
@@ -112,9 +110,7 @@ return function(self, obj, input)
112110
if errors then
113111
for i, v in ipairs(errors) do
114112
local reason, a, b, i = table.unpack(v)
115-
self:Error(
116-
error_messages.context("argument #" .. i .. ":", error_messages.because(error_messages.subset(a, b), reason))
117-
)
113+
self:Error(error_messages.argument(i, error_messages.because(error_messages.subset(a, b), reason)))
118114
end
119115
end
120116

@@ -169,9 +165,7 @@ return function(self, obj, input)
169165
arg:SetReferenceType(true)
170166
local ok, err = check_argument_against_contract(self, arg, contract, i)
171167

172-
if not ok then
173-
self:Error(error_messages.context("argument #" .. i, err))
174-
end
168+
if not ok then self:Error(error_messages.argument(i, err)) end
175169

176170
signature_override[i] = arg
177171
elseif type_expression then
@@ -186,7 +180,7 @@ return function(self, obj, input)
186180

187181
if not val then
188182
val = Any()
189-
self:Error(error_messages.context("argument #" .. i, err))
183+
self:Error(error_messages.argument(i, err))
190184
end
191185

192186
self:CreateLocalValue(identifier, val)
@@ -561,9 +555,7 @@ return function(self, obj, input)
561555
if err then
562556
for i, v in ipairs(err) do
563557
local reason, a, b, i = table.unpack(v)
564-
self:Error(
565-
error_messages.context("return #" .. i .. ":", error_messages.because(error_messages.subset(a, b), reason))
566-
)
558+
self:Error(error_messages.return_(i, error_messages.because(error_messages.subset(a, b), reason)))
567559
end
568560
end
569561

@@ -634,7 +626,7 @@ return function(self, obj, input)
634626
self:PushCurrentStatement(function_node)
635627
self:PushCurrentExpression(function_node.return_types and function_node.return_types[i])
636628
self:Error(
637-
error_messages.context("return #" .. i .. ":", error_messages.because(error_messages.subset(a, b), reason))
629+
error_messages.return_(i, error_messages.because(error_messages.subset(a, b), reason))
638630
)
639631
self:PopCurrentExpression()
640632
self:PopCurrentStatement()

nattlua/analyzer/operators/function_call_function_signature.lua

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ return function(analyzer, obj, input)
88
if errors then
99
for _, error in ipairs(errors) do
1010
local reason, a, b, i = error[1], error[2], error[3], error[4]
11-
analyzer:Error(
12-
error_messages.context("argument #" .. i .. ":", error_messages.because(error_messages.subset(a, b), reason))
13-
)
11+
analyzer:Error(error_messages.argument(i, error_messages.because(error_messages.subset(a, b), reason)))
1412
end
1513
end
1614

nattlua/definitions/attest.nlua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,17 @@ end
2929
SetPreventInputExpansionOnFunction<|attest.equal, true|>
3030

3131
analyzer function attest.literal(A: any)
32-
analyzer:ErrorAssert(A:IsLiteral())
32+
analyzer:AssertFatal(A:IsLiteral())
3333
return A
3434
end
3535

3636
analyzer function attest.superset_of(A: any, B: any)
37-
analyzer:ErrorAssert(B:IsSubsetOf(A))
37+
analyzer:AssertFatal(B:IsSubsetOf(A))
3838
return A
3939
end
4040

4141
analyzer function attest.subset_of(A: any, B: any)
42-
analyzer:ErrorAssert(A:IsSubsetOf(B))
42+
analyzer:AssertFatal(A:IsSubsetOf(B))
4343
return A
4444
end
4545

nattlua/error_messages.lua

Lines changed: 33 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ local table_concat = table.concat
77
local tostring = _G.tostring
88
local callstack = require("nattlua.other.callstack")
99
local error_messages = {}
10-
--[[#local type Reason = string | {[number] = any | string}]]
10+
--[[#local type Reason = {[number] = any | string}]]
1111

1212
function error_messages.ErrorMessageToString(tbl--[[#: List<|string | Reason|>]])--[[#: string]]
1313
local out = {}
@@ -27,37 +27,34 @@ function error_messages.ErrorMessageToString(tbl--[[#: List<|string | Reason|>]]
2727
return table_concat(out, " ")
2828
end
2929

30-
function error_messages.because(msg--[[#: Reason]], reason--[[#: nil | Reason]])--[[#: Reason]]
31-
if type(msg) ~= "table" then msg = {msg} end
32-
33-
if reason then
34-
if type(reason) ~= "table" then reason = {reason} end
35-
36-
table_insert(msg, "because")
37-
table_insert(msg, reason)
38-
end
39-
30+
function error_messages.because(msg--[[#: Reason]], reason--[[#: Reason]])--[[#: Reason]]
31+
table_insert(msg, "because")
32+
table_insert(msg, reason)
4033
return msg
4134
end
4235

43-
function error_messages.context(context--[[#: Reason]], reason--[[#: Reason]])--[[#: Reason]]
44-
if type(context) ~= "table" then context = {context} end
36+
function error_messages.argument(i--[[#: number]], reason--[[#: Reason]])
37+
return {"argument #", i, ":", reason}
38+
end
4539

46-
if type(reason) ~= "table" then
47-
reason = {context, reason}
48-
else
49-
reason = {context, reason[1], reason[2], reason[3], reason[4], reason[5], reason[6]}
50-
end
40+
function error_messages.return_(i--[[#: number]], reason--[[#: Reason]])
41+
return {"return #", i, ":", reason}
42+
end
43+
44+
function error_messages.table_key(reason--[[#: Reason]])
45+
return {"the key", reason}
46+
end
5147

52-
return reason
48+
function error_messages.table_value(reason--[[#: Reason]])
49+
return {"the value", reason}
5350
end
5451

5552
do -- string pattern
5653
function error_messages.string_pattern_invalid_construction(a--[[#: any]])--[[#: Reason]]
57-
return error_messages.context(
54+
return {
5855
"string pattern must be a string literal, but",
59-
error_messages.subset(a, "literal string")
60-
)
56+
error_messages.subset(a, "literal string"),
57+
}
6158
end
6259

6360
function error_messages.string_pattern_match_fail(a--[[#: any]], b--[[#: any]])--[[#: Reason]]
@@ -71,10 +68,12 @@ do -- string pattern
7168
end
7269

7370
function error_messages.string_pattern_type_mismatch(a--[[#: any]])--[[#: Reason]]
74-
return error_messages.context(
75-
{"to compare against a string pattern,", a, "must be a string literal, but"},
76-
error_messages.subset(a, "literal string")
77-
)
71+
return {
72+
"to compare against a string pattern,",
73+
a,
74+
"must be a string literal, but",
75+
error_messages.subset(a, "literal string"),
76+
}
7877
end
7978
end
8079

@@ -226,24 +225,12 @@ function error_messages.mutating_function_argument(obj--[[#: any]], i--[[#: numb
226225
return {
227226
"mutating function argument ",
228227
obj,
229-
" #" .. i,
228+
" #",
229+
i,
230230
" without a contract",
231231
}
232232
end
233233

234-
function error_messages.return_type_mismatch(
235-
function_node--[[#: any]],
236-
output_signature--[[#: any]],
237-
output--[[#: any]],
238-
reason--[[#: Reason]],
239-
i--[[#: number]]
240-
)
241-
return error_messages.context(
242-
"expected return type " .. tostring(output_signature) .. ", but found " .. tostring(output) .. " at return #" .. i .. ":",
243-
reason
244-
)
245-
end
246-
247234
function error_messages.global_assignment(key--[[#: any]], val--[[#: any]])--[[#: Reason]]
248235
return {"_G[", key, "] = ", val}
249236
end
@@ -272,7 +259,8 @@ function error_messages.mutating_immutable_function_argument(obj--[[#: any]], i-
272259
return {
273260
"mutating function argument",
274261
obj,
275-
"#" .. i,
262+
"#",
263+
i,
276264
"with an immutable contract",
277265
}
278266
end
@@ -303,7 +291,8 @@ end
303291

304292
function error_messages.argument_mutation(i--[[#: number]], arg--[[#: any]])--[[#: Reason]]
305293
return {
306-
"argument #" .. i,
294+
"argument #",
295+
i,
307296
arg,
308297
"can be mutated by external call",
309298
}
@@ -329,7 +318,7 @@ function error_messages.invalid_number(value--[[#: any]])--[[#: Reason]]
329318
end
330319

331320
function error_messages.typeof_lookup_missing(type_name--[[#: string]])--[[#: Reason]]
332-
return {"cannot find '" .. type_name .. "' in the current typesystem scope"}
321+
return {"cannot find '", type_name, "' in the current typesystem scope"}
333322
end
334323

335324
function error_messages.plain_error(msg--[[#: any]])--[[#: Reason]]
@@ -341,7 +330,7 @@ function error_messages.analyzer_error(msg, trace)--[[#: Reason]]
341330
end
342331

343332
function error_messages.too_many_combinations(total--[[#: number]], max--[[#: number]])--[[#: Reason]]
344-
return {"too many argument combinations (" .. total .. " > " .. max .. ")"}
333+
return {"too many argument combinations (", total, " > ", max, ")"}
345334
end
346335

347336
do

nattlua/types/table.lua

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ function META:FollowsContract(contract--[[#: TTable]])
315315

316316
if not ok then
317317
return false,
318-
error_messages.because(error_messages.context("the key", error_messages.subset(res.key, keyval.key)), err)
318+
error_messages.because(error_messages.table_key(error_messages.subset(res.key, keyval.key)), err)
319319
end
320320
end
321321
else
@@ -330,7 +330,7 @@ function META:FollowsContract(contract--[[#: TTable]])
330330

331331
if not ok then
332332
return false,
333-
error_messages.because(error_messages.context("the key", error_messages.subset(keyval2.key, keyval.key)), err)
333+
error_messages.because(error_messages.table_key(error_messages.subset(keyval2.key, keyval.key)), err)
334334
end
335335
end
336336
end
@@ -352,7 +352,7 @@ function META:FollowsContract(contract--[[#: TTable]])
352352

353353
if not ok then
354354
return false,
355-
error_messages.because(error_messages.context("the value", error_messages.subset(res.val, keyval.val)), err)
355+
error_messages.because(error_messages.table_value(error_messages.subset(res.val, keyval.val)), err)
356356
end
357357
end
358358
end
@@ -665,10 +665,11 @@ function META:FindKeyValExact(key--[[#: TBaseType]])
665665
end
666666

667667
if not reasons[1] then
668-
reasons[1] = error_messages.because(error_messages.table_index(self, key), "table is empty")
668+
reasons[1] = error_messages.because(error_messages.table_index(self, key), {"table is empty"})
669669
end
670670

671-
return false, error_messages.because(error_messages.table_index(self, key), reasons)
671+
return false,
672+
error_messages.because(error_messages.table_index(self, key), reasons)
672673
end
673674

674675
function META:FindKeyValWide(key--[[#: TBaseType]], reverse--[[#: boolean | nil]])
@@ -705,10 +706,11 @@ function META:FindKeyValWide(key--[[#: TBaseType]], reverse--[[#: boolean | nil]
705706
end
706707

707708
if not reasons[1] then
708-
reasons[1] = error_messages.because(error_messages.table_index(self, key), "table is empty")
709+
reasons[1] = error_messages.because(error_messages.table_index(self, key), {"table is empty"})
709710
end
710711

711-
return false, error_messages.because(error_messages.table_index(self, key), reasons)
712+
return false,
713+
error_messages.because(error_messages.table_index(self, key), reasons)
712714
end
713715

714716
function META:Set(key--[[#: TBaseType]], val--[[#: TBaseType | nil]], no_delete--[[#: boolean | nil]])
@@ -1031,7 +1033,7 @@ function META:HasLiteralKeys()
10311033

10321034
if not ok then
10331035
return false,
1034-
error_messages.because(error_messages.context("the key", error_messages.not_literal(v.key)), reason)
1036+
error_messages.table_key(error_messages.not_literal(v.key))
10351037
end
10361038
end
10371039
end
@@ -1056,17 +1058,15 @@ function META:IsLiteral()
10561058
self.suppress = false
10571059

10581060
if not ok then
1059-
return false,
1060-
error_messages.because(error_messages.context("the key", error_messages.not_literal(v.key)), reason)
1061+
return false
10611062
end
10621063

10631064
self.suppress = true
10641065
local ok, reason = v.val:IsLiteral()
10651066
self.suppress = false
10661067

10671068
if not ok then
1068-
return false,
1069-
error_messages.because(error_messages.context("the value", error_messages.not_literal(v.val)), reason)
1069+
return false
10701070
end
10711071
end
10721072
end

0 commit comments

Comments
 (0)