|
6 | 6 | package net.minecraftforge.gradle.userdev; |
7 | 7 |
|
8 | 8 | import groovy.lang.Closure; |
| 9 | +import groovy.lang.DelegatesTo; |
9 | 10 | import groovy.lang.GroovyObjectSupport; |
| 11 | +import groovy.transform.stc.ClosureParams; |
| 12 | +import groovy.transform.stc.SimpleType; |
10 | 13 | import groovy.util.Node; |
11 | 14 | import groovy.util.NodeList; |
12 | 15 | import net.minecraftforge.gradle.common.util.BaseRepo; |
|
18 | 21 | import org.gradle.api.Project; |
19 | 22 | import org.gradle.api.artifacts.Configuration; |
20 | 23 | 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; |
21 | 27 | import org.gradle.api.artifacts.repositories.ArtifactRepository; |
| 28 | +import org.gradle.api.provider.Provider; |
| 29 | +import org.gradle.api.provider.ProviderConvertible; |
22 | 30 | import org.gradle.api.publish.maven.MavenPublication; |
23 | 31 | import org.gradle.api.publish.tasks.GenerateModuleMetadata; |
| 32 | +import org.jetbrains.annotations.Nullable; |
24 | 33 |
|
25 | 34 | import java.io.File; |
| 35 | +import java.util.ArrayList; |
26 | 36 | import java.util.List; |
27 | 37 | import java.util.function.Supplier; |
28 | 38 | import java.util.stream.Collectors; |
@@ -53,16 +63,81 @@ public ArtifactRepository getRepository() { |
53 | 63 |
|
54 | 64 | @SuppressWarnings("unused") |
55 | 65 | public Dependency deobf(Object dependency) { |
| 66 | + //noinspection DataFlowIssue -- null closure is allowed here |
56 | 67 | return deobf(dependency, null); |
57 | 68 | } |
58 | 69 |
|
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 | + ) { |
60 | 76 | Dependency baseDependency = project.getDependencies().create(dependency, configure); |
61 | | - project.getConfigurations().getByName(UserDevPlugin.OBF).getDependencies().add(baseDependency); |
| 77 | + project.getDependencies().add(UserDevPlugin.OBF, baseDependency); |
62 | 78 |
|
63 | 79 | return remapper.remap(baseDependency); |
64 | 80 | } |
65 | 81 |
|
| 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 | + |
66 | 141 | @SuppressWarnings({"ConstantConditions", "unchecked"}) |
67 | 142 | public MavenPublication component(MavenPublication mavenPublication) { |
68 | 143 | project.getTasks().withType(GenerateModuleMetadata.class).forEach(generateModuleMetadata -> generateModuleMetadata.setEnabled(false)); |
|
0 commit comments