aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/parse.js23
-rw-r--r--test/compress/issue-2652.js33
2 files changed, 47 insertions, 9 deletions
diff --git a/lib/parse.js b/lib/parse.js
index c042a60b..5eb75441 100644
--- a/lib/parse.js
+++ b/lib/parse.js
@@ -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
index 00000000..d3159742
--- /dev/null
+++ b/test/compress/issue-2652.js
@@ -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;",
+ ]
+}