Skip to content

Commit 5a47829

Browse files
committed
New instantiation strategy for various things
Despite being a dynamic build service, Gradle has static service registries for objects that have already been instantiated. Working around this by taking advantage of the project when available. This only affects configuration time and does not cause caching issues.
1 parent 0b5bff1 commit 5a47829

File tree

5 files changed

+41
-17
lines changed

5 files changed

+41
-17
lines changed

gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/EnhancedPlugin.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616
import org.gradle.api.plugins.ExtensionAware;
1717
import org.gradle.api.provider.Provider;
1818
import org.gradle.api.provider.ProviderFactory;
19+
import org.gradle.jvm.toolchain.JavaToolchainService;
1920
import org.jetbrains.annotations.Nullable;
2021
import org.jetbrains.annotations.UnknownNullability;
2122

2223
import javax.inject.Inject;
2324
import java.io.File;
2425
import java.util.Objects;
26+
import java.util.concurrent.Callable;
2527

2628
/// The enhanced plugin contains several helper members to assist in making Gradle plugins as clean as possible without
2729
/// needing to duplicate code across projects.
@@ -33,7 +35,7 @@ public abstract class EnhancedPlugin<T> implements Plugin<T>, EnhancedPluginAddi
3335
private final @Nullable String toolsExtName;
3436

3537
private @UnknownNullability T target;
36-
private ToolsExtensionImpl tools = this.getObjects().newInstance(ToolsExtensionImpl.class);
38+
private ToolsExtensionImpl tools = this.getObjects().newInstance(ToolsExtensionImpl.class, (Callable<? extends JavaToolchainService>) this::toolchainsForTools);
3739
private final EnhancedProblems problemsInternal;
3840

3941
/// The object factory provided by Gradle services.
@@ -64,6 +66,11 @@ public abstract class EnhancedPlugin<T> implements Plugin<T>, EnhancedPluginAddi
6466
/// Service Injection</a>
6567
protected abstract @Inject ProviderFactory getProviders();
6668

69+
/// The Java toolchain service provided by Gradle services.
70+
///
71+
/// @return The Java toolchain service
72+
protected abstract @Inject JavaToolchainService getJavaToolchains();
73+
6774
/// This constructor must be called by all subclasses using a public constructor annotated with [Inject]. The name
6875
/// and display name passed in are used in a minimal instance of [EnhancedProblems], which is used to set up the
6976
/// plugin's [global][#globalCaches()] and [local][#localCaches()] caches. Additionally, the name is used to
@@ -98,7 +105,9 @@ public final void apply(T target) {
98105
this.setup(this.target = target);
99106

100107
if (this.toolsExtName != null && target instanceof ExtensionAware)
101-
this.tools = ((ExtensionAware) target).getExtensions().create(this.toolsExtName, ToolsExtensionImpl.class);
108+
this.tools = ((ExtensionAware) target).getExtensions().create(this.toolsExtName, ToolsExtensionImpl.class, (Callable<? extends JavaToolchainService>) this::toolchainsForTools);
109+
// else
110+
// this.tools = this.getObjects().newInstance(ToolsExtensionImpl.class, (Callable<? extends JavaToolchainService>) this::toolchainsForTools);
102111
}
103112

