88import groovy .lang .DelegatesTo ;
99import groovy .transform .stc .ClosureParams ;
1010import groovy .transform .stc .FirstParam ;
11+ import org .codehaus .groovy .runtime .InvokerHelper ;
1112import org .gradle .api .Action ;
1213import org .gradle .api .Project ;
1314import org .gradle .api .artifacts .Dependency ;
1617import org .gradle .api .plugins .ExtensionAware ;
1718import org .gradle .api .plugins .JavaPluginExtension ;
1819import org .gradle .api .provider .Provider ;
20+ import org .gradle .api .provider .ProviderFactory ;
1921import org .gradle .jvm .toolchain .JavaLanguageVersion ;
2022import org .gradle .jvm .toolchain .JavaLauncher ;
2123import org .gradle .jvm .toolchain .JavaToolchainService ;
2224import org .gradle .jvm .toolchain .JavaToolchainSpec ;
25+ import org .jetbrains .annotations .Nullable ;
2326
2427import java .io .File ;
2528import java .io .OutputStream ;
29+ import java .util .Objects ;
2630
2731/// Shared utilities for Gradle plugins.
2832public 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