Skip to content

Commit 600a5ea

Browse files
authored
Add support for version catalog entries in fg.deobf (#976)
This support includes bundles. ```groovy dependencies { implementation fg.deobf(libs.examplemod) runtimeOnly fg.deobf(libs.bundles.exampledeps) } ```
1 parent eddddc3 commit 600a5ea

File tree

1 file changed

+77
-2
lines changed

1 file changed

+77
-2
lines changed

src/userdev/java/net/minecraftforge/gradle/userdev/DependencyManagementExtension.java

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
package net.minecraftforge.gradle.userdev;
77

88
import groovy.lang.Closure;
9+
import groovy.lang.DelegatesTo;
910
import groovy.lang.GroovyObjectSupport;
11+
import groovy.transform.stc.ClosureParams;
12+
import groovy.transform.stc.SimpleType;
1013
import groovy.util.Node;
1114
import groovy.util.NodeList;
1215
import net.minecraftforge.gradle.common.util.BaseRepo;
@@ -18,11 +21,18 @@
1821
import org.gradle.api.Project;
1922
import org.gradle.api.artifacts.Configuration;
2023
import org.gradle.api.artifacts.Dependency;
24+
import org.gradle.api.artifacts.ExternalModuleDependency;
25+
import org.gradle.api.artifacts.ExternalModuleDependencyBundle;
26+
import org.gradle.api.artifacts.MinimalExternalModuleDependency;
2127
import org.gradle.api.artifacts.repositories.ArtifactRepository;
28+
import org.gradle.api.provider.Provider;
29+
import org.gradle.api.provider.ProviderConvertible;
2230
import org.gradle.api.publish.maven.MavenPublication;
2331
import org.gradle.api.publish.tasks.GenerateModuleMetadata;
32+
import org.jetbrains.annotations.Nullable;
2433

2534
import java.io.File;
35+
import java.util.ArrayList;
2636
import java.util.List;
2737
import java.util.function.Supplier;
2838
import java.util.stream.Collectors;
@@ -53,16 +63,81 @@ public ArtifactRepository getRepository() {
5363

5464
@SuppressWarnings("unused")
5565
public Dependency deobf(Object dependency) {
66+
//noinspection DataFlowIssue -- null closure is allowed here
5667
return deobf(dependency, null);
5768
}
5869

59-
public Dependency deobf(Object dependency, Closure<?> configure) {
70+
public Dependency deobf(
71+
Object dependency,
72+
@DelegatesTo(Dependency.class)
73+
@ClosureParams(value = SimpleType.class, options = "org.gradle.api.artifacts.Dependency")
74+
Closure<?> configure
75+
) {
6076
Dependency baseDependency = project.getDependencies().create(dependency, configure);
61-
project.getConfigurations().getByName(UserDevPlugin.OBF).getDependencies().add(baseDependency);
77+
project.getDependencies().add(UserDevPlugin.OBF, baseDependency);
6278

6379
return remapper.remap(baseDependency);
6480
}
6581

82+
@SuppressWarnings("unused")
83+
public <T> Provider<?> deobf(Provider<T> dependency) {
84+
//noinspection DataFlowIssue -- null closure is allowed here
85+
return deobf(dependency, null);
86+
}
87+
88+
public <T> Provider<?> deobf(
89+
Provider<T> dependency,
90+
@DelegatesTo(ExternalModuleDependency.class)
91+
@ClosureParams(value = SimpleType.class, options = "org.gradle.api.artifacts.ExternalModuleDependency")
92+
Closure<?> configure
93+
) {
94+
project.getDependencies().addProvider(UserDevPlugin.OBF, dependency, baseDependency -> {
95+
//noinspection ConstantValue -- null closure is allowed here
96+
if (configure != null)
97+
configure.call(baseDependency);
98+
});
99+
100+
// Checking for presence after DependencyHandler#addProvider so Gradle can throw its usual errors as needed
101+
if (!dependency.isPresent()) return dependency;
102+
103+
if (dependency.get() instanceof ExternalModuleDependencyBundle) {
104+
// this provider MUST return ExternalModuleDependencyBundle
105+
// The only way to coerce the type of it is to use a property, since we can set the type manually on creation.
106+
// ProviderInternal#getType uses the generic argument to determine what type it is.
107+
// Provider#map and #flatMap do NOT preserve the resultant type, which fucks with adding bundles to configurations.
108+
return project.getObjects().property(ExternalModuleDependencyBundle.class).value(project.provider(() -> {
109+
ExternalModuleDependencyBundle newBundle = new RemappedExternalModuleDependencyBundle();
110+
for (MinimalExternalModuleDependency d : (ExternalModuleDependencyBundle) dependency.get()) {
111+
//noinspection ConstantValue -- null closure is allowed here
112+
if (configure != null)
113+
configure.call(d);
114+
115+
newBundle.add((MinimalExternalModuleDependency) remapper.remap(d));
116+
}
117+
return newBundle;
118+
}));
119+
} else {
120+
return dependency.map(d -> remapper.remap(project.getDependencies().create(d, configure)));
121+
}
122+
}
123+
124+
@SuppressWarnings("unused")
125+
public <T> Provider<?> deobf(ProviderConvertible<T> dependency) {
126+
//noinspection DataFlowIssue -- null closure is allowed here
127+
return deobf(dependency, null);
128+
}
129+
130+
public <T> Provider<?> deobf(
131+
ProviderConvertible<T> dependency,
132+
@DelegatesTo(ExternalModuleDependency.class)
133+
@ClosureParams(value = SimpleType.class, options = "org.gradle.api.artifacts.ExternalModuleDependency")
134+
Closure<?> configure
135+
) {
136+
return deobf(dependency.asProvider(), configure);
137+
}
138+
139+
private static class RemappedExternalModuleDependencyBundle extends ArrayList<MinimalExternalModuleDependency> implements ExternalModuleDependencyBundle { }
140+
66141
@SuppressWarnings({"ConstantConditions", "unchecked"})
67142
public MavenPublication component(MavenPublication mavenPublication) {
68143
project.getTasks().withType(GenerateModuleMetadata.class).forEach(generateModuleMetadata -> generateModuleMetadata.setEnabled(false));

0 commit comments

Comments
 (0)