Skip to content

Commit d2bdf11

Browse files
committed
Refine Nullness for Kotlin functions returning Unit
Should have unspecified nullness like for Java void/Void. Closes gh-35420
1 parent e5b58ef commit d2bdf11

File tree

4 files changed

+24
-3
lines changed

4 files changed

+24
-3
lines changed

spring-core/src/main/java/org/springframework/core/Nullness.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,10 +181,10 @@ private static class KotlinDelegate {
181181

182182
public static Nullness forMethodReturnType(Method method) {
183183
KFunction<?> function = ReflectJvmMapping.getKotlinFunction(method);
184-
if (function != null && function.getReturnType().isMarkedNullable()) {
185-
return Nullness.NULLABLE;
184+
if (function != null && ReflectJvmMapping.getJavaType(function.getReturnType()) != void.class) {
185+
return (function.getReturnType().isMarkedNullable() ? Nullness.NULLABLE : Nullness.NON_NULL);
186186
}
187-
return Nullness.NON_NULL;
187+
return Nullness.UNSPECIFIED;
188188
}
189189

190190
public static Nullness forParameter(Executable executable, int parameterIndex) {

spring-core/src/test/java/org/springframework/core/NullnessTests.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,13 @@ void customNullableField() throws NoSuchFieldException {
377377
Assertions.assertThat(nullness).isEqualTo(Nullness.NULLABLE);
378378
}
379379

380+
@Test
381+
void voidClassMethod() throws NoSuchMethodException {
382+
var method = JSpecifyProcessor.class.getMethod("voidClassProcess");
383+
var nullness = Nullness.forMethodReturnType(method);
384+
Assertions.assertThat(nullness).isEqualTo(Nullness.UNSPECIFIED);
385+
}
386+
380387
// Primitive types
381388

382389
@Test

spring-core/src/test/kotlin/org/springframework/core/NullnessKotlinTests.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ class NullnessKotlinTests {
3737
Assertions.assertThat(nullness).isEqualTo(Nullness.NULLABLE)
3838
}
3939

40+
@Test
41+
fun unitReturnType() {
42+
val method = ::unit.javaMethod!!
43+
val nullness = Nullness.forMethodReturnType(method)
44+
Assertions.assertThat(nullness).isEqualTo(Nullness.UNSPECIFIED)
45+
}
46+
4047
@Test
4148
fun nullableParameter() {
4249
val method = ::nullable.javaMethod!!
@@ -78,4 +85,7 @@ class NullnessKotlinTests {
7885
@Suppress("unused_parameter")
7986
fun nonNull(nonNull: String): String = "foo"
8087

88+
fun unit() {
89+
}
90+
8191
}

spring-core/src/testFixtures/java/org/springframework/core/testfixture/nullness/JSpecifyProcessor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,9 @@ public interface JSpecifyProcessor {
3737
@NullMarked
3838
@NonNull String nonNullMarkedProcess();
3939

40+
@NullMarked
4041
void voidProcess();
42+
43+
@NullMarked
44+
void voidClassProcess();
4145
}

0 commit comments

Comments
 (0)