diff options
author | Anthony Van de Gejuchte <anthonyvdgent@gmail.com> | 2016-06-07 01:33:13 +0200 |
---|---|---|
committer | Richard van Velzen <rvanvelzen@experty.com> | 2016-06-08 19:45:21 +0200 |
commit | 8287ef67810f2332459fa157b26e556f55b36b98 (patch) | |
tree | 1cc5ba4b10a9640971d36b3dc67091510ca9d15d | |
parent | 5cb5305cf3a4dc075461630d5edd81cbfd04b9fc (diff) | |
download | tracifyjs-8287ef67810f2332459fa157b26e556f55b36b98.tar.gz tracifyjs-8287ef67810f2332459fa157b26e556f55b36b98.zip |
Fix uglify attempting to rewrite invalid new expressions
-rw-r--r-- | lib/output.js | 10 | ||||
-rw-r--r-- | test/compress/new.js | 8 | ||||
-rw-r--r-- | test/mocha/new.js | 34 |
3 files changed, 50 insertions, 2 deletions
diff --git a/lib/output.js b/lib/output.js index f8787582..f5ca0261 100644 --- a/lib/output.js +++ b/lib/output.js @@ -515,7 +515,8 @@ function OutputStream(options) { PARENS([ AST_Unary, AST_Undefined ], function(output){ var p = output.parent(); - return p instanceof AST_PropAccess && p.expression === this; + return p instanceof AST_PropAccess && p.expression === this + || p instanceof AST_New; }); PARENS(AST_Seq, function(output){ @@ -1283,7 +1284,12 @@ function OutputStream(options) { // self should be AST_New. decide if we want to show parens or not. function no_constructor_parens(self, output) { - return self.args.length == 0 && !output.option("beautify"); + return self.args.length == 0 && !output.option("beautify") || + !(self.expression instanceof AST_SymbolRef || + self.expression instanceof AST_Call || + self.expression instanceof AST_Function || + self.expression instanceof AST_Assign + ); }; function best_of(a) { diff --git a/test/compress/new.js b/test/compress/new.js index 4b2c51c3..d956ae27 100644 --- a/test/compress/new.js +++ b/test/compress/new.js @@ -10,3 +10,11 @@ new_statement: { } expect_exact: "new x(1);new x(1)(2);new x(1)(2)(3);new new x(1);new new x(1)(2);new new x(1)(2);(new new x(1))(2);" } + +new_with_rewritten_true_value: { + options = { booleans: true } + input: { + new true; + } + expect_exact: "new(!0);" +} diff --git a/test/mocha/new.js b/test/mocha/new.js new file mode 100644 index 00000000..7e7aea7d --- /dev/null +++ b/test/mocha/new.js @@ -0,0 +1,34 @@ +var assert = require("assert"); +var uglify = require("../../"); + +describe("New", function() { + it("Should attach callback parens after some tokens", function() { + var tests = [ + "new x(1);", + "new (function(foo){this.foo=foo;})(1);", + "new true;", + "new (0);", + "new (!0);", + "new (bar = function(foo) {this.foo=foo;})(123);" + ]; + var expected = [ + "new x(1);", + "new function(foo) {\n this.foo = foo;\n}(1);", + "new true;", + "new 0;", + "new (!0);", + "new (bar = function(foo) {\n this.foo = foo;\n})(123);" + ]; + for (var i = 0; i < tests.length; i++) { + assert.strictEqual( + uglify.minify(tests[i], { + fromString: true, + output: {beautify: true}, + compress: false, + mangle: false + }).code, + expected[i] + ); + } + }); +});
\ No newline at end of file |