diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dd1e3ceb0d98..16bb91733581 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -32,7 +32,9 @@ bndlib = { module = "biz.aQute.bnd:biz.aQute.bndlib", version.ref = "bnd" } checkstyle = { module = "com.puppycrawl.tools:checkstyle", version.ref = "checkstyle" } classgraph = { module = "io.github.classgraph:classgraph", version = "4.8.181" } commons-io = { module = "commons-io:commons-io", version = "2.20.0" } -errorProne-core = { module = "com.google.errorprone:error_prone_core", version = "2.42.0" } +error-prone-core = { module = "com.google.errorprone:error_prone_core", version = "2.42.0" } +error-prone-contrib = { module = "tech.picnic.error-prone-support:error-prone-contrib", version = "0.25.0" } +refaster-runner = { module = "tech.picnic.error-prone-support:refaster-runner", version = "0.25.0" } fastcsv = { module = "de.siegmar:fastcsv", version = "4.0.0" } groovy = { module = "org.apache.groovy:groovy", version = "5.0.1" } groovy2-bom = { module = "org.codehaus.groovy:groovy-bom", version = "2.5.23" } diff --git a/gradle/plugins/common/src/main/kotlin/junitbuild.java-nullability-conventions.gradle.kts b/gradle/plugins/common/src/main/kotlin/junitbuild.java-nullability-conventions.gradle.kts index 2bef782b14ed..dc99893c12e7 100644 --- a/gradle/plugins/common/src/main/kotlin/junitbuild.java-nullability-conventions.gradle.kts +++ b/gradle/plugins/common/src/main/kotlin/junitbuild.java-nullability-conventions.gradle.kts @@ -1,6 +1,7 @@ import junitbuild.extensions.dependencyFromLibs import net.ltgt.gradle.errorprone.errorprone import net.ltgt.gradle.nullaway.nullaway +import java.lang.System.getenv plugins { `java-library` @@ -9,61 +10,63 @@ plugins { } dependencies { - errorprone(dependencyFromLibs("errorProne-core")) + errorprone(dependencyFromLibs("error-prone-contrib")) + errorprone(dependencyFromLibs("error-prone-core")) errorprone(dependencyFromLibs("nullaway")) - constraints { - errorprone("com.google.guava:guava") { - version { - require("33.4.8-jre") - } - because("Older versions use deprecated methods in sun.misc.Unsafe") - } - } -} - -nullaway { - onlyNullMarked = true + errorprone(dependencyFromLibs("refaster-runner")) } tasks.withType().configureEach { options.errorprone { - val shouldDisableErrorProne = java.toolchain.implementation.orNull == JvmImplementation.J9 - if (name == "compileJava" && !shouldDisableErrorProne) { + disableWarningsInGeneratedCode = true + allErrorsAsWarnings = true + disableAllChecks = !(name == "compileJava" && java.toolchain.implementation.orNull != JvmImplementation.J9) + if (!disableAllChecks.get()) { + errorproneArgs.add("-XepOpt:Refaster:NamePattern=^(?!.*Rules\\$).*") // currently failing Refaster; might consider whitelist. disable( - - // This check is opinionated wrt. which method names it considers unsuitable for import which includes - // a few of our own methods in `ReflectionUtils` etc. - "BadImport", - - // The findings of this check are subjective because a named constant can be more readable in many cases - "UnnecessaryLambda", - - // Resolving findings for these checks requires ErrorProne's annotations which we don't want to use - "AnnotateFormatMethod", + "AnnotateFormatMethod", // We don`t want to use ErrorProne`s annotations. + "BadImport", // This check is opinionated wrt. which method names it considers unsuitable for import which includes a few of our own methods in `ReflectionUtils` etc. + "DirectReturn", // https://github.com/junit-team/junit-framework/pull/5006#discussion_r2403984446 "DoNotCallSuggester", - "InlineMeSuggester", "ImmutableEnumChecker", - - // Resolving findings for this check requires using Guava which we don't want to use - "StringSplitter", - - // Produces a lot of findings that we consider to be false positives, for example for package-private - // classes and methods - "MissingSummary", + "InlineMeSuggester", + "MissingSummary", // Produces a lot of findings that we consider to be false positives, for example for package-private classes and methods. + "StringSplitter", // We don`t want to use Guava. + "UnnecessaryLambda", // The findings of this check are subjective because a named constant can be more readable in many cases. + // picnic + "ConstantNaming", + "FormatStringConcatenation", + "IdentityConversion", + "LexicographicalAnnotationAttributeListing", + "LexicographicalAnnotationListing", + "MissingTestCall", + "NestedOptionals", + "StaticImport", + "NonStaticImport", + "OptionalOrElseGet", + "PrimitiveComparison", + "TimeZoneUsage", + ) + error( + "PackageLocation", + "PrimitiveComparison", + "RedundantStringConversion", + "RedundantStringEscape", + "RequestMappingAnnotation", ) - error("PackageLocation") - } else { - disableAllChecks = true + // introduce new check by activating once: + // errorproneArgs.addAll("-XepPatchLocation:IN_PLACE","-XepPatchChecks:StaticImport") } nullaway { - if (shouldDisableErrorProne) { + if (disableAllChecks.get()) { disable() } else { enable() } - isJSpecifyMode = true - customContractAnnotations.add("org.junit.platform.commons.annotation.Contract") checkContracts = true + customContractAnnotations.add("org.junit.platform.commons.annotation.Contract") + isJSpecifyMode = true + onlyNullMarked = true suppressionNameAliases.add("DataFlowIssue") } } diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/PreInterruptThreadDumpPrinter.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/PreInterruptThreadDumpPrinter.java index 283710eb1f1e..94147129d87b 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/PreInterruptThreadDumpPrinter.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/extension/PreInterruptThreadDumpPrinter.java @@ -49,7 +49,7 @@ public void beforeThreadInterrupt(PreInterruptContext preInterruptContext, Exten sb.append(NL); // Use the same prefix as java.lang.Throwable.printStackTrace(PrintStreamOrWriter) sb.append("\tat "); - sb.append(stackTraceElement.toString()); + sb.append(stackTraceElement); } sb.append(NL); }