Skip to content

Commit e2035ae

Browse files
committed
fix: break and indent assignments like declarations
1 parent 06a663d commit e2035ae

File tree

4 files changed

+188
-32
lines changed

4 files changed

+188
-32
lines changed

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

Lines changed: 52 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {
1717
DimExprCtx,
1818
DimExprsCtx,
1919
EmbeddedExpressionCtx,
20+
ExpressionCstNode,
2021
ExpressionCtx,
2122
FqnOrRefTypeCtx,
2223
FqnOrRefTypePartCommonCtx,
@@ -57,6 +58,7 @@ import {
5758
} from "java-parser/api";
5859

5960
import forEach from "lodash/forEach.js";
61+
import type { Doc } from "prettier";
6062
import { builders, utils } from "prettier/doc";
6163
import { BaseCstPrettierPrinter } from "../base-cst-printer.js";
6264
import { isAnnotationCstNode } from "../types/utils.js";
@@ -66,10 +68,17 @@ import {
6668
handleCommentsBinaryExpression,
6769
handleCommentsParameters
6870
} from "./comments/handle-comments.js";
69-
import { concat, dedent, group, indent } from "./prettier-builder.js";
71+
import {
72+
concat,
73+
dedent,
74+
group,
75+
indent,
76+
indentIfBreak
77+
} from "./prettier-builder.js";
7078
import {
7179
binary,
7280
findDeepElementInPartsArray,
81+
getOperators,
7382
isExplicitLambdaParameter,
7483
isUniqueMethodInvocation,
7584
putIntoBraces,
@@ -247,20 +256,50 @@ export class ExpressionsPrettierVisitor extends BaseCstPrettierPrinter {
247256
ctx.expression,
248257
ctx.unaryExpression
249258
]);
250-
251-
const nodes = this.mapVisit(
252-
sortedNodes,
253-
sortedNodes.length === 1 ? params : undefined
254-
);
255-
const tokens = sortTokens([
256-
ctx.Instanceof,
257-
ctx.AssignmentOperator,
258-
ctx.Less,
259-
ctx.Greater,
260-
ctx.BinaryOperator
261-
]);
259+
const tokens = sortTokens(getOperators(ctx));
262260
const hasTokens = tokens.length > 0;
263261

262+
const nodeParams = sortedNodes.length === 1 ? params : undefined;
263+
const nodes: Doc[] = [];
264+
for (let i = 0; i < sortedNodes.length; i++) {
265+
const node = this.visit(sortedNodes[i], nodeParams);
266+
const isAssignment =
267+
tokens[i]?.tokenType.CATEGORIES?.find(
268+
({ name }) => name === "AssignmentOperator"
269+
) !== undefined;
270+
if (!isAssignment) {
271+
nodes.push(node);
272+
continue;
273+
}
274+
const [equals] = tokens.splice(i, 1);
275+
const expression = sortedNodes[++i] as ExpressionCstNode;
276+
const nextNode = this.visit(expression);
277+
const conditionalExpression =
278+
expression.children.conditionalExpression?.[0].children;
279+
const binaryExpression =
280+
conditionalExpression?.binaryExpression?.[0].children;
281+
const breakAfterOperator =
282+
conditionalExpression?.QuestionMark === undefined &&
283+
binaryExpression !== undefined &&
284+
getOperators(binaryExpression).length > 0;
285+
if (breakAfterOperator) {
286+
nodes.push(
287+
concat([node, " ", equals, group(indent([line, nextNode]))])
288+
);
289+
continue;
290+
}
291+
const groupId = Symbol("assignment");
292+
nodes.push(
293+
concat([
294+
node,
295+
" ",
296+
equals,
297+
indent(group(line, { id: groupId })),
298+
indentIfBreak(nextNode, { groupId })
299+
])
300+
);
301+
}
302+
264303
const content = binary(nodes, tokens, true);
265304

266305
return hasTokens && params?.addParenthesisToWrapStatement

packages/prettier-plugin-java/src/printers/printer-utils.ts

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {
22
AnnotationCstNode,
3+
BinaryExpressionCtx,
34
ClassBodyDeclarationCstNode,
45
ConstantModifierCstNode,
56
CstElement,
@@ -31,13 +32,7 @@ import {
3132
getTokenLeadingComments,
3233
printTokenWithComments
3334
} from "./comments/format-comments.js";
34-
import {
35-
concat,
36-
group,
37-
ifBreak,
38-
indentIfBreak,
39-
join
40-
} from "./prettier-builder.js";
35+
import { concat, group, ifBreak, join } from "./prettier-builder.js";
4136

4237
const { indent, hardline, line, lineSuffixBoundary, softline } = builders;
4338

@@ -664,16 +659,17 @@ export function binary(nodes: Doc[], tokens: IToken[], isRoot = false): Doc {
664659
}
665660
}
666661
level.push(nodes.shift()!);
667-
const lineGroupId = Symbol("line");
668-
return group(
669-
levelOperator === "="
670-
? [
671-
level[0],
672-
indent(group(line, { id: lineGroupId })),
673-
indentIfBreak(level[1], { groupId: lineGroupId })
674-
]
675-
: join(line, level)
676-
);
662+
return group(join(line, level));
663+
}
664+
665+
export function getOperators(ctx: BinaryExpressionCtx) {
666+
return [
667+
ctx.AssignmentOperator,
668+
ctx.BinaryOperator,
669+
ctx.Greater,
670+
ctx.Instanceof,
671+
ctx.Less
672+
].filter(token => token !== undefined);
677673
}
678674

679675
function getOperator(tokens: IToken[]) {

packages/prettier-plugin-java/test/unit-test/binary_expressions/_input.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,30 @@ public void method() {
6060
}
6161

6262
public void binaryExpressionWithCast() {
63-
double availability = (double) successfulCount / (successfulCount + failureCount);
63+
double availability12 = (double) successfulCount / (successfulCount + failureCount);
64+
availability12 = (double) successfulCount / (successfulCount + failureCount);
65+
}
66+
67+
void declarationVsAssignment() {
68+
var lineLengthInAssignmentMoreThanPrintWidth = "1234567890" + "1234567890" + "1234567890" + "1234567890" + "1234567890" + "1234567890";
69+
lineLengthInAssignmentMoreThanPrintWidth = "1234567890" + "1234567890" + "1234567890" + "1234567890" + "1234567890" + "1234567890";
70+
71+
aaaaaaaaaa += bbbbbbbbbbb + ccccccccccc + ddddddddddd + eeeeeeeeee + ffffffffff + gggggggggg;
72+
aaaaaaaaaa %= bbbbbbbbbbb + ccccccccccc + ddddddddddd + eeeeeeeeee + ffffffffff + gggggggggg;
73+
aaaaaaaaaa <<= bbbbbbbbbbb + ccccccccccc + ddddddddddd + eeeeeeeeee + ffffffffff + gggggggggg;
74+
aaaaaaaaaa &= bbbbbbbbbbb + ccccccccccc + ddddddddddd + eeeeeeeeee + ffffffffff + gggggggggg;
75+
76+
var aaaaaaaaaa = bbbbbbbbbb || cccccccccc ? dddddddddd + eeeeeeeeee : ffffffffff + gggggggggg;
77+
aaaaaaaaaa = bbbbbbbbbb || cccccccccc ? dddddddddd + eeeeeeeeee : ffffffffff + gggggggggg;
78+
79+
var something = MyClass.staticFunction(aaaaaaaaaa, bbbbbbbbbbb, ccccccccccc, ddddddddddd);
80+
something = MyClass.staticFunction(aaaaaaaaaa, bbbbbbbbbbb, ccccccccccc, ddddddddddd);
81+
82+
var something = MyClass.staticFunction(aaaaaaaaaa, bbbbbbbbbbb, ccccccccccc, ddddddddddd) + 0;
83+
something = MyClass.staticFunction(aaaaaaaaaa, bbbbbbbbbbb, ccccccccccc, ddddddddddd) + 0;
84+
85+
var something12 = new MyClass(aaaaaaaaaa, bbbbbbbbbbb, ccccccccccc, ddddddddddd);
86+
something12 = new MyClass(aaaaaaaaaa, bbbbbbbbbbb, ccccccccccc, ddddddddddd);
6487
}
6588

6689
void parentheses() {

packages/prettier-plugin-java/test/unit-test/binary_expressions/_output.java

Lines changed: 99 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,106 @@ public void method() {
8686
}
8787

8888
public void binaryExpressionWithCast() {
89-
double availability =
89+
double availability12 =
9090
(double) successfulCount / (successfulCount + failureCount);
91+
availability12 =
92+
(double) successfulCount / (successfulCount + failureCount);
93+
}
94+
95+
void declarationVsAssignment() {
96+
var lineLengthInAssignmentMoreThanPrintWidth =
97+
"1234567890" +
98+
"1234567890" +
99+
"1234567890" +
100+
"1234567890" +
101+
"1234567890" +
102+
"1234567890";
103+
lineLengthInAssignmentMoreThanPrintWidth =
104+
"1234567890" +
105+
"1234567890" +
106+
"1234567890" +
107+
"1234567890" +
108+
"1234567890" +
109+
"1234567890";
110+
111+
aaaaaaaaaa +=
112+
bbbbbbbbbbb +
113+
ccccccccccc +
114+
ddddddddddd +
115+
eeeeeeeeee +
116+
ffffffffff +
117+
gggggggggg;
118+
aaaaaaaaaa %=
119+
bbbbbbbbbbb +
120+
ccccccccccc +
121+
ddddddddddd +
122+
eeeeeeeeee +
123+
ffffffffff +
124+
gggggggggg;
125+
aaaaaaaaaa <<=
126+
bbbbbbbbbbb +
127+
ccccccccccc +
128+
ddddddddddd +
129+
eeeeeeeeee +
130+
ffffffffff +
131+
gggggggggg;
132+
aaaaaaaaaa &=
133+
bbbbbbbbbbb +
134+
ccccccccccc +
135+
ddddddddddd +
136+
eeeeeeeeee +
137+
ffffffffff +
138+
gggggggggg;
139+
140+
var aaaaaaaaaa = bbbbbbbbbb || cccccccccc
141+
? dddddddddd + eeeeeeeeee
142+
: ffffffffff + gggggggggg;
143+
aaaaaaaaaa = bbbbbbbbbb || cccccccccc
144+
? dddddddddd + eeeeeeeeee
145+
: ffffffffff + gggggggggg;
146+
147+
var something = MyClass.staticFunction(
148+
aaaaaaaaaa,
149+
bbbbbbbbbbb,
150+
ccccccccccc,
151+
ddddddddddd
152+
);
153+
something = MyClass.staticFunction(
154+
aaaaaaaaaa,
155+
bbbbbbbbbbb,
156+
ccccccccccc,
157+
ddddddddddd
158+
);
159+
160+
var something =
161+
MyClass.staticFunction(
162+
aaaaaaaaaa,
163+
bbbbbbbbbbb,
164+
ccccccccccc,
165+
ddddddddddd
166+
) +
167+
0;
168+
something =
169+
MyClass.staticFunction(
170+
aaaaaaaaaa,
171+
bbbbbbbbbbb,
172+
ccccccccccc,
173+
ddddddddddd
174+
) +
175+
0;
176+
177+
var something12 = new MyClass(
178+
aaaaaaaaaa,
179+
bbbbbbbbbbb,
180+
ccccccccccc,
181+
ddddddddddd
182+
);
183+
something12 = new MyClass(
184+
aaaaaaaaaa,
185+
bbbbbbbbbbb,
186+
ccccccccccc,
187+
ddddddddddd
188+
);
91189
}
92190

93191
void parentheses() {

0 commit comments

Comments
 (0)