make `AST_Lambda.contains_this()` less magical (#2505)
authorAlex Lam S.L <alexlamsl@gmail.com>
Thu, 23 Nov 2017 23:03:37 +0000 (07:03 +0800)
committerGitHub <noreply@github.com>
Thu, 23 Nov 2017 23:03:37 +0000 (07:03 +0800)
lib/compress.js

index 987ad01..ce881c0 100644 (file)
@@ -610,7 +610,8 @@ merge(Compressor.prototype, {
                 || !immutable
                     && parent instanceof AST_Call
                     && parent.expression === node
-                    && (!(value instanceof AST_Function) || value.contains_this(parent))) {
+                    && (!(value instanceof AST_Function)
+                        || !(parent instanceof AST_New) && value.contains_this())) {
                 return true;
             } else if (parent instanceof AST_Array) {
                 return is_modified(parent, parent, level + 1);
@@ -4764,8 +4765,7 @@ merge(Compressor.prototype, {
         return self;
     });
 
-    AST_Lambda.DEFMETHOD("contains_this", function(grandparent) {
-        if (grandparent instanceof AST_New) return false;
+    AST_Lambda.DEFMETHOD("contains_this", function() {
         var result;
         var self = this;
         self.walk(new TreeWalker(function(node) {
@@ -4789,7 +4789,8 @@ merge(Compressor.prototype, {
                     })) break;
                     var value = prop.value;
                     if (value instanceof AST_Function
-                        && value.contains_this(compressor.parent())) break;
+                        && !(compressor.parent() instanceof AST_New)
+                        && value.contains_this()) break;
                     return make_node(AST_Sub, this, {
                         expression: make_node(AST_Array, expr, {
                             elements: props.map(function(prop) {