Skip to content

Commit cbf53be

Browse files
committed
Further Refine JSpecify support
Support `@Nullable` annotations in method bodies. Fixes gh-442
1 parent 43a13d2 commit cbf53be

File tree

4 files changed

+46
-10
lines changed

4 files changed

+46
-10
lines changed

spring-javaformat/spring-javaformat-formatter-tests/src/test/resources/expected/nullable.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,11 @@ public interface ExampleNullables {
1919
Object myArrayMethod(@Nullable String string, @Nullable String @Nullable [] array,
2020
@Nullable String @Nullable ... varargs);
2121

22+
default Object inBody() {
23+
@Nullable Object[] args = new Object[length];
24+
@Nullable List<@Nullable Object> list = new Object[length];
25+
Object @Nullable [] moreArgs = new Object[length];
26+
return args;
27+
}
28+
2229
}

spring-javaformat/spring-javaformat-formatter-tests/src/test/resources/source/nullable.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,11 @@ public interface ExampleNullables {
1717
Object myArrayMethod(@Nullable String string, @Nullable String @Nullable [] array, @Nullable
1818
String @Nullable ... varargs);
1919

20+
default Object inBody() {
21+
@Nullable Object[] args = new Object[length];
22+
@Nullable List<@Nullable Object> list = new Object[length];
23+
Object @Nullable [] moreArgs = new Object[length];
24+
return args;
25+
}
26+
2027
}

spring-javaformat/spring-javaformat-formatter/src/main/java/io/spring/javaformat/formatter/jdk17/eclipse/JSpecifyPreparator.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import io.spring.javaformat.eclipse.jdt.jdk17.core.dom.ImportDeclaration;
3434
import io.spring.javaformat.eclipse.jdt.jdk17.core.dom.MethodDeclaration;
3535
import io.spring.javaformat.eclipse.jdt.jdk17.core.dom.SingleVariableDeclaration;
36+
import io.spring.javaformat.eclipse.jdt.jdk17.core.dom.VariableDeclarationStatement;
3637
import io.spring.javaformat.eclipse.jdt.jdk17.core.formatter.CodeFormatter;
3738
import io.spring.javaformat.eclipse.jdt.jdk17.internal.formatter.Preparator;
3839
import io.spring.javaformat.eclipse.jdt.jdk17.internal.formatter.TokenManager;
@@ -86,12 +87,14 @@ public boolean visit(ImportDeclaration node) {
8687
}
8788

8889
@Override
89-
@SuppressWarnings("unchecked")
9090
public boolean visit(MethodDeclaration node) {
91-
Annotation lastAnnotation = getLastAnnotation((List<IExtendedModifier>) node.modifiers());
92-
if (isJSpecifyAnnotation(lastAnnotation)) {
93-
this.tokenManager.lastTokenIn(lastAnnotation, -1).clearLineBreaksAfter();
94-
}
91+
clearLineBreaksIfHasJSpecifyAnnotation(node.modifiers());
92+
return true;
93+
}
94+
95+
@Override
96+
public boolean visit(VariableDeclarationStatement node) {
97+
clearLineBreaksIfHasJSpecifyAnnotation(node.modifiers());
9598
return true;
9699
}
97100

@@ -107,6 +110,14 @@ public void endVisit(SingleVariableDeclaration node) {
107110
}
108111
}
109112

113+
@SuppressWarnings("unchecked")
114+
private void clearLineBreaksIfHasJSpecifyAnnotation(List<?> modifiers) {
115+
Annotation lastAnnotation = getLastAnnotation((List<IExtendedModifier>) modifiers);
116+
if (isJSpecifyAnnotation(lastAnnotation)) {
117+
this.tokenManager.lastTokenIn(lastAnnotation, -1).clearLineBreaksAfter();
118+
}
119+
}
120+
110121
private Annotation getLastAnnotation(List<? extends IExtendedModifier> modifiers) {
111122
Annotation annotation = null;
112123
for (IExtendedModifier modifier : modifiers) {

spring-javaformat/spring-javaformat-formatter/src/main/java/io/spring/javaformat/formatter/jdk8/eclipse/JSpecifyPreparator.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import io.spring.javaformat.eclipse.jdt.jdk8.core.dom.ImportDeclaration;
3434
import io.spring.javaformat.eclipse.jdt.jdk8.core.dom.MethodDeclaration;
3535
import io.spring.javaformat.eclipse.jdt.jdk8.core.dom.SingleVariableDeclaration;
36+
import io.spring.javaformat.eclipse.jdt.jdk8.core.dom.VariableDeclarationStatement;
3637
import io.spring.javaformat.eclipse.jdt.jdk8.core.formatter.CodeFormatter;
3738
import io.spring.javaformat.eclipse.jdt.jdk8.internal.formatter.Preparator;
3839
import io.spring.javaformat.eclipse.jdt.jdk8.internal.formatter.TokenManager;
@@ -86,12 +87,14 @@ public boolean visit(ImportDeclaration node) {
8687
}
8788

8889
@Override
89-
@SuppressWarnings("unchecked")
9090
public boolean visit(MethodDeclaration node) {
91-
Annotation lastAnnotation = getLastAnnotation((List<IExtendedModifier>) node.modifiers());
92-
if (isJSpecifyAnnotation(lastAnnotation)) {
93-
this.tokenManager.lastTokenIn(lastAnnotation, -1).clearLineBreaksAfter();
94-
}
91+
clearLineBreaksIfHasJSpecifyAnnotation(node.modifiers());
92+
return true;
93+
}
94+
95+
@Override
96+
public boolean visit(VariableDeclarationStatement node) {
97+
clearLineBreaksIfHasJSpecifyAnnotation(node.modifiers());
9598
return true;
9699
}
97100

@@ -107,6 +110,14 @@ public void endVisit(SingleVariableDeclaration node) {
107110
}
108111
}
109112

113+
@SuppressWarnings("unchecked")
114+
private void clearLineBreaksIfHasJSpecifyAnnotation(List<?> modifiers) {
115+
Annotation lastAnnotation = getLastAnnotation((List<IExtendedModifier>) modifiers);
116+
if (isJSpecifyAnnotation(lastAnnotation)) {
117+
this.tokenManager.lastTokenIn(lastAnnotation, -1).clearLineBreaksAfter();
118+
}
119+
}
120+
110121
private Annotation getLastAnnotation(List<? extends IExtendedModifier> modifiers) {
111122
Annotation annotation = null;
112123
for (IExtendedModifier modifier : modifiers) {

0 commit comments

Comments
 (0)