Skip to content

Commit ca529a2

Browse files
cushoncpovirk
authored andcommitted
Fix formatting of records without an explicit constructor
Fixes #460 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=308658958
1 parent 7ba82f7 commit ca529a2

File tree

4 files changed

+47
-14
lines changed

4 files changed

+47
-14
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1332,9 +1332,12 @@ public Void visitAnnotatedType(AnnotatedTypeTree node, Void unused) {
13321332
return null;
13331333
}
13341334

1335-
// TODO(cushon): Use Flags.COMPACT_RECORD_CONSTRUCTOR once if/when we drop support for Java 11
1335+
// TODO(cushon): Use Flags if/when we drop support for Java 11
1336+
13361337
protected static final long COMPACT_RECORD_CONSTRUCTOR = 1L << 51;
13371338

1339+
protected static final long RECORD = 1L << 61;
1340+
13381341
@Override
13391342
public Void visitMethod(MethodTree node, Void unused) {
13401343
sync(node);

core/src/main/java/com/google/googlejavaformat/java/java14/Java14InputAstVisitor.java

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@
1515
package com.google.googlejavaformat.java.java14;
1616

1717
import static com.google.common.collect.ImmutableList.toImmutableList;
18-
import static com.google.common.collect.MoreCollectors.onlyElement;
18+
import static com.google.common.collect.MoreCollectors.toOptional;
1919

2020
import com.google.common.base.Verify;
21+
import com.google.common.collect.ImmutableList;
2122
import com.google.googlejavaformat.Op;
2223
import com.google.googlejavaformat.OpsBuilder;
2324
import com.google.googlejavaformat.java.JavaInputAstVisitor;
@@ -26,13 +27,13 @@
2627
import com.sun.source.tree.ClassTree;
2728
import com.sun.source.tree.ExpressionTree;
2829
import com.sun.source.tree.InstanceOfTree;
29-
import com.sun.source.tree.MethodTree;
3030
import com.sun.source.tree.SwitchExpressionTree;
3131
import com.sun.source.tree.Tree;
3232
import com.sun.source.tree.YieldTree;
3333
import com.sun.tools.javac.code.Flags;
3434
import com.sun.tools.javac.tree.JCTree;
3535
import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
36+
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
3637
import com.sun.tools.javac.tree.TreeInfo;
3738
import java.util.List;
3839
import java.util.Optional;
@@ -112,20 +113,17 @@ public void visitRecordDeclaration(ClassTree node) {
112113
if (!node.getTypeParameters().isEmpty()) {
113114
typeParametersRest(node.getTypeParameters(), hasSuperInterfaceTypes ? plusFour : ZERO);
114115
}
115-
MethodTree constructor =
116-
node.getMembers().stream()
117-
.filter(JCMethodDecl.class::isInstance)
118-
.map(JCMethodDecl.class::cast)
119-
.filter(
120-
m -> (m.mods.flags & COMPACT_RECORD_CONSTRUCTOR) == COMPACT_RECORD_CONSTRUCTOR)
121-
.collect(onlyElement());
116+
ImmutableList<JCVariableDecl> parameters =
117+
compactRecordConstructor(node)
118+
.map(m -> ImmutableList.copyOf(m.getParameters()))
119+
.orElseGet(() -> recordVariables(node));
122120
token("(");
123-
if (!constructor.getParameters().isEmpty() || constructor.getReceiverParameter() != null) {
121+
if (!parameters.isEmpty()) {
124122
// Break before args.
125123
builder.breakToFill("");
126124
}
127-
visitFormals(
128-
Optional.ofNullable(constructor.getReceiverParameter()), constructor.getParameters());
125+
// record headers can't declare receiver parameters
126+
visitFormals(/* receiver= */ Optional.empty(), parameters);
129127
token(")");
130128
if (hasSuperInterfaceTypes) {
131129
builder.breakToFill(" ");
@@ -157,6 +155,22 @@ public void visitRecordDeclaration(ClassTree node) {
157155
dropEmptyDeclarations();
158156
}
159157

158+
private static Optional<JCMethodDecl> compactRecordConstructor(ClassTree node) {
159+
return node.getMembers().stream()
160+
.filter(JCMethodDecl.class::isInstance)
161+
.map(JCMethodDecl.class::cast)
162+
.filter(m -> (m.mods.flags & COMPACT_RECORD_CONSTRUCTOR) == COMPACT_RECORD_CONSTRUCTOR)
163+
.collect(toOptional());
164+
}
165+
166+
private static ImmutableList<JCVariableDecl> recordVariables(ClassTree node) {
167+
return node.getMembers().stream()
168+
.filter(JCVariableDecl.class::isInstance)
169+
.map(JCVariableDecl.class::cast)
170+
.filter(m -> (m.mods.flags & RECORD) == RECORD)
171+
.collect(toImmutableList());
172+
}
173+
160174
@Override
161175
public Void visitInstanceOf(InstanceOfTree node, Void unused) {
162176
sync(node);

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@ class Java14 {
1919
}
2020
}
2121

22+
record Foo(int id) {}
23+
24+
record Rcv(int id) {
25+
public Rcv(Rcv this, int id) {
26+
this.id = id;
27+
}
28+
}
29+
2230
void g() {
2331
var block = """
2432
hello
@@ -35,4 +43,4 @@ class Java14 {
3543
case WEDNESDAY -> 9;
3644
};
3745
}
38-
}
46+
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@ class Java14 {
1919
}
2020
}
2121

22+
record Foo(int id) {}
23+
24+
record Rcv(int id) {
25+
public Rcv(Rcv this, int id) {
26+
this.id = id;
27+
}
28+
}
29+
2230
void g() {
2331
var block = """
2432
hello

0 commit comments

Comments
 (0)