Skip to content

Commit b92435a

Browse files
cushongoogle-java-format Team
authored andcommitted
Support unnamed variables
Fixes #978 PiperOrigin-RevId: 589179786
1 parent 430ba3b commit b92435a

File tree

5 files changed

+115
-3
lines changed

5 files changed

+115
-3
lines changed

core/src/main/java/com/google/googlejavaformat/java/JavaInputAstVisitor.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3563,7 +3563,7 @@ int declareOne(
35633563
if (receiverExpression.isPresent()) {
35643564
scan(receiverExpression.get(), null);
35653565
} else {
3566-
visit(name);
3566+
variableName(name);
35673567
}
35683568
builder.op(op);
35693569
}
@@ -3606,6 +3606,10 @@ int declareOne(
36063606
return baseDims;
36073607
}
36083608

3609+
protected void variableName(Name name) {
3610+
visit(name);
3611+
}
3612+
36093613
private void maybeAddDims(Deque<List<? extends AnnotationTree>> annotations) {
36103614
maybeAddDims(new ArrayDeque<>(), annotations);
36113615
}
@@ -3696,7 +3700,7 @@ private void declareMany(List<VariableTree> fragments, Direction annotationDirec
36963700
builder.breakOp(" ");
36973701
builder.open(ZERO);
36983702
maybeAddDims(dims);
3699-
visit(fragment.getName());
3703+
variableName(fragment.getName());
37003704
maybeAddDims(dims);
37013705
ExpressionTree initializer = fragment.getInitializer();
37023706
if (initializer != null) {

core/src/main/java/com/google/googlejavaformat/java/java21/Java21InputAstVisitor.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.sun.source.tree.ExpressionTree;
2424
import com.sun.source.tree.PatternCaseLabelTree;
2525
import com.sun.source.tree.PatternTree;
26+
import javax.lang.model.element.Name;
2627

2728
/**
2829
* Extends {@link Java17InputAstVisitor} with support for AST nodes that were added or modified in
@@ -76,4 +77,13 @@ public Void visitDeconstructionPattern(DeconstructionPatternTree node, Void unus
7677
token(")");
7778
return null;
7879
}
80+
81+
@Override
82+
protected void variableName(Name name) {
83+
if (name.isEmpty()) {
84+
token("_");
85+
} else {
86+
visit(name);
87+
}
88+
}
7989
}

core/src/test/java/com/google/googlejavaformat/java/FormatterIntegrationTest.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,13 @@ public class FormatterIntegrationTest {
5353
.putAll(16, "I588")
5454
.putAll(17, "I683", "I684", "I696")
5555
.putAll(
56-
21, "SwitchGuardClause", "SwitchRecord", "SwitchDouble", "SwitchUnderscore", "I880")
56+
21,
57+
"SwitchGuardClause",
58+
"SwitchRecord",
59+
"SwitchDouble",
60+
"SwitchUnderscore",
61+
"I880",
62+
"Unnamed")
5763
.build();
5864

5965
@Parameters(name = "{index}: {0}")
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
class Unnamed {
2+
{
3+
int acc = 0;
4+
for (Order _ : orders) {
5+
if (acc < LIMIT) {
6+
acc++;
7+
}
8+
}
9+
10+
for (int i = 0, _ = sideEffect(); i < 10; i++) { }
11+
12+
Queue<Integer> q = null;
13+
while (q.size() >= 3) {
14+
var x = q.remove();
15+
var y = q.remove();
16+
var _ = q.remove();
17+
new Point(x, y);
18+
}
19+
20+
while (q.size() >= 3) {
21+
var x = q.remove();
22+
var _ = q.remove();
23+
var _ = q.remove();
24+
new Point(x, 0) ;
25+
}
26+
27+
String s = null;
28+
try {
29+
int i = Integer.parseInt(s);
30+
} catch (NumberFormatException _) {
31+
System.out.println("Bad number: " + s);
32+
}
33+
34+
try { doSomething(); }
35+
catch (Exception _) { doSomething(); }
36+
catch (Throwable _) { doSomething(); }
37+
38+
try (var _ = ScopedContext.acquire()) {
39+
doSomething();
40+
}
41+
42+
stream.collect(Collectors.toMap(String::toUpperCase, _ -> "NODATA"));
43+
}
44+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
class Unnamed {
2+
{
3+
int acc = 0;
4+
for (Order _ : orders) {
5+
if (acc < LIMIT) {
6+
acc++;
7+
}
8+
}
9+
10+
for (int i = 0, _ = sideEffect(); i < 10; i++) {}
11+
12+
Queue<Integer> q = null;
13+
while (q.size() >= 3) {
14+
var x = q.remove();
15+
var y = q.remove();
16+
var _ = q.remove();
17+
new Point(x, y);
18+
}
19+
20+
while (q.size() >= 3) {
21+
var x = q.remove();
22+
var _ = q.remove();
23+
var _ = q.remove();
24+
new Point(x, 0);
25+
}
26+
27+
String s = null;
28+
try {
29+
int i = Integer.parseInt(s);
30+
} catch (NumberFormatException _) {
31+
System.out.println("Bad number: " + s);
32+
}
33+
34+
try {
35+
doSomething();
36+
} catch (Exception _) {
37+
doSomething();
38+
} catch (Throwable _) {
39+
doSomething();
40+
}
41+
42+
try (var _ = ScopedContext.acquire()) {
43+
doSomething();
44+
}
45+
46+
stream.collect(Collectors.toMap(String::toUpperCase, _ -> "NODATA"));
47+
}
48+
}

0 commit comments

Comments
 (0)