Skip to content

Instantly share code, notes, and snippets.

@lptr
Created September 16, 2022 12:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lptr/177bc69bc8eda7695fddadca70387c97 to your computer and use it in GitHub Desktop.
Save lptr/177bc69bc8eda7695fddadca70387c97 to your computer and use it in GitHub Desktop.
diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/DefaultTaskInputPropertyRegistration.java b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/DefaultTaskInputPropertyRegistration.java
index 5953f394b7c..00228cceb3b 100644
--- a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/DefaultTaskInputPropertyRegistration.java
+++ b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/DefaultTaskInputPropertyRegistration.java
@@ -17,16 +17,17 @@
package org.gradle.api.internal.tasks;
import org.gradle.api.NonNullApi;
+import org.gradle.api.internal.tasks.properties.PropertyValue;
import org.gradle.api.tasks.TaskInputPropertyBuilder;
@NonNullApi
public class DefaultTaskInputPropertyRegistration implements TaskInputPropertyRegistration {
private final String propertyName;
- private final StaticValue value;
+ private final PropertyValue value;
private boolean optional;
- public DefaultTaskInputPropertyRegistration(String propertyName, StaticValue value) {
+ public DefaultTaskInputPropertyRegistration(String propertyName, PropertyValue value) {
this.propertyName = propertyName;
this.value = value;
}
@@ -48,7 +49,7 @@ public TaskInputPropertyBuilder optional(boolean optional) {
}
@Override
- public StaticValue getValue() {
+ public PropertyValue getValue() {
return value;
}
diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/DefaultTaskInputs.java b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/DefaultTaskInputs.java
index 468484d852f..c142d2693b8 100644
--- a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/DefaultTaskInputs.java
+++ b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/DefaultTaskInputs.java
@@ -162,7 +162,7 @@ public Map<String, Object> getProperties() {
TaskPropertyUtils.visitProperties(propertyWalker, task, visitor);
Map<String, Object> result = new HashMap<>();
for (InputPropertySpec inputProperty : visitor.getProperties()) {
- result.put(inputProperty.getPropertyName(), InputParameterUtils.prepareInputParameterValue(inputProperty, task));
+ result.put(inputProperty.getPropertyName(), inputProperty.getValue().getValue());
}
return Collections.unmodifiableMap(result);
}
@@ -170,7 +170,7 @@ public Map<String, Object> getProperties() {
@Override
public TaskInputPropertyBuilder property(final String name, @Nullable final Object value) {
return taskMutator.mutate("TaskInputs.property(String, Object)", (Callable<TaskInputPropertyBuilder>) () -> {
- StaticValue staticValue = new StaticValue(value);
+ PropertyValue staticValue = new ResolvingPropertyValue(new StaticValue(value), valueToResolve -> InputParameterUtils.prepareInputParameterValue(task, name, valueToResolve));
TaskInputPropertyRegistration registration = new DefaultTaskInputPropertyRegistration(name, staticValue);
registeredProperties.add(registration);
return registration;
diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/StaticValue.java b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/StaticValue.java
index 383acbf8c08..06a8e7e5f7c 100644
--- a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/StaticValue.java
+++ b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/StaticValue.java
@@ -66,7 +66,7 @@ public void maybeFinalizeValue() {
@Nullable
@Override
- public Object call() {
+ public Object getValue() {
return value;
}
}
diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/TaskPropertyRegistration.java b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/TaskPropertyRegistration.java
index d9914d6fa27..c5ee7fca948 100644
--- a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/TaskPropertyRegistration.java
+++ b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/TaskPropertyRegistration.java
@@ -16,8 +16,10 @@
package org.gradle.api.internal.tasks;
+import org.gradle.api.internal.tasks.properties.PropertyValue;
+
public interface TaskPropertyRegistration {
String getPropertyName();
- StaticValue getValue();
+ PropertyValue getValue();
boolean isOptional();
}
diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/execution/TaskExecution.java b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/execution/TaskExecution.java
index ee933ab3bf5..d842d5506a0 100644
--- a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/execution/TaskExecution.java
+++ b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/execution/TaskExecution.java
@@ -33,7 +33,6 @@
import org.gradle.api.internal.tasks.SnapshotTaskInputsBuildOperationType;
import org.gradle.api.internal.tasks.TaskExecutionContext;
import org.gradle.api.internal.tasks.properties.InputFilePropertySpec;
-import org.gradle.api.internal.tasks.properties.InputParameterUtils;
import org.gradle.api.internal.tasks.properties.InputPropertySpec;
import org.gradle.api.internal.tasks.properties.OutputFilePropertySpec;
import org.gradle.api.internal.tasks.properties.TaskProperties;
@@ -303,7 +302,7 @@ public void visitRegularInputs(InputVisitor visitor) {
for (InputPropertySpec inputProperty : taskProperties.getInputProperties()) {
visitor.visitInputProperty(
inputProperty.getPropertyName(),
- () -> InputParameterUtils.prepareInputParameterValue(inputProperty, task));
+ inputProperty.getValue());
}
for (InputFilePropertySpec inputFileProperty : taskProperties.getInputFileProperties()) {
// SkipWhenEmpty implies incremental.
diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/BeanPropertyContext.java b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/BeanPropertyContext.java
index 8fe81a3dd13..03d9c4d911f 100644
--- a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/BeanPropertyContext.java
+++ b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/BeanPropertyContext.java
@@ -17,5 +17,5 @@
package org.gradle.api.internal.tasks.properties;
public interface BeanPropertyContext {
- void addNested(String propertyName, Object bean);
+ void addNested(String propertyName, Object nested);
}
diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/InputParameterUtils.java b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/InputParameterUtils.java
index d3dc30d67f3..a9b88e34518 100644
--- a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/InputParameterUtils.java
+++ b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/InputParameterUtils.java
@@ -17,19 +17,17 @@
package org.gradle.api.internal.tasks.properties;
import groovy.lang.GString;
-import org.gradle.api.Task;
import org.gradle.util.internal.DeferredUtil;
import javax.annotation.Nullable;
public class InputParameterUtils {
@Nullable
- public static Object prepareInputParameterValue(InputPropertySpec inputProperty, Task task) {
- String propertyName = inputProperty.getPropertyName();
+ public static Object prepareInputParameterValue(Object work, String propertyName, Object value) {
try {
- return prepareInputParameterValue(inputProperty.getValue());
+ return prepareInputParameterValue(value);
} catch (Exception ex) {
- throw new PropertyEvaluationException(task, propertyName, ex);
+ throw new PropertyEvaluationException(work, propertyName, ex);
}
}
diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/PropertyValue.java b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/PropertyValue.java
index 6a299f97f19..237023bd2c3 100644
--- a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/PropertyValue.java
+++ b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/PropertyValue.java
@@ -17,6 +17,7 @@
package org.gradle.api.internal.tasks.properties;
import org.gradle.api.internal.tasks.TaskDependencyContainer;
+import org.gradle.internal.execution.UnitOfWork.ValueSupplier;
import javax.annotation.Nullable;
import java.util.concurrent.Callable;
@@ -24,13 +25,23 @@
/**
* A supplier of a property value.
*/
-public interface PropertyValue extends Callable<Object> {
+public interface PropertyValue extends ValueSupplier, Callable<Object> {
+
/**
* The value of the underlying property.
*/
@Nullable
@Override
- Object call();
+ Object getValue();
+
+ /**
+ * Must implement {@link Callable} in order for standard value resolution to work.
+ */
+ @Nullable
+ @Override
+ default Object call() {
+ return getValue();
+ }
/**
* Returns the dependencies of the property value, if supported by the value implementation. Returns an empty collection if not supported or the value has no producer tasks.
@@ -45,7 +56,7 @@ public interface PropertyValue extends Callable<Object> {
PropertyValue ABSENT = new PropertyValue() {
@Nullable
@Override
- public Object call() {
+ public Object getValue() {
return null;
}
diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/annotations/InputPropertyAnnotationHandler.java b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/annotations/InputPropertyAnnotationHandler.java
index 2d132882208..00ced4fe194 100755
--- a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/annotations/InputPropertyAnnotationHandler.java
+++ b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/annotations/InputPropertyAnnotationHandler.java
@@ -21,7 +21,9 @@
import org.gradle.api.file.FileCollection;
import org.gradle.api.file.RegularFile;
import org.gradle.api.file.RegularFileProperty;
+import org.gradle.api.internal.tasks.ResolvingPropertyValue;
import org.gradle.api.internal.tasks.properties.BeanPropertyContext;
+import org.gradle.api.internal.tasks.properties.InputParameterUtils;
import org.gradle.api.internal.tasks.properties.PropertyValue;
import org.gradle.api.internal.tasks.properties.PropertyVisitor;
import org.gradle.api.tasks.Input;
@@ -75,6 +77,11 @@ public void validatePropertyMetadata(PropertyMetadata propertyMetadata, TypeVali
validateNotPrimitiveType(propertyMetadata, validationContext, valueType);
}
+ @Override
+ public PropertyValue applyResolver(Object bean, String propertyName, PropertyValue delegate) {
+ return new ResolvingPropertyValue(delegate, value -> InputParameterUtils.prepareInputParameterValue(bean, propertyName, value));
+ }
+
private void validateNotPrimitiveType(PropertyMetadata propertyMetadata, TypeValidationContext validationContext, Class<?> valueType) {
if (valueType.isPrimitive() && propertyMetadata.isAnnotationPresent(Optional.class)) {
validationContext.visitPropertyProblem(problem ->
diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/annotations/NestedBeanAnnotationHandler.java b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/annotations/NestedBeanAnnotationHandler.java
index ba28a5fba2f..38ef440d62c 100644
--- a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/annotations/NestedBeanAnnotationHandler.java
+++ b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/annotations/NestedBeanAnnotationHandler.java
@@ -89,7 +89,7 @@ public InvalidValue(Exception exception) {
@Nullable
@Override
- public Object call() {
+ public Object getValue() {
throw UncheckedException.throwAsUncheckedException(exception);
}
diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/annotations/PropertyAnnotationHandler.java b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/annotations/PropertyAnnotationHandler.java
index 3376d8ddd64..ab710cebcb2 100644
--- a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/annotations/PropertyAnnotationHandler.java
+++ b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/annotations/PropertyAnnotationHandler.java
@@ -62,4 +62,11 @@ public interface PropertyAnnotationHandler {
* Visits problems associated with the given property, if any.
*/
default void validatePropertyMetadata(PropertyMetadata propertyMetadata, TypeValidationContext validationContext) {}
+
+ /**
+ * Resolves the property value.
+ */
+ default PropertyValue applyResolver(Object bean, String propertyName, PropertyValue value) {
+ return value;
+ }
}
diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/bean/AbstractNestedRuntimeBeanNode.java b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/bean/AbstractNestedRuntimeBeanNode.java
index 9acf2914594..9d1caf410ce 100644
--- a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/bean/AbstractNestedRuntimeBeanNode.java
+++ b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/bean/AbstractNestedRuntimeBeanNode.java
@@ -50,21 +50,25 @@ protected void visitProperties(PropertyVisitor visitor, final Queue<RuntimeBeanN
PropertyAnnotationHandler annotationHandler = typeMetadata.getAnnotationHandlerFor(propertyMetadata);
if (annotationHandler.shouldVisit(visitor)) {
String propertyName = getQualifiedPropertyName(propertyMetadata.getPropertyName());
- PropertyValue value = new BeanPropertyValue(getBean(), propertyMetadata.getGetterMethod());
+ Object bean = getBean();
+ PropertyValue value = annotationHandler.applyResolver(
+ bean,
+ propertyMetadata.getPropertyName(),
+ new BeanPropertyValue(bean, propertyMetadata.getGetterMethod()));
annotationHandler.visitPropertyValue(
propertyName,
value,
propertyMetadata,
visitor,
- (childPropertyName, bean) -> queue.add(nodeFactory.create(AbstractNestedRuntimeBeanNode.this, childPropertyName, bean))
+ (childPropertyName, nested) -> queue.add(nodeFactory.create(AbstractNestedRuntimeBeanNode.this, childPropertyName, nested))
);
}
}
}
private static class BeanPropertyValue implements PropertyValue {
- private final Method method;
private final Object bean;
+ private final Method method;
private final Supplier<Object> cachedInvoker = Suppliers.memoize(new Supplier<Object>() {
@Override
@Nullable
@@ -125,7 +129,7 @@ private boolean isBuildable() {
@Nullable
@Override
- public Object call() {
+ public Object getValue() {
return cachedInvoker.get();
}
}
diff --git a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/bean/NestedRuntimeBeanNode.java b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/bean/NestedRuntimeBeanNode.java
index 71e721b8afb..be237572d20 100644
--- a/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/bean/NestedRuntimeBeanNode.java
+++ b/subprojects/core/src/main/java/org/gradle/api/internal/tasks/properties/bean/NestedRuntimeBeanNode.java
@@ -87,7 +87,7 @@ public ImplementationPropertyValue(ImplementationValue implementationValue) {
}
@Override
- public Object call() {
+ public Object getValue() {
return implementationValue;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment