Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ plugins {
id 'idea'
id 'eclipse'
id 'maven-publish'
alias libs.plugins.nullaway
alias libs.plugins.gradleutils
alias libs.plugins.gitversion
alias libs.plugins.changelog
Expand All @@ -30,7 +31,7 @@ gradleutils.pluginDevDefaults(configurations, libs.versions.gradle)

dependencies {
// Static Analysis
compileOnly libs.nulls
api libs.annotations.jspecify

// Gradle API
compileOnly libs.gradle
Expand Down Expand Up @@ -59,6 +60,10 @@ tasks.named('shadowJar', ShadowJar) {
enableAutoRelocation = true
archiveClassifier = null
relocationPrefix = 'net.minecraftforge.gradle.shadow'

dependencies {
exclude dependency(libs.annotations.jspecify)
}
}

tasks.withType(Javadoc).configureEach {
Expand Down
3 changes: 2 additions & 1 deletion settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ gradle.beforeProject { Project project ->
dependencyResolutionManagement.versionCatalogs.register('libs') {
version 'gradleutils', '3.3.39'

plugin 'nullaway', 'net.ltgt.errorprone' version '4.3.0' // https://plugins.gradle.org/plugin/net.ltgt.errorprone
plugin 'licenser', 'net.minecraftforge.licenser' version '1.2.0' // https://plugins.gradle.org/plugin/net.minecraftforge.licenser
plugin 'gradleutils', 'net.minecraftforge.gradleutils' versionRef 'gradleutils'
plugin 'gitversion', 'net.minecraftforge.gitversion' version '3.1.7' // https://plugins.gradle.org/plugin/net.minecraftforge.changelog
Expand All @@ -30,7 +31,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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,16 +37,17 @@
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;
import java.util.Objects;
import java.util.Set;

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

final Property<String> asString = getObjects().property(String.class);
final Property<String> asPath = getObjects().property(String.class);
Expand Down Expand Up @@ -79,13 +80,15 @@ public MinecraftDependencyImpl(Provider<? extends Directory> 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<SyncMavenizer> asTask() {
public @Nullable TaskProvider<SyncMavenizer> asTask() {
return this.mavenizer;
}

Expand Down Expand Up @@ -258,12 +261,12 @@ private Attribute<Boolean> 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);
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand Down Expand Up @@ -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<SyncMavenizer> asTask();
// Can be nullable due to configuration caching.
@Nullable TaskProvider<SyncMavenizer> asTask();

Action<? super AttributeContainer> addAttributes();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,11 @@ static TaskProvider<SlimeLauncherExec> 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)));
Expand Down
5 changes: 2 additions & 3 deletions src/main/java/net/minecraftforge/gradle/internal/Util.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
4 changes: 2 additions & 2 deletions src/main/java/net/minecraftforge/gradle/package-info.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;