Skip to content

Commit 79de92d

Browse files
committed
Fixed getting Java launchers eagerly resolving the project toolchain
1 parent adae93f commit 79de92d

File tree

1 file changed

+78
-17
lines changed

1 file changed

+78
-17
lines changed

src/main/groovy/net/minecraftforge/gradleutils/shared/SharedUtil.java

Lines changed: 78 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import groovy.lang.DelegatesTo;
99
import groovy.transform.stc.ClosureParams;
1010
import groovy.transform.stc.FirstParam;
11+
import org.codehaus.groovy.runtime.InvokerHelper;
1112
import org.gradle.api.Action;
1213
import org.gradle.api.Project;
1314
import org.gradle.api.artifacts.Dependency;
@@ -16,13 +17,16 @@
1617
import org.gradle.api.plugins.ExtensionAware;
1718
import org.gradle.api.plugins.JavaPluginExtension;
1819
import org.gradle.api.provider.Provider;
20+
import org.gradle.api.provider.ProviderFactory;
1921
import org.gradle.jvm.toolchain.JavaLanguageVersion;
2022
import org.gradle.jvm.toolchain.JavaLauncher;
2123
import org.gradle.jvm.toolchain.JavaToolchainService;
2224
import org.gradle.jvm.toolchain.JavaToolchainSpec;
25+
import org.jetbrains.annotations.Nullable;
2326

2427
import java.io.File;
2528
import java.io.OutputStream;
29+
import java.util.Objects;
2630

