Skip to content

Commit aedcd79

Browse files
committed
fix: improve binary expression assignment breaking
1 parent 62e477b commit aedcd79

File tree

9 files changed

+149
-32
lines changed

9 files changed

+149
-32
lines changed

packages/prettier-plugin-java/src/printers/classes.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import {
1010
each,
1111
hasDeclarationAnnotations,
1212
hasLeadingComments,
13+
hasNonAssignmentOperators,
1314
indentInParentheses,
14-
isBinaryExpression,
1515
lineEndWithComments,
1616
lineStartWithComments,
1717
map,
@@ -154,12 +154,14 @@ export default {
154154
if (!variableInitializer) {
155155
return declaratorId;
156156
}
157-
const expression = variableInitializer.children.expression?.[0];
157+
const binaryExpression =
158+
variableInitializer.children.expression?.[0].children
159+
.conditionalExpression?.[0].children.binaryExpression[0];
158160
const declarator = [declaratorId, " ", call(path, print, "Equals")];
159161
const initializer = call(path, print, "variableInitializer");
160162
if (
161163
hasLeadingComments(variableInitializer) ||
162-
(expression && isBinaryExpression(expression))
164+
(binaryExpression && hasNonAssignmentOperators(binaryExpression))
163165
) {
164166
declarator.push(group(indent([line, initializer])));
165167
} else {

packages/prettier-plugin-java/src/printers/expressions.ts

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ import {
1313
findBaseIndent,
1414
flatMap,
1515
hasLeadingComments,
16+
hasNonAssignmentOperators,
1617
indentInParentheses,
17-
isBinaryExpression,
1818
isNonTerminal,
1919
isTerminal,
2020
map,
@@ -121,8 +121,7 @@ export default {
121121
return binaryExpression;
122122
}
123123
const [consequent, alternate] = map(path, print, "expression");
124-
const parts = [binaryExpression];
125-
const part = [
124+
const suffix = [
126125
line,
127126
["? ", options.useTabs ? indent(consequent) : align(2, consequent)],
128127
line,
@@ -131,12 +130,13 @@ export default {
131130
const isNestedTernary =
132131
(path.getNode(4) as JavaNonTerminal | null)?.name ===
133132
"conditionalExpression";
134-
parts.push(
133+
const alignedSuffix =
135134
!isNestedTernary || options.useTabs
136-
? part
137-
: align(Math.max(0, options.tabWidth - 2), part)
138-
);
139-
return isNestedTernary ? parts : group(indent(parts));
135+
? suffix
136+
: align(Math.max(0, options.tabWidth - 2), suffix);
137+
return isNestedTernary
138+
? [binaryExpression, alignedSuffix]
139+
: group([binaryExpression, indent(alignedSuffix)]);
140140
},
141141

142142
binaryExpression(path, print, options) {
@@ -172,15 +172,16 @@ export default {
172172
"shiftOperator"
173173
])
174174
);
175-
const hasNonAssignmentOperators =
176-
(operators.length > 0 && !children.AssignmentOperator) ||
177-
(children.expression !== undefined &&
178-
isBinaryExpression(children.expression[0]));
179175
const isInList =
180176
(path.getNode(4) as JavaNonTerminal | null)?.name === "elementValue" ||
181177
(path.getNode(6) as JavaNonTerminal | null)?.name === "argumentList";
178+
const binaryExpression =
179+
children.expression?.[0].children.conditionalExpression?.[0].children
180+
.binaryExpression[0];
182181
return binary(operands, operators, {
183-
hasNonAssignmentOperators,
182+
hasNonAssignmentOperators:
183+
(operators.length > 0 && !children.AssignmentOperator) ||
184+
(binaryExpression && hasNonAssignmentOperators(binaryExpression)),
184185
isInList,
185186
isRoot: true,
186187
operatorPosition: options.experimentalOperatorPosition

packages/prettier-plugin-java/src/printers/helpers.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type {
22
AnnotationCstNode,
3+
BinaryExpressionCstNode,
34
ClassPermitsCstNode,
45
ClassTypeCtx,
56
CstElement,
@@ -372,16 +373,19 @@ export function isBinaryExpression(expression: ExpressionCstNode) {
372373
if (isTernary) {
373374
return false;
374375
}
375-
const hasNonAssignmentOperators = Object.values(
376-
conditionalExpression.binaryExpression[0].children
377-
).some(
376+
return hasNonAssignmentOperators(conditionalExpression.binaryExpression[0]);
377+
}
378+
379+
export function hasNonAssignmentOperators(
380+
binaryExpression: BinaryExpressionCstNode
381+
) {
382+
return Object.values(binaryExpression.children).some(
378383
child =>
379384
isTerminal(child[0]) &&
380385
!child[0].tokenType.CATEGORIES?.some(
381386
category => category.name === "AssignmentOperator"
382387
)
383388
);
384-
return hasNonAssignmentOperators;
385389
}
386390

387391
export function findBaseIndent(lines: string[]) {

packages/prettier-plugin-java/test/unit-test/binary_expressions/operator-position-end/_output.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,14 @@ void declarationVsAssignment() {
114114
ffffffffff +
115115
gggggggggg;
116116

117-
var aaaaaaaaaa = bbbbbbbbbb || cccccccccc
118-
? dddddddddd + eeeeeeeeee
119-
: ffffffffff + gggggggggg;
120-
aaaaaaaaaa = bbbbbbbbbb || cccccccccc
121-
? dddddddddd + eeeeeeeeee
122-
: ffffffffff + gggggggggg;
117+
var aaaaaaaaaa =
118+
bbbbbbbbbb || cccccccccc
119+
? dddddddddd + eeeeeeeeee
120+
: ffffffffff + gggggggggg;
121+
aaaaaaaaaa =
122+
bbbbbbbbbb || cccccccccc
123+
? dddddddddd + eeeeeeeeee
124+
: ffffffffff + gggggggggg;
123125

124126
var something = MyClass.staticFunction(
125127
aaaaaaaaaa,

packages/prettier-plugin-java/test/unit-test/binary_expressions/operator-position-start/_output.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,14 @@ void declarationVsAssignment() {
117117
+ ffffffffff
118118
+ gggggggggg;
119119

120-
var aaaaaaaaaa = bbbbbbbbbb || cccccccccc
121-
? dddddddddd + eeeeeeeeee
122-
: ffffffffff + gggggggggg;
123-
aaaaaaaaaa = bbbbbbbbbb || cccccccccc
124-
? dddddddddd + eeeeeeeeee
125-
: ffffffffff + gggggggggg;
120+
var aaaaaaaaaa =
121+
bbbbbbbbbb || cccccccccc
122+
? dddddddddd + eeeeeeeeee
123+
: ffffffffff + gggggggggg;
124+
aaaaaaaaaa =
125+
bbbbbbbbbb || cccccccccc
126+
? dddddddddd + eeeeeeeeee
127+
: ffffffffff + gggggggggg;
126128

127129
var something = MyClass.staticFunction(
128130
aaaaaaaaaa,

packages/prettier-plugin-java/test/unit-test/conditional-expression/spaces/_input.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,18 @@ void ternaryWithComments() {
4242
void ternaryInParentheses() {
4343
(aaaaaaaaaa ? bbbbbbbbbb : cccccccccc.dddddddddd().eeeeeeeeee().ffffffffff());
4444
}
45+
46+
void assignment() {
47+
Aaaaaaaaaa aaaaaaaaaa = bbbbbbbbbb(cccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh;
48+
49+
Aaaaaaaaaa aaaaaaaaaa = bbbbbbbbbb(cccccccccccccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh;
50+
51+
Aaaaaaaaaa aaaaaaaaaa = bbbbbbbbbb(cccccccccccccccccccc, dddddddddddddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh;
52+
53+
aaaaaaaaaa = bbbbbbbbbb(cccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh;
54+
55+
aaaaaaaaaa = bbbbbbbbbb(cccccccccccccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh;
56+
57+
aaaaaaaaaa = bbbbbbbbbb(cccccccccccccccccccc, dddddddddddddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh;
58+
}
4559
}

packages/prettier-plugin-java/test/unit-test/conditional-expression/spaces/_output.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,48 @@ void ternaryInParentheses() {
5959
? bbbbbbbbbb
6060
: cccccccccc.dddddddddd().eeeeeeeeee().ffffffffff());
6161
}
62+
63+
void assignment() {
64+
Aaaaaaaaaa aaaaaaaaaa =
65+
bbbbbbbbbb(cccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff
66+
? gggggggggg
67+
: hhhhhhhhhh;
68+
69+
Aaaaaaaaaa aaaaaaaaaa =
70+
bbbbbbbbbb(cccccccccccccccccccc, dddddddddd, eeeeeeeeee) !=
71+
ffffffffff
72+
? gggggggggg
73+
: hhhhhhhhhh;
74+
75+
Aaaaaaaaaa aaaaaaaaaa =
76+
bbbbbbbbbb(
77+
cccccccccccccccccccc,
78+
dddddddddddddddddddd,
79+
eeeeeeeeee
80+
) !=
81+
ffffffffff
82+
? gggggggggg
83+
: hhhhhhhhhh;
84+
85+
aaaaaaaaaa =
86+
bbbbbbbbbb(cccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff
87+
? gggggggggg
88+
: hhhhhhhhhh;
89+
90+
aaaaaaaaaa =
91+
bbbbbbbbbb(cccccccccccccccccccc, dddddddddd, eeeeeeeeee) !=
92+
ffffffffff
93+
? gggggggggg
94+
: hhhhhhhhhh;
95+
96+
aaaaaaaaaa =
97+
bbbbbbbbbb(
98+
cccccccccccccccccccc,
99+
dddddddddddddddddddd,
100+
eeeeeeeeee
101+
) !=
102+
ffffffffff
103+
? gggggggggg
104+
: hhhhhhhhhh;
105+
}
62106
}

packages/prettier-plugin-java/test/unit-test/conditional-expression/tabs/_input.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,18 @@ void ternaryWithComments() {
4242
void ternaryInParentheses() {
4343
(aaaaaaaaaa ? bbbbbbbbbb : cccccccccc.dddddddddd().eeeeeeeeee().ffffffffff());
4444
}
45+
46+
void assignment() {
47+
Aaaaaaaaaa aaaaaaaaaa = bbbbbbbbbb(cccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh;
48+
49+
Aaaaaaaaaa aaaaaaaaaa = bbbbbbbbbb(cccccccccccccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh;
50+
51+
Aaaaaaaaaa aaaaaaaaaa = bbbbbbbbbb(cccccccccccccccccccc, dddddddddddddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh;
52+
53+
aaaaaaaaaa = bbbbbbbbbb(cccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh;
54+
55+
aaaaaaaaaa = bbbbbbbbbb(cccccccccccccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh;
56+
57+
aaaaaaaaaa = bbbbbbbbbb(cccccccccccccccccccc, dddddddddddddddddddd, eeeeeeeeee) != ffffffffff ? gggggggggg : hhhhhhhhhh;
58+
}
4559
}

packages/prettier-plugin-java/test/unit-test/conditional-expression/tabs/_output.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,38 @@ void ternaryInParentheses() {
5858
? bbbbbbbbbb
5959
: cccccccccc.dddddddddd().eeeeeeeeee().ffffffffff());
6060
}
61+
62+
void assignment() {
63+
Aaaaaaaaaa aaaaaaaaaa =
64+
bbbbbbbbbb(cccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff
65+
? gggggggggg
66+
: hhhhhhhhhh;
67+
68+
Aaaaaaaaaa aaaaaaaaaa =
69+
bbbbbbbbbb(cccccccccccccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff
70+
? gggggggggg
71+
: hhhhhhhhhh;
72+
73+
Aaaaaaaaaa aaaaaaaaaa =
74+
bbbbbbbbbb(cccccccccccccccccccc, dddddddddddddddddddd, eeeeeeeeee) !=
75+
ffffffffff
76+
? gggggggggg
77+
: hhhhhhhhhh;
78+
79+
aaaaaaaaaa =
80+
bbbbbbbbbb(cccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff
81+
? gggggggggg
82+
: hhhhhhhhhh;
83+
84+
aaaaaaaaaa =
85+
bbbbbbbbbb(cccccccccccccccccccc, dddddddddd, eeeeeeeeee) != ffffffffff
86+
? gggggggggg
87+
: hhhhhhhhhh;
88+
89+
aaaaaaaaaa =
90+
bbbbbbbbbb(cccccccccccccccccccc, dddddddddddddddddddd, eeeeeeeeee) !=
91+
ffffffffff
92+
? gggggggggg
93+
: hhhhhhhhhh;
94+
}
6195
}

0 commit comments

Comments
 (0)