Browse Source

Add primitive type support to Nullness

See gh-34261
pull/34319/head
Sébastien Deleuze 1 year ago
parent
commit
1115be581a
  1. 5
      framework-docs/modules/ROOT/pages/core/null-safety.adoc
  2. 12
      spring-core/src/main/java/org/springframework/core/Nullness.java
  3. 16
      spring-core/src/test/java/org/springframework/core/NullnessTests.java
  4. 2
      spring-core/src/testFixtures/java/org/springframework/core/testfixture/nullness/JSpecifyProcessor.java
  5. 2
      spring-core/src/testFixtures/java/org/springframework/core/testfixture/nullness/NullnessFields.java

5
framework-docs/modules/ROOT/pages/core/null-safety.adoc

@ -13,8 +13,9 @@ annotations such as IntelliJ IDEA or Eclipse) and Kotlin where JSpecify annotati @@ -13,8 +13,9 @@ annotations such as IntelliJ IDEA or Eclipse) and Kotlin where JSpecify annotati
{kotlin-docs}/null-safety.html[Kotlin's null safety].
The {spring-framework-api}/core/Nullness.html[`Nullness` Spring API] can be used at runtime to detect the nullness of a
type usage, a field, a method return type or a parameter. It provides full support for JSpecify annotations and
Kotlin null safety, as well as a pragmatic check on any `@Nullable` annotation (regardless of the package).
type usage, a field, a method return type or a parameter. It provides full support for JSpecify annotations,
Kotlin null safety, Java primitive types, as well as a pragmatic check on any `@Nullable` annotation (regardless of the
package).
[[null-safety-libraries]]
== Annotating libraries with JSpecify annotations

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

@ -41,8 +41,9 @@ import org.jspecify.annotations.Nullable; @@ -41,8 +41,9 @@ import org.jspecify.annotations.Nullable;
*
* <p>The nullness applies to a type usage, a field, a method return type or a parameter.
* <a href="https://jspecify.dev/docs/user-guide/">JSpecify annotations</a> are fully supported, as well as
* <a href="https://kotlinlang.org/docs/null-safety.html">Kotlin null safety</a> and {@code @Nullable} annotations
* regardless of their package (from Spring, JSR-305 or Jakarta set of annotations for example).
* <a href="https://kotlinlang.org/docs/null-safety.html">Kotlin null safety</a>, {@code @Nullable} annotations
* regardless of their package (from Spring, JSR-305 or Jakarta set of annotations for example) and Java primitive
* types.
*
* @author Sebastien Deleuze
* @since 7.0
@ -50,7 +51,7 @@ import org.jspecify.annotations.Nullable; @@ -50,7 +51,7 @@ import org.jspecify.annotations.Nullable;
public enum Nullness {
/**
* Unspecified nullness (Java and JSpecify {@code @NullUnmarked} defaults).
* Unspecified nullness (Java default for non-primitive types and JSpecify {@code @NullUnmarked} code).
*/
UNSPECIFIED,
@ -60,7 +61,7 @@ public enum Nullness { @@ -60,7 +61,7 @@ public enum Nullness {
NULLABLE,
/**
* Will not include null (Kotlin and JSpecify {@code @NullMarked} defaults).
* Will not include null (Kotlin default and JSpecify {@code @NullMarked} code).
*/
NON_NULL;
@ -130,6 +131,9 @@ public enum Nullness { @@ -130,6 +131,9 @@ public enum Nullness {
}
private static Nullness jSpecifyNullness(AnnotatedElement annotatedElement, Class<?> declaringClass, AnnotatedType annotatedType) {
if (annotatedType.getType() instanceof Class<?> clazz && clazz.isPrimitive()) {
return (clazz != void.class ? Nullness.NON_NULL : Nullness.UNSPECIFIED);
}
if (annotatedType.isAnnotationPresent(Nullable.class)) {
return Nullness.NULLABLE;
}

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

@ -377,4 +377,20 @@ public class NullnessTests { @@ -377,4 +377,20 @@ public class NullnessTests {
Assertions.assertThat(nullness).isEqualTo(Nullness.NULLABLE);
}
// Primitive types
@Test
void primitiveField() throws NoSuchFieldException {
var field = NullnessFields.class.getDeclaredField("primitiveField");
var nullness = Nullness.forField(field);
Assertions.assertThat(nullness).isEqualTo(Nullness.NON_NULL);
}
@Test
void voidMethod() throws NoSuchMethodException {
var method = JSpecifyProcessor.class.getMethod("voidProcess");
var nullness = Nullness.forMethodReturnType(method);
Assertions.assertThat(nullness).isEqualTo(Nullness.UNSPECIFIED);
}
}

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

@ -36,4 +36,6 @@ public interface JSpecifyProcessor { @@ -36,4 +36,6 @@ public interface JSpecifyProcessor {
@NullMarked
@NonNull String nonNullMarkedProcess();
void voidProcess();
}

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

@ -26,4 +26,6 @@ public class NullnessFields { @@ -26,4 +26,6 @@ public class NullnessFields {
@org.springframework.core.testfixture.nullness.custom.Nullable
public String customNullableField;
public int primitiveField = 0;
}

Loading…
Cancel
Save