handle destructuring `catch` in `--reduce-test` (#4427)
authorAlex Lam S.L <alexlamsl@gmail.com>
Sun, 20 Dec 2020 03:22:45 +0000 (03:22 +0000)
committerGitHub <noreply@github.com>
Sun, 20 Dec 2020 03:22:45 +0000 (11:22 +0800)
test/input/reduce/destructured_catch.js [new file with mode: 0644]
test/input/reduce/destructured_catch.reduced.js [new file with mode: 0644]
test/mocha/reduce.js
test/reduce.js
test/ufuzz/index.js

diff --git a/test/input/reduce/destructured_catch.js b/test/input/reduce/destructured_catch.js
new file mode 100644 (file)
index 0000000..3b24845
--- /dev/null
@@ -0,0 +1,7 @@
+try {
+    "foo" in 42;
+} catch ({
+    message,
+}) {
+    console.log(message);
+}
diff --git a/test/input/reduce/destructured_catch.reduced.js b/test/input/reduce/destructured_catch.reduced.js
new file mode 100644 (file)
index 0000000..c7a6736
--- /dev/null
@@ -0,0 +1,15 @@
+// (beautified)
+try {
+    1 in 0;
+} catch ({
+    message: message
+}) {
+    console.log(message);
+}
+// output: Cannot use 'in' operator to search for '1' in 0
+// 
+// minify: Cannot use 'in' operator to search for '0' in 0
+// 
+// options: {
+//   "mangle": false
+// }
\ No newline at end of file
index 7e2d460..c06efd6 100644 (file)
@@ -313,4 +313,12 @@ describe("test/reduce.js", function() {
         if (result.error) throw result.error;
         assert.strictEqual(result.code, read("test/input/reduce/diff_error.reduced.js"));
     });
+    it("Should handle destructured catch expressions", function() {
+        if (semver.satisfies(process.version, "<6")) return;
+        var result = reduce_test(read("test/input/reduce/destructured_catch.js"), {
+            mangle: false,
+        });
+        if (result.error) throw result.error;
+        assert.strictEqual(result.code, read("test/input/reduce/destructured_catch.reduced.js"));
+    });
 });
index 1ab1841..bcb30fe 100644 (file)
@@ -465,7 +465,7 @@ module.exports = function reduce_test(testcase, minify_options, reduce_options)
                     if (node.TYPE == "Call" && node.expression.print_to_string() == "console.log") {
                         return to_sequence(node.args);
                     }
-                    if (node instanceof U.AST_Catch && node.argname) {
+                    if (node instanceof U.AST_Catch && node.argname instanceof U.AST_SymbolCatch) {
                         descend(node, this);
                         node.body.unshift(new U.AST_SimpleStatement({
                             body: wrap_with_console_log(new U.AST_SymbolRef(node.argname)),
index 8fce55d..74fbd4b 100644 (file)
@@ -1714,7 +1714,7 @@ function patch_try_catch(orig, toplevel) {
         offset: 0,
         tries: [],
     } ];
-    var re = /(?:(?:^|[\s{}):;])try|}\s*catch\s*\(([^)]+)\)|}\s*finally)\s*(?={)/g;
+    var re = /(?:(?:^|[\s{}):;])try|}\s*catch\s*\(([^)[{]+)\)|}\s*finally)\s*(?={)/g;
     while (stack.length) {
         var code = stack[0].code;
         var offset = stack[0].offset;