drop unused function arguments
authorMihai Bazon <mihai@bazon.net>
Sat, 13 Oct 2012 12:04:44 +0000 (15:04 +0300)
committerMihai Bazon <mihai@bazon.net>
Sat, 13 Oct 2012 12:04:44 +0000 (15:04 +0300)
also add test for "drop_unused" (the last one fails for now)

lib/compress.js
test/compress/drop-unused.js [new file with mode: 0644]
test/run-tests.js

index 78d9d0c..f216ed2 100644 (file)
@@ -856,6 +856,21 @@ merge(Compressor.prototype, {
             // pass 3: we should drop declarations not in_use
             var tt = new TreeTransformer(
                 function before(node, descend) {
+                    if (node instanceof AST_Lambda) {
+                        for (var a = node.argnames, i = a.length; --i >= 0;) {
+                            var sym = a[i];
+                            if (sym.unreferenced()) {
+                                a.pop();
+                                compressor.warn("Dropping unused function argument {name} [{file}:{line},{col}]", {
+                                    name : sym.name,
+                                    file : sym.start.file,
+                                    line : sym.start.line,
+                                    col  : sym.start.col
+                                });
+                            }
+                            else break;
+                        }
+                    }
                     if (node instanceof AST_Defun && node !== self) {
                         if (!member(node.name.definition(), in_use)) {
                             compressor.warn("Dropping unused function {name} [{file}:{line},{col}]", {
diff --git a/test/compress/drop-unused.js b/test/compress/drop-unused.js
new file mode 100644 (file)
index 0000000..bf5cd29
--- /dev/null
@@ -0,0 +1,97 @@
+unused_funarg_1: {
+    options = { unused: true };
+    input: {
+        function f(a, b, c, d, e) {
+            return a + b;
+        }
+    }
+    expect: {
+        function f(a, b) {
+            return a + b;
+        }
+    }
+}
+
+unused_funarg_2: {
+    options = { unused: true };
+    input: {
+        function f(a, b, c, d, e) {
+            return a + c;
+        }
+    }
+    expect: {
+        function f(a, b, c) {
+            return a + c;
+        }
+    }
+}
+
+unused_nested_function: {
+    options = { unused: true };
+    input: {
+        function f(x, y) {
+            function g() {
+                something();
+            }
+            return x + y;
+        }
+    };
+    expect: {
+        function f(x, y) {
+            return x + y;
+        }
+    }
+}
+
+unused_circular_references_1: {
+    options = { unused: true };
+    input: {
+        function f(x, y) {
+            // circular reference
+            function g() {
+                return h();
+            }
+            function h() {
+                return g();
+            }
+            return x + y;
+        }
+    };
+    expect: {
+        function f(x, y) {
+            return x + y;
+        }
+    }
+}
+
+unused_circular_references_2: {
+    options = { unused: true };
+    input: {
+        function f(x, y) {
+            var foo = 1, bar = baz, baz = foo + bar, qwe = moo();
+            return x + y;
+        }
+    };
+    expect: {
+        function f(x, y) {
+            moo();              // keeps side effect
+            return x + y;
+        }
+    }
+}
+
+unused_circular_references_3: {
+    options = { unused: true };
+    input: {
+        function f(x, y) {
+            var g = function() { return h() };
+            var h = function() { return g() };
+            return x + y;
+        }
+    };
+    expect: {
+        function f(x, y) {
+            return x + y;
+        }
+    }
+}
index abace39..8730141 100755 (executable)
@@ -37,6 +37,12 @@ function find_test_files(dir) {
     var files = fs.readdirSync(dir).filter(function(name){
         return /\.js$/i.test(name);
     });
+    if (process.argv.length > 2) {
+        var x = process.argv.slice(2);
+        files = files.filter(function(f){
+            return x.indexOf(f) >= 0;
+        });
+    }
     return files;
 }