2731
/// Shared utilities for Gradle plugins.
2832
public abstract class SharedUtil {
@@ -52,35 +56,68 @@ public static Provider<JavaLauncher> launcherFor(JavaPluginExtension java, JavaT
5256
/// @return A provider for the Java launcher
5357
public static Provider<JavaLauncher> launcherFor(JavaPluginExtension java, JavaToolchainService javaToolchains, JavaLanguageVersion version) {
5458
JavaToolchainSpec currentToolchain = java.getToolchain();
55-
return currentToolchain.getLanguageVersion().getOrElse(JavaLanguageVersion.current()).canCompileOrRun(version)
56-
? javaToolchains.launcherFor(currentToolchain)
57-
: launcherForStrictly(javaToolchains, version);
59+
return currentToolchain.getLanguageVersion().orElse(JavaLanguageVersion.current()).flatMap(languageVersion -> languageVersion.canCompileOrRun(version)
60+
? javaToolchains.launcherFor(spec -> spec.getLanguageVersion().set(languageVersion))
61+
: launcherForStrictly(javaToolchains, version));
5862
}
5963

6064
/// Gets the Java launcher that [can compile or run][JavaLanguageVersion#canCompileOrRun(JavaLanguageVersion)] the
6165
/// given version.
6266
///
6367
/// If the currently running Java toolchain is able to compile and run the given version, it will be used instead.
6468
///
65-
/// @param object The extension-aware object to get the Java extensions from
69+
/// @param java The Java plugin extension of the currently-used toolchain
70+
/// @param javaToolchains The Java toolchain service to get the Java launcher from
71+
/// @param version The version of Java required
72+
/// @return A provider for the Java launcher
73+
public static Provider<JavaLauncher> launcherFor(Provider<? extends JavaPluginExtension> java, Provider<? extends JavaToolchainService> javaToolchains, int version) {
74+
return launcherFor(java, javaToolchains, JavaLanguageVersion.of(version));
75+
}
76+
77+
/// Gets the Java launcher that [can compile or run][JavaLanguageVersion#canCompileOrRun(JavaLanguageVersion)] the
78+
/// given version.
79+
///
80+
/// If the currently running Java toolchain is able to compile and run the given version, it will be used instead.
81+
///
82+
/// @param java The Java plugin extension of the currently-used toolchain
83+
/// @param javaToolchains The Java toolchain service to get the Java launcher from
84+
/// @param version The version of Java required
85+
/// @return A provider for the Java launcher
86+
public static Provider<JavaLauncher> launcherFor(Provider<? extends JavaPluginExtension> java, Provider<? extends JavaToolchainService> javaToolchains, JavaLanguageVersion version) {
87+
return java.flatMap(j -> {
88+
var currentToolchain = j.getToolchain();
89+
return currentToolchain.getLanguageVersion().orElse(JavaLanguageVersion.current()).flatMap(languageVersion -> languageVersion.canCompileOrRun(version)
90+
? javaToolchains.flatMap(t -> t.launcherFor(spec -> spec.getLanguageVersion().set(languageVersion)))
91+
: launcherForStrictly(javaToolchains, version));
92+
});
93+
}
94+
95+
/// Gets the Java launcher that [can compile or run][JavaLanguageVersion#canCompileOrRun(JavaLanguageVersion)] the
96+
/// given version.
97+
///
98+
/// If the currently running Java toolchain is able to compile and run the given version, it will be used instead.
99+
///
100+
/// @param project The project to get the Java extensions from
66101
/// @param version The version of Java required
67102
/// @return A provider for the Java launcher
68-
public static Provider<JavaLauncher> launcherFor(ExtensionAware object, int version) {
69-
var extensions = object.getExtensions();
70-
return launcherFor(extensions.getByType(JavaPluginExtension.class), extensions.getByType(JavaToolchainService.class), version);
103+
public static Provider<JavaLauncher> launcherFor(Project project, int version) {
104+
var providers = project.getProviders();
105+
var extensions = project.getExtensions();
106+
return launcherFor(providers.provider(() -> extensions.getByType(JavaPluginExtension.class)), providers.provider(() -> extensions.getByType(JavaToolchainService.class)), version);
71107
}
72108

73109
/// Gets the Java launcher that [can compile or run][JavaLanguageVersion#canCompileOrRun(JavaLanguageVersion)] the
74110
/// given version.
75111
///
76112
/// If the currently running Java toolchain is able to compile and run the given version, it will be used instead.
77113
///
78-
/// @param object The extension-aware object to get the Java extensions from
114+
/// @param project The project to get the Java extensions from
79115
/// @param version The version of Java required
80116
/// @return A provider for the Java launcher
81-
public static Provider<JavaLauncher> launcherFor(ExtensionAware object, JavaLanguageVersion version) {
82-
var extensions = object.getExtensions();
83-
return launcherFor(extensions.getByType(JavaPluginExtension.class), extensions.getByType(JavaToolchainService.class), version);
117+
public static Provider<JavaLauncher> launcherFor(Project project, JavaLanguageVersion version) {
118+
var providers = project.getProviders();
119+
var extensions = project.getExtensions();
120+
return launcherFor(providers.provider(() -> extensions.getByType(JavaPluginExtension.class)), providers.provider(() -> extensions.getByType(JavaToolchainService.class)), version);
84121
}
85122

86123
/// Gets the Java launcher strictly for the given version, even if the currently running Java toolchain is higher
@@ -106,21 +143,45 @@ public static Provider<JavaLauncher> launcherForStrictly(JavaToolchainService ja
106143
/// Gets the Java launcher strictly for the given version, even if the currently running Java toolchain is higher
107144
/// than it.
108145
///
109-
/// @param object The extension-aware object to get the Java extensions from
146+
/// @param javaToolchains The Java toolchain service to get the Java launcher from
147+
/// @param version The version of Java required
148+
/// @return A provider for the Java launcher
149+
public static Provider<JavaLauncher> launcherForStrictly(Provider<? extends JavaToolchainService> javaToolchains, int version) {
150+
return launcherForStrictly(javaToolchains, JavaLanguageVersion.of(version));
151+
}
152+
153+
/// Gets the Java launcher strictly for the given version, even if the currently running Java toolchain is higher
154+
/// than it.
155+
///
156+
/// @param javaToolchains The Java toolchain service to get the Java launcher from
157+
/// @param version The version of Java required
158+
/// @return A provider for the Java launcher
159+
public static Provider<JavaLauncher> launcherForStrictly(Provider<? extends JavaToolchainService> javaToolchains, JavaLanguageVersion version) {
160+
return javaToolchains.flatMap(t -> t.launcherFor(spec -> spec.getLanguageVersion().set(version)));
161+
}
162+
163+
/// Gets the Java launcher strictly for the given version, even if the currently running Java toolchain is higher
164+
/// than it.
165+
///
166+
/// @param project The extension-aware object to get the Java extensions from
110167
/// @param version The version of Java required
111168
/// @return A provider for the Java launcher
112-
public static Provider<JavaLauncher> launcherForStrictly(ExtensionAware object, int version) {
113-
return launcherForStrictly(object.getExtensions().getByType(JavaToolchainService.class), version);
169+
public static Provider<JavaLauncher> launcherForStrictly(Project project, int version) {
170+
var providers = project.getProviders();
171+
var extensions = project.getExtensions();
172+
return launcherForStrictly(providers.provider(() -> extensions.getByType(JavaToolchainService.class)), version);
114173
}
115174

116175
/// Gets the Java launcher strictly for the given version, even if the currently running Java toolchain is higher
117176
/// than it.
118177
///
119-
/// @param object The extension-aware object to get the Java extensions from
178+
/// @param project The extension-aware object to get the Java extensions from
120179
/// @param version The version of Java required
121180
/// @return A provider for the Java launcher
122-
public static Provider<JavaLauncher> launcherForStrictly(ExtensionAware object, JavaLanguageVersion version) {
123-
return launcherForStrictly(object.getExtensions().getByType(JavaToolchainService.class), version);
181+
public static Provider<JavaLauncher> launcherForStrictly(Project project, JavaLanguageVersion version) {
182+
var providers = project.getProviders();
183+
var extensions = project.getExtensions();
184+
return launcherForStrictly(providers.provider(() -> extensions.getByType(JavaToolchainService.class)), version);
124185
}
125186
//endregion
126187

0 commit comments

Comments
 (0)