fix corner case with `class` (#4713)
authorAlex Lam S.L <alexlamsl@gmail.com>
Tue, 2 Mar 2021 04:08:08 +0000 (04:08 +0000)
committerGitHub <noreply@github.com>
Tue, 2 Mar 2021 04:08:08 +0000 (12:08 +0800)
lib/parse.js
test/compress/classes.js

index 2cb3040..0798062 100644 (file)
@@ -1053,6 +1053,16 @@ function parse($TEXT, options) {
         return stat;
     }
 
+    function has_modifier(name) {
+        if (!is("name", name)) return;
+        var token = peek();
+        if (!token) return;
+        if (is_token(token, "operator", "=")) return;
+        if (token.type == "punc" && /^[(;}]$/.test(token.value)) return;
+        if (has_newline_before(token)) return;
+        return next();
+    }
+
     function class_(ctor) {
         var was_async = S.in_async;
         var was_gen = S.in_generator;
@@ -1078,16 +1088,8 @@ function parse($TEXT, options) {
                 continue;
             }
             var start = S.token;
-            var fixed = is("name", "static");
-            if (fixed) next();
-            var async = is("name", "async") && peek();
-            if (async) {
-                if (async.type == "punc" && /^[(=;}]$/.test(async.value) || has_newline_before(async)) {
-                    async = false;
-                } else {
-                    async = next();
-                }
-            }
+            var fixed = !!has_modifier("static");
+            var async = has_modifier("async");
             if (is("operator", "*")) {
                 next();
                 var internal = is("name") && /^#/.test(S.token.value);
index f94731f..386e372 100644 (file)
@@ -82,6 +82,19 @@ fields: {
     node_version: ">=12"
 }
 
+modifier_as_field_name: {
+    input: {
+        for (var k in new class { async; static = 42 })
+            console.log(k);
+    }
+    expect_exact: "for(var k in new class{async;static=42})console.log(k);"
+    expect_stdout: [
+        "async",
+        "static",
+    ]
+    node_version: ">=12"
+}
+
 methods: {
     input: {
         "use strict";