Skip to content

Commit 28ed7cd

Browse files
committed
Add gradleutils.asProvider utility method
1 parent 728f6c1 commit 28ed7cd

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,25 @@ public static <T> T unpack(Object value) {
502502
return (T) value;
503503
}
504504
}
505+
506+
@SuppressWarnings("unchecked")
507+
public static <T> Provider<T> asProvider(ProviderFactory providers, Object value) {
508+
if (value instanceof ProviderConvertible<?> deferred) {
509+
return (Provider<T>) deferred.asProvider();
510+
} else if (value instanceof Provider<?> deferred) {
511+
return (Provider<T>) deferred;
512+
} else if (value instanceof Closure<?> deferred) {
513+
return providers.provider(() -> Closures.invoke(deferred));
514+
} else if (value instanceof Callable<?> deferred) {
515+
return providers.provider((Callable<T>) deferred);
516+
} else if (value instanceof Function0<?> deferred) {
517+
return providers.provider(() -> (T) deferred.invoke());
518+
} else if (value instanceof Supplier<?> deferred) {
519+
return providers.provider(() -> (T) deferred.get());
520+
} else {
521+
return providers.provider(() -> (T) value);
522+
}
523+
}
505524
//endregion
506525

507526
//region Properties

src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtension.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -300,13 +300,25 @@ default Action<MavenArtifactRepository> getPublishingForgeMaven(Provider<?> defa
300300
/// Unpacks a deferred value.
301301
///
302302
/// Since buildscripts are dynamically compiled, this allows buildscript authors to use this method with version
303-
/// catalog entries, other provider-like objects. This prevents the need to arbitrarily call
304-
/// [Provider#get()] (or similar) on values which may or may not be deferred based on circumstance.
303+
/// catalog entries, other provider-like objects. This prevents the need to arbitrarily call [Provider#get()] (or
304+
/// similar) on values which may or may not be deferred based on circumstance.
305305
///
306306
/// @param value The value to unpack
307307
/// @param <T> The type of value held by the provider
308308
/// @return The unpacked value
309309
default <T> T unpack(Object value) {
310310
return Util.unpack(value);
311311
}
312+
313+
/// Packs a (deferred) value as a provider.
314+
///
315+
/// Since buildscripts are dynamically compiled, this allows buildscript authors to use this method with version
316+
/// catalog entries, other provider-like objects. This prevents the need to call [ProviderConvertible#asProvider()]
317+
/// or otherwise create arbitrary providers using [org.gradle.api.provider.ProviderFactory#provider(Callable)] on
318+
/// values which may or may not be deferred based on circumstance.
319+
///
320+
/// @param value The value to pack
321+
/// @param <T> The type of value held by the provider
322+
/// @return The packed value
323+
<T> Provider<T> asProvider(Object value);
312324
}

src/main/groovy/net/minecraftforge/gradleutils/GradleUtilsExtensionImpl.groovy

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,11 @@ import static net.minecraftforge.gradleutils.GradleUtilsPlugin.LOGGER
145145
}
146146
}
147147

148+
@Override
149+
<T> Provider<T> asProvider(Object value) {
150+
Util.asProvider(this.providers, value)
151+
}
152+
148153
@CompileStatic
149154
@PackageScope static abstract class ForProjectImpl extends GradleUtilsExtensionImpl implements GradleUtilsExtensionInternal.ForProject {
150155
private final GradleUtilsProblems problems = this.objects.newInstance(GradleUtilsProblems)

0 commit comments

Comments
 (0)