You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-- All global variables must be 'declared' through a regular assignment
-- (even assigning nil will do) in a main chunk before being used
-- anywhere or assigned to inside a function.
--
local getinfo, error, rawset, rawget = debug.getinfo, error, rawset, rawget
local mt = getmetatable(_G)
if mt == nil then
mt = { strict = true }
Strict = mt
setmetatable(_G, mt)
end
mt.__declared = {}
local function what ()
local d = getinfo(3, "S")
return d and d.what or "C"
end
mt.__newindex = function (t, n, v)
if not mt.__declared[n] then
local w = what()
if w ~= "main" and w ~= "C" then
error("Attempting to assign to previously undeclared global variable '"..n.."' from inside a function. If this variable is local to the function, it needs to be tagged with the 'local' keyword. If it is a global variable, it needs to be defined at the global scope before being used in a function.", 2)
end
mt.__declared[n] = true
end
rawset(t, n, v)
end
mt.__index = function (t, n)
if mt.strict and not mt.__declared[n] and what() ~= "C" then
error("Global variable '"..n.."' is not declared. Global variables must be 'declared' through a regular assignment (even to nil) at global scope before being used.", 2)