joebodo

sys.apis.minify.Scope.lua

Sep 6th, 2016
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.45 KB | None | 0 0
  1. local Scope = {
  2.     new = function(self, parent)
  3.         local s = {
  4.             Parent = parent,
  5.             Locals = { },
  6.             Globals = { },
  7.             oldLocalNamesMap = { },
  8.             oldGlobalNamesMap = { },
  9.             Children = { },
  10.         }
  11.        
  12.         if parent then
  13.             table.insert(parent.Children, s)
  14.         end
  15.        
  16.         return setmetatable(s, { __index = self })
  17.     end,
  18.    
  19.     AddLocal = function(self, v)
  20.         table.insert(self.Locals, v)
  21.     end,
  22.    
  23.     AddGlobal = function(self, v)
  24.         table.insert(self.Globals, v)
  25.     end,
  26.    
  27.     CreateLocal = function(self, name)
  28.         local v
  29.         v = self:GetLocal(name)
  30.         if v then return v end
  31.         v = { }
  32.         v.Scope = self
  33.         v.Name = name
  34.         v.IsGlobal = false
  35.         v.CanRename = true
  36.         v.References = 1
  37.         self:AddLocal(v)
  38.         return v
  39.     end,
  40.    
  41.     GetLocal = function(self, name)
  42.         for k, var in pairs(self.Locals) do
  43.             if var.Name == name then return var end
  44.         end
  45.        
  46.         if self.Parent then
  47.             return self.Parent:GetLocal(name)
  48.         end
  49.     end,
  50.    
  51.     GetOldLocal = function(self, name)
  52.         if self.oldLocalNamesMap[name] then
  53.             return self.oldLocalNamesMap[name]
  54.         end
  55.         return self:GetLocal(name)
  56.     end,
  57.    
  58.     mapLocal = function(self, name, var)
  59.         self.oldLocalNamesMap[name] = var
  60.     end,
  61.    
  62.     GetOldGlobal = function(self, name)
  63.         if self.oldGlobalNamesMap[name] then
  64.             return self.oldGlobalNamesMap[name]
  65.         end
  66.         return self:GetGlobal(name)
  67.     end,
  68.    
  69.     mapGlobal = function(self, name, var)
  70.         self.oldGlobalNamesMap[name] = var
  71.     end,
  72.    
  73.     GetOldVariable = function(self, name)
  74.         return self:GetOldLocal(name) or self:GetOldGlobal(name)
  75.     end,
  76.    
  77.     RenameLocal = function(self, oldName, newName)
  78.         oldName = type(oldName) == 'string' and oldName or oldName.Name
  79.         local found = false
  80.         local var = self:GetLocal(oldName)
  81.         if var then
  82.             var.Name = newName
  83.             self:mapLocal(oldName, var)
  84.             found = true
  85.         end
  86.         if not found and self.Parent then
  87.             self.Parent:RenameLocal(oldName, newName)
  88.         end
  89.     end,
  90.    
  91.     RenameGlobal = function(self, oldName, newName)
  92.         oldName = type(oldName) == 'string' and oldName or oldName.Name
  93.         local found = false
  94.         local var = self:GetGlobal(oldName)
  95.         if var then
  96.             var.Name = newName
  97.             self:mapGlobal(oldName, var)
  98.             found = true
  99.         end
  100.         if not found and self.Parent then
  101.             self.Parent:RenameGlobal(oldName, newName)
  102.         end
  103.     end,
  104.    
  105.     RenameVariable = function(self, oldName, newName)
  106.         oldName = type(oldName) == 'string' and oldName or oldName.Name
  107.         if self:GetLocal(oldName) then
  108.             self:RenameLocal(oldName, newName)
  109.         else
  110.             self:RenameGlobal(oldName, newName)
  111.         end
  112.     end,
  113.    
  114.     GetAllVariables = function(self)
  115.         local ret = self:getVars(true) -- down
  116.         for k, v in pairs(self:getVars(false)) do -- up
  117.             table.insert(ret, v)
  118.         end
  119.         return ret
  120.     end,
  121.    
  122.     getVars = function(self, top)
  123.         local ret = { }
  124.         if top then
  125.             for k, v in pairs(self.Children) do
  126.                 for k2, v2 in pairs(v:getVars(true)) do
  127.                     table.insert(ret, v2)
  128.                 end
  129.             end
  130.         else
  131.             for k, v in pairs(self.Locals) do
  132.                 table.insert(ret, v)
  133.             end
  134.             for k, v in pairs(self.Globals) do
  135.                 table.insert(ret, v)
  136.             end
  137.             if self.Parent then
  138.                 for k, v in pairs(self.Parent:getVars(false)) do
  139.                     table.insert(ret, v)
  140.                 end
  141.             end
  142.         end
  143.         return ret
  144.     end,
  145.    
  146.     CreateGlobal = function(self, name)
  147.         local v
  148.         v = self:GetGlobal(name)
  149.         if v then return v end
  150.         v = { }
  151.         v.Scope = self
  152.         v.Name = name
  153.         v.IsGlobal = true
  154.         v.CanRename = true
  155.         v.References = 1
  156.         self:AddGlobal(v)
  157.         return v
  158.     end,
  159.    
  160.     GetGlobal = function(self, name)
  161.         for k, v in pairs(self.Globals) do
  162.             if v.Name == name then return v end
  163.         end
  164.        
  165.         if self.Parent then
  166.             return self.Parent:GetGlobal(name)
  167.         end
  168.     end,
  169.    
  170.     GetVariable = function(self, name)
  171.         return self:GetLocal(name) or self:GetGlobal(name)
  172.     end,
  173.    
  174.     ObfuscateLocals = function(self, recommendedMaxLength, validNameChars)
  175.         recommendedMaxLength = recommendedMaxLength or 7
  176.         local chars = validNameChars or "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuioplkjhgfdsazxcvbnm_"
  177.         local chars2 = validNameChars or "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuioplkjhgfdsazxcvbnm_1234567890"
  178.         for _, var in pairs(self.Locals) do
  179.             local id = ""
  180.             local tries = 0
  181.             repeat
  182.                 local n = math.random(1, #chars)
  183.                 id = id .. chars:sub(n, n)
  184.                 for i = 1, math.random(0, tries > 5 and 30 or recommendedMaxLength) do
  185.                     local n = math.random(1, #chars2)
  186.                     id = id .. chars2:sub(n, n)
  187.                 end
  188.                 tries = tries + 1
  189.             until not self:GetVariable(id)
  190.             self:RenameLocal(var.Name, id)
  191.         end
  192.     end,
  193. }
  194.  
  195. return Scope
Add Comment
Please, Sign In to add comment