diff --git a/changelog_unreleased/javascript/16899.md b/changelog_unreleased/javascript/16899.md
new file mode 100644
index 000000000..5d0515bcb
--- /dev/null
+++ b/changelog_unreleased/javascript/16899.md
@@ -0,0 +1,35 @@
+#### Fix non-idempotent formatting (#16899 by @seiyab)
+
+This bug fix is not language-specific. You may see similar change in any languages. This fixes regression in 3.4.0 so change caused by it should yield same formatting as 3.3.3.
+
+
+```jsx
+// Input
+
+ foo
+ longlonglonglonglonglonglonglonglonglonglonglonglonglonglongl foo
+ , abc
+
;
+
+// Prettier stable (first)
+
+ foo
+
+ longlonglonglonglonglonglonglonglonglonglonglonglonglonglongl foo
+ , abc
+
;
+
+// Prettier stable (second)
+
+ foo
+ longlonglonglonglonglonglonglonglonglonglonglonglonglonglongl foo
+ , abc
+
;
+
+// Prettier main
+
+ foo
+ longlonglonglonglonglonglonglonglonglonglonglonglonglonglongl foo
+ , abc
+
;
+```
diff --git a/src/document/printer.js b/src/document/printer.js
index 196691b42..23a268fed 100644
--- a/src/document/printer.js
+++ b/src/document/printer.js
@@ -234,7 +234,8 @@ function fits(
case DOC_TYPE_ARRAY:
case DOC_TYPE_FILL: {
const parts = docType === DOC_TYPE_ARRAY ? doc : doc.parts;
- for (let i = parts.length - 1; i >= 0; i--) {
+ const end = doc[DOC_FILL_PRINTED_LENGTH] ?? 0;
+ for (let i = parts.length - 1; i >= end; i--) {
cmds.push({ mode, doc: parts[i] });
}
break;
diff --git a/tests/format/jsx/text-wrap/__snapshots__/format.test.js.snap b/tests/format/jsx/text-wrap/__snapshots__/format.test.js.snap
index beb5c870f..fd8dec060 100644
--- a/tests/format/jsx/text-wrap/__snapshots__/format.test.js.snap
+++ b/tests/format/jsx/text-wrap/__snapshots__/format.test.js.snap
@@ -1,5 +1,44 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
+exports[`issue-16897.js format 1`] = `
+====================================options=====================================
+parsers: ["flow", "typescript"]
+printWidth: 80
+ | printWidth
+=====================================input======================================
+function HelloWorld( ) {
+ return (
+
+
+ foo
+
+ bar{' '}
+
+ foobar foobar foobar foobar 12345
+ , foobar foobar foobar
+
+
+ )
+}
+
+=====================================output=====================================
+function HelloWorld() {
+ return (
+
+
+ foo
+
+ bar{" "}
+ foobar foobar foobar foobar 12345
+ , foobar foobar foobar
+
+
+ );
+}
+
+================================================================================
+`;
+
exports[`test.js format 1`] = `
====================================options=====================================
parsers: ["flow", "typescript"]
diff --git a/tests/format/jsx/text-wrap/issue-16897.js b/tests/format/jsx/text-wrap/issue-16897.js
new file mode 100644
index 000000000..8410de1d1
--- /dev/null
+++ b/tests/format/jsx/text-wrap/issue-16897.js
@@ -0,0 +1,14 @@
+function HelloWorld( ) {
+ return (
+
+
+ foo
+
+ bar{' '}
+
+ foobar foobar foobar foobar 12345
+ , foobar foobar foobar
+
+
+ )
+}