JavaScript: Keep unary expressions parentheses with comments (#6217)

master
Sosuke Suzuki 2019-07-10 22:06:08 +09:00 committed by Lucas Duailibe
parent 712b44b814
commit cfba21f493
6 changed files with 1005 additions and 3 deletions

View File

@ -146,6 +146,33 @@ Previously, Prettier would sometimes ignore whitespace when formatting comments.
</div>
```
#### JavaScript: Keep unary expressions parentheses with comments ([#6217] by [@sosukesuzuki])
Previously, Prettier removes parentheses enclose unary expressions. This change modify to keep it when the expression has comments.
<!-- prettier-ignore -->
```ts
// Input
!(
/* foo */
foo
);
!(
foo // foo
);
// Output (Prettier stable)
!/* foo */
foo;
!foo; // foo
// Output (Prettier master)
!(/* foo */ foo);
!(
foo // foo
);
```
### Handlebars: Improve comment formatting ([#6234] by [@gavinjoyce])
Previously, Prettier would incorrectly decode HTML entiites.
@ -168,9 +195,11 @@ Previously, Prettier would incorrectly decode HTML entiites.
</p>
```
[#6209]: https://github.com/prettier/prettier/pull/6209
[#6186]: https://github.com/prettier/prettier/pull/6186
[#6186]: https://github.com/prettier/prettier/pull/6206
[#6206]: https://github.com/prettier/prettier/pull/6206
[#6209]: https://github.com/prettier/prettier/pull/6209
[#6217]: https://github.com/prettier/prettier/pull/6217
[#6234]: https://github.com/prettier/prettier/pull/6234
[@duailibe]: https://github.com/duailibe
[@gavinjoyce]: https://github.com/gavinjoyce
[@sosukesuzuki]: https://github.com/sosukesuzuki

View File

@ -1630,7 +1630,20 @@ function printPathNoParens(path, options, print, args) {
parts.push(" ");
}
parts.push(path.call(print, "argument"));
if (n.argument.comments && n.argument.comments.length > 0) {
parts.push(
group(
concat([
"(",
indent(concat([softline, path.call(print, "argument")])),
softline,
")"
])
)
);
} else {
parts.push(path.call(print, "argument"));
}
return concat(parts);
case "UpdateExpression":

View File

@ -414,3 +414,84 @@ class X {
================================================================================
`;
exports[`unary.js 1`] = `
====================================options=====================================
parsers: ["babel"]
printWidth: 80
| printWidth
=====================================input======================================
!x::y;
!(x::y /* foo */);
!(/* foo */ x::y);
!(
/* foo */
x::y
);
!(
x::y
/* foo */
);
!(
x::y // foo
);
=====================================output=====================================
!x::y;
!(x::y /* foo */);
!(/* foo */ x::y);
!(
/* foo */
x::y
);
!(
x::y
/* foo */
);
!(
x::y // foo
);
================================================================================
`;
exports[`unary.js 2`] = `
====================================options=====================================
parsers: ["babel"]
printWidth: 80
semi: false
| printWidth
=====================================input======================================
!x::y;
!(x::y /* foo */);
!(/* foo */ x::y);
!(
/* foo */
x::y
);
!(
x::y
/* foo */
);
!(
x::y // foo
);
=====================================output=====================================
!x::y
!(x::y /* foo */)
!(/* foo */ x::y)
!(
/* foo */
x::y
)
!(
x::y
/* foo */
)
!(
x::y // foo
)
================================================================================
`;

View File

@ -0,0 +1,14 @@
!x::y;
!(x::y /* foo */);
!(/* foo */ x::y);
!(
/* foo */
x::y
);
!(
x::y
/* foo */
);
!(
x::y // foo
);

View File

@ -1,5 +1,585 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`comments.js 1`] = `
====================================options=====================================
parsers: ["flow", "typescript"]
printWidth: 80
| printWidth
=====================================input======================================
!x;
!(x /* foo */);
!(/* foo */ x);
!(
/* foo */
x
);
!(
x
/* foo */
);
!(
x // foo
);
!(x + y);
!(x + y /* foo */);
!(/* foo */ x + y);
!(
/* foo */
x + y
);
!(
x + y
/* foo */
);
!(
x + y // foo
);
!(x || y);
!(/* foo */ x || y);
!(x || y /* foo */);
!(
/* foo */
x || y
);
!(
x || y
/* foo */
);
!(
x || y // foo
);
![1, 2, 3];
!([1, 2, 3] /* foo */);
!(/* foo */ [1, 2, 3]);
!(
/* foo */
[1, 2, 3]
);
!(
[1, 2, 3]
/* foo */
);
!(
[1, 2, 3] // foo
);
!{ a: 1, b: 2 };
!({ a: 1, b: 2 } /* foo */);
!(/* foo */ { a: 1, b: 2 });
!(
/* foo */
{ a: 1, b: 2 }
);
!(
{ a: 1, b: 2 }
/* foo */
);
!(
{ a: 1, b: 2 } // foo
)
!function() {
return x;
};
!(
function() {
return x;
} /* foo */
);
!(
/* foo */ function() {
return x;
}
);
!(
/* foo */
function() {
return x;
}
);
!(
function() {
return x;
}
/* foo */
);
!(
function() {
return x;
} // foo
)
!+3;
!(+3 /* foo */);
!(/* foo */ +3);
!(
/* foo */
+3
);
!(
+3
/* foo */
);
!(
+3 // foo
);
!+(
/* foo */
3
);
!(/* foo */ +(3 /* foo */));
!(+(3 /* foo */) /* foo */);
!(
/* foo */
+(
/* foo */
3
)
);
!(
+(
3
/* foo */
)
/* foo */
);
!(
+(
3 /* foo */
) // foo
);
!(x = y);
!(x = y /* foo */);
!(/* foo */ x = y);
!(
/* foo */
x = y
);
!(
x = y
/* foo */
);
!(
x = y // foo
);
!x.y;
!(x.y /* foo */);
!(/* foo */ x.y);
!(
/* foo */
x.y
);
!(
x.y
/* foo */
);
!(
x.y // foo
);
!(x ? y : z);
!(x ? y : z /* foo */);
!(/* foo */ x ? y : z);
!(
/* foo */
x ? y : z
);
!(
x ? y : z
/* foo */
);
!(
x ? y : z // foo
);
!x();
!(x() /* foo */);
!(/* foo */ x());
!(
/* foo */
x()
);
!(
x()
/* foo */
);
!(
x() // foo
);
!new x();
!(new x() /* foo */);
!(/* foo */ new x());
!(
/* foo */
new x()
);
!(
new x()
/* foo */
);
!(
new x() // foo
);
!(x, y);
!(x, y /* foo */);
!(/* foo */ x, y);
!(
/* foo */
x, y
);
!(
x, y
/* foo */
);
!(
x.y // foo
);
!(() => 3);
!(() => 3 /* foo */);
!(/* foo */ () => 3);
!(
/* foo */
() => 3
);
!(
() => 3
/* foo */
);
!(
() => 3 // foo
);
function* bar() {
!(yield x);
!(yield x /* foo */);
!(/* foo */ yield x);
!(
/* foo */
yield x
);
!(
yield x
/* foo */
);
!(
yield x // foo
);
}
async function bar() {
!(await x);
!(await x /* foo */);
!(/* foo */ await x);
!(
/* foo */
await x
);
!(
await x
/* foo */
);
!(
await x // foo
);
}
=====================================output=====================================
!x;
!(x /* foo */);
!(/* foo */ x);
!(
/* foo */
x
);
!(
x
/* foo */
);
!(
x // foo
);
!(x + y);
!((x + y) /* foo */);
!(/* foo */ (x + y));
!(
/* foo */
(x + y)
);
!(
(x + y)
/* foo */
);
!(
(x + y) // foo
);
!(x || y);
!(/* foo */ (x || y));
!((x || y) /* foo */);
!(
/* foo */
(x || y)
);
!(
(x || y)
/* foo */
);
!(
(x || y) // foo
);
![1, 2, 3];
!([1, 2, 3] /* foo */);
!(/* foo */ [1, 2, 3]);
!(
/* foo */
[1, 2, 3]
);
!(
[1, 2, 3]
/* foo */
);
!(
[1, 2, 3] // foo
);
!{ a: 1, b: 2 };
!({ a: 1, b: 2 } /* foo */);
!(/* foo */ { a: 1, b: 2 });
!(
/* foo */
{ a: 1, b: 2 }
);
!(
{ a: 1, b: 2 }
/* foo */
);
!(
{ a: 1, b: 2 } // foo
);
!function() {
return x;
};
!(
function() {
return x;
} /* foo */
);
!(
/* foo */ function() {
return x;
}
);
!(
/* foo */
function() {
return x;
}
);
!(
function() {
return x;
}
/* foo */
);
!(
function() {
return x;
} // foo
);
!+3;
!(+3 /* foo */);
!(/* foo */ +3);
!(
/* foo */
+3
);
!(
+3
/* foo */
);
!(
+3 // foo
);
!+(
/* foo */
3
);
!(/* foo */ +(3 /* foo */));
!(+(3 /* foo */) /* foo */);
!(
/* foo */
+(
/* foo */
3
)
);
!(
+(
3
/* foo */
)
/* foo */
);
!(
+(3 /* foo */) // foo
);
!(x = y);
!((x = y) /* foo */);
!(/* foo */ (x = y));
!(
/* foo */
(x = y)
);
!(
(x = y)
/* foo */
);
!(
(x = y) // foo
);
!x.y;
!(x.y /* foo */);
!(/* foo */ x.y);
!(
/* foo */
x.y
);
!(
x.y
/* foo */
);
!(
x.y // foo
);
!(x ? y : z);
!((x ? y : z) /* foo */);
!(/* foo */ (x ? y : z));
!(
/* foo */
(x ? y : z)
);
!(
(x ? y : z)
/* foo */
);
!(
(x ? y : z) // foo
);
!x();
!(x() /* foo */);
!(/* foo */ x());
!(
/* foo */
x()
);
!(
x()
/* foo */
);
!(
x() // foo
);
!new x();
!(new x() /* foo */);
!(/* foo */ new x());
!(
/* foo */
new x()
);
!(
new x()
/* foo */
);
!(
new x() // foo
);
!(x, y);
!((x, y) /* foo */);
!(/* foo */ (x, y));
!(
/* foo */
(x, y)
);
!(
(x, y)
/* foo */
);
!(
x.y // foo
);
!(() => 3);
!((() => 3) /* foo */);
!(/* foo */ (() => 3));
!(
/* foo */
(() => 3)
);
!(
(() => 3)
/* foo */
);
!(
(() => 3) // foo
);
function* bar() {
!(yield x);
!((yield x) /* foo */);
!(/* foo */ (yield x));
!(
/* foo */
(yield x)
);
!(
(yield x)
/* foo */
);
!(
(yield x) // foo
);
}
async function bar() {
!(await x);
!((await x) /* foo */);
!(/* foo */ (await x));
!(
/* foo */
(await x)
);
!(
(await x)
/* foo */
);
!(
(await x) // foo
);
}
================================================================================
`;
exports[`urnary_expression.js 1`] = `
====================================options=====================================
parsers: ["flow", "typescript"]

View File

@ -0,0 +1,285 @@
!x;
!(x /* foo */);
!(/* foo */ x);
!(
/* foo */
x
);
!(
x
/* foo */
);
!(
x // foo
);
!(x + y);
!(x + y /* foo */);
!(/* foo */ x + y);
!(
/* foo */
x + y
);
!(
x + y
/* foo */
);
!(
x + y // foo
);
!(x || y);
!(/* foo */ x || y);
!(x || y /* foo */);
!(
/* foo */
x || y
);
!(
x || y
/* foo */
);
!(
x || y // foo
);
![1, 2, 3];
!([1, 2, 3] /* foo */);
!(/* foo */ [1, 2, 3]);
!(
/* foo */
[1, 2, 3]
);
!(
[1, 2, 3]
/* foo */
);
!(
[1, 2, 3] // foo
);
!{ a: 1, b: 2 };
!({ a: 1, b: 2 } /* foo */);
!(/* foo */ { a: 1, b: 2 });
!(
/* foo */
{ a: 1, b: 2 }
);
!(
{ a: 1, b: 2 }
/* foo */
);
!(
{ a: 1, b: 2 } // foo
)
!function() {
return x;
};
!(
function() {
return x;
} /* foo */
);
!(
/* foo */ function() {
return x;
}
);
!(
/* foo */
function() {
return x;
}
);
!(
function() {
return x;
}
/* foo */
);
!(
function() {
return x;
} // foo
)
!+3;
!(+3 /* foo */);
!(/* foo */ +3);
!(
/* foo */
+3
);
!(
+3
/* foo */
);
!(
+3 // foo
);
!+(
/* foo */
3
);
!(/* foo */ +(3 /* foo */));
!(+(3 /* foo */) /* foo */);
!(
/* foo */
+(
/* foo */
3
)
);
!(
+(
3
/* foo */
)
/* foo */
);
!(
+(
3 /* foo */
) // foo
);
!(x = y);
!(x = y /* foo */);
!(/* foo */ x = y);
!(
/* foo */
x = y
);
!(
x = y
/* foo */
);
!(
x = y // foo
);
!x.y;
!(x.y /* foo */);
!(/* foo */ x.y);
!(
/* foo */
x.y
);
!(
x.y
/* foo */
);
!(
x.y // foo
);
!(x ? y : z);
!(x ? y : z /* foo */);
!(/* foo */ x ? y : z);
!(
/* foo */
x ? y : z
);
!(
x ? y : z
/* foo */
);
!(
x ? y : z // foo
);
!x();
!(x() /* foo */);
!(/* foo */ x());
!(
/* foo */
x()
);
!(
x()
/* foo */
);
!(
x() // foo
);
!new x();
!(new x() /* foo */);
!(/* foo */ new x());
!(
/* foo */
new x()
);
!(
new x()
/* foo */
);
!(
new x() // foo
);
!(x, y);
!(x, y /* foo */);
!(/* foo */ x, y);
!(
/* foo */
x, y
);
!(
x, y
/* foo */
);
!(
x.y // foo
);
!(() => 3);
!(() => 3 /* foo */);
!(/* foo */ () => 3);
!(
/* foo */
() => 3
);
!(
() => 3
/* foo */
);
!(
() => 3 // foo
);
function* bar() {
!(yield x);
!(yield x /* foo */);
!(/* foo */ yield x);
!(
/* foo */
yield x
);
!(
yield x
/* foo */
);
!(
yield x // foo
);
}
async function bar() {
!(await x);
!(await x /* foo */);
!(/* foo */ await x);
!(
/* foo */
await x
);
!(
await x
/* foo */
);
!(
await x // foo
);
}