Skip to content

Commit

Permalink
Break after equal on assignment if rhs is await/yield expression (#15204
Browse files Browse the repository at this point in the history
)

* add as-is test

* break after equal on assignment if rhs is wait

Discussion: #15196

* rename test file

* add as-is test

* treat YieldExpression

* add tests

* add changelog

* fix a bug

* add test for delegated yield
  • Loading branch information
seiyab committed Aug 6, 2023
1 parent 892a1cf commit bf0b304
Show file tree
Hide file tree
Showing 4 changed files with 147 additions and 1 deletion.
16 changes: 16 additions & 0 deletions changelog_unreleased/javascript/15204.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#### Break after `=` of assignment if RHS is poorly breakable AwaitExpression or YieldExpression (#15204 by @seiyab)

<!-- prettier-ignore -->
```js
// Input
const { section, rubric, authors, tags } = await utils.upsertCommonData(mainData);

// Prettier stable
const { section, rubric, authors, tags } = await utils.upsertCommonData(
mainData,
);

// Prettier main
const { section, rubric, authors, tags } =
await utils.upsertCommonData(mainData);
```
6 changes: 5 additions & 1 deletion src/language-js/print/assignment.js
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,11 @@ function shouldBreakAfterOperator(path, options, print, hasShortKey) {
let node = rightNode;
const propertiesForPath = [];
for (;;) {
if (node.type === "UnaryExpression") {
if (
node.type === "UnaryExpression" ||
node.type === "AwaitExpression" ||
(node.type === "YieldExpression" && node.argument !== null)
) {
node = node.argument;
propertiesForPath.push("argument");
} else if (node.type === "TSNonNullExpression") {
Expand Down
98 changes: 98 additions & 0 deletions tests/format/js/assignment/__snapshots__/jsfmt.spec.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,104 @@ printWidth: 80
================================================================================
`;

exports[`discussion-15196.js format 1`] = `
====================================options=====================================
parsers: ["babel", "flow", "typescript"]
printWidth: 80
| printWidth
=====================================input======================================
async function f() {
const { section, rubric, authors, tags } = await utils.upsertCommonData(mainData);
const loooooooooooooooooooooooooong1 = await looooooooooooooong.looooooooooooooong.loooooong;
const loooooooooooooooooooooooooong2 = await looooooooooooooong.looooooooooooooong.loooooong();
const loooooooooooooooooooooooooong3 = await looooooooooooooooooooooooooooooooooooooooooooog();
const loooooooooooooooooooooooooong4 = !await looooooooooooooong.looooooooooooooong.loooooong;
const loooooooooooooooooooooooooong5 = void !!await looooooooooooooong.looooooooooooooong.loooooong;
const longlonglonglonglonglonglong1 = await new Promise((resolve, reject) => { setTimeout(() => { resolve('foo'); }, 300); })
const longlonglonglonglonglonglong2 = await { then(onFulfilled, onRejected) { onFulfilled(1234567890) } };
}
function* g() {
const { section, rubric, authors, tags } = yield utils.upsertCommonData(mainData);
const loooooooooooooooooooooooooong1 = yield looooooooooooooong.looooooooooooooong.loooooong;
const loooooooooooooooooooooooooong2 = yield looooooooooooooong.looooooooooooooong.loooooong();
const loooooooooooooooooooooooooong3 = yield looooooooooooooooooooooooooooooooooooooooooooog();
const loooooooooooooooooooooooooong4 = !(yield looooooooooooooong.looooooooooooooong.loooooong);
const loooooooooooooooooooooooooong5 = void !!(yield looooooooooooooong.looooooooooooooong.loooooong);
const loooooooooooooooooooooooooong6 = yield* looooooooooooooong.looooooooooooooong.loooooong;
const longlonglonglonglonglonglong1 = yield qwertyuiop(asdfghjkl, zxcvbnm, qwertyuiop, asdfghjkl);
const longlonglonglonglonglonglong2 = yield { qwertyuiop: 1234567890, asdfghjkl: 1234567890, zxcvbnm: 123456789 };
const x = yield;
}
=====================================output=====================================
async function f() {
const { section, rubric, authors, tags } =
await utils.upsertCommonData(mainData);
const loooooooooooooooooooooooooong1 =
await looooooooooooooong.looooooooooooooong.loooooong;
const loooooooooooooooooooooooooong2 =
await looooooooooooooong.looooooooooooooong.loooooong();
const loooooooooooooooooooooooooong3 =
await looooooooooooooooooooooooooooooooooooooooooooog();
const loooooooooooooooooooooooooong4 =
!(await looooooooooooooong.looooooooooooooong.loooooong);
const loooooooooooooooooooooooooong5 =
void !!(await looooooooooooooong.looooooooooooooong.loooooong);
const longlonglonglonglonglonglong1 = await new Promise((resolve, reject) => {
setTimeout(() => {
resolve("foo");
}, 300);
});
const longlonglonglonglonglonglong2 = await {
then(onFulfilled, onRejected) {
onFulfilled(1234567890);
},
};
}
function* g() {
const { section, rubric, authors, tags } =
yield utils.upsertCommonData(mainData);
const loooooooooooooooooooooooooong1 =
yield looooooooooooooong.looooooooooooooong.loooooong;
const loooooooooooooooooooooooooong2 =
yield looooooooooooooong.looooooooooooooong.loooooong();
const loooooooooooooooooooooooooong3 =
yield looooooooooooooooooooooooooooooooooooooooooooog();
const loooooooooooooooooooooooooong4 =
!(yield looooooooooooooong.looooooooooooooong.loooooong);
const loooooooooooooooooooooooooong5 =
void !!(yield looooooooooooooong.looooooooooooooong.loooooong);
const loooooooooooooooooooooooooong6 =
yield* looooooooooooooong.looooooooooooooong.loooooong;
const longlonglonglonglonglonglong1 = yield qwertyuiop(
asdfghjkl,
zxcvbnm,
qwertyuiop,
asdfghjkl,
);
const longlonglonglonglonglonglong2 = yield {
qwertyuiop: 1234567890,
asdfghjkl: 1234567890,
zxcvbnm: 123456789,
};
const x = yield;
}
================================================================================
`;

exports[`issue-1419.js format 1`] = `
====================================options=====================================
parsers: ["babel", "flow", "typescript"]
Expand Down
28 changes: 28 additions & 0 deletions tests/format/js/assignment/discussion-15196.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
async function f() {
const { section, rubric, authors, tags } = await utils.upsertCommonData(mainData);

const loooooooooooooooooooooooooong1 = await looooooooooooooong.looooooooooooooong.loooooong;
const loooooooooooooooooooooooooong2 = await looooooooooooooong.looooooooooooooong.loooooong();
const loooooooooooooooooooooooooong3 = await looooooooooooooooooooooooooooooooooooooooooooog();
const loooooooooooooooooooooooooong4 = !await looooooooooooooong.looooooooooooooong.loooooong;
const loooooooooooooooooooooooooong5 = void !!await looooooooooooooong.looooooooooooooong.loooooong;

const longlonglonglonglonglonglong1 = await new Promise((resolve, reject) => { setTimeout(() => { resolve('foo'); }, 300); })
const longlonglonglonglonglonglong2 = await { then(onFulfilled, onRejected) { onFulfilled(1234567890) } };
}

function* g() {
const { section, rubric, authors, tags } = yield utils.upsertCommonData(mainData);

const loooooooooooooooooooooooooong1 = yield looooooooooooooong.looooooooooooooong.loooooong;
const loooooooooooooooooooooooooong2 = yield looooooooooooooong.looooooooooooooong.loooooong();
const loooooooooooooooooooooooooong3 = yield looooooooooooooooooooooooooooooooooooooooooooog();
const loooooooooooooooooooooooooong4 = !(yield looooooooooooooong.looooooooooooooong.loooooong);
const loooooooooooooooooooooooooong5 = void !!(yield looooooooooooooong.looooooooooooooong.loooooong);
const loooooooooooooooooooooooooong6 = yield* looooooooooooooong.looooooooooooooong.loooooong;

const longlonglonglonglonglonglong1 = yield qwertyuiop(asdfghjkl, zxcvbnm, qwertyuiop, asdfghjkl);
const longlonglonglonglonglonglong2 = yield { qwertyuiop: 1234567890, asdfghjkl: 1234567890, zxcvbnm: 123456789 };

const x = yield;
}

0 comments on commit bf0b304

Please sign in to comment.