From 6eaee56a9e77dfed1237d07e6dc3959a35c9ce86 Mon Sep 17 00:00:00 2001 From: Jonathing Date: Sun, 7 Dec 2025 22:28:58 -0500 Subject: [PATCH] Use JSpecify nulls over JetBrains --- build.gradle | 6 +++++- settings.gradle | 2 +- .../gradle/internal/ClosureOwnerInternal.java | 2 +- .../gradle/internal/ForgeGradleFlowAction.java | 2 +- .../gradle/internal/ForgeGradlePlugin.java | 2 +- .../internal/MinecraftDependencyImpl.java | 17 ++++++++++------- .../internal/MinecraftDependencyInternal.java | 8 +++++--- .../MinecraftMappingsContainerInternal.java | 5 +++-- .../gradle/internal/OperatingSystemName.java | 2 +- .../gradle/internal/SlimeLauncherExec.java | 6 ++---- .../minecraftforge/gradle/internal/Util.java | 5 ++--- .../gradle/internal/package-info.java | 4 ++-- .../net/minecraftforge/gradle/package-info.java | 4 ++-- 13 files changed, 36 insertions(+), 29 deletions(-) diff --git a/build.gradle b/build.gradle index d8b25a312..1d1bff527 100644 --- a/build.gradle +++ b/build.gradle @@ -30,7 +30,7 @@ gradleutils.pluginDevDefaults(configurations, libs.versions.gradle) dependencies { // Static Analysis - compileOnly libs.nulls + api libs.annotations.jspecify // Gradle API compileOnly libs.gradle @@ -59,6 +59,10 @@ tasks.named('shadowJar', ShadowJar) { enableAutoRelocation = true archiveClassifier = null relocationPrefix = 'net.minecraftforge.gradle.shadow' + + dependencies { + exclude dependency(libs.annotations.jspecify) + } } tasks.withType(Javadoc).configureEach { diff --git a/settings.gradle b/settings.gradle index 32349032d..75319c644 100644 --- a/settings.gradle +++ b/settings.gradle @@ -30,7 +30,7 @@ dependencyResolutionManagement.versionCatalogs.register('libs') { plugin 'shadow', 'com.gradleup.shadow' version '9.3.0' // https://plugins.gradle.org/plugin/com.gradleup.shadow // Static Analysis - library 'nulls', 'org.jetbrains', 'annotations' version '26.0.2-1' + library 'annotations-jspecify', 'org.jspecify', 'jspecify' version '1.0.0' // Gradle API // Original: https://github.com/remal-gradle-api/packages/packages/760197?version=9.0.0 diff --git a/src/main/java/net/minecraftforge/gradle/internal/ClosureOwnerInternal.java b/src/main/java/net/minecraftforge/gradle/internal/ClosureOwnerInternal.java index 4eeea5f7f..a32a7e8d7 100644 --- a/src/main/java/net/minecraftforge/gradle/internal/ClosureOwnerInternal.java +++ b/src/main/java/net/minecraftforge/gradle/internal/ClosureOwnerInternal.java @@ -26,7 +26,7 @@ import org.gradle.api.file.RegularFileProperty; import org.gradle.api.reflect.HasPublicType; import org.gradle.api.reflect.TypeOf; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Map; diff --git a/src/main/java/net/minecraftforge/gradle/internal/ForgeGradleFlowAction.java b/src/main/java/net/minecraftforge/gradle/internal/ForgeGradleFlowAction.java index 7cbae1e52..be438c498 100644 --- a/src/main/java/net/minecraftforge/gradle/internal/ForgeGradleFlowAction.java +++ b/src/main/java/net/minecraftforge/gradle/internal/ForgeGradleFlowAction.java @@ -9,7 +9,7 @@ import org.gradle.api.file.DirectoryProperty; import org.gradle.api.provider.Property; import org.gradle.api.provider.SetProperty; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import javax.inject.Inject; import java.io.File; diff --git a/src/main/java/net/minecraftforge/gradle/internal/ForgeGradlePlugin.java b/src/main/java/net/minecraftforge/gradle/internal/ForgeGradlePlugin.java index 11dfb2ebf..4888e35e7 100644 --- a/src/main/java/net/minecraftforge/gradle/internal/ForgeGradlePlugin.java +++ b/src/main/java/net/minecraftforge/gradle/internal/ForgeGradlePlugin.java @@ -11,7 +11,7 @@ import org.gradle.api.logging.Logger; import org.gradle.api.logging.Logging; import org.gradle.api.plugins.ExtensionAware; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import javax.inject.Inject; import java.util.function.Consumer; diff --git a/src/main/java/net/minecraftforge/gradle/internal/MinecraftDependencyImpl.java b/src/main/java/net/minecraftforge/gradle/internal/MinecraftDependencyImpl.java index 9e48c7707..51352b140 100644 --- a/src/main/java/net/minecraftforge/gradle/internal/MinecraftDependencyImpl.java +++ b/src/main/java/net/minecraftforge/gradle/internal/MinecraftDependencyImpl.java @@ -37,7 +37,7 @@ import org.gradle.api.provider.ProviderFactory; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.TaskProvider; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import javax.inject.Inject; import java.io.File; @@ -45,8 +45,9 @@ import java.util.Set; abstract class MinecraftDependencyImpl implements MinecraftDependencyInternal { - private transient @Nullable("configuration cache") ExternalModuleDependency delegate; - private transient @Nullable("configuration cache") TaskProvider mavenizer; + // These can be nullable due to configuration caching. + private transient @Nullable ExternalModuleDependency delegate; + private transient @Nullable TaskProvider mavenizer; final Property asString = getObjects().property(String.class); final Property asPath = getObjects().property(String.class); @@ -79,13 +80,15 @@ public MinecraftDependencyImpl(Provider mavenizerOutput) { ); } + // Can be nullable due to configuration caching. @Override - public @Nullable("configuration cache") ExternalModuleDependency asDependency() { + public @Nullable ExternalModuleDependency asDependency() { return this.delegate; } + // Can be nullable due to configuration caching. @Override - public @Nullable("configuration cache") TaskProvider asTask() { + public @Nullable TaskProvider asTask() { return this.mavenizer; } @@ -258,12 +261,12 @@ private Attribute registerTransform() { spec.getFrom() .attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.JAR_TYPE) - .attribute(Category.CATEGORY_ATTRIBUTE, this.getObjects().named(Category.class, Category.LIBRARY)) + .attribute(Category.CATEGORY_ATTRIBUTE, spec.getFrom().named(Category.class, Category.LIBRARY)) .attribute(attribute, false); spec.getTo() .attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.JAR_TYPE) - .attribute(Category.CATEGORY_ATTRIBUTE, this.getObjects().named(Category.class, Category.LIBRARY)) + .attribute(Category.CATEGORY_ATTRIBUTE, spec.getTo().named(Category.class, Category.LIBRARY)) .attribute(attribute, true); }); diff --git a/src/main/java/net/minecraftforge/gradle/internal/MinecraftDependencyInternal.java b/src/main/java/net/minecraftforge/gradle/internal/MinecraftDependencyInternal.java index 7c5969dc7..467e600a7 100644 --- a/src/main/java/net/minecraftforge/gradle/internal/MinecraftDependencyInternal.java +++ b/src/main/java/net/minecraftforge/gradle/internal/MinecraftDependencyInternal.java @@ -17,7 +17,7 @@ import org.gradle.api.reflect.TypeOf; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.TaskProvider; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; interface MinecraftDependencyInternal extends MinecraftDependency, HasPublicType, MinecraftMappingsContainerInternal { String MC_EXT_NAME = "__fg_minecraft_dependency"; @@ -46,9 +46,11 @@ static boolean is(Dependency dependency) { ExternalModuleDependency init(Object dependencyNotation, Closure closure); - @Nullable("configuration cache") ExternalModuleDependency asDependency(); + // Can be nullable due to configuration caching. + @Nullable ExternalModuleDependency asDependency(); - @Nullable("configuration cache") TaskProvider asTask(); + // Can be nullable due to configuration caching. + @Nullable TaskProvider asTask(); Action addAttributes(); diff --git a/src/main/java/net/minecraftforge/gradle/internal/MinecraftMappingsContainerInternal.java b/src/main/java/net/minecraftforge/gradle/internal/MinecraftMappingsContainerInternal.java index 989c69d68..77ffa7c8d 100644 --- a/src/main/java/net/minecraftforge/gradle/internal/MinecraftMappingsContainerInternal.java +++ b/src/main/java/net/minecraftforge/gradle/internal/MinecraftMappingsContainerInternal.java @@ -7,14 +7,15 @@ import groovy.transform.NamedParam; import groovy.transform.NamedParams; import net.minecraftforge.gradle.MinecraftMappingsContainer; -import org.jetbrains.annotations.UnknownNullability; +import org.jspecify.annotations.NullUnmarked; import java.util.Map; interface MinecraftMappingsContainerInternal extends MinecraftMappingsContainer { // NOTE: Overridden with @UnknownNullability, null is checked in MinecraftMappingsImpl @Override - void mappings(@UnknownNullability String channel, @UnknownNullability String version); + @NullUnmarked + void mappings(String channel, String version); @Override default void mappings( diff --git a/src/main/java/net/minecraftforge/gradle/internal/OperatingSystemName.java b/src/main/java/net/minecraftforge/gradle/internal/OperatingSystemName.java index 94c1451b0..d35c9dcf8 100644 --- a/src/main/java/net/minecraftforge/gradle/internal/OperatingSystemName.java +++ b/src/main/java/net/minecraftforge/gradle/internal/OperatingSystemName.java @@ -8,7 +8,7 @@ import org.gradle.api.provider.SetProperty; import org.gradle.api.provider.ValueSource; import org.gradle.api.provider.ValueSourceParameters; -import org.jetbrains.annotations.Nullable; +import org.jspecify.annotations.Nullable; import javax.inject.Inject; diff --git a/src/main/java/net/minecraftforge/gradle/internal/SlimeLauncherExec.java b/src/main/java/net/minecraftforge/gradle/internal/SlimeLauncherExec.java index e244933cc..862371d57 100644 --- a/src/main/java/net/minecraftforge/gradle/internal/SlimeLauncherExec.java +++ b/src/main/java/net/minecraftforge/gradle/internal/SlimeLauncherExec.java @@ -50,13 +50,11 @@ static TaskProvider register(Project project, SourceSet sourc try { t = project.getTasks().named(taskName, SlimeLauncherMetadata.class); } catch (UnknownDomainObjectException e) { - var metadataDep = project.getDependencyFactory().create(module.getGroup(), module.getName(), version, "metadata", "zip"); - var metadataAttr = project.getObjects().named(Usage.class, "metadata"); var metadataConfiguration = project.getConfigurations().detachedConfiguration( - metadataDep + project.getDependencyFactory().create(module.getGroup(), module.getName(), version, "metadata", "zip") ); metadataConfiguration.setTransitive(false); - metadataConfiguration.attributes(a -> a.attribute(Usage.USAGE_ATTRIBUTE, metadataAttr)); + metadataConfiguration.attributes(a -> a.attribute(Usage.USAGE_ATTRIBUTE, a.named(Usage.class, "metadata"))); t = project.getTasks().register(taskName, SlimeLauncherMetadata.class, task -> { task.setDescription("Extracts the Slime Launcher metadata%s.".formatted(single ? "" : " for '%s'".formatted(asString))); diff --git a/src/main/java/net/minecraftforge/gradle/internal/Util.java b/src/main/java/net/minecraftforge/gradle/internal/Util.java index 0cde403c7..9001cb167 100644 --- a/src/main/java/net/minecraftforge/gradle/internal/Util.java +++ b/src/main/java/net/minecraftforge/gradle/internal/Util.java @@ -12,14 +12,13 @@ import org.gradle.api.artifacts.ModuleIdentifier; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.SourceSetContainer; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.UnknownNullability; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; final class Util extends SharedUtil { - static String checkMappingsParam(ForgeGradleProblems problems, @UnknownNullability Object param, String name) { + static String checkMappingsParam(ForgeGradleProblems problems, @Nullable Object param, String name) { if (param == null) throw problems.nullMappingsParam(name); diff --git a/src/main/java/net/minecraftforge/gradle/internal/package-info.java b/src/main/java/net/minecraftforge/gradle/internal/package-info.java index 822038a28..cd1445c12 100644 --- a/src/main/java/net/minecraftforge/gradle/internal/package-info.java +++ b/src/main/java/net/minecraftforge/gradle/internal/package-info.java @@ -2,7 +2,7 @@ * Copyright (c) Forge Development LLC and contributors * SPDX-License-Identifier: LGPL-2.1-only */ -@NotNullByDefault +@NullMarked package net.minecraftforge.gradle.internal; -import org.jetbrains.annotations.NotNullByDefault; +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/net/minecraftforge/gradle/package-info.java b/src/main/java/net/minecraftforge/gradle/package-info.java index 15c436044..6cdc634e6 100644 --- a/src/main/java/net/minecraftforge/gradle/package-info.java +++ b/src/main/java/net/minecraftforge/gradle/package-info.java @@ -7,8 +7,8 @@ /// This package houses the entirety of ForgeGradle, a simple plugin designed to bootstrap the process of using /// Minecraft as a dependency for your Gradle project. @Incubating -@NotNullByDefault +@NullMarked package net.minecraftforge.gradle; import org.gradle.api.Incubating; -import org.jetbrains.annotations.NotNullByDefault; +import org.jspecify.annotations.NullMarked;