Skip to content

Commit 77afc42

Browse files
cushonfawind
authored andcommitted
Handle final variables in instanceof patterns
Fixes google/google-java-format#588 PiperOrigin-RevId: 368117115
1 parent 8a290a0 commit 77afc42

File tree

6 files changed

+38
-15
lines changed

6 files changed

+38
-15
lines changed

palantir-java-format/src/main/java/com/palantir/javaformat/java/java14/Java14InputAstVisitor.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.sun.source.tree.ExpressionTree;
3535
import com.sun.source.tree.InstanceOfTree;
3636
import com.sun.source.tree.LambdaExpressionTree;
37+
import com.sun.source.tree.ModifiersTree;
3738
import com.sun.source.tree.ModuleTree;
3839
import com.sun.source.tree.SwitchExpressionTree;
3940
import com.sun.source.tree.Tree;
@@ -80,12 +81,12 @@ public Void visitBindingPattern(BindingPatternTree node, Void unused) {
8081
try {
8182
VariableTree variableTree = (VariableTree)
8283
BindingPatternTree.class.getMethod("getVariable").invoke(node);
83-
visitBindingPattern(variableTree.getType(), variableTree.getName());
84+
visitBindingPattern(variableTree.getModifiers(), variableTree.getType(), variableTree.getName());
8485
} catch (ReflectiveOperationException e1) {
8586
try {
8687
Tree type = (Tree) BindingPatternTree.class.getMethod("getType").invoke(node);
8788
Name name = (Name) BindingPatternTree.class.getMethod("getName").invoke(node);
88-
visitBindingPattern(type, name);
89+
visitBindingPattern(/* modifiers= */ null, type, name);
8990
} catch (ReflectiveOperationException e2) {
9091
e2.addSuppressed(e1);
9192
throw new LinkageError(e2.getMessage(), e2);
@@ -94,7 +95,10 @@ public Void visitBindingPattern(BindingPatternTree node, Void unused) {
9495
return null;
9596
}
9697

97-
private void visitBindingPattern(Tree type, Name name) {
98+
private void visitBindingPattern(ModifiersTree modifiers, Tree type, Name name) {
99+
if (modifiers != null) {
100+
builder.addAll(visitModifiers(modifiers, Direction.HORIZONTAL, Optional.empty()));
101+
}
98102
scan(type, null);
99103
builder.breakOp(" ");
100104
visit(name);

palantir-java-format/src/test/java/com/palantir/javaformat/java/FileBasedTests.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,10 @@
4141

4242
@Execution(ExecutionMode.CONCURRENT)
4343
public final class FileBasedTests {
44-
// Tests files that are only used when run with java 14 or higher
44+
// Test files that are only used when run with a minimum Java version
4545
private static final ImmutableSet<String> JAVA_14_TESTS =
4646
ImmutableSet.of("ExpressionSwitch", "RSL", "Records", "Var");
47+
private static final ImmutableSet<String> JAVA_16_TESTS = ImmutableSet.of("I588");
4748

4849
private final Class<?> testClass;
4950
/** The path prefix for all tests if loaded as resources. */
@@ -62,9 +63,11 @@ public FileBasedTests(Class<?> testClass, String testDirName) {
6263
this.fullTestPath = Paths.get("src/test/resources").resolve(resourcePrefix);
6364
}
6465

65-
public static void assumeJava14ForJava14Tests(String testName) {
66+
public static void assumeJavaVersionForTest(String testName) {
6667
if (JAVA_14_TESTS.contains(testName)) {
6768
Assumptions.assumeTrue(Formatter.getRuntimeVersion() >= 14, "Not running on jdk 14 or later");
69+
} else if (JAVA_16_TESTS.contains(testName)) {
70+
Assumptions.assumeTrue(Formatter.getRuntimeVersion() >= 16, "Not running on jdk 16 or later");
6871
}
6972
}
7073

palantir-java-format/src/test/java/com/palantir/javaformat/java/FormatterIntegrationTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
package com.palantir.javaformat.java;
1616

17-
import static com.palantir.javaformat.java.FileBasedTests.assumeJava14ForJava14Tests;
17+
import static com.palantir.javaformat.java.FileBasedTests.assumeJavaVersionForTest;
1818
import static com.palantir.javaformat.java.FileBasedTests.isRecreate;
1919
import static org.assertj.core.api.Assertions.assertThat;
2020

@@ -69,7 +69,7 @@ private static boolean isDebugMode() {
6969

7070
@TestTemplate
7171
public void format() {
72-
assumeJava14ForJava14Tests(name);
72+
assumeJavaVersionForTest(name);
7373
try {
7474
String output = createFormatter().formatSource(input);
7575
if (isRecreate()) {
@@ -93,7 +93,7 @@ private static Formatter createFormatter() {
9393

9494
@TestTemplate
9595
public void idempotentLF() {
96-
assumeJava14ForJava14Tests(name);
96+
assumeJavaVersionForTest(name);
9797
Assumptions.assumeFalse(isRecreate(), "Not running when recreating test outputs");
9898
try {
9999
String mangled = expected.replace(separator, "\n");
@@ -106,7 +106,7 @@ public void idempotentLF() {
106106

107107
@TestTemplate
108108
public void idempotentCR() {
109-
assumeJava14ForJava14Tests(name);
109+
assumeJavaVersionForTest(name);
110110
Assumptions.assumeFalse(isRecreate(), "Not running when recreating test outputs");
111111
try {
112112
String mangled = expected.replace(separator, "\r");
@@ -119,7 +119,7 @@ public void idempotentCR() {
119119

120120
@TestTemplate
121121
public void idempotentCRLF() {
122-
assumeJava14ForJava14Tests(name);
122+
assumeJavaVersionForTest(name);
123123
Assumptions.assumeFalse(isRecreate(), "Not running when recreating test outputs");
124124
try {
125125
String mangled = expected.replace(separator, "\r\n");

palantir-java-format/src/test/java/com/palantir/javaformat/java/StringWrapperIntegrationTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
package com.palantir.javaformat.java;
1616

1717
import static com.google.common.truth.Truth.assertThat;
18-
import static com.palantir.javaformat.java.FileBasedTests.assumeJava14ForJava14Tests;
18+
import static com.palantir.javaformat.java.FileBasedTests.assumeJavaVersionForTest;
1919
import static com.palantir.javaformat.java.FileBasedTests.isRecreate;
2020

2121
import com.palantir.javaformat.jupiter.ParameterizedClass;
@@ -52,7 +52,7 @@ public StringWrapperIntegrationTest(String name, String input, String output) {
5252

5353
@TestTemplate
5454
public void test() throws Exception {
55-
assumeJava14ForJava14Tests(name);
55+
assumeJavaVersionForTest(name);
5656
String actualOutput = StringWrapper.wrap(40, formatter.formatSource(input), formatter);
5757
if (isRecreate()) {
5858
tests.writeFormatterOutput(name, actualOutput);
@@ -63,23 +63,23 @@ public void test() throws Exception {
6363

6464
@TestTemplate
6565
public void testCR() throws Exception {
66-
assumeJava14ForJava14Tests(name);
66+
assumeJavaVersionForTest(name);
6767
Assumptions.assumeFalse(isRecreate(), "Not running when recreating test outputs");
6868
assertThat(StringWrapper.wrap(40, formatter.formatSource(input.replace("\n", "\r")), formatter))
6969
.isEqualTo(output.replace("\n", "\r"));
7070
}
7171

7272
@TestTemplate
7373
public void testCRLF() throws Exception {
74-
assumeJava14ForJava14Tests(name);
74+
assumeJavaVersionForTest(name);
7575
Assumptions.assumeFalse(isRecreate(), "Not running when recreating test outputs");
7676
assertThat(StringWrapper.wrap(40, formatter.formatSource(input.replace("\n", "\r\n")), formatter))
7777
.isEqualTo(output.replace("\n", "\r\n"));
7878
}
7979

8080
@TestTemplate
8181
public void idempotent() throws Exception {
82-
assumeJava14ForJava14Tests(name);
82+
assumeJavaVersionForTest(name);
8383
Assumptions.assumeFalse(isRecreate(), "Not running when recreating test outputs");
8484
String wrap = StringWrapper.wrap(40, formatter.formatSource(input), formatter);
8585
assertThat(formatter.formatSource(wrap)).isEqualTo(wrap);
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class T {
2+
int f(Object x) {
3+
if (x instanceof final Integer i) {
4+
return i;
5+
}
6+
return -1;
7+
}
8+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class T {
2+
int f(Object x) {
3+
if (x instanceof final Integer i) {
4+
return i;
5+
}
6+
return -1;
7+
}
8+
}

0 commit comments

Comments
 (0)