lua-obfuscator 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/.github/workflows/release.yml +40 -0
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.js +18 -14
  4. package/dist/prometheus/LICENSE +661 -661
  5. package/dist/prometheus/build.bat +9 -9
  6. package/dist/prometheus/doc/README.md +11 -11
  7. package/dist/prometheus/doc/SUMMARY.md +27 -27
  8. package/dist/prometheus/doc/advanced/using-prometheus-in-your-lua-application.md +31 -31
  9. package/dist/prometheus/doc/getting-started/command-line-options.md +13 -13
  10. package/dist/prometheus/doc/getting-started/installation.md +11 -11
  11. package/dist/prometheus/doc/getting-started/obfuscating-your-first-script.md +50 -50
  12. package/dist/prometheus/doc/getting-started/presets.md +10 -10
  13. package/dist/prometheus/doc/getting-started/the-config-object.md +58 -58
  14. package/dist/prometheus/doc/getting-started/writing-a-custom-config-file.md +56 -56
  15. package/dist/prometheus/doc/steps/anti-tamper.md +11 -11
  16. package/dist/prometheus/doc/steps/constantarray.md +71 -71
  17. package/dist/prometheus/doc/steps/encryptstrings.md +86 -86
  18. package/dist/prometheus/doc/steps/proxifylocals.md +47 -47
  19. package/dist/prometheus/doc/steps/splitstrings.md +40 -40
  20. package/dist/prometheus/doc/steps/vmify.md +9 -9
  21. package/dist/prometheus/doc/steps/wrapinfunction.md +29 -29
  22. package/dist/prometheus/readme.md +57 -57
  23. package/dist/prometheus/readme.txt +4 -4
  24. package/package.json +5 -1
  25. package/src/index.ts +81 -75
  26. package/tsconfig.json +12 -12
  27. package/src/prometheus/.editorconfig +0 -4
  28. package/src/prometheus/.gitattributes +0 -2
  29. package/src/prometheus/.gitbook.yaml +0 -1
  30. package/src/prometheus/.github/ISSUE_TEMPLATE/bug_report.md +0 -25
  31. package/src/prometheus/.github/workflows/Build.yml +0 -49
  32. package/src/prometheus/.github/workflows/Test.yml +0 -19
  33. package/src/prometheus/LICENSE +0 -661
  34. package/src/prometheus/benchmark.lua +0 -34
  35. package/src/prometheus/build.bat +0 -10
  36. package/src/prometheus/cli.lua +0 -12
  37. package/src/prometheus/doc/README.md +0 -11
  38. package/src/prometheus/doc/SUMMARY.md +0 -27
  39. package/src/prometheus/doc/advanced/using-prometheus-in-your-lua-application.md +0 -31
  40. package/src/prometheus/doc/getting-started/command-line-options.md +0 -13
  41. package/src/prometheus/doc/getting-started/installation.md +0 -11
  42. package/src/prometheus/doc/getting-started/obfuscating-your-first-script.md +0 -50
  43. package/src/prometheus/doc/getting-started/presets.md +0 -10
  44. package/src/prometheus/doc/getting-started/the-config-object.md +0 -58
  45. package/src/prometheus/doc/getting-started/writing-a-custom-config-file.md +0 -56
  46. package/src/prometheus/doc/steps/anti-tamper.md +0 -11
  47. package/src/prometheus/doc/steps/constantarray.md +0 -71
  48. package/src/prometheus/doc/steps/encryptstrings.md +0 -86
  49. package/src/prometheus/doc/steps/proxifylocals.md +0 -47
  50. package/src/prometheus/doc/steps/splitstrings.md +0 -40
  51. package/src/prometheus/doc/steps/vmify.md +0 -9
  52. package/src/prometheus/doc/steps/wrapinfunction.md +0 -29
  53. package/src/prometheus/prometheus-main.lua +0 -1
  54. package/src/prometheus/readme.md +0 -57
  55. package/src/prometheus/readme.txt +0 -5
  56. package/src/prometheus/src/cli.lua +0 -154
  57. package/src/prometheus/src/colors.lua +0 -61
  58. package/src/prometheus/src/highlightlua.lua +0 -61
  59. package/src/prometheus/src/logger.lua +0 -62
  60. package/src/prometheus/src/presets.lua +0 -174
  61. package/src/prometheus/src/prometheus/ast.lua +0 -792
  62. package/src/prometheus/src/prometheus/bit.lua +0 -521
  63. package/src/prometheus/src/prometheus/compiler/compiler.lua +0 -2365
  64. package/src/prometheus/src/prometheus/enums.lua +0 -106
  65. package/src/prometheus/src/prometheus/namegenerators/Il.lua +0 -41
  66. package/src/prometheus/src/prometheus/namegenerators/confuse.lua +0 -169
  67. package/src/prometheus/src/prometheus/namegenerators/mangled.lua +0 -26
  68. package/src/prometheus/src/prometheus/namegenerators/mangled_shuffled.lua +0 -35
  69. package/src/prometheus/src/prometheus/namegenerators/number.lua +0 -11
  70. package/src/prometheus/src/prometheus/namegenerators.lua +0 -7
  71. package/src/prometheus/src/prometheus/parser.lua +0 -969
  72. package/src/prometheus/src/prometheus/pipeline.lua +0 -250
  73. package/src/prometheus/src/prometheus/randomLiterals.lua +0 -41
  74. package/src/prometheus/src/prometheus/randomStrings.lua +0 -24
  75. package/src/prometheus/src/prometheus/scope.lua +0 -332
  76. package/src/prometheus/src/prometheus/step.lua +0 -79
  77. package/src/prometheus/src/prometheus/steps/AddVararg.lua +0 -33
  78. package/src/prometheus/src/prometheus/steps/AntiTamper.lua +0 -194
  79. package/src/prometheus/src/prometheus/steps/ConstantArray.lua +0 -521
  80. package/src/prometheus/src/prometheus/steps/EncryptStrings.lua +0 -239
  81. package/src/prometheus/src/prometheus/steps/NumbersToExpressions.lua +0 -82
  82. package/src/prometheus/src/prometheus/steps/ProxifyLocals.lua +0 -313
  83. package/src/prometheus/src/prometheus/steps/SplitStrings.lua +0 -338
  84. package/src/prometheus/src/prometheus/steps/Vmify.lua +0 -30
  85. package/src/prometheus/src/prometheus/steps/Watermark.lua +0 -61
  86. package/src/prometheus/src/prometheus/steps/WatermarkCheck.lua +0 -50
  87. package/src/prometheus/src/prometheus/steps/WrapInFunction.lua +0 -45
  88. package/src/prometheus/src/prometheus/steps.lua +0 -12
  89. package/src/prometheus/src/prometheus/tokenizer.lua +0 -546
  90. package/src/prometheus/src/prometheus/unparser.lua +0 -866
  91. package/src/prometheus/src/prometheus/util.lua +0 -297
  92. package/src/prometheus/src/prometheus/visitast.lua +0 -245
  93. package/src/prometheus/src/prometheus.lua +0 -71
  94. package/src/prometheus/tests/closures.lua +0 -12
  95. package/src/prometheus/tests/fibonacci.lua +0 -10
  96. package/src/prometheus/tests/loops.lua +0 -8
  97. package/src/prometheus/tests/primes.lua +0 -18
  98. package/src/prometheus/tests.lua +0 -149
