diff --git a/luamin.js b/luamin.js index 21cbf40..2b957c7 100644 --- a/luamin.js +++ b/luamin.js @@ -26,17 +26,22 @@ var regexAlphaNumUnderscore = /[a-zA-Z0-9_]/; var regexDigits = /[0-9]/; - // http://www.lua.org/manual/5.2/manual.html#3.4.7 - // http://www.lua.org/source/5.2/lparser.c.html#priority + // https://www.lua.org/manual/5.4/manual.html#3.4.8 + // https://www.lua.org/source/5.4/lparser.c.html#priority + // not supported yet: binary ~, <<, >>, //, unary~ var PRECEDENCE = { 'or': 1, 'and': 2, '<': 3, '>': 3, '<=': 3, '>=': 3, '~=': 3, '==': 3, - '..': 5, - '+': 6, '-': 6, // binary - - '*': 7, '/': 7, '%': 7, - 'unarynot': 8, 'unary#': 8, 'unary-': 8, // unary - - '^': 10 + '|': 4, + '~': 5, + '&': 6, + '<<': 7, '>>': 7, + '..': 8, + '+': 9, '-': 9, // binary - + '*': 10, '/': 10, '//': 10, '%': 10, + 'unarynot': 11, 'unary#': 11, 'unary~': 11, 'unary-': 11, // unary - + '^': 12, }; var IDENTIFIER_PARTS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', diff --git a/tests/tests.js b/tests/tests.js index 3a04da0..e5d5a77 100644 --- a/tests/tests.js +++ b/tests/tests.js @@ -1629,7 +1629,7 @@ // Operator precedence 'Operator precedence': [ - // http://www.lua.org/manual/5.1/manual.html#2.5.6 + // https://www.lua.org/manual/5.4/manual.html#3.4.8 { 'description': 'Operator precedence', 'original': 'a = (1 + 2) * 3', @@ -1760,6 +1760,31 @@ 'original': 'a = (4 ^ (2 ^ 3))', 'minified': 'a=4^2^3' }, + { + 'description': 'Operator precedence', + 'original': 'a = (1 | 2) & 0', + 'minified': 'a=(1|2)&0' + }, + { + 'description': 'Operator precedence', + 'original': 'a = 1 | (2 & 0)', + 'minified': 'a=1|2&0' + }, + { + 'description': 'Operator precedence', + 'original': 'a = (1 | 0) < 1', + 'minified': 'a=1|0<1' + }, + { + 'description': 'Operator precedence', + 'original': 'a = (0 & 1) + 1', + 'minified': 'a=(0&1)+1' + }, + { + 'description': 'Operator precedence', + 'original': 'a = 0 & (1 + 1)', + 'minified': 'a=0&1+1' + }, { 'description': 'Operator precedence: right associativity', 'original': 'a = (((4) ^ 2) ^ 3)', @@ -1809,7 +1834,87 @@ 'description': 'Operator precedence: RHS parens', 'original': 'a = 1 * (2 - 3)', 'minified': 'a=1*(2-3)' - } + }, + { + 'description': 'Operator precedence: ^ before unary~, keep parentheses', + 'original': 'a =(~1)^2', + 'minified': 'a=(~1)^2' + }, + { + 'description': 'Operator precedence: ^ before unary~, strip parentheses', + 'original': 'a =~(1^2)', + 'minified': 'a=~1^2' + }, + { + 'description': 'Operator precedence: unary~ before *, keep parentheses', + 'original': 'a = ~(1 * 2)', + 'minified': 'a=~(1*2)' + }, + { + 'description': 'Operator precedence: unary~ before *, strip parentheses', + 'original': 'a = (~1) * 2', + 'minified': 'a=~1*2' + }, + { + 'description': 'Operator precedence: unary~ before //, keep parentheses', + 'original': 'a = ~(1 // 2)', + 'minified': 'a=~(1//2)' + }, + { + 'description': 'Operator precedence: unary~ before //, strip parentheses', + 'original': 'a = (~1) // 2', + 'minified': 'a=~1//2' + }, + { + 'description': 'Operator precedence: // before +, keep parentheses', + 'original': 'a = (1 + 2) // 3', + 'minified': 'a=(1+2)//3' + }, + { + 'description': 'Operator precedence: // before +, strip parentheses', + 'original': 'a = 1 + (2 // 3)', + 'minified': 'a=1+2//3' + }, + { + 'description': 'Operator precedence: .. before <<, keep parentheses', + 'original': 'a = 1 .. (2 << 3)', + 'minified': 'a=1 ..(2<<3)' + }, + { + 'description': 'Operator precedence: .. before <<, strip parentheses', + 'original': 'a = (1 .. 2) << 3', + 'minified': 'a=1 ..2<<3' + }, + { + 'description': 'Operator precedence: .. before >>, keep parentheses', + 'original': 'a = 1 .. (2 >> 3)', + 'minified': 'a=1 ..(2>>3)' + }, + { + 'description': 'Operator precedence: .. before >>, strip parentheses', + 'original': 'a = (1 .. 2) >> 3', + 'minified': 'a=1 ..2>>3' + }, + { + 'description': 'Operator precedence: & before binary ~, keep parentheses', + 'original': 'a = 1 & (2 ~ 3)', + 'minified': 'a=1&(2~3)' + }, + { + 'description': 'Operator precedence: & before binary ~, strip parentheses', + 'original': 'a = (1 & 2) ~ 3', + 'minified': 'a=1&2~3' + }, + { + 'description': 'Operator precedence: ~ before |, keep parentheses', + 'original': 'a = 1 ~ (2 | 3)', + 'minified': 'a=1~(2|3)' + }, + { + 'description': 'Operator precedence: ~ before |, strip parentheses', + 'original': 'a = (1 ~ 2) | 3', + 'minified': 'a=1~2|3' + }, ], // RepeatStatement