Break lines before binary operators (#7111)

* Add additional binary expression comment tests

Refs #3806

These cover a few edge cases I encountered while maintaining
`@btmills/prettier` over the last few years. I'm adding them up front to
demonstrate that the `experimentalOperatorPosition` changes in a later
commit have no effect on this formatting when the flag is not enabled.

* Define experimentalOperatorPosition flag

Refs #3806

This merely defines the flag. A future commit will use it in updated
logic.

* Add experimentalOperatorPosition default tests

Right now, this flag isn't implemented, so these tests duplicate the
existing behavior. I'm adding them now so that when I implement the
flag's logic in a future commit, the changed formatting will be obvious
in the diff and easier to review.

* Implement experimentalOperatorPosition flag

Fixes #3806 as requested in https://github.com/prettier/prettier/pull/7111#issuecomment-2252623779

The flag's tests were already added in a previous commit, so the test
changes you see in this commit are specifically due to the new flag's
implementation.

* Document experimentalOperatorPosition flag

* Change operator position option start|end

In response to https://github.com/prettier/prettier/pull/7111#discussion_r1729382119

* Add TS intersection line wrapping tests

This clones TypeScript's type union operator tests in `union-parens.ts`
and swaps the operators (& <-> |) to test the the type interesection
operator. It also runs intersection tests with the new
`experimentalOperatorPosition: "start"` flag. This does _not_ yet update
the implementation to consider the flag; to ease review, I'll make that
change in the next commit to isolate the impact of the change.

* Apply experimentalOperatorPosition: start to type intersections

The type union operator was already formatted at the beginning of lines
by default, so that logic didn't need to be updated.

* Update 7111.md

* Update tests after rebasing

I rebased from 1dfe28f85 to c7066780e to fix test failures related to
https://github.com/prettier/prettier/pull/16601. The rebase applied
cleanly, and this was the only change to tests. Since the PR has
already been approved, I'll keep this as a separate commit rather than
squashing into the prior commits.

---------

Co-authored-by: fisker Cheung <lionkay@gmail.com>
Co-authored-by: SUZUKI Sosuke <aosukeke@gmail.com>
This commit is contained in:
authored and GitHub committed 2025-01-04 01:30:51 +09:00
1 parent d9d0999aac
commit eed53fc29a
17 files changed
+2342 -21

No files matched your search

@@ -53,6 +53,9 @@ Format options:
--end-of-line <lf|crlf|cr|auto>
Which end of line characters to apply.
Defaults to lf.
--experimental-operator-position <start|end>
Where to print operators when binary expressions wrap lines.
Defaults to end.
--no-experimental-ternaries
Default behavior of ternaries; keep question marks on the same line as the consequent.
--html-whitespace-sensitivity <css|strict|ignore>
@@ -218,6 +221,9 @@ Format options:
--end-of-line <lf|crlf|cr|auto>
Which end of line characters to apply.
Defaults to lf.
--experimental-operator-position <start|end>
Where to print operators when binary expressions wrap lines.
Defaults to end.
--no-experimental-ternaries
Default behavior of ternaries; keep question marks on the same line as the consequent.
--html-whitespace-sensitivity <css|strict|ignore>
@@ -191,6 +191,23 @@ Default: lf"
exports[`show detailed usage with --help end-of-line (write) 1`] = `[]`;
exports[`show detailed usage with --help experimental-operator-position (stderr) 1`] = `""`;
exports[`show detailed usage with --help experimental-operator-position (stdout) 1`] = `
"--experimental-operator-position <start|end>
Where to print operators when binary expressions wrap lines.
Valid options:
start Print operators at the start of new lines.
end Print operators at the end of previous lines.
Default: end"
`;
exports[`show detailed usage with --help experimental-operator-position (write) 1`] = `[]`;
exports[`show detailed usage with --help experimental-ternaries (stderr) 1`] = `""`;
exports[`show detailed usage with --help experimental-ternaries (stdout) 1`] = `
@@ -17,10 +17,10 @@ exports[`show external options with \`--help\` 1`] = `
- First value
+ Second value
@@ -24,16 +24,18 @@
--end-of-line <lf|crlf|cr|auto>
Which end of line characters to apply.
Defaults to lf.
@@ -27,16 +27,18 @@
--experimental-operator-position <start|end>
Where to print operators when binary expressions wrap lines.
Defaults to end.
--no-experimental-ternaries
Default behavior of ternaries; keep question marks on the same line as the consequent.
+ --foo-string <string> foo description
@@ -60,10 +60,10 @@ exports[`show external options with \`--help\` 1`] = `
- First value
+ Second value
@@ -24,16 +24,18 @@
--end-of-line <lf|crlf|cr|auto>
Which end of line characters to apply.
Defaults to lf.
@@ -27,16 +27,18 @@
--experimental-operator-position <start|end>
Where to print operators when binary expressions wrap lines.
Defaults to end.
--no-experimental-ternaries
Default behavior of ternaries; keep question marks on the same line as the consequent.
+ --foo-option <bar|baz> foo description
@@ -89,6 +89,24 @@ exports[`schema 1`] = `
},
],
},
"experimentalOperatorPosition": {
"default": "end",
"description": "Where to print operators when binary expressions wrap lines.",
"oneOf": [
{
"description": "Print operators at the start of new lines.",
"enum": [
"start",
],
},
{
"description": "Print operators at the end of previous lines.",
"enum": [
"end",
],
},
],
},
"experimentalTernaries": {
"default": false,
"description": "Use curious ternaries, with the question mark after the condition.",
@@ -130,6 +130,14 @@ exports[`API getSupportInfo() 1`] = `
"default": "lf",
"type": "choice",
},
"experimentalOperatorPosition": {
"choices": [
"start",
"end",
],
"default": "end",
"type": "choice",
},
"experimentalTernaries": {
"default": false,
"type": "boolean",
@@ -847,6 +855,24 @@ exports[`CLI --support-info (stdout) 1`] = `
"pluginDefaults": {},
"type": "choice"
},
{
"category": "JavaScript",
"choices": [
{
"description": "Print operators at the start of new lines.",
"value": "start"
},
{
"description": "Print operators at the end of previous lines.",
"value": "end"
}
],
"default": "end",
"description": "Where to print operators when binary expressions wrap lines.",
"name": "experimentalOperatorPosition",
"pluginDefaults": {},
"type": "choice"
},
{
"category": "JavaScript",
"default": false,