diff --git a/packages/prettier-plugin-java/src/printers/helpers.ts b/packages/prettier-plugin-java/src/printers/helpers.ts index 8677cb152..bf0ec40c7 100644 --- a/packages/prettier-plugin-java/src/printers/helpers.ts +++ b/packages/prettier-plugin-java/src/printers/helpers.ts @@ -304,26 +304,30 @@ export function printClassType( path: AstPath, print: JavaPrintFn ) { - return flatMap( - path, - childPath => { - const { node, isLast } = childPath; - const child = [print(childPath)]; - if (isTerminal(node)) { - if (!isLast) { - child.push("."); + const { children } = path.node; + return definedKeys(children, ["annotation", "Identifier", "typeArguments"]) + .flatMap(child => + children[child]!.map((node, index) => ({ + child, + index, + startOffset: parser.locStart(node) + })) + ) + .sort((a, b) => a.startOffset - b.startOffset) + .flatMap(({ child, index: childIndex }, index, array) => { + const node = children[child]![childIndex]; + const next = array.at(index + 1); + const nextNode = next && children[next.child]![next.index]; + const docs = [call(path, print, child, childIndex)]; + if (nextNode) { + if (isNonTerminal(node)) { + docs.push(node.name === "annotation" ? " " : "."); + } else if (isTerminal(nextNode) || nextNode.name === "annotation") { + docs.push("."); } - } else if (node.name === "annotation") { - child.push(" "); } - return child; - }, - definedKeys(path.node.children, [ - "annotation", - "Identifier", - "typeArguments" - ]) - ); + return docs; + }); } export function isBinaryExpression(expression: ExpressionCstNode) { diff --git a/packages/prettier-plugin-java/test/unit-test/types/_input.java b/packages/prettier-plugin-java/test/unit-test/types/_input.java index 213d4b9f2..7163ef0ef 100644 --- a/packages/prettier-plugin-java/test/unit-test/types/_input.java +++ b/packages/prettier-plugin-java/test/unit-test/types/_input.java @@ -23,4 +23,8 @@ public void dataTypes() { String stringVariable; } + public void complexTypes() { + @A B.C.@E @F G.H h; + } + } diff --git a/packages/prettier-plugin-java/test/unit-test/types/_output.java b/packages/prettier-plugin-java/test/unit-test/types/_output.java index 425f492a4..8052ddedf 100644 --- a/packages/prettier-plugin-java/test/unit-test/types/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/types/_output.java @@ -22,4 +22,9 @@ public void dataTypes() { Boolean booleanVariable; String stringVariable; } + + public void complexTypes() { + @A + B.C.@E @F G.H h; + } }