aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authoralexlamsl <alexlamsl@gmail.com>2017-02-20 01:46:59 +0800
committeralexlamsl <alexlamsl@gmail.com>2017-02-21 13:31:59 +0800
commit26fbeece1c385a0e63efe3a6683af8459f4e495a (patch)
tree76a89112f69c6569430999a531d914166e3b84d8 /test
parent8898b8a0fe87f71c0ea2d35face6dfbf11db27ec (diff)
downloadtracifyjs-26fbeece1c385a0e63efe3a6683af8459f4e495a.tar.gz
tracifyjs-26fbeece1c385a0e63efe3a6683af8459f4e495a.zip
fix `pure_funcs` & improve `side_effects`
- only drops side-effect-free arguments - drop side-effect-free parts with discarded value from `AST_Seq` & `AST_SimpleStatement` closes #1494
Diffstat (limited to 'test')
-rw-r--r--test/compress/drop-unused.js58
-rw-r--r--test/compress/pure_funcs.js295
2 files changed, 353 insertions, 0 deletions
diff --git a/test/compress/drop-unused.js b/test/compress/drop-unused.js
index 5a09c6cd..f5a88f21 100644
--- a/test/compress/drop-unused.js
+++ b/test/compress/drop-unused.js
@@ -590,3 +590,61 @@ drop_fnames: {
}
}
}
+
+global_var: {
+ options = {
+ side_effects: true,
+ unused: true,
+ }
+ input: {
+ var a;
+ function foo(b) {
+ a;
+ b;
+ c;
+ typeof c === "undefined";
+ c + b + a;
+ b && b.ar();
+ return b;
+ }
+ }
+ expect: {
+ var a;
+ function foo(b) {
+ c;
+ c;
+ b && b.ar();
+ return b;
+ }
+ }
+}
+
+iife: {
+ options = {
+ side_effects: true,
+ unused: true,
+ }
+ input: {
+ function f() {
+ var a;
+ ~function() {}(b);
+ }
+ }
+ expect: {
+ function f() {
+ ~function() {}(b);
+ }
+ }
+}
+
+drop_value: {
+ options = {
+ side_effects: true,
+ }
+ input: {
+ (1, [2, foo()], 3, {a:1, b:bar()});
+ }
+ expect: {
+ foo(), bar();
+ }
+}
diff --git a/test/compress/pure_funcs.js b/test/compress/pure_funcs.js
new file mode 100644
index 00000000..3cc529a8
--- /dev/null
+++ b/test/compress/pure_funcs.js
@@ -0,0 +1,295 @@
+array: {
+ options = {
+ pure_funcs: [ "Math.floor" ],
+ side_effects: true,
+ }
+ input: {
+ var a;
+ function f(b) {
+ Math.floor(a / b);
+ Math.floor(c / b);
+ }
+ }
+ expect: {
+ var a;
+ function f(b) {
+ c;
+ }
+ }
+}
+
+func: {
+ options = {
+ pure_funcs: function(node) {
+ return !~node.args[0].print_to_string().indexOf("a");
+ },
+ side_effects: true,
+ }
+ input: {
+ function f(a, b) {
+ Math.floor(a / b);
+ Math.floor(c / b);
+ }
+ }
+ expect: {
+ function f(a, b) {
+ Math.floor(c / b);
+ }
+ }
+}
+
+side_effects: {
+ options = {
+ pure_funcs: [ "console.log" ],
+ side_effects: true,
+ }
+ input: {
+ function f(a, b) {
+ console.log(a());
+ console.log(b);
+ }
+ }
+ expect: {
+ function f(a, b) {
+ a();
+ }
+ }
+}
+
+unused: {
+ options = {
+ pure_funcs: [ "pure" ],
+ side_effects: true,
+ unused: true,
+ }
+ input: {
+ function foo() {
+ var u = pure(1);
+ var x = pure(2);
+ var y = pure(x);
+ var z = pure(pure(side_effects()));
+ return pure(3);
+ }
+ }
+ expect: {
+ function foo() {
+ side_effects();
+ return pure(3);
+ }
+ }
+}
+
+babel: {
+ options = {
+ pure_funcs: [ "_classCallCheck" ],
+ side_effects: true,
+ unused: true,
+ }
+ input: {
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor))
+ throw new TypeError("Cannot call a class as a function");
+ }
+ var Foo = function Foo() {
+ _classCallCheck(this, Foo);
+ };
+ }
+ expect: {
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor))
+ throw new TypeError("Cannot call a class as a function");
+ }
+ var Foo = function() {
+ };
+ }
+}
+
+conditional: {
+ options = {
+ pure_funcs: [ "pure" ],
+ side_effects: true,
+ }
+ input: {
+ pure(1 | a() ? 2 & b() : 7 ^ c());
+ pure(1 | a() ? 2 & b() : 5);
+ pure(1 | a() ? 4 : 7 ^ c());
+ pure(1 | a() ? 4 : 5);
+ pure(3 ? 2 & b() : 7 ^ c());
+ pure(3 ? 2 & b() : 5);
+ pure(3 ? 4 : 7 ^ c());
+ pure(3 ? 4 : 5);
+ }
+ expect: {
+ 1 | a() ? b() : c();
+ 1 | a() && b();
+ 1 | a() || c();
+ a();
+ 3 ? b() : c();
+ 3 && b();
+ 3 || c();
+ }
+}
+
+relational: {
+ options = {
+ pure_funcs: [ "foo" ],
+ side_effects :true,
+ }
+ input: {
+ foo() in foo();
+ foo() instanceof bar();
+ foo() < "bar";
+ bar() > foo();
+ bar() != bar();
+ bar() !== "bar";
+ "bar" == foo();
+ "bar" === bar();
+ "bar" >= "bar";
+ }
+ expect: {
+ bar();
+ bar();
+ bar(), bar();
+ bar();
+ bar();
+ }
+}
+
+arithmetic: {
+ options = {
+ pure_funcs: [ "foo" ],
+ side_effects :true,
+ }
+ input: {
+ foo() + foo();
+ foo() - bar();
+ foo() * "bar";
+ bar() / foo();
+ bar() & bar();
+ bar() | "bar";
+ "bar" >> foo();
+ "bar" << bar();
+ "bar" >>> "bar";
+ }
+ expect: {
+ bar();
+ bar();
+ bar(), bar();
+ bar();
+ bar();
+ }
+}
+
+boolean_and: {
+ options = {
+ pure_funcs: [ "foo" ],
+ side_effects :true,
+ }
+ input: {
+ foo() && foo();
+ foo() && bar();
+ foo() && "bar";
+ bar() && foo();
+ bar() && bar();
+ bar() && "bar";
+ "bar" && foo();
+ "bar" && bar();
+ "bar" && "bar";
+ }
+ expect: {
+ foo() && bar();
+ bar();
+ bar() && bar();
+ bar();
+ "bar" && bar();
+ }
+}
+
+boolean_or: {
+ options = {
+ pure_funcs: [ "foo" ],
+ side_effects :true,
+ }
+ input: {
+ foo() || foo();
+ foo() || bar();
+ foo() || "bar";
+ bar() || foo();
+ bar() || bar();
+ bar() || "bar";
+ "bar" || foo();
+ "bar" || bar();
+ "bar" || "bar";
+ }
+ expect: {
+ foo() || bar();
+ bar();
+ bar() || bar();
+ bar();
+ "bar" || bar();
+ }
+}
+
+assign: {
+ options = {
+ pure_funcs: [ "foo" ],
+ side_effects :true,
+ }
+ input: {
+ var a;
+ function f(b) {
+ a = foo();
+ b *= 4 + foo();
+ c >>= 0 | foo();
+ }
+ }
+ expect: {
+ var a;
+ function f(b) {
+ a = foo();
+ b *= 4 + foo();
+ c >>= 0 | foo();
+ }
+ }
+}
+
+unary: {
+ options = {
+ pure_funcs: [ "foo" ],
+ side_effects :true,
+ }
+ input: {
+ typeof foo();
+ typeof bar();
+ typeof "bar";
+ void foo();
+ void bar();
+ void "bar";
+ delete a[foo()];
+ delete a[bar()];
+ delete a["bar"];
+ a[foo()]++;
+ a[bar()]++;
+ a["bar"]++;
+ --a[foo()];
+ --a[bar()];
+ --a["bar"];
+ ~foo();
+ ~bar();
+ ~"bar";
+ }
+ expect: {
+ bar();
+ bar();
+ delete a[foo()];
+ delete a[bar()];
+ delete a["bar"];
+ a[foo()]++;
+ a[bar()]++;
+ a["bar"]++;
+ --a[foo()];
+ --a[bar()];
+ --a["bar"];
+ bar();
+ }
+}