parent
d83be7c33a
commit
1115be581a
|
@ -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].
|
{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
|
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
|
type usage, a field, a method return type or a parameter. It provides full support for JSpecify annotations,
|
||||||
Kotlin null safety, as well as a pragmatic check on any `@Nullable` annotation (regardless of the package).
|
Kotlin null safety, Java primitive types, as well as a pragmatic check on any `@Nullable` annotation (regardless of the
|
||||||
|
package).
|
||||||
|
|
||||||
[[null-safety-libraries]]
|
[[null-safety-libraries]]
|
||||||
== Annotating libraries with JSpecify annotations
|
== Annotating libraries with JSpecify annotations
|
||||||
|
|
|
@ -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.
|
* <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://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
|
* <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).
|
* regardless of their package (from Spring, JSR-305 or Jakarta set of annotations for example) and Java primitive
|
||||||
|
* types.
|
||||||
*
|
*
|
||||||
* @author Sebastien Deleuze
|
* @author Sebastien Deleuze
|
||||||
* @since 7.0
|
* @since 7.0
|
||||||
|
@ -50,7 +51,7 @@ import org.jspecify.annotations.Nullable;
|
||||||
public enum Nullness {
|
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,
|
UNSPECIFIED,
|
||||||
|
|
||||||
|
@ -60,7 +61,7 @@ public enum Nullness {
|
||||||
NULLABLE,
|
NULLABLE,
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Will not include null (Kotlin and JSpecify {@code @NullMarked} defaults).
|
* Will not include null (Kotlin default and JSpecify {@code @NullMarked} code).
|
||||||
*/
|
*/
|
||||||
NON_NULL;
|
NON_NULL;
|
||||||
|
|
||||||
|
@ -130,6 +131,9 @@ public enum Nullness {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Nullness jSpecifyNullness(AnnotatedElement annotatedElement, Class<?> declaringClass, AnnotatedType annotatedType) {
|
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)) {
|
if (annotatedType.isAnnotationPresent(Nullable.class)) {
|
||||||
return Nullness.NULLABLE;
|
return Nullness.NULLABLE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -377,4 +377,20 @@ public class NullnessTests {
|
||||||
Assertions.assertThat(nullness).isEqualTo(Nullness.NULLABLE);
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,4 +36,6 @@ public interface JSpecifyProcessor {
|
||||||
|
|
||||||
@NullMarked
|
@NullMarked
|
||||||
@NonNull String nonNullMarkedProcess();
|
@NonNull String nonNullMarkedProcess();
|
||||||
|
|
||||||
|
void voidProcess();
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,4 +26,6 @@ public class NullnessFields {
|
||||||
|
|
||||||
@org.springframework.core.testfixture.nullness.custom.Nullable
|
@org.springframework.core.testfixture.nullness.custom.Nullable
|
||||||
public String customNullableField;
|
public String customNullableField;
|
||||||
|
|
||||||
|
public int primitiveField = 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue