Aspects propagating other aspects
This CL adds a new parameter to the `aspect()` API called `requires` guarded by `experimental_required_aspects` flag. Through this parameter we can specify a list of aspects needed by the aspect being defined to be propagated before it to the targets it operates on.
Aspects can only require Starlark defined aspects.
PiperOrigin-RevId: 377473191
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Aspect.java b/src/main/java/com/google/devtools/build/lib/packages/Aspect.java
index 716f6b8..c83d2f6 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Aspect.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Aspect.java
@@ -17,6 +17,7 @@
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext;
import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
@@ -71,6 +72,36 @@
this.aspectDefinition = Preconditions.checkNotNull(aspectDefinition);
}
+ private Aspect(
+ AspectClass aspectClass,
+ AspectDefinition aspectDefinition,
+ AspectParameters parameters,
+ RequiredProviders inheritedRequiredProviders,
+ ImmutableSet<String> inheritedAttributeAspects) {
+ this.aspectDescriptor =
+ new AspectDescriptor(
+ Preconditions.checkNotNull(aspectClass),
+ Preconditions.checkNotNull(parameters),
+ Preconditions.checkNotNull(inheritedRequiredProviders),
+ inheritedAttributeAspects);
+ this.aspectDefinition = Preconditions.checkNotNull(aspectDefinition);
+ }
+
+ public static Aspect forNative(
+ NativeAspectClass nativeAspectClass,
+ AspectParameters parameters,
+ RequiredProviders inheritedRequiredProviders,
+ ImmutableSet<String> inheritedAttributeAspects) {
+ AspectDefinition definition =
+ definitionCache.getUnchecked(nativeAspectClass).getUnchecked(parameters);
+ return new Aspect(
+ nativeAspectClass,
+ definition,
+ parameters,
+ inheritedRequiredProviders,
+ inheritedAttributeAspects);
+ }
+
public static Aspect forNative(
NativeAspectClass nativeAspectClass, AspectParameters parameters) {
AspectDefinition definition =
@@ -85,8 +116,15 @@
public static Aspect forStarlark(
StarlarkAspectClass starlarkAspectClass,
AspectDefinition aspectDefinition,
- AspectParameters parameters) {
- return new Aspect(starlarkAspectClass, aspectDefinition, parameters);
+ AspectParameters parameters,
+ RequiredProviders inheritedRequiredProviders,
+ ImmutableSet<String> inheritedAttributeAspects) {
+ return new Aspect(
+ starlarkAspectClass,
+ aspectDefinition,
+ parameters,
+ inheritedRequiredProviders,
+ inheritedAttributeAspects);
}
/**
@@ -153,7 +191,9 @@
return forStarlark(
(StarlarkAspectClass) aspectDescriptor.getAspectClass(),
aspectDefinition,
- aspectDescriptor.getParameters());
+ aspectDescriptor.getParameters(),
+ aspectDescriptor.getInheritedRequiredProviders(),
+ aspectDescriptor.getInheritedAttributeAspects());
}
}
}