Skip to content

Commit 6fd1d27

Browse files
committed
ATs work (fr) with FULL understanding this time
tl;dr the AT gradle plugin was due for some API changes
1 parent b7a39fb commit 6fd1d27

File tree

9 files changed

+111
-120
lines changed

9 files changed

+111
-120
lines changed

build.gradle

Lines changed: 5 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
2-
import com.github.jengelman.gradle.plugins.shadow.ShadowJavaPlugin
3-
import org.gradle.api.attributes.plugin.GradlePluginApiVersion
42

53
plugins {
64
id 'java-gradle-plugin'
@@ -16,32 +14,19 @@ plugins {
1614
alias libs.plugins.shadow
1715
}
1816

19-
final projectDisplayName = 'ForgeGradle'
17+
gradleutils.displayName = 'ForgeGradle'
2018
description = "Forge's Gradle plugin for Mod development"
2119
base.archivesName = 'forgegradle'
2220
group = 'net.minecraftforge'
2321
version = gitversion.tagOffset
2422

25-
println "Version: $version"
26-
2723
java {
28-
toolchain.languageVersion = JavaLanguageVersion.of 17
24+
toolchain.languageVersion = JavaLanguageVersion.of(17)
2925
withSourcesJar()
3026
withJavadocJar()
3127
}
3228

33-
configurations {
34-
// Applies the "Gradle Plugin API Version" attribute to configuration
35-
// This was added in Gradle 7, gives consumers useful errors if they are on an old version
36-
def applyGradleVersionAttribute = { Configuration configuration ->
37-
configuration.attributes {
38-
attribute(GradlePluginApiVersion.GRADLE_PLUGIN_API_VERSION_ATTRIBUTE, objects.named(GradlePluginApiVersion, libs.versions.gradle.get()))
39-
}
40-
}
41-
42-
named(JavaPlugin.RUNTIME_ELEMENTS_CONFIGURATION_NAME, applyGradleVersionAttribute)
43-
named(ShadowJavaPlugin.SHADOW_RUNTIME_ELEMENTS_CONFIGURATION_NAME, applyGradleVersionAttribute)
44-
}
29+
gradleutils.pluginDevDefaults(configurations, libs.versions.gradle)
4530

4631
dependencies {
4732
// Static Analysis
@@ -60,15 +45,6 @@ dependencies {
6045
implementation libs.bundles.utils
6146
}
6247

63-
// Removes local Gradle API from compileOnly. This is a workaround for bugged plugins.
64-
// Publish Plugin: https://github.com/gradle/plugin-portal-requests/issues/260
65-
// Shadow: https://github.com/GradleUp/shadow/pull/1422
66-
afterEvaluate { project ->
67-
project.configurations.named(JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME) { compileOnly ->
68-
compileOnly.dependencies.remove(project.dependencies.gradleApi())
69-
}
70-
}
71-
7248
license {
7349
header = rootProject.file('LICENSE-header.txt')
7450
newLine = false
@@ -87,11 +63,6 @@ tasks.named('shadowJar', ShadowJar) {
8763

8864
tasks.withType(Javadoc).configureEach {
8965
javadocTool = javaToolchains.javadocToolFor { languageVersion = JavaLanguageVersion.of(24) }
90-
91-
options { StandardJavadocDocletOptions options ->
92-
options.windowTitle = projectDisplayName + project.version
93-
options.tags 'apiNote:a:API Note:', 'implNote:a:Implementation Note:', 'implSpec:a:Implementation Requirements:'
94-
}
9566
}
9667

9768
changelog {
@@ -105,7 +76,7 @@ gradlePlugin {
10576
plugins.register('forgegradle') {
10677
id = 'net.minecraftforge.gradle'
10778
implementationClass = 'net.minecraftforge.gradle.ForgeGradlePlugin'
108-
displayName = projectDisplayName
79+
displayName = gradleutils.displayName.get()
10980
description = project.description
11081
tags = ['minecraftforge', 'minecraft']
11182
}
@@ -121,7 +92,7 @@ publishing {
12192
gradleutils.promote(it)
12293

12394
pom { pom ->
124-
name = projectDisplayName
95+
name = gradleutils.displayName
12596
description = project.description
12697

12798
gradleutils.pom.addRemoteDetails(pom)
@@ -136,6 +107,3 @@ publishing {
136107
}
137108
}
138109
}
139-
140-
idea.module { downloadSources = downloadJavadoc = true }
141-
eclipse.classpath { downloadSources = downloadJavadoc = true }

gradle.properties

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,9 @@ org.gradle.configuration-cache.parallel=true
77
org.gradle.configuration-cache.problems=warn
88

99
systemProp.org.gradle.unsafe.suppress-gradle-api=true
10+
11+
net.minecraftforge.gradleutils.publishing.use-base-archives-name=true
12+
net.minecraftforge.gradleutils.ide.automatic.sources=true
13+
net.minecraftforge.gradleutils.compilation.defaults=true
14+
15+
net.minecraftforge.gitversion.log.version=true

settings.gradle

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
plugins {
22
id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0'
33
id 'io.freefair.javadoc-links' version '8.14' apply false
4-
id 'net.minecraftforge.gradleutils' version '3.3.11'
4+
id 'net.minecraftforge.gradleutils' version '3.3.13'
55
}
66

77
rootProject.name = 'forgegradle'
@@ -33,15 +33,15 @@ dependencyResolutionManagement {
3333
library 'gradle', 'name.remal.gradle-api', 'gradle-api' versionRef 'gradle'
3434

3535
// GradleUtils Shared Base
36-
library 'gradleutils-shared', 'net.minecraftforge', 'gradleutils-shared' version '3.3.11'
36+
library 'gradleutils-shared', 'net.minecraftforge', 'gradleutils-shared' version '3.3.13'
3737

3838
// AccessTransformers Gradle Plugin
3939
// https://plugins.gradle.org/plugin/net.minecraftforge.accesstransformers
40-
library 'accesstransformers-gradle', 'net.minecraftforge.accesstransformers', 'net.minecraftforge.accesstransformers.gradle.plugin' version '5.0.0-beta.0'
40+
library 'accesstransformers-gradle', 'net.minecraftforge.accesstransformers', 'net.minecraftforge.accesstransformers.gradle.plugin' version '5.0.0-beta.8'
4141

42-
library 'utils-data', 'net.minecraftforge', 'json-data-utils' version '0.2.1' // https://files.minecraftforge.net/net/minecraftforge/json-data-utils/index.html
43-
library 'utils-hash', 'net.minecraftforge', 'hash-utils' version '0.1.9' // https://files.minecraftforge.net/net/minecraftforge/hash-utils/index.html
44-
library 'utils-download', 'net.minecraftforge', 'download-utils' version '0.3.2' // https://files.minecraftforge.net/net/minecraftforge/download-utils/index.html
42+
library 'utils-data', 'net.minecraftforge', 'json-data-utils' version '0.3.0' // https://files.minecraftforge.net/net/minecraftforge/json-data-utils/index.html
43+
library 'utils-hash', 'net.minecraftforge', 'hash-utils' version '0.1.10' // https://files.minecraftforge.net/net/minecraftforge/hash-utils/index.html
44+
library 'utils-download', 'net.minecraftforge', 'download-utils' version '0.3.2' // https://files.minecraftforge.net/net/minecraftforge/download-utils/index.html
4545
bundle 'utils', ['utils-data', 'utils-hash', 'utils-download']
4646
}
4747
//@formatter:on

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import groovy.transform.Generated;
99
import groovy.transform.NamedParam;
1010
import groovy.transform.NamedParams;
11+
import net.minecraftforge.accesstransformers.gradle.AccessTransformersConfiguration;
1112
import net.minecraftforge.accesstransformers.gradle.AccessTransformersContainer;
1213
import org.gradle.api.Action;
1314
import org.gradle.api.artifacts.DependencyArtifact;
@@ -250,11 +251,6 @@ default void setAccessTransformer(boolean accessTransformer) {
250251
this.getOwnerDelegate().setAccessTransformer(accessTransformer);
251252
}
252253

253-
@Override
254-
default void accessTransformer(Action<? super AccessTransformersContainer.Options> options) {
255-
this.getOwnerDelegate().accessTransformer(options);
256-
}
257-
258254
@Override
259255
default @Nullable MinecraftMappings getMappings() {
260256
return this.getOwnerDelegate().getMappings();

src/main/java/net/minecraftforge/gradle/ForgeGradleExtension.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,11 @@ public sealed interface ForgeGradleExtension permits ForgeGradleExtensionInterna
2626
* }
2727
* </code></pre>
2828
*
29-
* @see #forgeMaven
29+
* @return The closure
3030
*/
31-
Action<MavenArtifactRepository> forgeMaven = ForgeGradleExtensionInternal.forgeMaven;
31+
default Action<MavenArtifactRepository> getForgeMaven() {
32+
return ForgeGradleExtensionInternal.forgeMaven;
33+
}
3234

3335
/**
3436
* A closure for the Minecraft libraries maven to be passed into
@@ -40,6 +42,10 @@ public sealed interface ForgeGradleExtension permits ForgeGradleExtensionInterna
4042
* maven fg.minecraftLibsMaven
4143
* }
4244
* </code></pre>
45+
*
46+
* @return The closure
4347
*/
44-
Action<MavenArtifactRepository> minecraftLibsMaven = ForgeGradleExtensionInternal.minecraftLibsMaven;
48+
default Action<MavenArtifactRepository> getMinecraftLibsMaven() {
49+
return ForgeGradleExtensionInternal.minecraftLibsMaven;
50+
}
4551
}

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

Lines changed: 75 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,19 @@
88
import groovy.transform.NamedParam;
99
import groovy.transform.NamedParams;
1010
import groovy.transform.NamedVariant;
11-
import net.minecraftforge.accesstransformers.gradle.AccessTransformersContainer;
11+
import net.minecraftforge.accesstransformers.gradle.ArtifactAccessTransformer;
1212
import net.minecraftforge.gradleutils.shared.Closures;
1313
import org.gradle.api.Action;
14-
import org.gradle.api.InvalidUserDataException;
15-
import org.gradle.api.NamedDomainObjectProvider;
1614
import org.gradle.api.Project;
17-
import org.gradle.api.artifacts.Configuration;
1815
import org.gradle.api.artifacts.Dependency;
19-
import org.gradle.api.artifacts.DependencyScopeConfiguration;
2016
import org.gradle.api.artifacts.ExternalModuleDependency;
17+
import org.gradle.api.artifacts.type.ArtifactTypeDefinition;
2118
import org.gradle.api.attributes.Attribute;
19+
import org.gradle.api.attributes.AttributeContainer;
20+
import org.gradle.api.attributes.Category;
2221
import org.gradle.api.file.ProjectLayout;
23-
import org.gradle.api.file.RegularFile;
2422
import org.gradle.api.file.RegularFileProperty;
2523
import org.gradle.api.model.ObjectFactory;
26-
import org.gradle.api.plugins.ExtensionAware;
27-
import org.gradle.api.plugins.ExtraPropertiesExtension.UnknownPropertyException;
2824
import org.gradle.api.provider.Property;
2925
import org.gradle.api.provider.Provider;
3026
import org.gradle.api.provider.ProviderFactory;
@@ -36,9 +32,10 @@
3632
import javax.inject.Inject;
3733
import java.io.File;
3834
import java.util.Map;
35+
import java.util.Objects;
3936

4037
abstract class MinecraftDependencyImpl implements MinecraftDependencyInternal {
41-
private static final String AT_COUNT_NAME = "fg_minecraft_atcontainers";
38+
private static final String AT_COUNT_NAME = "__fg_minecraft_atcontainers";
4239

4340
private @UnknownNullability Provider<ExternalModuleDependency> delegate;
4441

@@ -87,32 +84,28 @@ void resolve() {
8784
this.getDelegate().get();
8885
}
8986

87+
Action<? super AttributeContainer> addAttributes() {
88+
return attributes -> {
89+
attributes.attribute(MinecraftExtension.Attributes.os, this.getObjects().named(OperatingSystemFamily.class, OperatingSystem.current().getFamilyName()));
90+
attributes.attributeProvider(MinecraftExtension.Attributes.mappingsChannel, mappings.map(MinecraftMappings::channel));
91+
attributes.attributeProvider(MinecraftExtension.Attributes.mappingsVersion, mappings.map(MinecraftMappings::version));
92+
};
93+
}
94+
9095
@Override
9196
public void handle(SourceSet sourceSet) {
9297
var configurations = this.project.getConfigurations();
9398
var dependency = this.getDelegate().get();
9499

95-
NamedDomainObjectProvider<DependencyScopeConfiguration> minecraftDependencyConstraints;
96-
try {
97-
minecraftDependencyConstraints = configurations.dependencyScope("minecraftDependencyConstraints", configuration -> {
98-
configuration.setDescription("Transient dependency constraints for Minecraft dependencies.");
99-
});
100-
} catch (InvalidUserDataException e) {
101-
minecraftDependencyConstraints = configurations.named("minecraftDependencyConstraints", DependencyScopeConfiguration.class);
102-
}
103-
104-
configurations.getByName(sourceSet.getCompileClasspathConfigurationName()).extendsFrom(minecraftDependencyConstraints.get());
105-
configurations.getByName(sourceSet.getRuntimeClasspathConfigurationName()).extendsFrom(minecraftDependencyConstraints.get());
106-
107-
minecraftDependencyConstraints.get().getDependencyConstraints().add(this.project.getDependencies().getConstraints().create(dependency.getModule().toString(), constraint -> {
108-
constraint.because("Accounts for mappings used and natives variants");
109-
110-
constraint.attributes(attributes -> {
111-
attributes.attribute(MinecraftExtension.Attributes.os, this.getObjects().named(OperatingSystemFamily.class, OperatingSystem.current().getFamilyName()));
112-
attributes.attributeProvider(MinecraftExtension.Attributes.mappingsChannel, mappings.map(MinecraftMappings::channel));
113-
attributes.attributeProvider(MinecraftExtension.Attributes.mappingsVersion, mappings.map(MinecraftMappings::version));
114-
});
115-
}));
100+
Util.forEachClasspath(configurations, sourceSet, configuration ->
101+
configuration.getResolutionStrategy().dependencySubstitution(s -> {
102+
var moduleSelector = "%s:%s".formatted(dependency.getModule(), dependency.getVersion());
103+
var module = s.module(moduleSelector);
104+
s.substitute(module)
105+
.using(s.variant(module, variant -> variant.attributes(this.addAttributes())))
106+
.because("Accounts for mappings used and natives variants");
107+
})
108+
);
116109
}
117110

118111
@Override
@@ -153,22 +146,25 @@ public void mappings(
153146
}
154147

155148
static abstract class WithAccessTransformersImpl extends MinecraftDependencyImpl implements WithAccessTransformers {
156-
private final AccessTransformersContainer atContainer;
149+
private final RegularFileProperty atFile = this.getObjects().fileProperty();
157150
private final Property<String> atPath = this.getObjects().property(String.class);
158151

152+
private final Attribute<Boolean> attribute;
153+
159154
@Inject
160155
public WithAccessTransformersImpl(Project project) {
161156
super(project);
162-
this.atContainer = AccessTransformersContainer.register(project, it -> { });
157+
this.attribute = this.registerTransform();
158+
163159
this.atPath.convention(project.getExtensions().getByType(MinecraftExtensionForProjectWithAccessTransformers.class).getAccessTransformers());
164160
}
165161

166162
@Override
167-
Provider<ExternalModuleDependency> setDelegate(Object dependencyNotation, Closure<?> closure) {
168-
return super.setDelegate(dependencyNotation, Closures.<Dependency>consumer(dependency -> {
169-
Closures.invoke(closure, dependency);
170-
this.atContainer.configure(dependency);
171-
}));
163+
Action<? super AttributeContainer> addAttributes() {
164+
return attributes -> {
165+
super.addAttributes().execute(attributes);
166+
attributes.attribute(this.attribute, true);
167+
};
172168
}
173169

174170
@Override
@@ -180,37 +176,61 @@ public void handle(SourceSet sourceSet) {
180176

181177
var itor = sourceSet.getResources().getSrcDirs().iterator();
182178
if (itor.hasNext()) {
183-
this.getAccessTransformer().convention(this.getProjectLayout().file(this.getProviders().provider(() -> new File(itor.next(), this.atPath.get()))).get());
179+
this.atFile.convention(this.getProjectLayout().file(this.getProviders().provider(() -> new File(itor.next(), this.atPath.get()))).get());
184180
} else {
185181
// weird edge case where a source set might not have any resources???
186182
// in which case, just best guess the location for accesstransformer.cfg
187-
this.getAccessTransformer().convention(this.getProjectLayout().getProjectDirectory().file(this.getProviders().provider(() -> "src/%s/resources/%s".formatted(sourceSet.getName(), this.atPath.get()))).get());
183+
this.atFile.convention(this.getProjectLayout().getProjectDirectory().file(this.getProviders().provider(() -> "src/%s/resources/%s".formatted(sourceSet.getName(), this.atPath.get()))).get());
188184
}
189185
}
190186

191-
private int getAtContainerCount() {
192-
try {
193-
//noinspection DataFlowIssue
194-
return (int) this.project.getExtensions().getExtraProperties().get(AT_COUNT_NAME);
195-
} catch (UnknownPropertyException ignored) {
196-
this.setAtContainerCount(0);
197-
return 0;
198-
}
199-
}
187+
private Attribute<Boolean> registerTransform() {
188+
var dependencies = this.project.getDependencies();
189+
190+
var attribute = Attribute.of("net.minecraftforge.gradle.accesstransformers.automatic." + this.getIndex(), Boolean.class);
191+
192+
dependencies.attributesSchema(attributesSchema -> attributesSchema.attribute(attribute));
193+
194+
dependencies.getArtifactTypes().named(
195+
ArtifactTypeDefinition.JAR_TYPE,
196+
type -> type.getAttributes().attribute(attribute, false)
197+
);
198+
199+
dependencies.registerTransform(ArtifactAccessTransformer.class, spec -> {
200+
spec.parameters(ArtifactAccessTransformer.Parameters.defaults(project, parameters -> {
201+
parameters.getConfig().set(this.atFile);
202+
this.project.afterEvaluate(p ->
203+
ArtifactAccessTransformer.validateConfig(this.project, this.getDelegate().get(), this.atFile)
204+
);
205+
}));
206+
207+
spec.getFrom()
208+
.attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.JAR_TYPE)
209+
.attribute(Category.CATEGORY_ATTRIBUTE, this.getObjects().named(Category.class, Category.LIBRARY))
210+
.attribute(attribute, false);
200211

201-
private void setAtContainerCount(int count) {
202-
this.project.getExtensions().getExtraProperties().set(AT_COUNT_NAME, count);
212+
spec.getTo()
213+
.attribute(ArtifactTypeDefinition.ARTIFACT_TYPE_ATTRIBUTE, ArtifactTypeDefinition.JAR_TYPE)
214+
.attribute(Category.CATEGORY_ATTRIBUTE, this.getObjects().named(Category.class, Category.LIBRARY))
215+
.attribute(attribute, true);
216+
});
217+
218+
return attribute;
203219
}
204220

205-
private int postIncrementContainerCount() {
206-
int ret = this.getAtContainerCount();
207-
this.setAtContainerCount(ret + 1);
208-
return ret;
221+
private int getIndex() {
222+
var ext = this.project.getGradle().getExtensions().getExtraProperties();
223+
224+
int index = ext.has(AT_COUNT_NAME)
225+
? (int) Objects.requireNonNull(ext.get(AT_COUNT_NAME), "Internal extra property can never be null!") + 1
226+
: 0;
227+
ext.set(AT_COUNT_NAME, index);
228+
return index;
209229
}
210230

211231
@Override
212232
public RegularFileProperty getAccessTransformer() {
213-
return this.atContainer.getOptions().getConfig();
233+
return this.atFile;
214234
}
215235

216236
@Override
@@ -225,10 +245,5 @@ public void setAccessTransformer(boolean accessTransformer) {
225245
else
226246
this.atPath.unsetConvention().unset();
227247
}
228-
229-
@Override
230-
public void accessTransformer(Action<? super AccessTransformersContainer.Options> options) {
231-
this.atContainer.options(options);
232-
}
233248
}
234249
}

0 commit comments

Comments
 (0)