aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Lam S.L <alexlamsl@gmail.com>2019-12-05 00:59:57 +0800
committerGitHub <noreply@github.com>2019-12-05 00:59:57 +0800
commitbf7e4ca1a3b1305308c66fcdf188d31a398c4ba2 (patch)
tree4ecd673e8b914fae92d7b86efb226ee0d1f6bbd6
parentd68ddc31f94074e09c661cb79ea43cef9adb44e6 (diff)
downloadtracifyjs-bf7e4ca1a3b1305308c66fcdf188d31a398c4ba2.tar.gz
tracifyjs-bf7e4ca1a3b1305308c66fcdf188d31a398c4ba2.zip
fix corner case in `collapse_vars` (#3627)
fixes #3626
-rw-r--r--lib/compress.js8
-rw-r--r--test/compress/collapse_vars.js37
2 files changed, 42 insertions, 3 deletions
diff --git a/lib/compress.js b/lib/compress.js
index 4442bbb5..74e2c6fc 100644
--- a/lib/compress.js
+++ b/lib/compress.js
@@ -1578,9 +1578,11 @@ merge(Compressor.prototype, {
}
if (parent instanceof AST_Binary) {
if (lazy_op[parent.operator] && parent.left !== node) {
- var grandparent = scanner.parent(level + 1);
- if (!(grandparent instanceof AST_Binary)) return node;
- if (grandparent.operator != parent.operator) return node;
+ do {
+ node = parent;
+ parent = scanner.parent(++level);
+ } while (parent instanceof AST_Binary && parent.operator == node.operator);
+ return node;
}
return find_stop_value(parent, level + 1);
}
diff --git a/test/compress/collapse_vars.js b/test/compress/collapse_vars.js
index cc6c5f9a..9fe5a93f 100644
--- a/test/compress/collapse_vars.js
+++ b/test/compress/collapse_vars.js
@@ -7308,3 +7308,40 @@ substitution_unary: {
"true 42 42",
]
}
+
+issue_3626_1: {
+ options = {
+ collapse_vars: true,
+ }
+ input: {
+ var a = "foo", b = 42;
+ a.p && (b = a) && a;
+ console.log(a, b);
+ }
+ expect: {
+ var a = "foo", b = 42;
+ a.p && (b = a) && a;
+ console.log(a, b);
+ }
+ expect_stdout: "foo 42"
+}
+
+issue_3626_2: {
+ options = {
+ collapse_vars: true,
+ conditionals: true,
+ }
+ input: {
+ var a = "foo", b = 42, c = null;
+ if (a && a.p)
+ if (b = a)
+ c++ + a;
+ console.log(a, b, c);
+ }
+ expect: {
+ var a = "foo", b = 42, c = null;
+ a && a.p && (b = a) && c++ + a;
+ console.log(a, b, c);
+ }
+ expect_stdout: "foo 42 null"
+}