104113
/// Called when this plugin is applied to do setup work.
@@ -128,7 +137,19 @@ final EnhancedProblems getProblemsInternal() {
128137

129138
@Override
130139
public Tool.Resolved getTool(Tool tool) {
131-
return ((ToolInternal) tool).get(this.globalCaches(), this.tools);
140+
ProviderFactory providers;
141+
try {
142+
providers = this.target instanceof Project ? this.getProviders() : ((Gradle) InvokerHelper.getProperty(this.target, "gradle")).getRootProject().getProviders();
143+
} catch (Throwable ignored) {
144+
providers = this.getProviders();
145+
}
146+
147+
return ((ToolInternal) tool).get(this.globalCaches(), providers, this.tools);
148+
}
149+
150+
// NOTE: Use this in Tool implementations. Enhanced plugins do not enforce application on projects.
151+
JavaToolchainService toolchainsForTools() {
152+
return this.target instanceof Project ? this.getJavaToolchains() : ((Gradle) InvokerHelper.getProperty(this.target, "gradle")).getRootProject().getExtensions().getByType(JavaToolchainService.class);
132153
}
133154

134155

gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/ToolExecBase.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.gradle.api.tasks.Internal;
1717
import org.gradle.api.tasks.JavaExec;
1818
import org.gradle.api.tasks.Optional;
19+
import org.gradle.jvm.toolchain.JavaToolchainService;
1920
import org.jetbrains.annotations.ApiStatus;
2021
import org.jetbrains.annotations.MustBeInvokedByOverriders;
2122
import org.jetbrains.annotations.UnknownNullability;
@@ -24,6 +25,7 @@
2425
import java.io.File;
2526
import java.util.Locale;
2627
import java.util.Map;
28+
import java.util.concurrent.Callable;
2729

2830
/// This tool execution task is a template on top of [JavaExec] to make executing [tools][Tool] much easier and more
2931
/// consistent between plugins.
@@ -75,7 +77,8 @@ protected ToolExecBase(Class<P> problemsType, Tool tool) {
7577
this.getProject().afterEvaluate(project -> this.getProblems().reportToolExecNotEnhanced(this));
7678
resolved = ((ToolInternal) tool).get(
7779
this.getProjectLayout().getBuildDirectory().dir("minecraftforge/tools/" + tool.getName().toLowerCase(Locale.ENGLISH)).map(this.ensureFileLocationInternal()),
78-
this.getObjectFactory().newInstance(ToolsExtensionImpl.class)
80+
this.getProviderFactory(),
81+
this.getObjectFactory().newInstance(ToolsExtensionImpl.class, (Callable<? extends JavaToolchainService>) this::getJavaToolchainService)
7982
);
8083

8184
this.defaultToolDir.value(

gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/ToolImpl.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.gradle.api.model.ObjectFactory;
1515
import org.gradle.api.provider.Property;
1616
import org.gradle.api.provider.Provider;
17+
import org.gradle.api.provider.ProviderFactory;
1718
import org.gradle.api.provider.ValueSource;
1819
import org.gradle.api.provider.ValueSourceParameters;
1920
import org.gradle.jvm.toolchain.JavaLauncher;
@@ -69,12 +70,12 @@ public int getJavaVersion() {
6970
}
7071

7172
@Override
72-
public Tool.Resolved get(Provider<? extends Directory> cachesDir, ToolsExtensionImpl toolsExt) {
73+
public Tool.Resolved get(Provider<? extends Directory> cachesDir, ProviderFactory providers, ToolsExtensionImpl toolsExt) {
7374
Tool.Definition definition = toolsExt.definitions.maybeCreate(this.name);
7475
FileCollection classpath = definition.getClasspath();
7576
if (classpath.isEmpty()) {
7677
classpath = toolsExt.getObjects().fileCollection().from(
77-
toolsExt.getProviders().of(Source.class, spec -> spec.parameters(parameters -> {
78+
providers.of(Source.class, spec -> spec.parameters(parameters -> {
7879
parameters.getInputFile().set(cachesDir.map(d -> d.file("tools/" + this.fileName)));
7980
parameters.getDownloadUrl().set(this.downloadUrl);
8081
}))
@@ -84,8 +85,8 @@ public Tool.Resolved get(Provider<? extends Directory> cachesDir, ToolsExtension
8485
return new ResolvedImpl(
8586
toolsExt.getObjects(),
8687
classpath,
87-
definition.getMainClass().orElse(toolsExt.getProviders().provider(this::getMainClass)),
88-
definition.getJavaLauncher().orElse(SharedUtil.launcherForStrictly(toolsExt.getJavaToolchains(), this.getJavaVersion()))
88+
definition.getMainClass().orElse(providers.provider(this::getMainClass)),
89+
definition.getJavaLauncher().orElse(providers.provider(() -> SharedUtil.launcherForStrictly(toolsExt.javaToolchains.call(), this.getJavaVersion()).get()))
8990
);
9091
}
9192

gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/ToolInternal.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
import org.gradle.api.file.Directory;
88
import org.gradle.api.provider.Provider;
9+
import org.gradle.api.provider.ProviderFactory;
910
import org.gradle.api.reflect.HasPublicType;
1011
import org.gradle.api.reflect.TypeOf;
1112

@@ -20,14 +21,14 @@ default TypeOf<?> getPublicType() {
2021
/// @param cachesDir The caches directory to store the downloaded tool in
2122
/// @param toolsExt The plugin's tools extension, which may contain overrides for the tool definition
2223
/// @return The provider to the tool file
23-
Tool.Resolved get(Provider<? extends Directory> cachesDir, ToolsExtensionImpl toolsExt);
24+
Tool.Resolved get(Provider<? extends Directory> cachesDir, ProviderFactory providers, ToolsExtensionImpl toolsExt);
2425

2526
/// Gets this tool and returns a provider for the downloaded/cached file.
2627
///
2728
/// @param cachesDir The caches directory to store the downloaded tool in
2829
/// @param toolsExt The plugin's tools extension, which may contain overrides for the tool definition
2930
/// @return The provider to the tool file
30-
default Tool.Resolved get(Directory cachesDir, ToolsExtensionImpl toolsExt) {
31-
return this.get(toolsExt.getProviders().provider(() -> cachesDir), toolsExt);
31+
default Tool.Resolved get(Directory cachesDir, ProviderFactory providers, ToolsExtensionImpl toolsExt) {
32+
return this.get(providers.provider(() -> cachesDir), providers, toolsExt);
3233
}
3334
}

gradleutils-shared/src/main/java/net/minecraftforge/gradleutils/shared/ToolsExtensionImpl.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,23 @@
99
import org.gradle.api.file.ConfigurableFileCollection;
1010
import org.gradle.api.model.ObjectFactory;
1111
import org.gradle.api.provider.Property;
12-
import org.gradle.api.provider.ProviderFactory;
1312
import org.gradle.api.reflect.HasPublicType;
1413
import org.gradle.api.reflect.TypeOf;
1514
import org.gradle.jvm.toolchain.JavaLauncher;
1615
import org.gradle.jvm.toolchain.JavaToolchainService;
1716

1817
import javax.inject.Inject;
18+
import java.util.concurrent.Callable;
1919

2020
abstract class ToolsExtensionImpl implements ToolsExtensionInternal {
21+
final Callable<? extends JavaToolchainService> javaToolchains;
2122
final NamedDomainObjectContainer<? extends Tool.Definition> definitions;
2223

2324
protected abstract @Inject ObjectFactory getObjects();
2425

25-
protected abstract @Inject ProviderFactory getProviders();
26-
27-
protected abstract @Inject JavaToolchainService getJavaToolchains();
28-
2926
@Inject
30-
public ToolsExtensionImpl() {
27+
public ToolsExtensionImpl(Callable<? extends JavaToolchainService> javaToolchains) {
28+
this.javaToolchains = javaToolchains;
3129
this.definitions = this.getObjects().domainObjectContainer(DefinitionImpl.class);
3230
}
3331

0 commit comments

Comments
 (0)