Acquis 14 - Pedantic Warnings
The -Wpedantic flag enables AST-based warnings that identify Lua idioms which can be improved using Lus features. This flag should ideally only be used during development and be avoided in production as it force-enables AST generation for every chunk, which increases memory usage and slows down code generation.
Usage
lus -Wpedantic script.lus
Warnings are printed to stderr using the standard warning format:
Lua warning: filename:line: message
Warnings
W1: Pledge After Seal
Calling pledge() after pledge("seal") has no effect because permissions are frozen.
pledge("fs")
pledge("seal")
pledge("network") -- Warning: pledge() after pledge("seal") has no effect
W2: pcall/xpcall Deprecation
References to pcall or xpcall suggest using the catch expression instead (Acquis 1).
local ok, err = pcall(risky) -- Warning: 'pcall' is deprecated, use 'catch'
Use instead:
local ok, result = catch risky()
W3: Moveable Local Declaration
Local variables that are only used in the immediately following if or while condition can be moved into the condition using assignment syntax (Acquis 3, Acquis 13).
local x = getValue()
if x then -- Warning: local declaration can be moved to if condition
process(x)
end
Use instead:
if x = getValue() then
process(x)
end
W4: And-Chain for Optional Chaining
Multi-level and chains checking for nil can use optional chaining (Acquis 2).
local port = cfg and cfg.server and cfg.server.port
-- Warning: and-chain can use optional chaining: x?.y?.z
Use instead:
local port = cfg?.server?.port
This also applies to nested if x ~= nil checks:
if cfg ~= nil then
if cfg.server ~= nil then
print(cfg.server.port)
end
end
-- Warning: nested nil checks can use optional chaining: x?.y?.z
W5: Manual Table Deconstruction
Pattern of extracting multiple fields from a table can use from syntax (Acquis 4).
local a, b, c = t.a, t.b, t.c
-- Warning: use 'from' destructuring: local ... from t
Use instead:
local a, b, c from t
Combining with -W
The -Wpedantic flag implies -W (enables runtime warnings), so both compile-time pedantic warnings and runtime warn() calls are active.