From 0cfd772fd28475fcd20eb52eaf5ccaff020aa7c2 Mon Sep 17 00:00:00 2001 From: Joseph Frazier <1212jtraceur@gmail.com> Date: Tue, 6 Jun 2017 17:28:51 -0400 Subject: [PATCH] Protect SwitchCase statements from ASI (#2008) * Add no-semi test with SequenceExpression Adapted from https://github.com/prettier/prettier/issues/2006 * Protect SequenceExpressions from ASI Fixes https://github.com/prettier/prettier/issues/2006 * Add test for ASI protection of SequenceExpression outside SwitchCase See https://github.com/prettier/prettier/pull/2008#issuecomment-306614217 * Revert "Protect SequenceExpressions from ASI" This reverts commit ca644fad8072c90a977ad8a2f29674bc72f679e8. * Protect SwitchCase statements from ASI See https://github.com/prettier/prettier/pull/2008#issuecomment-306614217 Fixes https://github.com/prettier/prettier/issues/2006 --- src/printer.js | 10 ++- .../no-semi/__snapshots__/jsfmt.spec.js.snap | 63 +++++++++++++++++++ tests/no-semi/issue2006.js | 8 +++ 3 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 tests/no-semi/issue2006.js diff --git a/src/printer.js b/src/printer.js index fcda02739..1e6ae4dfc 100644 --- a/src/printer.js +++ b/src/printer.js @@ -1488,7 +1488,15 @@ function genericPrintNoParens(path, options, print, args) { const shouldAddLine = i !== n.consequent.length - 1 && util.isNextLineEmpty(options.originalText, p.getValue()); - return concat([print(p), shouldAddLine ? hardline : ""]); + const printed = concat([ + print(p), + shouldAddLine ? hardline : "" + ]); + // in no-semi mode, prepend statement with semicolon if it might break ASI + if (!options.semi && stmtNeedsASIProtection(p)) { + return concat([";", printed]); + } + return printed; }) .filter(e => e !== null) ); diff --git a/tests/no-semi/__snapshots__/jsfmt.spec.js.snap b/tests/no-semi/__snapshots__/jsfmt.spec.js.snap index 8646015b9..ff055a1b8 100644 --- a/tests/no-semi/__snapshots__/jsfmt.spec.js.snap +++ b/tests/no-semi/__snapshots__/jsfmt.spec.js.snap @@ -81,6 +81,69 @@ x `; +exports[`issue2006.js 1`] = ` +switch (n) { + case 11: + var c = a.e; + (i.a += Ga(c.e)), F(i, c.i, 0); +} + +var c = a.e; +(i.a += Ga(c.e)), F(i, c.i, 0); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +switch (n) { + case 11: + var c = a.e; + (i.a += Ga(c.e)), F(i, c.i, 0); +} + +var c = a.e; +(i.a += Ga(c.e)), F(i, c.i, 0); + +`; + +exports[`issue2006.js 2`] = ` +switch (n) { + case 11: + var c = a.e; + (i.a += Ga(c.e)), F(i, c.i, 0); +} + +var c = a.e; +(i.a += Ga(c.e)), F(i, c.i, 0); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +switch (n) { + case 11: + var c = a.e + ;(i.a += Ga(c.e)), F(i, c.i, 0) +} + +var c = a.e +;(i.a += Ga(c.e)), F(i, c.i, 0) + +`; + +exports[`issue2006.js 3`] = ` +switch (n) { + case 11: + var c = a.e; + (i.a += Ga(c.e)), F(i, c.i, 0); +} + +var c = a.e; +(i.a += Ga(c.e)), F(i, c.i, 0); +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +switch (n) { + case 11: + var c = a.e + ;(i.a += Ga(c.e)), F(i, c.i, 0) +} + +var c = a.e +;(i.a += Ga(c.e)), F(i, c.i, 0) + +`; + exports[`no-semi.js 1`] = ` // with preexisting semi diff --git a/tests/no-semi/issue2006.js b/tests/no-semi/issue2006.js new file mode 100644 index 000000000..bcbd4fbde --- /dev/null +++ b/tests/no-semi/issue2006.js @@ -0,0 +1,8 @@ +switch (n) { + case 11: + var c = a.e; + (i.a += Ga(c.e)), F(i, c.i, 0); +} + +var c = a.e; +(i.a += Ga(c.e)), F(i, c.i, 0);