Skip to content

Commit ef7581e

Browse files
authored
Use JSpecify annotations (#1010)
This effectively replaces the usage of JetBrains annotations. Settings aside Java library politics, Gradle itself is using JSpecify nullability annotations,. It is just better for consistency this way.
1 parent 17c24d0 commit ef7581e

13 files changed

+36
-29
lines changed

build.gradle

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ gradleutils.pluginDevDefaults(configurations, libs.versions.gradle)
3030

3131
dependencies {
3232
// Static Analysis
33-
compileOnly libs.nulls
33+
api libs.annotations.jspecify
3434

3535
// Gradle API
3636
compileOnly libs.gradle
@@ -59,6 +59,10 @@ tasks.named('shadowJar', ShadowJar) {
5959
enableAutoRelocation = true
6060
archiveClassifier = null
6161
relocationPrefix = 'net.minecraftforge.gradle.shadow'
62+
63+
dependencies {
64+
exclude dependency(libs.annotations.jspecify)
65+
}
6266
}
6367

6468
tasks.withType(Javadoc).configureEach {

settings.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ dependencyResolutionManagement.versionCatalogs.register('libs') {
3030
plugin 'shadow', 'com.gradleup.shadow' version '9.3.0' // https://plugins.gradle.org/plugin/com.gradleup.shadow
3131

3232
// Static Analysis
33-
library 'nulls', 'org.jetbrains', 'annotations' version '26.0.2-1'
33+
library 'annotations-jspecify', 'org.jspecify', 'jspecify' version '1.0.0'
3434

3535
// Gradle API
3636
// Original: https://github.com/remal-gradle-api/packages/packages/760197?version=9.0.0

src/main/java/net/minecraftforge/gradle/internal/ClosureOwnerInternal.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import org.gradle.api.file.RegularFileProperty;
2727
import org.gradle.api.reflect.HasPublicType;
2828
import org.gradle.api.reflect.TypeOf;
29-
import org.jetbrains.annotations.Nullable;
29+
import org.jspecify.annotations.Nullable;
3030

3131
import java.util.List;
3232
import java.util.Map;

src/main/java/net/minecraftforge/gradle/internal/ForgeGradleFlowAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import org.gradle.api.file.DirectoryProperty;
1010
import org.gradle.api.provider.Property;
1111
import org.gradle.api.provider.SetProperty;
12-
import org.jetbrains.annotations.Nullable;
12+
import org.jspecify.annotations.Nullable;
1313

1414
import javax.inject.Inject;
1515
import java.io.File;

src/main/java/net/minecraftforge/gradle/internal/ForgeGradlePlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import org.gradle.api.logging.Logger;
1212
import org.gradle.api.logging.Logging;
1313
import org.gradle.api.plugins.ExtensionAware;
14-
import org.jetbrains.annotations.Nullable;
14+
import org.jspecify.annotations.Nullable;
1515

1616
import javax.inject.Inject;
1717
import java.util.function.Consumer;

src/main/java/net/minecraftforge/gradle/internal/MinecraftDependencyImpl.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,16 +37,17 @@
3737
import org.gradle.api.provider.ProviderFactory;
3838
import org.gradle.api.tasks.SourceSet;
3939
import org.gradle.api.tasks.TaskProvider;
40-
import org.jetbrains.annotations.Nullable;
40+
import org.jspecify.annotations.Nullable;
4141

4242
import javax.inject.Inject;
4343
import java.io.File;
4444
import java.util.Objects;
4545
import java.util.Set;
4646

4747
abstract class MinecraftDependencyImpl implements MinecraftDependencyInternal {
48-
private transient @Nullable("configuration cache") ExternalModuleDependency delegate;
49-
private transient @Nullable("configuration cache") TaskProvider<SyncMavenizer> mavenizer;
48+
// These can be nullable due to configuration caching.
49+
private transient @Nullable ExternalModuleDependency delegate;
50+
private transient @Nullable TaskProvider<SyncMavenizer> mavenizer;
5051

5152
final Property<String> asString = getObjects().property(String.class);
5253
final Property<String> asPath = getObjects().property(String.class);
@@ -79,13 +80,15 @@ public MinecraftDependencyImpl(Provider<? extends Directory> mavenizerOutput) {
7980
);
8081
}
8182

83+
// Can be nullable due to configuration caching.
8284
@Override
83-
public @Nullable("configuration cache") ExternalModuleDependency asDependency() {
85+
public @Nullable ExternalModuleDependency asDependency() {
8486
return this.delegate;
8587
}
8688

89+
// Can be nullable due to configuration caching.
8790
@Override
88-
public @Nullable("configuration cache") TaskProvider<SyncMavenizer> asTask() {
91+
public @Nullable TaskProvider<SyncMavenizer> asTask() {
8992
return this.mavenizer;
9093
}
9194

@@ -258,12 +261,12 @@ private Attribute<Boolean> registerTransform() {
258261

259262
spec.getFrom()
260263
.attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.JAR_TYPE)
261-
.attribute(Category.CATEGORY_ATTRIBUTE, this.getObjects().named(Category.class, Category.LIBRARY))
264+
.attribute(Category.CATEGORY_ATTRIBUTE, spec.getFrom().named(Category.class, Category.LIBRARY))
262265
.attribute(attribute, false);
263266

264267
spec.getTo()
265268
.attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.JAR_TYPE)
266-
.attribute(Category.CATEGORY_ATTRIBUTE, this.getObjects().named(Category.class, Category.LIBRARY))
269+
.attribute(Category.CATEGORY_ATTRIBUTE, spec.getTo().named(Category.class, Category.LIBRARY))
267270
.attribute(attribute, true);
268271
});
269272

src/main/java/net/minecraftforge/gradle/internal/MinecraftDependencyInternal.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import org.gradle.api.reflect.TypeOf;
1818
import org.gradle.api.tasks.SourceSet;
1919
import org.gradle.api.tasks.TaskProvider;
20-
import org.jetbrains.annotations.Nullable;
20+
import org.jspecify.annotations.Nullable;
2121

2222
interface MinecraftDependencyInternal extends MinecraftDependency, HasPublicType, MinecraftMappingsContainerInternal {
2323
String MC_EXT_NAME = "__fg_minecraft_dependency";
@@ -46,9 +46,11 @@ static boolean is(Dependency dependency) {
4646

4747
ExternalModuleDependency init(Object dependencyNotation, Closure<?> closure);
4848

49-
@Nullable("configuration cache") ExternalModuleDependency asDependency();
49+
// Can be nullable due to configuration caching.
50+
@Nullable ExternalModuleDependency asDependency();
5051

51-
@Nullable("configuration cache") TaskProvider<SyncMavenizer> asTask();
52+
// Can be nullable due to configuration caching.
53+
@Nullable TaskProvider<SyncMavenizer> asTask();
5254

5355
Action<? super AttributeContainer> addAttributes();
5456

src/main/java/net/minecraftforge/gradle/internal/MinecraftMappingsContainerInternal.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@
77
import groovy.transform.NamedParam;
88
import groovy.transform.NamedParams;
99
import net.minecraftforge.gradle.MinecraftMappingsContainer;
10-
import org.jetbrains.annotations.UnknownNullability;
10+
import org.jspecify.annotations.NullUnmarked;
1111

1212
import java.util.Map;
1313

1414
interface MinecraftMappingsContainerInternal extends MinecraftMappingsContainer {
1515
// NOTE: Overridden with @UnknownNullability, null is checked in MinecraftMappingsImpl
1616
@Override
17-
void mappings(@UnknownNullability String channel, @UnknownNullability String version);
17+
@NullUnmarked
18+
void mappings(String channel, String version);
1819

1920
@Override
2021
default void mappings(

src/main/java/net/minecraftforge/gradle/internal/OperatingSystemName.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import org.gradle.api.provider.SetProperty;
99
import org.gradle.api.provider.ValueSource;
1010
import org.gradle.api.provider.ValueSourceParameters;
11-
import org.jetbrains.annotations.Nullable;
11+
import org.jspecify.annotations.Nullable;
1212

1313
import javax.inject.Inject;
1414

src/main/java/net/minecraftforge/gradle/internal/SlimeLauncherExec.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,11 @@ static TaskProvider<SlimeLauncherExec> register(Project project, SourceSet sourc
5050
try {
5151
t = project.getTasks().named(taskName, SlimeLauncherMetadata.class);
5252
} catch (UnknownDomainObjectException e) {
53-
var metadataDep = project.getDependencyFactory().create(module.getGroup(), module.getName(), version, "metadata", "zip");
54-
var metadataAttr = project.getObjects().named(Usage.class, "metadata");
5553
var metadataConfiguration = project.getConfigurations().detachedConfiguration(
56-
metadataDep
54+
project.getDependencyFactory().create(module.getGroup(), module.getName(), version, "metadata", "zip")
5755
);
5856
metadataConfiguration.setTransitive(false);
59-
metadataConfiguration.attributes(a -> a.attribute(Usage.USAGE_ATTRIBUTE, metadataAttr));
57+
metadataConfiguration.attributes(a -> a.attribute(Usage.USAGE_ATTRIBUTE, a.named(Usage.class, "metadata")));
6058

6159
t = project.getTasks().register(taskName, SlimeLauncherMetadata.class, task -> {
6260
task.setDescription("Extracts the Slime Launcher metadata%s.".formatted(single ? "" : " for '%s'".formatted(asString)));

0 commit comments

Comments
 (0)