diff --git a/build.gradle b/build.gradle index a4aae3767d3f..c661531e733f 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ 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.55' + id 'org.checkerframework' version '0.6.56' id 'org.hibernate.orm.build.jdks' id 'io.github.gradle-nexus.publish-plugin' version '2.0.0' diff --git a/checkerstubs/jboss.logging.astub b/checkerstubs/jboss.logging.astub index d3bc6a062670..c7a114536fab 100644 --- a/checkerstubs/jboss.logging.astub +++ b/checkerstubs/jboss.logging.astub @@ -10,4 +10,5 @@ public interface BasicLogger { public interface Logger { void tracev(String format, @Nullable Object param1); + void tracef(String format, @Nullable Object param1); } \ No newline at end of file diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/EffectiveEntityGraph.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/EffectiveEntityGraph.java index 2ece41266eb9..851bdccd9480 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/spi/EffectiveEntityGraph.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/EffectiveEntityGraph.java @@ -120,20 +120,18 @@ public void applyConfiguredGraph(@Nullable Map properties) { loadHint = (RootGraphImplementor) properties.get( GraphSemantic.LOAD.getJakartaHintName() ); } - if ( fetchHint != null || loadHint != null ) { - if ( fetchHint != null ) { - if ( loadHint != null ) { - // can't have both - throw new IllegalArgumentException( - "Passed properties contained both a LOAD and a FETCH graph which is illegal - " + - "only one should be passed" - ); - } - applyGraph( fetchHint, GraphSemantic.FETCH ); - } - else { - applyGraph( loadHint, GraphSemantic.LOAD ); + if ( fetchHint != null ) { + if ( loadHint != null ) { + // can't have both + throw new IllegalArgumentException( + "Passed properties contained both a LOAD and a FETCH graph which is illegal - " + + "only one should be passed" + ); } + applyGraph( fetchHint, GraphSemantic.FETCH ); + } + else if ( loadHint != null ) { + applyGraph( loadHint, GraphSemantic.LOAD ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/FakeSqmToSqlAstConverter.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/FakeSqmToSqlAstConverter.java index b8be07c7d122..d3bde5082114 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/FakeSqmToSqlAstConverter.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/FakeSqmToSqlAstConverter.java @@ -29,7 +29,7 @@ import org.hibernate.sql.ast.tree.expression.QueryTransformer; import org.hibernate.sql.ast.tree.predicate.Predicate; -import jakarta.annotation.Nullable; +import org.checkerframework.checker.nullness.qual.Nullable; /** * 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 80a99863d398..8e79bb839212 100644 --- a/local-build-plugins/src/main/groovy/local.code-quality.gradle +++ b/local-build-plugins/src/main/groovy/local.code-quality.gradle @@ -105,9 +105,15 @@ spotless { tasks.compileJava.dependsOn tasks.spotlessJavaApply +dependencies { + compileOnly libs.checkerFramework + testCompileOnly libs.checkerFramework + checkerFramework libs.checkerFrameworkChecker +} + checkerFramework { excludeTests = true - skipCheckerFramework = true + skipCheckerFramework = !gradle.startParameter.taskNames.contains("ciCheck") checkers = [ 'org.checkerframework.checker.nullness.NullnessChecker' ] diff --git a/settings.gradle b/settings.gradle index 8031e0cfd582..1abc0067f4e8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -77,6 +77,7 @@ dependencyResolutionManagement { // WARNING: When upgrading to a version of bytebuddy that supports a new bytecode version, // make sure to remove the now unnecessary net.bytebuddy.experimental=true in relevant CI jobs (Jenkinsfile). def byteBuddyVersion = version "byteBuddy", "1.17.6" + def checkerFrameworkVersion = version "checkerFramework", "3.49.5" def classmateVersion = version "classmate", "1.7.0" def geolatteVersion = version "geolatte", "1.10" def hibernateModelsVersion = version "hibernateModels", "1.0.1" @@ -102,6 +103,9 @@ dependencyResolutionManagement { library( "byteBuddy", "net.bytebuddy", "byte-buddy" ).versionRef( byteBuddyVersion ) library( "byteBuddyAgent", "net.bytebuddy", "byte-buddy-agent" ).versionRef( byteBuddyVersion ) + library( "checkerFramework", "org.checkerframework", "checker-qual-android" ).versionRef( checkerFrameworkVersion ) + library( "checkerFrameworkChecker", "org.checkerframework", "checker" ).versionRef( checkerFrameworkVersion ) + library( "logging", "org.jboss.logging", "jboss-logging" ).versionRef( jbossLoggingVersion ) library( "loggingAnnotations", "org.jboss.logging", "jboss-logging-annotations" ).versionRef( jbossLoggingToolVersion ) library( "loggingProcessor", "org.jboss.logging", "jboss-logging-processor" ).versionRef( jbossLoggingToolVersion ) diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeUtils.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeUtils.java index a97a3061bc24..ef4117f5b65d 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeUtils.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/TypeUtils.java @@ -784,12 +784,12 @@ public static boolean isPrimitive(String paramType) { public static final Set PRIMITIVE_TYPES = Set.of("boolean", "char", "long", "int", "short", "byte", "double", "float"); - public static TypeMirror resolveTypeMirror(TypeElement typeElement, Element element, String name) { + public static @Nullable TypeMirror resolveTypeMirror(TypeElement typeElement, Element element, String name) { final var mirrorMap = resolveTypeParameters( typeElement.asType(), element, Map.of(), new HashSet<>() ); return mirrorMap == null ? null : mirrorMap.get( name ); } - private static Map resolveTypeParameters(TypeMirror type, Element element, Map parametersMap, Collection visited) { + private static @Nullable Map resolveTypeParameters(TypeMirror type, Element element, Map parametersMap, Collection visited) { if ( !(type instanceof DeclaredType declaredType && declaredType.asElement() instanceof TypeElement typeElement) ) { return null;