@@ -1,866 +0,0 @@
1
- -- This Script is Part of the Prometheus Obfuscator by Levno_710
2
- --
3
- -- unparser.lua
4
- -- Overview:
5
- -- This Script provides a class for lua code generation from an ast
6
- -- This UnParser is Capable of generating LuaU and Lua5.1
7
- --
8
- -- Note that a LuaU ast can only be unparsed as LuaU if it contains any continue statements
9
- --
10
- -- Settings Object:
11
- -- luaVersion : The LuaVersion of the Script
12
- --
13
-
14
- local config = require("config");
15
- local Ast = require("prometheus.ast");
16
- local Enums = require("prometheus.enums");
17
- local util = require("prometheus.util");
18
- local logger = require("logger");
19
-
20
- local lookupify = util.lookupify;
21
- local LuaVersion = Enums.LuaVersion;
22
- local AstKind = Ast.AstKind;
23
-
24
- local Unparser = {}
25
-
26
- Unparser.SPACE = config.SPACE;
27
- Unparser.TAB = config.TAB;
28
-
29
- local function escapeString(str)
30
- str = util.escape(str)
31
- return str;
32
- end
33
-
34
- function Unparser:new(settings)
35
- local luaVersion = settings.LuaVersion or LuaVersion.LuaU;
36
- local conventions = Enums.Conventions[luaVersion];
37
- local unparser = {
38
- luaVersion = luaVersion;
39
- conventions = conventions;
40
- identCharsLookup = lookupify(conventions.IdentChars);
41
- numberCharsLookup = lookupify(conventions.NumberChars);
42
- prettyPrint = settings and settings.PrettyPrint or false;
43
- notIdentPattern = "[^" .. table.concat(conventions.IdentChars, "") .. "]";
44
- numberPattern = "^[" .. table.concat(conventions.NumberChars, "") .. "]";
45
- highlight = settings and settings.Highlight or false;
46
- keywordsLookup = lookupify(conventions.Keywords);
47
- }
48
-
49
- setmetatable(unparser, self);
50
- self.__index = self;
51
-
52
- return unparser;
53
- end
54
-
55
- function Unparser:isValidIdentifier(source)
56
- if(string.find(source, self.notIdentPattern)) then
57
- return false;
58
- end
59
- if(string.find(source, self.numberPattern)) then
60
- return false;
61
- end
62
- if self.keywordsLookup[source] then
63
- return false;
64
- end
65
- return #source > 0;
66
- end
67
-
68
- function Unparser:setPrettyPrint(prettyPrint)
69
- self.prettyPrint = prettyPrint;
70
- end
71
-
72
- function Unparser:getPrettyPrint()
73
- return self.prettyPrint;
74
- end
75
-
76
- function Unparser:tabs(i, ws_needed)
77
- return self.prettyPrint and string.rep(self.TAB, i) or ws_needed and self.SPACE or "";
78
- end
79
-
80
- function Unparser:newline(ws_needed)
81
- return self.prettyPrint and "\n" or ws_needed and self.SPACE or "";
82
- end
83
-
84
- function Unparser:whitespaceIfNeeded(following, ws)
85
- if(self.prettyPrint or self.identCharsLookup[string.sub(following, 1, 1)]) then
86
- return ws or self.SPACE;
87
- end
88
- return "";
89
- end
90
-
91
- function Unparser:whitespaceIfNeeded2(leading, ws)
92
- if(self.prettyPrint or self.identCharsLookup[string.sub(leading, #leading, #leading)]) then
93
- return ws or self.SPACE;
94
- end
95
- return "";
96
- end
97
-
98
- function Unparser:optionalWhitespace(ws)
99
- return self.prettyPrint and (ws or self.SPACE) or "";
100
- end
101
-
102
- function Unparser:whitespace(ws)
103
- return self.SPACE or ws;
104
- end
105
-
106
- function Unparser:unparse(ast)
107
- if(ast.kind ~= AstKind.TopNode) then
108
- logger:error("Unparser:unparse expects a TopNode as first argument")
109
- end
110
-
111
- return self:unparseBlock(ast.body);
112
- end
113
-
114
- function Unparser:unparseBlock(block, tabbing)
115
- local code = "";
116
-
117
- if(#block.statements < 1) then
118
- return self:whitespace();
119
- end
120
-
121
- for i, statement in ipairs(block.statements) do
122
- if(statement.kind ~= AstKind.NopStatement) then
123
- local statementCode = self:unparseStatement(statement, tabbing);
124
- if(not self.prettyPrint and #code > 0 and string.sub(statementCode, 1, 1) == "(") then
125
- -- This is so that the following works:
126
- -- print("Test");(function() print("Test2") end)();
127
- statementCode = ";" .. statementCode;
128
- end
129
- local ws = self:whitespaceIfNeeded2(code, self:whitespaceIfNeeded(statementCode, self:newline(true)));
130
- if i ~= 1 then
131
- code = code .. ws;
132
- end
133
- if(self.prettyPrint) then
134
- statementCode = statementCode .. ";"
135
- end
136
- code = code .. statementCode;
137
- end
138
- end
139
-
140
- return code;
141
- end
142
-
143
- function Unparser:unparseStatement(statement, tabbing)
144
- tabbing = tabbing and tabbing + 1 or 0;
145
- local code = "";
146
-
147
- if(statement.kind == AstKind.ContinueStatement) then
148
- code = "continue";
149
-
150
- -- Break Statement
151
- elseif(statement.kind == AstKind.BreakStatement) then
152
- code = "break";
153
-
154
-
155
- -- Do Statement
156
- elseif(statement.kind == AstKind.DoStatement) then
157
- local bodyCode = self:unparseBlock(statement.body, tabbing);
158
- code = "do" .. self:whitespaceIfNeeded(bodyCode, self:newline(true))
159
- .. bodyCode .. self:newline(false)
160
- .. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
161
-
162
- -- While Statement
163
- elseif(statement.kind == AstKind.WhileStatement) then
164
- local expressionCode = self:unparseExpression(statement.condition, tabbing);
165
-
166
- local bodyCode = self:unparseBlock(statement.body, tabbing);
167
-
168
-
169
- code = "while" .. self:whitespaceIfNeeded(expressionCode) .. expressionCode .. self:whitespaceIfNeeded2(expressionCode)
170
- .. "do" .. self:whitespaceIfNeeded(bodyCode, self:newline(true))
171
- .. bodyCode .. self:newline(false)
172
- .. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
173
-
174
- -- Repeat Until Statement
175
- elseif(statement.kind == AstKind.RepeatStatement) then
176
- local expressionCode = self:unparseExpression(statement.condition, tabbing);
177
-
178
- local bodyCode = self:unparseBlock(statement.body, tabbing);
179
-
180
-
181
- code = "repeat" .. self:whitespaceIfNeeded(bodyCode, self:newline(true))
182
- .. bodyCode
183
- .. self:whitespaceIfNeeded2(bodyCode, self:newline() .. self:tabs(tabbing, true)) .. "until" .. self:whitespaceIfNeeded(expressionCode) .. expressionCode;
184
-
185
- -- For Statement
186
- elseif(statement.kind == AstKind.ForStatement) then
187
- local bodyCode = self:unparseBlock(statement.body, tabbing);
188
-
189
- code = "for" .. self:whitespace() .. statement.scope:getVariableName(statement.id) .. self:optionalWhitespace() .. "=";
190
- code = code .. self:optionalWhitespace() .. self:unparseExpression(statement.initialValue, tabbing) .. ",";
191
- code = code .. self:optionalWhitespace() .. self:unparseExpression(statement.finalValue, tabbing) .. ",";
192
-
193
- local incrementByCode = statement.incrementBy and self:unparseExpression(statement.incrementBy, tabbing) or "1";
194
- code = code .. self:optionalWhitespace() .. incrementByCode .. self:whitespaceIfNeeded2(incrementByCode) .. "do" .. self:whitespaceIfNeeded(bodyCode, self:newline(true))
195
- .. bodyCode .. self:newline(false)
196
- .. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
197
-
198
-
199
- -- For In Statement
200
- elseif(statement.kind == AstKind.ForInStatement) then
201
- code = "for" .. self:whitespace();
202
-
203
- for i, id in ipairs(statement.ids) do
204
- if(i ~= 1) then
205
- code = code .. "," .. self:optionalWhitespace();
206
- end
207
-
208
- code = code .. statement.scope:getVariableName(id);
209
- end
210
-
211
- code = code .. self:whitespace() .. "in";
212
-
213
- local exprcode = self:unparseExpression(statement.expressions[1], tabbing);
214
- code = code .. self:whitespaceIfNeeded(exprcode) .. exprcode;
215
- for i = 2, #statement.expressions, 1 do
216
- exprcode = self:unparseExpression(statement.expressions[i], tabbing);
217
- code = code .. "," .. self:optionalWhitespace() .. exprcode;
218
- end
219
-
220
- local bodyCode = self:unparseBlock(statement.body, tabbing);
221
- code = code .. self:whitespaceIfNeeded2(code) .. "do" .. self:whitespaceIfNeeded(bodyCode, self:newline(true))
222
- .. bodyCode .. self:newline(false)
223
- .. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
224
-
225
-
226
- -- If Statement
227
- elseif(statement.kind == AstKind.IfStatement) then
228
- local exprcode = self:unparseExpression(statement.condition, tabbing);
229
-
230
- local bodyCode = self:unparseBlock(statement.body, tabbing);
231
- code = "if" .. self:whitespaceIfNeeded(exprcode) .. exprcode .. self:whitespaceIfNeeded2(exprcode) .. "then" .. self:whitespaceIfNeeded(bodyCode, self:newline(true))
232
- .. bodyCode;
233
-
234
- for i, eif in ipairs(statement.elseifs) do
235
- exprcode = self:unparseExpression(eif.condition, tabbing);
236
- bodyCode = self:unparseBlock(eif.body, tabbing);
237
- code = code .. self:newline(false) .. self:whitespaceIfNeeded2(code, self:tabs(tabbing, true)) .. "elseif" .. self:whitespaceIfNeeded(exprcode) .. exprcode .. self:whitespaceIfNeeded2(exprcode)
238
- .. "then" .. self:whitespaceIfNeeded(bodyCode, self:newline(true))
239
- .. bodyCode;
240
- end
241
-
242
- if(statement.elsebody) then
243
- bodyCode = self:unparseBlock(statement.elsebody, tabbing);
244
- code = code .. self:newline(false) .. self:whitespaceIfNeeded2(code, self:tabs(tabbing, true)) .. "else" .. self:whitespaceIfNeeded(bodyCode, self:newline(true))
245
- .. bodyCode;
246
- end
247
-
248
- code = code .. self:newline(false) .. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
249
-
250
-
251
- -- Function Declaration
252
- elseif(statement.kind == AstKind.FunctionDeclaration) then
253
- local funcname = statement.scope:getVariableName(statement.id);
254
- for _, index in ipairs(statement.indices) do
255
- funcname = funcname .. "." .. index;
256
- end
257
-
258
- code = "function" .. self:whitespace() .. funcname .. "(";
259
-
260
- for i, arg in ipairs(statement.args) do
261
- if i > 1 then
262
- code = code .. "," .. self:optionalWhitespace();
263
- end
264
- if(arg.kind == AstKind.VarargExpression) then
265
- code = code .. "...";
266
- else
267
- code = code .. arg.scope:getVariableName(arg.id);
268
- end
269
- end
270
- code = code .. ")";
271
-
272
- local bodyCode = self:unparseBlock(statement.body, tabbing);
273
- code = code .. self:newline(false) .. bodyCode .. self:newline(false) .. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
274
-
275
-
276
- -- Local Function Declaration
277
- elseif(statement.kind == AstKind.LocalFunctionDeclaration) then
278
- local funcname = statement.scope:getVariableName(statement.id);
279
- code = "local" .. self:whitespace() .. "function" .. self:whitespace() .. funcname .. "(";
280
-
281
- for i, arg in ipairs(statement.args) do
282
- if i > 1 then
283
- code = code .. "," .. self:optionalWhitespace();
284
- end
285
- if(arg.kind == AstKind.VarargExpression) then
286
- code = code .. "...";
287
- else
288
- code = code .. arg.scope:getVariableName(arg.id);
289
- end
290
- end
291
- code = code .. ")";
292
-
293
- local bodyCode = self:unparseBlock(statement.body, tabbing);
294
- code = code .. self:newline(false) .. bodyCode .. self:newline(false) .. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
295
-
296
- -- Local Variable Declaration
297
- elseif(statement.kind == AstKind.LocalVariableDeclaration) then
298
- code = "local" .. self:whitespace();
299
-
300
- for i, id in ipairs(statement.ids) do
301
- if i > 1 then
302
- code = code .. "," .. self:optionalWhitespace();
303
- end
304
- code = code .. statement.scope:getVariableName(id);
305
- end
306
-
307
- if(#statement.expressions > 0) then
308
- code = code .. self:optionalWhitespace() .. "=" .. self:optionalWhitespace();
309
- for i, expr in ipairs(statement.expressions) do
310
- if i > 1 then
311
- code = code .. "," .. self:optionalWhitespace();
312
- end
313
- code = code .. self:unparseExpression(expr, tabbing + 1);
314
- end
315
- end
316
- -- Function Call Statement
317
- elseif(statement.kind == AstKind.FunctionCallStatement) then
318
- if not (statement.base.kind == AstKind.IndexExpression or statement.base.kind == AstKind.VariableExpression) then
319
- code = "(" .. self:unparseExpression(statement.base, tabbing) .. ")";
320
- else
321
- code = self:unparseExpression(statement.base, tabbing);
322
- end
323
-
324
- code = code .. "(";
325
-
326
- for i, arg in ipairs(statement.args) do
327
- if i > 1 then
328
- code = code .. "," .. self:optionalWhitespace();
329
- end
330
- code = code .. self:unparseExpression(arg, tabbing);
331
- end
332
-
333
- code = code .. ")";
334
-
335
- -- Pass Self Function Call Statement
336
- elseif(statement.kind == AstKind.PassSelfFunctionCallStatement) then
337
- if not (statement.base.kind == AstKind.IndexExpression or statement.base.kind == AstKind.VariableExpression) then
338
- code = "(" .. self:unparseExpression(statement.base, tabbing) .. ")";
339
- else
340
- code = self:unparseExpression(statement.base, tabbing);
341
- end
342
-
343
- code = code .. ":" .. statement.passSelfFunctionName;
344
-
345
- code = code .. "(";
346
-
347
- for i, arg in ipairs(statement.args) do
348
- if i > 1 then
349
- code = code .. "," .. self:optionalWhitespace();
350
- end
351
- code = code .. self:unparseExpression(arg, tabbing);
352
- end
353
-
354
- code = code .. ")";
355
-
356
-
357
- elseif(statement.kind == AstKind.AssignmentStatement) then
358
- for i, primary_expr in ipairs(statement.lhs) do
359
- if i > 1 then
360
- code = code .. "," .. self:optionalWhitespace();
361
- end
362
- code = code .. self:unparseExpression(primary_expr, tabbing);
363
- end
364
-
365
- code = code .. self:optionalWhitespace() .. "=" .. self:optionalWhitespace();
366
-
367
- for i, expr in ipairs(statement.rhs) do
368
- if i > 1 then
369
- code = code .. "," .. self:optionalWhitespace();
370
- end
371
- code = code .. self:unparseExpression(expr, tabbing + 1);
372
- end
373
-
374
- -- Return Statement
375
- elseif(statement.kind == AstKind.ReturnStatement) then
376
- code = "return";
377
- if(#statement.args > 0) then
378
- local exprcode = self:unparseExpression(statement.args[1], tabbing);
379
- code = code .. self:whitespaceIfNeeded(exprcode) .. exprcode;
380
- for i = 2, #statement.args, 1 do
381
- exprcode = self:unparseExpression(statement.args[i], tabbing);
382
- code = code .. "," .. self:optionalWhitespace() .. exprcode;
383
- end
384
- end
385
- elseif self.luaVersion == LuaVersion.LuaU then
386
- local compoundOperators = {
387
- [AstKind.CompoundAddStatement] = "+=",
388
- [AstKind.CompoundSubStatement] = "-=",
389
- [AstKind.CompoundMulStatement] = "*=",
390
- [AstKind.CompoundDivStatement] = "/=",
391
- [AstKind.CompoundModStatement] = "%=",
392
- [AstKind.CompoundPowStatement] = "^=",
393
- [AstKind.CompoundConcatStatement] = "..=",
394
- }
395
-
396
- local operator = compoundOperators[statement.kind]
397
- if operator then
398
- code = code .. self:unparseExpression(statement.lhs, tabbing) .. self:optionalWhitespace() .. operator .. self:optionalWhitespace() .. self:unparseExpression(statement.rhs, tabbing)
399
- else
400
- logger:error(string.format("\"%s\" is not a valid unparseable statement in %s!", statement.kind, self.luaVersion))
401
- end
402
- end
403
-
404
- return self:tabs(tabbing, false) .. code;
405
- end
406
-
407
- local function randomTrueNode()
408
- local op = math.random(1, 2);
409
- if(op == 1) then
410
- -- Less than
411
- local a = math.random(1, 9)
412
- local b = math.random(0, a - 1);
413
- return tostring(a) .. ">" .. tostring(b);
414
- else
415
- -- Greater than
416
- local a = math.random(1, 9)
417
- local b = math.random(0, a - 1);
418
- return tostring(b) .. "<" .. tostring(a);
419
- end
420
- end
421
-
422
- local function randomFalseNode()
423
- local op = math.random(1, 2);
424
- if(op == 1) then
425
- -- Less than
426
- local a = math.random(1, 9)
427
- local b = math.random(0, a - 1);
428
- return tostring(b) .. ">" .. tostring(a);
429
- else
430
- -- Greater than
431
- local a = math.random(1, 9)
432
- local b = math.random(0, a - 1);
433
- return tostring(a) .. "<" .. tostring(b);
434
- end
435
- end
436
-
437
- function Unparser:unparseExpression(expression, tabbing)
438
- local code = "";
439
-
440
- if(expression.kind == AstKind.BooleanExpression) then
441
- if(expression.value) then
442
- return "true";
443
- else
444
- return "false";
445
- end
446
- end
447
-
448
- if(expression.kind == AstKind.NumberExpression) then
449
- local str = tostring(expression.value);
450
- if(str == "inf") then
451
- return "2e1024"
452
- end
453
- if(str == "-inf") then
454
- return "-2e1024"
455
- end
456
- if(str:sub(1, 2) == "0.") then
457
- str = str:sub(2);
458
- end
459
- return str;
460
- end
461
-
462
- if(expression.kind == AstKind.VariableExpression or expression.kind == AstKind.AssignmentVariable) then
463
- return expression.scope:getVariableName(expression.id);
464
- end
465
-
466
- if(expression.kind == AstKind.StringExpression) then
467
- return "\"" .. escapeString(expression.value) .. "\"";
468
- end
469
-
470
- if(expression.kind == AstKind.NilExpression) then
471
- return "nil";
472
- end
473
-
474
- if(expression.kind == AstKind.VarargExpression) then
475
- return "...";
476
- end
477
-
478
- local k = AstKind.OrExpression;
479
- if(expression.kind == k) then
480
- local lhs = self:unparseExpression(expression.lhs, tabbing);
481
- local rhs = self:unparseExpression(expression.rhs, tabbing);
482
- return lhs .. self:whitespaceIfNeeded2(lhs) .. "or" .. self:whitespaceIfNeeded(rhs) .. rhs;
483
- end
484
-
485
- k = AstKind.AndExpression;
486
- if(expression.kind == k) then
487
- local lhs = self:unparseExpression(expression.lhs, tabbing);
488
- if(Ast.astKindExpressionToNumber(expression.lhs.kind) >= Ast.astKindExpressionToNumber(k)) then
489
- lhs = "(" .. lhs .. ")";
490
- end
491
-
492
- local rhs = self:unparseExpression(expression.rhs, tabbing);
493
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
494
- rhs = "(" .. rhs .. ")";
495
- end
496
-
497
- return lhs .. self:whitespaceIfNeeded2(lhs) .. "and" .. self:whitespaceIfNeeded(rhs) .. rhs;
498
- end
499
-
500
- k = AstKind.LessThanExpression;
501
- if(expression.kind == k) then
502
- local lhs = self:unparseExpression(expression.lhs, tabbing);
503
- if(Ast.astKindExpressionToNumber(expression.lhs.kind) >= Ast.astKindExpressionToNumber(k)) then
504
- lhs = "(" .. lhs .. ")";
505
- end
506
-
507
- local rhs = self:unparseExpression(expression.rhs, tabbing);
508
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
509
- rhs = "(" .. rhs .. ")";
510
- end
511
-
512
- return lhs .. self:optionalWhitespace() .. "<" .. self:optionalWhitespace() .. rhs;
513
- end
514
-
515
- k = AstKind.GreaterThanExpression;
516
- if(expression.kind == k) then
517
- local lhs = self:unparseExpression(expression.lhs, tabbing);
518
- if(Ast.astKindExpressionToNumber(expression.lhs.kind) >= Ast.astKindExpressionToNumber(k)) then
519
- lhs = "(" .. lhs .. ")";
520
- end
521
-
522
- local rhs = self:unparseExpression(expression.rhs, tabbing);
523
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
524
- rhs = "(" .. rhs .. ")";
525
- end
526
-
527
- return lhs .. self:optionalWhitespace() .. ">" .. self:optionalWhitespace() .. rhs;
528
- end
529
-
530
- k = AstKind.LessThanOrEqualsExpression;
531
- if(expression.kind == k) then
532
- local lhs = self:unparseExpression(expression.lhs, tabbing);
533
- if(Ast.astKindExpressionToNumber(expression.lhs.kind) >= Ast.astKindExpressionToNumber(k)) then
534
- lhs = "(" .. lhs .. ")";
535
- end
536
-
537
- local rhs = self:unparseExpression(expression.rhs, tabbing);
538
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
539
- rhs = "(" .. rhs .. ")";
540
- end
541
-
542
- return lhs .. self:optionalWhitespace() .. "<=" .. self:optionalWhitespace() .. rhs;
543
- end
544
-
545
- k = AstKind.GreaterThanOrEqualsExpression;
546
- if(expression.kind == k) then
547
- local lhs = self:unparseExpression(expression.lhs, tabbing);
548
- if(Ast.astKindExpressionToNumber(expression.lhs.kind) >= Ast.astKindExpressionToNumber(k)) then
549
- lhs = "(" .. lhs .. ")";
550
- end
551
-
552
- local rhs = self:unparseExpression(expression.rhs, tabbing);
553
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
554
- rhs = "(" .. rhs .. ")";
555
- end
556
-
557
- return lhs .. self:optionalWhitespace() .. ">=" .. self:optionalWhitespace() .. rhs;
558
- end
559
-
560
- k = AstKind.NotEqualsExpression;
561
- if(expression.kind == k) then
562
- local lhs = self:unparseExpression(expression.lhs, tabbing);
563
- if(Ast.astKindExpressionToNumber(expression.lhs.kind) >= Ast.astKindExpressionToNumber(k)) then
564
- lhs = "(" .. lhs .. ")";
565
- end
566
-
567
- local rhs = self:unparseExpression(expression.rhs, tabbing);
568
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
569
- rhs = "(" .. rhs .. ")";
570
- end
571
-
572
- return lhs .. self:optionalWhitespace() .. "~=" .. self:optionalWhitespace() .. rhs;
573
- end
574
-
575
- k = AstKind.EqualsExpression;
576
- if(expression.kind == k) then
577
- local lhs = self:unparseExpression(expression.lhs, tabbing);
578
- if(Ast.astKindExpressionToNumber(expression.lhs.kind) >= Ast.astKindExpressionToNumber(k)) then
579
- lhs = "(" .. lhs .. ")";
580
- end
581
-
582
- local rhs = self:unparseExpression(expression.rhs, tabbing);
583
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
584
- rhs = "(" .. rhs .. ")";
585
- end
586
-
587
- return lhs .. self:optionalWhitespace() .. "==" .. self:optionalWhitespace() .. rhs;
588
- end
589
-
590
- k = AstKind.StrCatExpression;
591
- if(expression.kind == k) then
592
- local lhs = self:unparseExpression(expression.lhs, tabbing);
593
- if(Ast.astKindExpressionToNumber(expression.lhs.kind) >= Ast.astKindExpressionToNumber(k)) then
594
- lhs = "(" .. lhs .. ")";
595
- end
596
-
597
- local rhs = self:unparseExpression(expression.rhs, tabbing);
598
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
599
- rhs = "(" .. rhs .. ")";
600
- end
601
-
602
- if(self.numberCharsLookup[string.sub(lhs, #lhs, #lhs)]) then
603
- lhs = lhs .. " ";
604
- end
605
-
606
- return lhs .. self:optionalWhitespace() .. ".." .. self:optionalWhitespace() .. rhs;
607
- end
608
-
609
- k = AstKind.AddExpression;
610
- if(expression.kind == k) then
611
- local lhs = self:unparseExpression(expression.lhs, tabbing);
612
- if(Ast.astKindExpressionToNumber(expression.lhs.kind) >= Ast.astKindExpressionToNumber(k)) then
613
- lhs = "(" .. lhs .. ")";
614
- end
615
-
616
- local rhs = self:unparseExpression(expression.rhs, tabbing);
617
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
618
- rhs = "(" .. rhs .. ")";
619
- end
620
-
621
- return lhs .. self:optionalWhitespace() .. "+" .. self:optionalWhitespace() .. rhs;
622
- end
623
-
624
- k = AstKind.SubExpression;
625
- if(expression.kind == k) then
626
- local lhs = self:unparseExpression(expression.lhs, tabbing);
627
- if(Ast.astKindExpressionToNumber(expression.lhs.kind) >= Ast.astKindExpressionToNumber(k)) then
628
- lhs = "(" .. lhs .. ")";
629
- end
630
-
631
- local rhs = self:unparseExpression(expression.rhs, tabbing);
632
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
633
- rhs = "(" .. rhs .. ")";
634
- end
635
-
636
- if string.sub(rhs, 1, 1) == "-" then
637
- rhs = "(" .. rhs .. ")";
638
- end
639
-
640
- return lhs .. self:optionalWhitespace() .. "-" .. self:optionalWhitespace() .. rhs;
641
- end
642
-
643
- k = AstKind.MulExpression;
644
- if(expression.kind == k) then
645
- local lhs = self:unparseExpression(expression.lhs, tabbing);
646
- if(Ast.astKindExpressionToNumber(expression.lhs.kind) >= Ast.astKindExpressionToNumber(k)) then
647
- lhs = "(" .. lhs .. ")";
648
- end
649
-
650
- local rhs = self:unparseExpression(expression.rhs, tabbing);
651
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
652
- rhs = "(" .. rhs .. ")";
653
- end
654
-
655
- return lhs .. self:optionalWhitespace() .. "*" .. self:optionalWhitespace() .. rhs;
656
- end
657
-
658
- k = AstKind.DivExpression;
659
- if(expression.kind == k) then
660
- local lhs = self:unparseExpression(expression.lhs, tabbing);
661
- if(Ast.astKindExpressionToNumber(expression.lhs.kind) >= Ast.astKindExpressionToNumber(k)) then
662
- lhs = "(" .. lhs .. ")";
663
- end
664
-
665
- local rhs = self:unparseExpression(expression.rhs, tabbing);
666
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
667
- rhs = "(" .. rhs .. ")";
668
- end
669
-
670
- return lhs .. self:optionalWhitespace() .. "/" .. self:optionalWhitespace() .. rhs;
671
- end
672
-
673
- k = AstKind.ModExpression;
674
- if(expression.kind == k) then
675
- local lhs = self:unparseExpression(expression.lhs, tabbing);
676
- if(Ast.astKindExpressionToNumber(expression.lhs.kind) >= Ast.astKindExpressionToNumber(k)) then
677
- lhs = "(" .. lhs .. ")";
678
- end
679
-
680
- local rhs = self:unparseExpression(expression.rhs, tabbing);
681
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
682
- rhs = "(" .. rhs .. ")";
683
- end
684
-
685
- return lhs .. self:optionalWhitespace() .. "%" .. self:optionalWhitespace() .. rhs;
686
- end
687
-
688
- k = AstKind.PowExpression;
689
- if(expression.kind == k) then
690
- local lhs = self:unparseExpression(expression.lhs, tabbing);
691
- if(Ast.astKindExpressionToNumber(expression.lhs.kind) >= Ast.astKindExpressionToNumber(k)) then
692
- lhs = "(" .. lhs .. ")";
693
- end
694
-
695
- local rhs = self:unparseExpression(expression.rhs, tabbing);
696
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
697
- rhs = "(" .. rhs .. ")";
698
- end
699
-
700
- return lhs .. self:optionalWhitespace() .. "^" .. self:optionalWhitespace() .. rhs;
701
- end
702
-
703
- -- Unary Expressions
704
- k = AstKind.NotExpression;
705
- if(expression.kind == k) then
706
- local rhs = self:unparseExpression(expression.rhs, tabbing);
707
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
708
- rhs = "(" .. rhs .. ")";
709
- end
710
-
711
- return "not" .. self:whitespaceIfNeeded(rhs) .. rhs;
712
- end
713
-
714
- k = AstKind.NegateExpression;
715
- if(expression.kind == k) then
716
- local rhs = self:unparseExpression(expression.rhs, tabbing);
717
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
718
- rhs = "(" .. rhs .. ")";
719
- end
720
-
721
- if string.sub(rhs, 1, 1) == "-" then
722
- rhs = "(" .. rhs .. ")";
723
- end
724
-
725
- return "-" .. rhs;
726
- end
727
-
728
- k = AstKind.LenExpression;
729
- if(expression.kind == k) then
730
- local rhs = self:unparseExpression(expression.rhs, tabbing);
731
- if(Ast.astKindExpressionToNumber(expression.rhs.kind) >= Ast.astKindExpressionToNumber(k)) then
732
- rhs = "(" .. rhs .. ")";
733
- end
734
-
735
- return "#" .. rhs;
736
- end
737
-
738
- k = AstKind.IndexExpression;
739
- if(expression.kind == k or expression.kind == AstKind.AssignmentIndexing) then
740
- local base = self:unparseExpression(expression.base, tabbing);
741
- if(Ast.astKindExpressionToNumber(expression.base.kind) > Ast.astKindExpressionToNumber(k)) then
742
- base = "(" .. base .. ")";
743
- end
744
-
745
- -- Identifier Indexing e.g: x.y instead of x["y"];
746
- if(expression.index.kind == AstKind.StringExpression and self:isValidIdentifier(expression.index.value)) then
747
- return base .. "." .. expression.index.value;
748
- end
749
-
750
- -- Index never needs parens
751
- local index = self:unparseExpression(expression.index, tabbing);
752
- return base .. "[" .. index .. "]";
753
- end
754
-
755
- k = AstKind.FunctionCallExpression;
756
- if(expression.kind == k) then
757
- if not (expression.base.kind == AstKind.IndexExpression or expression.base.kind == AstKind.VariableExpression) then
758
- code = "(" .. self:unparseExpression(expression.base, tabbing) .. ")";
759
- else
760
- code = self:unparseExpression(expression.base, tabbing);
761
- end
762
-
763
- code = code .. "(";
764
-
765
- for i, arg in ipairs(expression.args) do
766
- if i > 1 then
767
- code = code .. "," .. self:optionalWhitespace();
768
- end
769
- code = code .. self:unparseExpression(arg, tabbing);
770
- end
771
-
772
- code = code .. ")";
773
- return code;
774
- end
775
-
776
-
777
- k = AstKind.PassSelfFunctionCallExpression;
778
- if(expression.kind == k) then
779
- if not (expression.base.kind == AstKind.IndexExpression or expression.base.kind == AstKind.VariableExpression) then
780
- code = "(" .. self:unparseExpression(expression.base, tabbing) .. ")";
781
- else
782
- code = self:unparseExpression(expression.base, tabbing);
783
- end
784
-
785
- code = code .. ":" .. expression.passSelfFunctionName;
786
-
787
- code = code .. "(";
788
-
789
- for i, arg in ipairs(expression.args) do
790
- if i > 1 then
791
- code = code .. "," .. self:optionalWhitespace();
792
- end
793
- code = code .. self:unparseExpression(arg, tabbing);
794
- end
795
-
796
- code = code .. ")";
797
- return code;
798
- end
799
-
800
- k = AstKind.FunctionLiteralExpression;
801
- if(expression.kind == k) then
802
- code = "function" .. "(";
803
-
804
- for i, arg in ipairs(expression.args) do
805
- if i > 1 then
806
- code = code .. "," .. self:optionalWhitespace();
807
- end
808
- if(arg.kind == AstKind.VarargExpression) then
809
- code = code .. "...";
810
- else
811
- code = code .. arg.scope:getVariableName(arg.id);
812
- end
813
- end
814
- code = code .. ")";
815
-
816
- local bodyCode = self:unparseBlock(expression.body, tabbing);
817
- code = code .. self:newline(false) .. bodyCode .. self:newline(false) .. self:whitespaceIfNeeded2(bodyCode, self:tabs(tabbing, true)) .. "end";
818
- return code;
819
- end
820
-
821
- k = AstKind.TableConstructorExpression;
822
- if(expression.kind == k) then
823
- if(#expression.entries == 0) then return "{}" end;
824
-
825
- local inlineTable = #expression.entries <= 3;
826
- local tableTabbing = tabbing + 1;
827
-
828
- code = "{";
829
- if inlineTable then
830
- code = code .. self:optionalWhitespace();
831
- else
832
- code = code .. self:optionalWhitespace(self:newline() .. self:tabs(tableTabbing));
833
- end
834
-
835
- local p = false;
836
- for i, entry in ipairs(expression.entries) do
837
- p = true;
838
- local sep = self.prettyPrint and "," or (math.random(1, 2) == 1 and "," or ";");
839
- if i > 1 and not inlineTable then
840
- code = code .. sep .. self:optionalWhitespace(self:newline() .. self:tabs(tableTabbing));
841
- elseif i > 1 then
842
- code = code .. sep .. self:optionalWhitespace();
843
- end
844
- if(entry.kind == AstKind.KeyedTableEntry) then
845
- if(entry.key.kind == AstKind.StringExpression and self:isValidIdentifier(entry.key.value)) then
846
- code = code .. entry.key.value;
847
- else
848
- code = code .. "[" .. self:unparseExpression(entry.key, tableTabbing) .. "]";
849
- end
850
- code = code .. self:optionalWhitespace() .. "=" .. self:optionalWhitespace() .. self:unparseExpression(entry.value, tableTabbing);
851
- else
852
- code = code .. self:unparseExpression(entry.value, tableTabbing);
853
- end
854
- end
855
-
856
- if inlineTable then
857
- return code .. self:optionalWhitespace() .. "}";
858
- end
859
-
860
- return code .. self:optionalWhitespace((p and "," or "") .. self:newline() .. self:tabs(tabbing)) .. "}";
861
- end
862
-
863
- logger:error(string.format("\"%s\" is not a valid unparseable expression", expression.kind));
864
- end
865
-
866
- return Unparser