parse LF & comment correctly (#2653)
authorAlex Lam S.L <alexlamsl@gmail.com>
Mon, 25 Dec 2017 17:38:01 +0000 (01:38 +0800)
committerGitHub <noreply@github.com>
Mon, 25 Dec 2017 17:38:01 +0000 (01:38 +0800)
fixes #2652

lib/parse.js
test/compress/issue-2652.js [new file with mode: 0644]

index c042a60..5eb7544 100644 (file)
@@ -774,10 +774,15 @@ function parse($TEXT, options) {
 
     function expect(punc) { return expect_token("punc", punc); };
 
+    function has_newline_before(token) {
+        return token.nlb || !all(token.comments_before, function(comment) {
+            return !comment.nlb;
+        });
+    }
+
     function can_insert_semicolon() {
-        return !options.strict && (
-            S.token.nlb || is("eof") || is("punc", "}")
-        );
+        return !options.strict
+            && (is("eof") || is("punc", "}") || has_newline_before(S.token));
     };
 
     function semicolon(optional) {
@@ -817,10 +822,10 @@ function parse($TEXT, options) {
             if (S.in_directives) {
                 var token = peek();
                 if (S.token.raw.indexOf("\\") == -1
-                    && (token.nlb
-                        || is_token(token, "eof")
-                        || is_token(token, "punc", ";")
-                        || is_token(token, "punc", "}"))) {
+                    && (is_token(token, "punc", ";")
+                        || is_token(token, "punc", "}")
+                        || has_newline_before(token)
+                        || is_token(token, "eof"))) {
                     S.input.add_directive(S.token.value);
                 } else {
                     S.in_directives = false;
@@ -927,7 +932,7 @@ function parse($TEXT, options) {
 
               case "throw":
                 next();
-                if (S.token.nlb)
+                if (has_newline_before(S.token))
                     croak("Illegal newline after 'throw'");
                 var value = expression(true);
                 semicolon();
@@ -1503,7 +1508,7 @@ function parse($TEXT, options) {
             return ex;
         }
         var val = expr_atom(allow_calls);
-        while (is("operator") && UNARY_POSTFIX(S.token.value) && !S.token.nlb) {
+        while (is("operator") && UNARY_POSTFIX(S.token.value) && !has_newline_before(S.token)) {
             val = make_unary(AST_UnaryPostfix, S.token, val);
             val.start = start;
             val.end = S.token;
diff --git a/test/compress/issue-2652.js b/test/compress/issue-2652.js
new file mode 100644 (file)
index 0000000..d315974
--- /dev/null
@@ -0,0 +1,33 @@
+insert_semicolon: {
+    beautify = {
+        beautify: true,
+        comments: "all",
+    }
+    input: {
+        var a
+        /* foo */ var b
+    }
+    expect_exact: [
+        "var a",
+        "/* foo */;",
+        "",
+        "var b;",
+    ]
+}
+
+unary_postfix: {
+    beautify = {
+        beautify: true,
+        comments: "all",
+    }
+    input: {
+        a
+        /* foo */++b
+    }
+    expect_exact: [
+        "a",
+        "/* foo */;",
+        "",
+        "++b;",
+    ]
+}