From 533b8f126dab6d466051702768e34e5d67388184 Mon Sep 17 00:00:00 2001 From: Rivulet Date: Wed, 24 Dec 2025 05:18:14 +0000 Subject: [PATCH] Update lua-minify.lua --- lua-minify.lua | 195 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 194 insertions(+), 1 deletion(-) diff --git a/lua-minify.lua b/lua-minify.lua index 384dbb7..f9e6a62 100644 --- a/lua-minify.lua +++ b/lua-minify.lua @@ -153,7 +153,200 @@ local HexDigits = lookupify{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f'} local Symbols = lookupify{'+', '-', '*', '/', '^', '%', ',', '{', '}', '[', ']', '(', ')', ';', '#'} -local Scope = require'Scope' + +local Scope = { + new = function(self, parent) + local s = { + Parent = parent, + Locals = { }, + Globals = { }, + oldLocalNamesMap = { }, + oldGlobalNamesMap = { }, + Children = { }, + } + + if parent then + table.insert(parent.Children, s) + end + + return setmetatable(s, { __index = self }) + end, + + AddLocal = function(self, v) + table.insert(self.Locals, v) + end, + + AddGlobal = function(self, v) + table.insert(self.Globals, v) + end, + + CreateLocal = function(self, name) + local v + v = self:GetLocal(name) + if v then return v end + v = { } + v.Scope = self + v.Name = name + v.IsGlobal = false + v.CanRename = true + v.References = 1 + self:AddLocal(v) + return v + end, + + GetLocal = function(self, name) + for k, var in pairs(self.Locals) do + if var.Name == name then return var end + end + + if self.Parent then + return self.Parent:GetLocal(name) + end + end, + + GetOldLocal = function(self, name) + if self.oldLocalNamesMap[name] then + return self.oldLocalNamesMap[name] + end + return self:GetLocal(name) + end, + + mapLocal = function(self, name, var) + self.oldLocalNamesMap[name] = var + end, + + GetOldGlobal = function(self, name) + if self.oldGlobalNamesMap[name] then + return self.oldGlobalNamesMap[name] + end + return self:GetGlobal(name) + end, + + mapGlobal = function(self, name, var) + self.oldGlobalNamesMap[name] = var + end, + + GetOldVariable = function(self, name) + return self:GetOldLocal(name) or self:GetOldGlobal(name) + end, + + RenameLocal = function(self, oldName, newName) + oldName = type(oldName) == 'string' and oldName or oldName.Name + local found = false + local var = self:GetLocal(oldName) + if var then + var.Name = newName + self:mapLocal(oldName, var) + found = true + end + if not found and self.Parent then + self.Parent:RenameLocal(oldName, newName) + end + end, + + RenameGlobal = function(self, oldName, newName) + oldName = type(oldName) == 'string' and oldName or oldName.Name + local found = false + local var = self:GetGlobal(oldName) + if var then + var.Name = newName + self:mapGlobal(oldName, var) + found = true + end + if not found and self.Parent then + self.Parent:RenameGlobal(oldName, newName) + end + end, + + RenameVariable = function(self, oldName, newName) + oldName = type(oldName) == 'string' and oldName or oldName.Name + if self:GetLocal(oldName) then + self:RenameLocal(oldName, newName) + else + self:RenameGlobal(oldName, newName) + end + end, + + GetAllVariables = function(self) + local ret = self:getVars(true) -- down + for k, v in pairs(self:getVars(false)) do -- up + table.insert(ret, v) + end + return ret + end, + + getVars = function(self, top) + local ret = { } + if top then + for k, v in pairs(self.Children) do + for k2, v2 in pairs(v:getVars(true)) do + table.insert(ret, v2) + end + end + else + for k, v in pairs(self.Locals) do + table.insert(ret, v) + end + for k, v in pairs(self.Globals) do + table.insert(ret, v) + end + if self.Parent then + for k, v in pairs(self.Parent:getVars(false)) do + table.insert(ret, v) + end + end + end + return ret + end, + + CreateGlobal = function(self, name) + local v + v = self:GetGlobal(name) + if v then return v end + v = { } + v.Scope = self + v.Name = name + v.IsGlobal = true + v.CanRename = true + v.References = 1 + self:AddGlobal(v) + return v + end, + + GetGlobal = function(self, name) + for k, v in pairs(self.Globals) do + if v.Name == name then return v end + end + + if self.Parent then + return self.Parent:GetGlobal(name) + end + end, + + GetVariable = function(self, name) + return self:GetLocal(name) or self:GetGlobal(name) + end, + + ObfuscateLocals = function(self, recommendedMaxLength, validNameChars) + recommendedMaxLength = recommendedMaxLength or 7 + local chars = validNameChars or "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuioplkjhgfdsazxcvbnm_" + local chars2 = validNameChars or "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuioplkjhgfdsazxcvbnm_1234567890" + for _, var in pairs(self.Locals) do + local id = "" + local tries = 0 + repeat + local n = math.random(1, #chars) + id = id .. chars:sub(n, n) + for i = 1, math.random(0, tries > 5 and 30 or recommendedMaxLength) do + local n = math.random(1, #chars2) + id = id .. chars2:sub(n, n) + end + tries = tries + 1 + until not self:GetVariable(id) + self:RenameLocal(var.Name, id) + end + end, +} local Keywords = lookupify{ 'and', 'break', 'do', 'else', 'elseif',