diff --git a/build.gradle b/build.gradle index c661531e733f..7122d727e1fc 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,9 @@ plugins { id 'biz.aQute.bnd' version '7.1.0' apply false id "com.diffplug.spotless" version "7.0.4" - id 'org.checkerframework' version '0.6.56' + //id 'org.checkerframework' version '0.6.56' + id "net.ltgt.errorprone" version "4.3.0" + id "net.ltgt.nullaway" version "2.3.0" id 'org.hibernate.orm.build.jdks' id 'io.github.gradle-nexus.publish-plugin' version '2.0.0' diff --git a/hibernate-community-dialects/hibernate-community-dialects.gradle b/hibernate-community-dialects/hibernate-community-dialects.gradle index c2089b483917..702821ceeb1d 100644 --- a/hibernate-community-dialects/hibernate-community-dialects.gradle +++ b/hibernate-community-dialects/hibernate-community-dialects.gradle @@ -13,6 +13,8 @@ description = 'Hibernate\'s community supported dialects' dependencies { api project( ':hibernate-core' ) + compileOnly libs.checkerFramework + testImplementation project( ':hibernate-testing' ) testImplementation project( path: ':hibernate-core', configuration: 'tests' ) } diff --git a/hibernate-core/hibernate-core.gradle b/hibernate-core/hibernate-core.gradle index a417f71604bd..4cdf15d08a2e 100644 --- a/hibernate-core/hibernate-core.gradle +++ b/hibernate-core/hibernate-core.gradle @@ -20,7 +20,6 @@ configurations { } } - dependencies { api jakartaLibs.jpa api jakartaLibs.jta @@ -35,6 +34,8 @@ dependencies { implementation libs.antlrRuntime + compileOnly libs.checkerFramework + compileOnly jakartaLibs.jacc compileOnly jakartaLibs.validation compileOnly jakartaLibs.cdi @@ -61,6 +62,8 @@ dependencies { testImplementation jdbcLibs.h2 testImplementation libs.hibernateModelsJandex + testCompileOnly libs.checkerFramework + testRuntimeOnly libs.byteBuddy testRuntimeOnly testLibs.weld testRuntimeOnly testLibs.wildFlyTxnClient diff --git a/hibernate-micrometer/hibernate-micrometer.gradle b/hibernate-micrometer/hibernate-micrometer.gradle index 461d5cca2a28..85306b67b589 100644 --- a/hibernate-micrometer/hibernate-micrometer.gradle +++ b/hibernate-micrometer/hibernate-micrometer.gradle @@ -9,6 +9,8 @@ dependencies { implementation project( ':hibernate-core' ) implementation libs.micrometer + compileOnly libs.checkerFramework + testImplementation project( ':hibernate-testing' ) testAnnotationProcessor project( ':hibernate-processor' ) diff --git a/hibernate-vector/hibernate-vector.gradle b/hibernate-vector/hibernate-vector.gradle index 61e10169bc30..9fdd435ae7aa 100644 --- a/hibernate-vector/hibernate-vector.gradle +++ b/hibernate-vector/hibernate-vector.gradle @@ -13,6 +13,8 @@ description = 'Hibernate\'s extensions for vector support' dependencies { api project( ':hibernate-core' ) + compileOnly libs.checkerFramework + testImplementation project( ':hibernate-testing' ) testImplementation project( path: ':hibernate-core', configuration: 'tests' ) } diff --git a/local-build-plugins/src/main/groovy/local.code-quality.gradle b/local-build-plugins/src/main/groovy/local.code-quality.gradle index 8e79bb839212..bcfa76710669 100644 --- a/local-build-plugins/src/main/groovy/local.code-quality.gradle +++ b/local-build-plugins/src/main/groovy/local.code-quality.gradle @@ -4,7 +4,9 @@ */ plugins { - id "org.checkerframework" + //id "org.checkerframework" + id "net.ltgt.errorprone" + id "net.ltgt.nullaway" id "de.thetaphi.forbiddenapis" id "com.diffplug.spotless" } @@ -106,11 +108,44 @@ spotless { tasks.compileJava.dependsOn tasks.spotlessJavaApply dependencies { - compileOnly libs.checkerFramework - testCompileOnly libs.checkerFramework - checkerFramework libs.checkerFrameworkChecker + //compileOnly libs.checkerFramework + //testCompileOnly libs.checkerFramework + //checkerFramework libs.checkerFrameworkChecker + api "org.jspecify:jspecify:1.0.0" + // for use contract like @Nullable Boolean foo(final String a) @Contract(null->null) + // see https://github.com/uber/NullAway/wiki/Supported-Annotations#contracts + // compileOnly "org.jetbrains:annotations:26.0.2" + errorprone "com.uber.nullaway:nullaway:0.12.9" + errorprone "com.google.errorprone:error_prone_core:2.41.0" } +tasks.withType(JavaCompile).configureEach { + if (gradle.startParameter.taskNames.contains("ciCheck")) { + // options.errorprone.enabled = true + } + if (it.name.toLowerCase().contains("test")) { + options.errorprone.enabled = false + } + options.errorprone { + disableWarningsInGeneratedCode.set(true) + + // error prone core = warnings + errorproneArgs.add("-XepAllErrorsAsWarnings") + + nullaway { + error() + // annotatedPackages.add("org.hibernate") + onlyNullMarked.set(true) + treatGeneratedAsUnannotated.set(true) + checkContracts.set(true) + checkOptionalEmptiness.set(true) + exhaustiveOverride.set(true) + jspecifyMode.set(true) + } + } +} + +/* checkerFramework { excludeTests = true skipCheckerFramework = !gradle.startParameter.taskNames.contains("ciCheck") @@ -123,6 +158,7 @@ checkerFramework { '-AonlyDefs=^org\\.hibernate\\.(jdbc|exception|integrator|processor|service|spi|pretty|property\\.access|stat|engine\\.(config|jndi|profile|spi|transaction)|(action|context|bytecode)\\.spi)\\.' ] } +*/ tasks.forbiddenApisMain { // unfortunately we currently have many uses of default Locale implicitly (~370) diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java index 922cf3c4a792..1aa9a150fe83 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java @@ -5,6 +5,7 @@ package org.hibernate.jpamodelgen; import org.hibernate.processor.HibernateProcessor; +import org.jspecify.annotations.NonNull; import javax.annotation.processing.ProcessingEnvironment; import javax.annotation.processing.SupportedAnnotationTypes; @@ -65,7 +66,7 @@ @Deprecated(forRemoval = true) public class JPAMetaModelEntityProcessor extends HibernateProcessor { @Override - public synchronized void init(ProcessingEnvironment processingEnvironment) { + public synchronized void init(@NonNull ProcessingEnvironment processingEnvironment) { processingEnvironment.getMessager().printMessage( Diagnostic.Kind.WARNING, "JPAMetaModelEntityProcessor is deprecated, replaced by org.hibernate.processor.HibernateProcessor" diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java index 56987d856151..3acfd66d23c2 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/ClassWriter.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Set; +import static java.util.Objects.requireNonNull; import static org.hibernate.processor.util.Constants.SPRING_COMPONENT; import static org.hibernate.processor.util.TypeUtils.getGeneratedClassFullyQualifiedName; import static org.hibernate.processor.util.TypeUtils.isMemberType; @@ -270,7 +271,7 @@ private static String getGeneratedSuperclassName(Element superClassElement, bool private static String getGeneratedClassName(TypeElement typeElement, boolean jakartaDataStyle) { final String simpleName = typeElement.getSimpleName().toString(); - final Element enclosingElement = typeElement.getEnclosingElement(); + final Element enclosingElement = requireNonNull( typeElement.getEnclosingElement() ); return (enclosingElement instanceof TypeElement ? getGeneratedSuperclassName( enclosingElement, jakartaDataStyle ) : ((PackageElement) enclosingElement).getQualifiedName().toString()) @@ -305,6 +306,9 @@ private static String writeGeneratedAnnotation(Metamodel entity, Context context private static String writeSuppressWarnings(Context context) { final StringBuilder annotation = new StringBuilder("@SuppressWarnings({"); final String[] warnings = context.getSuppressedWarnings(); + if (warnings == null || warnings.length == 0) { + return "@SuppressWarnings({})"; + } for (int i = 0; i < warnings.length; i++) { if ( i>0 ) { annotation.append(", "); diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java index e70d5a6e04f0..98bb816b8107 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Context.java @@ -29,7 +29,7 @@ import org.hibernate.processor.util.AccessTypeInformation; import jakarta.persistence.AccessType; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import static java.lang.Boolean.parseBoolean; import static java.util.Collections.emptyList; @@ -81,16 +81,16 @@ public final class Context { * Whether all mapping files are xml-mapping-metadata-complete. In this case no annotation processing will take * place. */ - private Boolean fullyXmlConfigured; + private @Nullable Boolean fullyXmlConfigured; private boolean addInjectAnnotation = false; private boolean addDependentAnnotation = false; private boolean addComponentAnnotation = false; private boolean addNonnullAnnotation = false; private boolean addGeneratedAnnotation = true; private boolean addGenerationDate; - private String[] suppressedWarnings; + private String @Nullable [] suppressedWarnings; private boolean addTransactionScopedAnnotation; - private AccessType persistenceUnitDefaultAccessType; + private @Nullable AccessType persistenceUnitDefaultAccessType; private boolean generateJakartaDataStaticMetamodel; private boolean quarkusInjection; private boolean springInjection; @@ -213,7 +213,7 @@ public boolean addSuppressWarningsAnnotation() { return suppressedWarnings != null; } - public String[] getSuppressedWarnings() { + public String @Nullable [] getSuppressedWarnings() { return suppressedWarnings; } @@ -402,7 +402,7 @@ public void mappingDocumentFullyXmlConfigured(boolean fullyXmlConfigured) { : this.fullyXmlConfigured && fullyXmlConfigured; } - public AccessType getPersistenceUnitDefaultAccessType() { + public @Nullable AccessType getPersistenceUnitDefaultAccessType() { return persistenceUnitDefaultAccessType; } diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java index e483b07d6045..76121a1f54f4 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/HibernateProcessor.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.hibernate.processor.annotation.AnnotationMetaEntity; import org.hibernate.processor.annotation.AnnotationMetaPackage; import org.hibernate.processor.annotation.NonManagedMetamodel; @@ -45,6 +45,7 @@ import java.util.function.Function; import static java.lang.Boolean.parseBoolean; +import static java.util.Objects.requireNonNull; import static javax.lang.model.util.ElementFilter.fieldsIn; import static javax.lang.model.util.ElementFilter.methodsIn; import static org.hibernate.processor.HibernateProcessor.ADD_GENERATED_ANNOTATION; @@ -512,7 +513,7 @@ private void createMetaModelClasses() { for ( Metamodel aux : context.getMetaAuxiliaries() ) { if ( !context.isAlreadyGenerated(aux) - && !isClassRecordOrInterfaceType( aux.getElement().getEnclosingElement() ) ) { + && !isClassRecordOrInterfaceType( requireNonNull( aux.getElement().getEnclosingElement() ) ) ) { context.logMessage( Diagnostic.Kind.OTHER, "Writing metamodel for auxiliary '" + aux + "'" ); ClassWriter.writeFile( aux, context ); @@ -711,7 +712,7 @@ && hasAnnotation( element, ENTITY, MAPPED_SUPERCLASS ) } private static boolean hasHandwrittenMetamodel(Element element) { - return element.getEnclosingElement().getEnclosedElements() + return requireNonNull( element.getEnclosingElement() ).getEnclosedElements() .stream().anyMatch(e -> e.getSimpleName() .contentEquals('_' + element.getSimpleName().toString())); } @@ -764,7 +765,7 @@ private void indexEnumValues(TypeMirror type) { if ( fieldType.getKind() == ElementKind.ENUM ) { for ( Element enumMember : fieldType.getEnclosedElements() ) { if ( enumMember.getKind() == ElementKind.ENUM_CONSTANT ) { - final Element enclosingElement = fieldType.getEnclosingElement(); + final Element enclosingElement = requireNonNull( fieldType.getEnclosingElement() ); final boolean hasOuterType = enclosingElement.getKind().isClass() || enclosingElement.getKind().isInterface(); context.addEnumValue( fieldType.getQualifiedName().toString(), diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Version.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Version.java index a0f0f5676e36..43276452a085 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Version.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/Version.java @@ -6,7 +6,7 @@ import org.hibernate.processor.util.NullnessUtil; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Information about the Meta Model Generator version. diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java index 5c8eb7565da3..a0815234e53f 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractCriteriaMethod.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor.annotation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractFinderMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractFinderMethod.java index 79640626bd4a..3e256dbdb664 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractFinderMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractFinderMethod.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor.annotation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import javax.lang.model.element.ExecutableElement; import java.util.List; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractQueryMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractQueryMethod.java index 65e43eef6ab6..d7786f1be56d 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractQueryMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AbstractQueryMethod.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor.annotation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.hibernate.AssertionFailure; import javax.lang.model.element.ExecutableElement; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMeta.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMeta.java index 233e9f25df18..6af5f4e7fc52 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMeta.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMeta.java @@ -6,7 +6,7 @@ import org.antlr.v4.runtime.RecognitionException; import org.antlr.v4.runtime.Recognizer; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.hibernate.processor.Context; import org.hibernate.processor.model.MetaAttribute; import org.hibernate.processor.model.Metamodel; @@ -22,6 +22,7 @@ import java.util.List; import static java.lang.Character.isJavaIdentifierStart; +import static java.util.Objects.requireNonNull; import static org.hibernate.processor.util.Constants.ENTITY_GRAPH; import static org.hibernate.processor.util.Constants.HIB_ENABLED_FETCH_PROFILE; import static org.hibernate.processor.util.Constants.JAVA_OBJECT; @@ -56,7 +57,7 @@ void addAuxiliaryMembers() { void checkNamedQueries() { boolean checkHql = containsAnnotation( getElement(), Constants.CHECK_HQL ) - || containsAnnotation( getElement().getEnclosingElement(), Constants.CHECK_HQL ); + || containsAnnotation( requireNonNull( getElement().getEnclosingElement() ), Constants.CHECK_HQL ); handleNamedQueryAnnotation( NAMED_QUERY, checkHql ); handleNamedQueryRepeatableAnnotation( Constants.NAMED_QUERIES, checkHql ); handleNamedQueryAnnotation( Constants.HIB_NAMED_QUERY, checkHql ); diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java index 123589a1f799..dcb04a1a8470 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java @@ -5,7 +5,7 @@ package org.hibernate.processor.annotation; import org.antlr.v4.runtime.Token; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.hibernate.AssertionFailure; import org.hibernate.grammars.hql.HqlLexer; import org.hibernate.metamodel.mapping.ordering.OrderByFragmentTranslator; @@ -69,6 +69,7 @@ import static java.beans.Introspector.decapitalize; import static java.lang.Boolean.FALSE; import static java.util.Collections.emptyList; +import static java.util.Objects.requireNonNull; import static java.util.Objects.requireNonNullElse; import static java.util.stream.Collectors.toList; import static javax.lang.model.util.ElementFilter.fieldsIn; @@ -130,10 +131,10 @@ public class AnnotationMetaEntity extends AnnotationMeta { private boolean jakartaDataRepository; private final boolean quarkusInjection; private final boolean springInjection; - private String qualifiedName; + private @Nullable String qualifiedName; private final boolean jakartaDataStaticModel; - private AccessTypeInformation entityAccessTypeInfo; + private @Nullable AccessTypeInformation entityAccessTypeInfo; /** * Whether the members of this type have already been initialized or not. @@ -153,7 +154,7 @@ public class AnnotationMetaEntity extends AnnotationMeta { * lazily is required for embeddables and mapped supertypes, to only pull in those members matching the access * type as configured via the embedding entity or subclass (also see METAGEN-85). */ - private Metamodel entityToMerge; + private @Nullable Metamodel entityToMerge; /** * True if this "metamodel class" is actually an instantiable DAO-style repository. @@ -229,7 +230,7 @@ public static AnnotationMetaEntity create( return memberTypes.get( qualify(entityType, memberName) ); } - public AccessTypeInformation getEntityAccessTypeInfo() { + public @Nullable AccessTypeInformation getEntityAccessTypeInfo() { return entityAccessTypeInfo; } @@ -419,7 +420,7 @@ else if ( hasAnnotation( method, JD_DELETE ) ) { queryMethods.add( method ); } } - else if ( method.getEnclosingElement().getKind().isInterface() + else if ( requireNonNull( method.getEnclosingElement() ).getKind().isInterface() && !method.isDefault() && !method.getModifiers().contains(Modifier.PRIVATE) && !isSessionGetter(method) ) { @@ -1506,7 +1507,7 @@ else if ( typeUtils.isSameType( backType, element.asType() ) ) { } private boolean isPersistent(Element memberOfClass, AccessType membersKind) { - return ( entityAccessTypeInfo.getAccessType() == membersKind + return ( ( entityAccessTypeInfo != null && entityAccessTypeInfo.getAccessType() == membersKind ) || determineAnnotationSpecifiedAccessType( memberOfClass ) != null ) && !containsAnnotation( memberOfClass, TRANSIENT ) && !memberOfClass.getModifiers().contains( Modifier.TRANSIENT ) @@ -2559,7 +2560,7 @@ enum FieldType { final var attributeType = requireNonNullElse( resolveTypeMirror( entityType, - member.getEnclosingElement(), + requireNonNull( member.getEnclosingElement() ), memberType.toString() ), memberType ); @@ -2623,7 +2624,7 @@ private TypeMirror actualParameterType(VariableElement param) { context.getTypeUtils() .asMemberOf( (DeclaredType) element.asType(), method ); return methodType.getParameterTypes() - .get( method.getParameters().indexOf( param ) ); + .get( requireNonNull( method ).getParameters().indexOf( param ) ); } /** @@ -3442,7 +3443,7 @@ private String typeAsString(TypeMirror type) { private TypeMirror parameterType(VariableElement parameter) { final ExecutableElement method = - (ExecutableElement) parameter.getEnclosingElement(); + (ExecutableElement) requireNonNull( parameter.getEnclosingElement() ); final TypeMirror type = memberMethodType(method).getParameterTypes() .get( method.getParameters().indexOf(parameter) ); @@ -3690,7 +3691,7 @@ public void message(Element method, AnnotationMirror mirror, AnnotationValue val private static String messageWithLocation(Element element, String message) { return element.getKind() == ElementKind.PARAMETER ? message + " for parameter '" + element.getSimpleName() - + "' of inherited member '" + element.getEnclosingElement().getSimpleName() + "'" + + "' of inherited member '" + requireNonNull( element.getEnclosingElement() ).getSimpleName() + "'" : message + " for inherited member '" + element.getSimpleName() + "'"; } diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaPackage.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaPackage.java index dde5471ece66..657ae844fb38 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaPackage.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaPackage.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor.annotation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.hibernate.processor.Context; import org.hibernate.processor.ImportContextImpl; import org.hibernate.processor.model.ImportContext; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaFinderMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaFinderMethod.java index 9545578ce2d1..71b8cc64f915 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaFinderMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/CriteriaFinderMethod.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor.annotation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import javax.lang.model.element.ExecutableElement; import java.util.List; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DataAnnotationMetaAttribute.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DataAnnotationMetaAttribute.java index 53032f9faac5..c79dad56e193 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DataAnnotationMetaAttribute.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DataAnnotationMetaAttribute.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor.annotation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.hibernate.processor.model.MetaAttribute; import org.hibernate.processor.model.Metamodel; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DataMetaAttributeGenerationVisitor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DataMetaAttributeGenerationVisitor.java index 2c06d7123a36..06efc5b5688f 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DataMetaAttributeGenerationVisitor.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DataMetaAttributeGenerationVisitor.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor.annotation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.hibernate.processor.Context; import org.hibernate.processor.util.Constants; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DefaultConstructor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DefaultConstructor.java index 54cd106ae92c..0a5fc515bf41 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DefaultConstructor.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/DefaultConstructor.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor.annotation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.hibernate.processor.model.MetaAttribute; import org.hibernate.processor.model.Metamodel; import org.hibernate.processor.util.Constants; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/IdFinderMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/IdFinderMethod.java index fc27c6eb4405..2be27b197c92 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/IdFinderMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/IdFinderMethod.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor.annotation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import javax.lang.model.element.ExecutableElement; import java.util.List; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/LifecycleMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/LifecycleMethod.java index 4736c6545406..b0be348d0d72 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/LifecycleMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/LifecycleMethod.java @@ -19,6 +19,7 @@ import java.util.Set; import static java.lang.Character.toUpperCase; +import static java.util.Objects.requireNonNull; import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toSet; import static javax.lang.model.type.TypeKind.VOID; @@ -400,7 +401,7 @@ else if ( type instanceof TypeVariable typeVariable ) { if ( methodTypeParameters.contains( value ) ) { return value; } - return annotationMetaEntity.importType( resolveTypeName( element, method.getEnclosingElement(), value ) ); + return annotationMetaEntity.importType( resolveTypeName( element, requireNonNull( method.getEnclosingElement() ), value ) ); } else if ( type instanceof WildcardType wildcardType ) { return "?" diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/MetaAttributeGenerationVisitor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/MetaAttributeGenerationVisitor.java index ea4c04224f52..d4e19d7b7b3a 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/MetaAttributeGenerationVisitor.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/MetaAttributeGenerationVisitor.java @@ -5,7 +5,7 @@ package org.hibernate.processor.annotation; import jakarta.persistence.AccessType; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.hibernate.processor.Context; import org.hibernate.processor.util.AccessTypeInformation; import org.hibernate.processor.util.Constants; @@ -25,6 +25,7 @@ import javax.tools.Diagnostic; import java.util.List; +import static java.util.Objects.requireNonNull; import static org.hibernate.processor.util.Constants.ELEMENT_COLLECTION; import static org.hibernate.processor.util.Constants.LIST_ATTRIBUTE; import static org.hibernate.processor.util.Constants.MANY_TO_ANY; @@ -139,10 +140,10 @@ private AnnotationMetaAttribute createMetaAttribute( } } - private void setAccessType(TypeMirror collectionElementType, TypeElement collectionElement) { + private void setAccessType(TypeMirror collectionElementType, @Nullable TypeElement collectionElement) { final String elementTypeName = collectionElementType.toString(); final AccessTypeInformation accessTypeInfo = context.getAccessTypeInfo( elementTypeName ); - final AccessType entityAccessType = entity.getEntityAccessTypeInfo().getAccessType(); + final AccessType entityAccessType = requireNonNull( entity.getEntityAccessTypeInfo() ).getAccessType(); if ( accessTypeInfo == null ) { context.addAccessTypeInformation( elementTypeName, diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NamedQueryMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NamedQueryMethod.java index 0e86826aab89..9e94eb4cbf85 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NamedQueryMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NamedQueryMethod.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor.annotation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.hibernate.processor.model.MetaAttribute; import org.hibernate.processor.model.Metamodel; import org.hibernate.processor.util.Constants; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NaturalIdFinderMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NaturalIdFinderMethod.java index d9d98e0ee071..4ad45995bd2e 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NaturalIdFinderMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NaturalIdFinderMethod.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor.annotation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import javax.lang.model.element.ExecutableElement; import java.util.List; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NonManagedMetamodel.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NonManagedMetamodel.java index 6127612d4022..33800e9372a8 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NonManagedMetamodel.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/NonManagedMetamodel.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor.annotation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.hibernate.processor.Context; import javax.lang.model.element.TypeElement; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java index 15770caf2c69..a17590a9798f 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/QueryMethod.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor.annotation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.hibernate.internal.util.StringHelper; import javax.lang.model.element.ExecutableElement; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/RepositoryConstructor.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/RepositoryConstructor.java index 20727f6cfb95..906e15ea0525 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/RepositoryConstructor.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/RepositoryConstructor.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor.annotation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.hibernate.processor.model.MetaAttribute; import org.hibernate.processor.model.Metamodel; import org.hibernate.processor.util.Constants; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/TypedMetaAttribute.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/TypedMetaAttribute.java index 14f577610c12..89851720ebaa 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/TypedMetaAttribute.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/TypedMetaAttribute.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor.annotation; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.hibernate.processor.model.Metamodel; import static org.hibernate.processor.util.StringUtil.nameToMethodName; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/package-info.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/package-info.java index 49c36b5002a3..3c06b78097ef 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/package-info.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/package-info.java @@ -5,4 +5,5 @@ /** * Implementation of the model classes backed by annotations. */ +@org.jspecify.annotations.NullMarked package org.hibernate.processor.annotation; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/Metamodel.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/Metamodel.java index 6a19f2ab4928..a6420486dead 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/Metamodel.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/Metamodel.java @@ -4,7 +4,7 @@ */ package org.hibernate.processor.model; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; import org.hibernate.processor.Context; import java.util.List; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/package-info.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/package-info.java index 731671b84a9e..9aa54da956cc 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/package-info.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/model/package-info.java @@ -2,4 +2,5 @@ * SPDX-License-Identifier: Apache-2.0 * Copyright Red Hat Inc. and Hibernate Authors */ +@org.jspecify.annotations.NullMarked package org.hibernate.processor.model; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/package-info.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/package-info.java index 18d4ab4819ea..c6b1a11642c4 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/package-info.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/package-info.java @@ -6,4 +6,5 @@ * The main package of this annotation processor. * The actual processor class is {@link org.hibernate.processor.HibernateProcessor}. */ +@org.jspecify.annotations.NullMarked package org.hibernate.processor; diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/AccessTypeInformation.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/AccessTypeInformation.java index 40748c39727d..d9b74ee82666 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/AccessTypeInformation.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/AccessTypeInformation.java @@ -5,7 +5,7 @@ package org.hibernate.processor.util; import jakarta.persistence.AccessType; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * Encapsulates the access type information for a single class. diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/FileTimeStampChecker.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/FileTimeStampChecker.java index 68c723826018..98e2334270e1 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/FileTimeStampChecker.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/FileTimeStampChecker.java @@ -8,7 +8,7 @@ import java.util.HashMap; import java.util.Map; -import org.checkerframework.checker.nullness.qual.Nullable; +import org.jspecify.annotations.Nullable; /** * @author Hardy Ferentschik diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/NullnessUtil.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/NullnessUtil.java index 3cadd5b5488c..9b9f3d9c001c 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/NullnessUtil.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/NullnessUtil.java @@ -4,10 +4,9 @@ */ package org.hibernate.processor.util; -import org.checkerframework.checker.nullness.qual.EnsuresNonNull; -import org.checkerframework.checker.nullness.qual.NonNull; -import org.checkerframework.checker.nullness.qual.Nullable; -import org.checkerframework.framework.qual.AnnotatedFor; +import org.jspecify.annotations.Nullable; + +import static java.util.Objects.requireNonNull; /** * Utility class for the Nullness Checker. @@ -23,11 +22,6 @@ *
Runtime Dependency: If you use this class, you must distribute (or link to) {@code
* checker-qual.jar}, along with your binaries. Or, you can copy this class into your own project.
*/
-@SuppressWarnings({
- "nullness", // Nullness utilities are trusted regarding nullness.
- "cast" // Casts look redundant if Nullness Checker is not run.
-})
-@AnnotatedFor("nullness")
public final class NullnessUtil {
private NullnessUtil() {
@@ -70,10 +64,8 @@ private NullnessUtil() {
*
* @return the argument, cast to have the type qualifier @NonNull
*/
- @EnsuresNonNull("#1")
- public static