diff --git a/packages/prettier-plugin-java/src/printers/classes.ts b/packages/prettier-plugin-java/src/printers/classes.ts index f55361d6..ee28b010 100644 --- a/packages/prettier-plugin-java/src/printers/classes.ts +++ b/packages/prettier-plugin-java/src/printers/classes.ts @@ -10,8 +10,8 @@ import { each, hasDeclarationAnnotations, hasLeadingComments, + hasNonAssignmentOperators, indentInParentheses, - isBinaryExpression, lineEndWithComments, lineStartWithComments, map, @@ -154,12 +154,14 @@ export default { if (!variableInitializer) { return declaratorId; } - const expression = variableInitializer.children.expression?.[0]; + const binaryExpression = + variableInitializer.children.expression?.[0].children + .conditionalExpression?.[0].children.binaryExpression[0]; const declarator = [declaratorId, " ", call(path, print, "Equals")]; const initializer = call(path, print, "variableInitializer"); if ( hasLeadingComments(variableInitializer) || - (expression && isBinaryExpression(expression)) + (binaryExpression && hasNonAssignmentOperators(binaryExpression)) ) { declarator.push(group(indent([line, initializer]))); } else { diff --git a/packages/prettier-plugin-java/src/printers/expressions.ts b/packages/prettier-plugin-java/src/printers/expressions.ts index b14c1eb0..6f3a1608 100644 --- a/packages/prettier-plugin-java/src/printers/expressions.ts +++ b/packages/prettier-plugin-java/src/printers/expressions.ts @@ -13,8 +13,8 @@ import { findBaseIndent, flatMap, hasLeadingComments, + hasNonAssignmentOperators, indentInParentheses, - isBinaryExpression, isNonTerminal, isTerminal, map, @@ -121,8 +121,7 @@ export default { return binaryExpression; } const [consequent, alternate] = map(path, print, "expression"); - const parts = [binaryExpression]; - const part = [ + const suffix = [ line, ["? ", options.useTabs ? indent(consequent) : align(2, consequent)], line, @@ -131,12 +130,13 @@ export default { const isNestedTernary = (path.getNode(4) as JavaNonTerminal | null)?.name === "conditionalExpression"; - parts.push( + const alignedSuffix = !isNestedTernary || options.useTabs - ? part - : align(Math.max(0, options.tabWidth - 2), part) - ); - return isNestedTernary ? parts : group(indent(parts)); + ? suffix + : align(Math.max(0, options.tabWidth - 2), suffix); + return isNestedTernary + ? [binaryExpression, alignedSuffix] + : group([binaryExpression, indent(alignedSuffix)]); }, binaryExpression(path, print, options) { @@ -172,15 +172,16 @@ export default { "shiftOperator" ]) ); - const hasNonAssignmentOperators = - (operators.length > 0 && !children.AssignmentOperator) || - (children.expression !== undefined && - isBinaryExpression(children.expression[0])); const isInList = (path.getNode(4) as JavaNonTerminal | null)?.name === "elementValue" || (path.getNode(6) as JavaNonTerminal | null)?.name === "argumentList"; + const binaryExpression = + children.expression?.[0].children.conditionalExpression?.[0].children + .binaryExpression[0]; return binary(operands, operators, { - hasNonAssignmentOperators, + hasNonAssignmentOperators: + (operators.length > 0 && !children.AssignmentOperator) || + (binaryExpression && hasNonAssignmentOperators(binaryExpression)), isInList, isRoot: true, operatorPosition: options.experimentalOperatorPosition diff --git a/packages/prettier-plugin-java/src/printers/helpers.ts b/packages/prettier-plugin-java/src/printers/helpers.ts index 7b338ebe..2ca38676 100644 --- a/packages/prettier-plugin-java/src/printers/helpers.ts +++ b/packages/prettier-plugin-java/src/printers/helpers.ts @@ -1,5 +1,6 @@ import type { AnnotationCstNode, + BinaryExpressionCstNode, ClassPermitsCstNode, ClassTypeCtx, CstElement, @@ -372,16 +373,19 @@ export function isBinaryExpression(expression: ExpressionCstNode) { if (isTernary) { return false; } - const hasNonAssignmentOperators = Object.values( - conditionalExpression.binaryExpression[0].children - ).some( + return hasNonAssignmentOperators(conditionalExpression.binaryExpression[0]); +} + +export function hasNonAssignmentOperators( + binaryExpression: BinaryExpressionCstNode +) { + return Object.values(binaryExpression.children).some( child => isTerminal(child[0]) && !child[0].tokenType.CATEGORIES?.some( category => category.name === "AssignmentOperator" ) ); - return hasNonAssignmentOperators; } export function findBaseIndent(lines: string[]) { diff --git a/packages/prettier-plugin-java/test/unit-test/binary_expressions/operator-position-end/_output.java b/packages/prettier-plugin-java/test/unit-test/binary_expressions/operator-position-end/_output.java index 798e73da..898db4d8 100644 --- a/packages/prettier-plugin-java/test/unit-test/binary_expressions/operator-position-end/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/binary_expressions/operator-position-end/_output.java @@ -114,12 +114,14 @@ void declarationVsAssignment() { ffffffffff + gggggggggg; - var aaaaaaaaaa = bbbbbbbbbb || cccccccccc - ? dddddddddd + eeeeeeeeee - : ffffffffff + gggggggggg; - aaaaaaaaaa = bbbbbbbbbb || cccccccccc - ? dddddddddd + eeeeeeeeee - : ffffffffff + gggggggggg; + var aaaaaaaaaa = + bbbbbbbbbb || cccccccccc + ? dddddddddd + eeeeeeeeee + : ffffffffff + gggggggggg; + aaaaaaaaaa = + bbbbbbbbbb || cccccccccc + ? dddddddddd + eeeeeeeeee + : ffffffffff + gggggggggg; var something = MyClass.staticFunction( aaaaaaaaaa, diff --git a/packages/prettier-plugin-java/test/unit-test/binary_expressions/operator-position-start/_output.java b/packages/prettier-plugin-java/test/unit-test/binary_expressions/operator-position-start/_output.java index f07cff4e..55d0ec52 100644 --- a/packages/prettier-plugin-java/test/unit-test/binary_expressions/operator-position-start/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/binary_expressions/operator-position-start/_output.java @@ -117,12 +117,14 @@ void declarationVsAssignment() { + ffffffffff + gggggggggg; - var aaaaaaaaaa = bbbbbbbbbb || cccccccccc - ? dddddddddd + eeeeeeeeee - : ffffffffff + gggggggggg; - aaaaaaaaaa = bbbbbbbbbb || cccccccccc - ? dddddddddd + eeeeeeeeee - : ffffffffff + gggggggggg; + var aaaaaaaaaa = + bbbbbbbbbb || cccccccccc + ? dddddddddd + eeeeeeeeee + : ffffffffff + gggggggggg; + aaaaaaaaaa = + bbbbbbbbbb || cccccccccc + ? dddddddddd + eeeeeeeeee + : ffffffffff + gggggggggg; var something = MyClass.staticFunction( aaaaaaaaaa, diff --git a/packages/prettier-plugin-java/test/unit-test/conditional-expression/spaces/_input.java b/packages/prettier-plugin-java/test/unit-test/conditional-expression/spaces/_input.java index 3c9f5ab5..f5aaf520 100644 --- a/packages/prettier-plugin-java/test/unit-test/conditional-expression/spaces/_input.java +++ b/packages/prettier-plugin-java/test/unit-test/conditional-expression/spaces/_input.java @@ -42,4 +42,18 @@ void ternaryWithComments() { void ternaryInParentheses() { (aaaaaaaaaa ? bbbbbbbbbb : cccccccccc.dddddddddd().eeeeeeeeee().ffffffffff()); } + + void assignment() { + Aaaaaaaaaa aaaaaaaaaa = bbbbbbbbbb(cccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh; + + Aaaaaaaaaa aaaaaaaaaa = bbbbbbbbbb(cccccccccccccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh; + + Aaaaaaaaaa aaaaaaaaaa = bbbbbbbbbb(cccccccccccccccccccc, dddddddddddddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh; + + aaaaaaaaaa = bbbbbbbbbb(cccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh; + + aaaaaaaaaa = bbbbbbbbbb(cccccccccccccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh; + + aaaaaaaaaa = bbbbbbbbbb(cccccccccccccccccccc, dddddddddddddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh; + } } diff --git a/packages/prettier-plugin-java/test/unit-test/conditional-expression/spaces/_output.java b/packages/prettier-plugin-java/test/unit-test/conditional-expression/spaces/_output.java index 4c8fdd27..44da4d1d 100644 --- a/packages/prettier-plugin-java/test/unit-test/conditional-expression/spaces/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/conditional-expression/spaces/_output.java @@ -59,4 +59,48 @@ void ternaryInParentheses() { ? bbbbbbbbbb : cccccccccc.dddddddddd().eeeeeeeeee().ffffffffff()); } + + void assignment() { + Aaaaaaaaaa aaaaaaaaaa = + bbbbbbbbbb(cccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff + ? gggggggggg + : hhhhhhhhhh; + + Aaaaaaaaaa aaaaaaaaaa = + bbbbbbbbbb(cccccccccccccccccccc, dddddddddd, eeeeeeeeee) != + ffffffffff + ? gggggggggg + : hhhhhhhhhh; + + Aaaaaaaaaa aaaaaaaaaa = + bbbbbbbbbb( + cccccccccccccccccccc, + dddddddddddddddddddd, + eeeeeeeeee + ) != + ffffffffff + ? gggggggggg + : hhhhhhhhhh; + + aaaaaaaaaa = + bbbbbbbbbb(cccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff + ? gggggggggg + : hhhhhhhhhh; + + aaaaaaaaaa = + bbbbbbbbbb(cccccccccccccccccccc, dddddddddd, eeeeeeeeee) != + ffffffffff + ? gggggggggg + : hhhhhhhhhh; + + aaaaaaaaaa = + bbbbbbbbbb( + cccccccccccccccccccc, + dddddddddddddddddddd, + eeeeeeeeee + ) != + ffffffffff + ? gggggggggg + : hhhhhhhhhh; + } } diff --git a/packages/prettier-plugin-java/test/unit-test/conditional-expression/tabs/_input.java b/packages/prettier-plugin-java/test/unit-test/conditional-expression/tabs/_input.java index bedcb29f..234a5b09 100644 --- a/packages/prettier-plugin-java/test/unit-test/conditional-expression/tabs/_input.java +++ b/packages/prettier-plugin-java/test/unit-test/conditional-expression/tabs/_input.java @@ -42,4 +42,18 @@ void ternaryWithComments() { void ternaryInParentheses() { (aaaaaaaaaa ? bbbbbbbbbb : cccccccccc.dddddddddd().eeeeeeeeee().ffffffffff()); } + + void assignment() { + Aaaaaaaaaa aaaaaaaaaa = bbbbbbbbbb(cccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh; + + Aaaaaaaaaa aaaaaaaaaa = bbbbbbbbbb(cccccccccccccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh; + + Aaaaaaaaaa aaaaaaaaaa = bbbbbbbbbb(cccccccccccccccccccc, dddddddddddddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh; + + aaaaaaaaaa = bbbbbbbbbb(cccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh; + + aaaaaaaaaa = bbbbbbbbbb(cccccccccccccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh; + + aaaaaaaaaa = bbbbbbbbbb(cccccccccccccccccccc, dddddddddddddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh; + } } diff --git a/packages/prettier-plugin-java/test/unit-test/conditional-expression/tabs/_output.java b/packages/prettier-plugin-java/test/unit-test/conditional-expression/tabs/_output.java index 19697faa..43fa4743 100644 --- a/packages/prettier-plugin-java/test/unit-test/conditional-expression/tabs/_output.java +++ b/packages/prettier-plugin-java/test/unit-test/conditional-expression/tabs/_output.java @@ -58,4 +58,38 @@ void ternaryInParentheses() { ? bbbbbbbbbb : cccccccccc.dddddddddd().eeeeeeeeee().ffffffffff()); } + + void assignment() { + Aaaaaaaaaa aaaaaaaaaa = + bbbbbbbbbb(cccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff + ? gggggggggg + : hhhhhhhhhh; + + Aaaaaaaaaa aaaaaaaaaa = + bbbbbbbbbb(cccccccccccccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff + ? gggggggggg + : hhhhhhhhhh; + + Aaaaaaaaaa aaaaaaaaaa = + bbbbbbbbbb(cccccccccccccccccccc, dddddddddddddddddddd, eeeeeeeeee) != + ffffffffff + ? gggggggggg + : hhhhhhhhhh; + + aaaaaaaaaa = + bbbbbbbbbb(cccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff + ? gggggggggg + : hhhhhhhhhh; + + aaaaaaaaaa = + bbbbbbbbbb(cccccccccccccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff + ? gggggggggg + : hhhhhhhhhh; + + aaaaaaaaaa = + bbbbbbbbbb(cccccccccccccccccccc, dddddddddddddddddddd, eeeeeeeeee) != + ffffffffff + ? gggggggggg + : hhhhhhhhhh; + } }