Skip to content

Commit 7e5fb80

Browse files
cushongoogle-java-format Team
authored andcommitted
Allow breaks before pattern guards
Previously there were never breaks before `when` pattern guards, which produced surprising results. There's possible future work here around evaluating how many level of continuation indents to take to differentiate between syntactic levels, but I think this is an improvement on the status quo. PiperOrigin-RevId: 696193971
1 parent 453ad08 commit 7e5fb80

File tree

3 files changed

+70
-42
lines changed

3 files changed

+70
-42
lines changed

core/src/main/java/com/google/googlejavaformat/java/java17/Java17InputAstVisitor.java

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ public Void visitBindingPattern(BindingPatternTree node, Void unused) {
8282
}
8383

8484
private void visitBindingPattern(ModifiersTree modifiers, Tree type, Name name) {
85-
builder.open(plusFour);
8685
declareOne(
8786
DeclarationKind.PARAMETER,
8887
Direction.HORIZONTAL,
@@ -95,7 +94,6 @@ private void visitBindingPattern(ModifiersTree modifiers, Tree type, Name name)
9594
/* trailing= */ Optional.empty(),
9695
/* receiverExpression= */ Optional.empty(),
9796
/* typeWithDims= */ Optional.empty());
98-
builder.close();
9997
}
10098

