Created
September 16, 2022 12:29
-
-
Save lptr/177bc69bc8eda7695fddadca70387c97 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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