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());
       }
     }
   }