10199
@Override
@@ -227,16 +225,12 @@ public Void visitCase(CaseTree node, Void unused) {
227225
List<? extends CaseLabelTree> labels = node.getLabels();
228226
boolean isDefault =
229227
labels.size() == 1 && getOnlyElement(labels).getKind().name().equals("DEFAULT_CASE_LABEL");
230-
builder.open(
231-
node.getCaseKind().equals(CaseTree.CaseKind.RULE)
232-
&& !node.getBody().getKind().equals(Tree.Kind.BLOCK)
233-
? plusFour
234-
: ZERO);
228+
builder.open(node.getCaseKind().equals(CaseTree.CaseKind.RULE) ? plusFour : ZERO);
235229
if (isDefault) {
236230
token("default", ZERO);
237231
} else {
238232
token("case", ZERO);
239-
builder.open(labels.size() > 1 ? plusFour : ZERO);
233+
builder.open(ZERO);
240234
builder.space();
241235
boolean afterFirstToken = false;
242236
for (Tree expression : labels) {
@@ -252,7 +246,7 @@ public Void visitCase(CaseTree node, Void unused) {
252246

253247
final ExpressionTree guard = getGuard(node);
254248
if (guard != null) {
255-
builder.space();
249+
builder.breakToFill(" ");
256250
token("when");
257251
builder.space();
258252
scan(guard, null);
@@ -264,12 +258,14 @@ public Void visitCase(CaseTree node, Void unused) {
264258
builder.open(plusTwo);
265259
visitStatements(node.getStatements());
266260
builder.close();
261+
builder.close();
267262
break;
268263
case RULE:
269264
builder.space();
270265
token("-");
271266
token(">");
272267
if (node.getBody().getKind() == Tree.Kind.BLOCK) {
268+
builder.close();
273269
builder.space();
274270
// Explicit call with {@link CollapseEmptyOrNot.YES} to handle empty case blocks.
275271
visitBlock(
@@ -280,13 +276,13 @@ public Void visitCase(CaseTree node, Void unused) {
280276
} else {
281277
builder.breakOp(" ");
282278
scan(node.getBody(), null);
279+
builder.close();
283280
}
284281
builder.guessToken(";");
285282
break;
286283
default:
287284
throw new AssertionError(node.getCaseKind());
288285
}
289-
builder.close();
290286
return null;
291287
}
292288

core/src/test/resources/com/google/googlejavaformat/java/testdata/SwitchGuardClause.input

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,26 +27,42 @@ class SwitchGuardClause {
2727
}
2828
switch (o) {
2929
case TypeWithVeryVeryVeryVeryLongName variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
30-
when variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
30+
when variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
3131
.methodWithVeryVeryVeryVeryLongNameReturnThis()
3232
.methodWithVeryVeryVeryVeryLongNameReturnBoolean() -> {
3333
System.err.println();
3434
}
3535
default -> {}
3636
}
3737
switch (o) {
38-
case TypeWithVeryVeryVeryVeryLongName variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName,
39-
TypeWithVeryVeryVeryVeryLongName variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
40-
when variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
41-
.methodWithVeryVeryVeryVeryLongNameReturnThis()
42-
.methodWithVeryVeryVeryVeryLongNameReturnBoolean() -> {
43-
System.err.println();
44-
}
45-
default -> {}
46-
}
38+
case SwitchRecord(
39+
int one,
40+
int two,
41+
int three,
42+
int four,
43+
int five,
44+
int six,
45+
int seven,
46+
int eight,
47+
int variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName)
48+
when variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
49+
.methodWithVeryVeryVeryVeryLongNameReturnThis()
50+
.methodWithVeryVeryVeryVeryLongNameReturnBoolean() -> {
51+
System.err.println();
52+
}
53+
default -> {}
54+
}
4755
switch (o) {
48-
case TypeWithVeryVeryVeryVeryLongName variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName,
49-
TypeWithVeryVeryVeryVeryLongName variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
56+
case SwitchRecord(
57+
int one,
58+
int two,
59+
int three,
60+
int four,
61+
int five,
62+
int six,
63+
int seven,
64+
int eight,
65+
int variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName)
5066
when variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
5167
.methodWithVeryVeryVeryVeryLongNameReturnThis()
5268
.methodWithVeryVeryVeryVeryLongNameReturnBoolean() ->

core/src/test/resources/com/google/googlejavaformat/java/testdata/SwitchGuardClause.output

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,47 +9,63 @@ class SwitchGuardClause {
99

1010
{
1111
switch (o) {
12-
case TypeWithVeryVeryVeryVeryLongName variableWithVeryLongName when variableWithVeryLongName
13-
.methodWithVeryVeryVeryVeryLongNameReturnThis()
14-
.methodWithVeryVeryVeryVeryLongNameReturnBoolean() -> {
12+
case TypeWithVeryVeryVeryVeryLongName variableWithVeryLongName
13+
when variableWithVeryLongName
14+
.methodWithVeryVeryVeryVeryLongNameReturnThis()
15+
.methodWithVeryVeryVeryVeryLongNameReturnBoolean() -> {
1516
System.err.println();
1617
}
1718
default -> {}
1819
}
1920
switch (o) {
20-
case TypeWithVeryVeryVeryVeryLongName
21-
variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName when variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
22-
.methodWithVeryVeryVeryVeryLongNameReturnThis()
23-
.methodWithVeryVeryVeryVeryLongNameReturnBoolean() -> {
21+
case TypeWithVeryVeryVeryVeryLongName variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
22+
when variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
23+
.methodWithVeryVeryVeryVeryLongNameReturnThis()
24+
.methodWithVeryVeryVeryVeryLongNameReturnBoolean() -> {
2425
System.err.println();
2526
}
2627
default -> {}
2728
}
2829
switch (o) {
2930
case TypeWithVeryVeryVeryVeryLongName
30-
variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName when variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
31-
.methodWithVeryVeryVeryVeryLongNameReturnThis()
32-
.methodWithVeryVeryVeryVeryLongNameReturnBoolean() -> {
31+
variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
32+
when variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
33+
.methodWithVeryVeryVeryVeryLongNameReturnThis()
34+
.methodWithVeryVeryVeryVeryLongNameReturnBoolean() -> {
3335
System.err.println();
3436
}
3537
default -> {}
3638
}
3739
switch (o) {
38-
case TypeWithVeryVeryVeryVeryLongName
39-
variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName,
40-
TypeWithVeryVeryVeryVeryLongName
41-
variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName when variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
42-
.methodWithVeryVeryVeryVeryLongNameReturnThis()
43-
.methodWithVeryVeryVeryVeryLongNameReturnBoolean() -> {
40+
case SwitchRecord(
41+
int one,
42+
int two,
43+
int three,
44+
int four,
45+
int five,
46+
int six,
47+
int seven,
48+
int eight,
49+
int variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName)
50+
when variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
51+
.methodWithVeryVeryVeryVeryLongNameReturnThis()
52+
.methodWithVeryVeryVeryVeryLongNameReturnBoolean() -> {
4453
System.err.println();
4554
}
4655
default -> {}
4756
}
4857
switch (o) {
49-
case TypeWithVeryVeryVeryVeryLongName
50-
variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName,
51-
TypeWithVeryVeryVeryVeryLongName
52-
variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName when variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
58+
case SwitchRecord(
59+
int one,
60+
int two,
61+
int three,
62+
int four,
63+
int five,
64+
int six,
65+
int seven,
66+
int eight,
67+
int variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName)
68+
when variableWithVeryVeryVeryVeryVeryVeryVeryVeryVeryLongName
5369
.methodWithVeryVeryVeryVeryLongNameReturnThis()
5470
.methodWithVeryVeryVeryVeryLongNameReturnBoolean() ->
5571
System.err.println();

0 commit comments

Comments
 (0)