Make aspects support SkylarkApiProviders.
These are initialised with a TransitiveInfoCollection, which aspects do not implement. By fiddling with the interfaces we can pull out a ProviderCollection which is sufficient for a SkylarkApiProvider to operate.
RELNOTES: None
PiperOrigin-RevId: 215441598
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
index a87bdde..5c01533 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
@@ -26,6 +26,7 @@
import com.google.devtools.build.lib.actions.Actions.GeneratingActions;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
+import com.google.devtools.build.lib.analysis.skylark.SkylarkApiProvider;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
@@ -76,6 +77,14 @@
this.actions = actions;
this.generatingActionIndex = generatingActionIndex;
this.providers = providers;
+
+ // Initialize every SkylarkApiProvider
+ for (int i = 0; i < providers.getProviderCount(); i++) {
+ Object obj = providers.getProviderInstanceAt(i);
+ if (obj instanceof SkylarkApiProvider) {
+ ((SkylarkApiProvider) obj).init(providers);
+ }
+ }
}
/**
@@ -125,14 +134,14 @@
}
public InfoInterface get(Provider.Key key) {
- return providers.getProvider(key);
+ return providers.get(key);
}
public Object get(String legacyKey) {
if (OutputGroupInfo.SKYLARK_NAME.equals(legacyKey)) {
return get(OutputGroupInfo.SKYLARK_CONSTRUCTOR.getKey());
}
- return providers.getProvider(legacyKey);
+ return providers.get(legacyKey);
}
public static ConfiguredAspect forAlias(ConfiguredAspect real) {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/SkylarkProviderCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/ProviderCollection.java
similarity index 90%
rename from src/main/java/com/google/devtools/build/lib/analysis/SkylarkProviderCollection.java
rename to src/main/java/com/google/devtools/build/lib/analysis/ProviderCollection.java
index c30e12a..dced6a4 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/SkylarkProviderCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ProviderCollection.java
@@ -25,7 +25,13 @@
* Interface to mark classes that could contain transitive information added using the Skylark
* framework.
*/
-public interface SkylarkProviderCollection {
+public interface ProviderCollection {
+ /**
+ * Returns the transitive information provider requested, or null if the provider is not found.
+ * The provider has to be a TransitiveInfoProvider Java class.
+ */
+ @Nullable
+ <P extends TransitiveInfoProvider> P getProvider(Class<P> provider);
/**
* Returns the transitive information requested or null, if the information is not found. The
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java
index 1ba59847..75f253c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoCollection.java
@@ -45,7 +45,7 @@
* @see TransitiveInfoProvider
*/
public interface TransitiveInfoCollection
- extends SkylarkIndexable, SkylarkProviderCollection, TransitiveInfoCollectionApi {
+ extends SkylarkIndexable, ProviderCollection, TransitiveInfoCollectionApi {
@Override
default SkylarkNestedSet outputGroup(String group) {
@@ -57,12 +57,6 @@
}
/**
- * Returns the transitive information provider requested, or null if the provider is not found.
- * The provider has to be a TransitiveInfoProvider Java class.
- */
- @Nullable <P extends TransitiveInfoProvider> P getProvider(Class<P> provider);
-
- /**
* Returns the label associated with this prerequisite.
*/
Label getLabel();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java
index 29923da..91b3249 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java
@@ -16,8 +16,6 @@
import com.google.devtools.build.lib.packages.InfoInterface;
import com.google.devtools.build.lib.packages.Provider;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
-import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
/**
@@ -37,37 +35,7 @@
* </ul>
*/
@Immutable
-public interface TransitiveInfoProviderMap {
- /** Returns the instance for the provided providerClass, or {@code null} if not present. */
- @Nullable
- <P extends TransitiveInfoProvider> P getProvider(Class<P> providerClass);
-
- /**
- * Returns the instance of declared provider with the given {@code key}, or {@code null} if not
- * present.
- */
- @Nullable
- InfoInterface getProvider(Provider.Key key);
-
- /**
- * Returns the instance of a legacy Skylark with the given name, or {@code null} if not present.
- *
- * todo(dslomov,skylark): remove this as part of legacy provider removal.
- */
- @Nullable
- Object getProvider(String legacyKey);
-
- /**
- * Helper method to access SKylark provider with a give {@code id} and validate its type.
- */
- @Nullable
- default <T> T getProvider(
- SkylarkProviderIdentifier id, Class<T> result) {
- return result.cast(
- id.isLegacy() ? this.getProvider(id.getLegacyId()) : this.getProvider(id.getKey())
- );
- }
-
+public interface TransitiveInfoProviderMap extends ProviderCollection {
/**
* Returns a count of providers.
*
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImpl.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImpl.java
index 4ae87bf..1b5aa39 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImpl.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImpl.java
@@ -62,14 +62,14 @@
@Nullable
@Override
- public InfoInterface getProvider(Provider.Key key) {
- return (InfoInterface) get(key);
+ public InfoInterface get(Provider.Key key) {
+ return (InfoInterface) super.get(key);
}
@Nullable
@Override
- public Object getProvider(String legacyKey) {
- return get(legacyKey);
+ public Object get(String legacyKey) {
+ return super.get(legacyKey);
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/FileConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/FileConfiguredTarget.java
index dc96f65..1082572 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/FileConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/FileConfiguredTarget.java
@@ -87,11 +87,11 @@
@Override
protected InfoInterface rawGetSkylarkProvider(Provider.Key providerKey) {
- return providers.getProvider(providerKey);
+ return providers.get(providerKey);
}
@Override
protected Object rawGetSkylarkProvider(String providerKey) {
- return providers.getProvider(providerKey);
+ return providers.get(providerKey);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/MergedConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/MergedConfiguredTarget.java
index 5a421df..2924efa 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/MergedConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/MergedConfiguredTarget.java
@@ -92,7 +92,7 @@
@Override
protected InfoInterface rawGetSkylarkProvider(Provider.Key providerKey) {
- InfoInterface provider = providers.getProvider(providerKey);
+ InfoInterface provider = providers.get(providerKey);
if (provider == null) {
provider = base.get(providerKey);
}
@@ -111,7 +111,7 @@
}
return actions.build();
}
- Object provider = providers.getProvider(providerKey);
+ Object provider = providers.get(providerKey);
if (provider == null) {
provider = base.get(providerKey);
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java
index 2314b43..d5c5a17 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java
@@ -212,7 +212,7 @@
@Override
protected InfoInterface rawGetSkylarkProvider(Provider.Key providerKey) {
- return providers.getProvider(providerKey);
+ return providers.get(providerKey);
}
@Override
@@ -220,7 +220,7 @@
if (providerKey.equals(ACTIONS_FIELD_NAME)) {
return actions;
}
- return providers.getProvider(providerKey);
+ return providers.get(providerKey);
}
@Override
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/platform/BUILD
index 5c7362f..3c2a22c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/BUILD
@@ -36,7 +36,7 @@
srcs = UTIL_SRCS,
deps = [
":platform",
- "//src/main/java/com/google/devtools/build/lib:skylark-provider-collection",
+ "//src/main/java/com/google/devtools/build/lib:provider-collection",
"//third_party:guava",
],
)
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformProviderUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformProviderUtils.java
index e2c39cc..f38d62c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformProviderUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformProviderUtils.java
@@ -15,46 +15,45 @@
package com.google.devtools.build.lib.analysis.platform;
import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.analysis.SkylarkProviderCollection;
+import com.google.devtools.build.lib.analysis.ProviderCollection;
/** Utility methods to help locate platform-related providers. */
public class PlatformProviderUtils {
/** Retrieves and casts the {@link PlatformInfo} provider from the given target. */
- public static PlatformInfo platform(SkylarkProviderCollection target) {
+ public static PlatformInfo platform(ProviderCollection target) {
return target.get(PlatformInfo.PROVIDER);
}
/** Retrieves and casts {@link PlatformInfo} providers from the given targets. */
- public static Iterable<PlatformInfo> platforms(
- Iterable<? extends SkylarkProviderCollection> targets) {
+ public static Iterable<PlatformInfo> platforms(Iterable<? extends ProviderCollection> targets) {
return Iterables.transform(targets, PlatformProviderUtils::platform);
}
/** Retrieves and casts the {@link ConstraintSettingInfo} provider from the given target. */
- public static ConstraintSettingInfo constraintSetting(SkylarkProviderCollection target) {
+ public static ConstraintSettingInfo constraintSetting(ProviderCollection target) {
return target.get(ConstraintSettingInfo.PROVIDER);
}
/** Retrieves and casts {@link ConstraintSettingInfo} providers from the given targets. */
public static Iterable<ConstraintSettingInfo> constraintSettings(
- Iterable<? extends SkylarkProviderCollection> targets) {
+ Iterable<? extends ProviderCollection> targets) {
return Iterables.transform(targets, PlatformProviderUtils::constraintSetting);
}
/** Retrieves and casts the {@link ConstraintValueInfo} provider from the given target. */
- public static ConstraintValueInfo constraintValue(SkylarkProviderCollection target) {
+ public static ConstraintValueInfo constraintValue(ProviderCollection target) {
return target.get(ConstraintValueInfo.PROVIDER);
}
/** Retrieves and casts {@link ConstraintValueInfo} providers from the given targets. */
public static Iterable<ConstraintValueInfo> constraintValues(
- Iterable<? extends SkylarkProviderCollection> targets) {
+ Iterable<? extends ProviderCollection> targets) {
return Iterables.transform(targets, PlatformProviderUtils::constraintValue);
}
/** Retrieves and casts the {@link ToolchainInfo} provider from the given target. */
- public static ToolchainInfo toolchain(SkylarkProviderCollection target) {
+ public static ToolchainInfo toolchain(ProviderCollection target) {
return target.get(ToolchainInfo.PROVIDER);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkApiProvider.java
index d0f4017..d47aff9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkApiProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkApiProvider.java
@@ -15,20 +15,20 @@
package com.google.devtools.build.lib.analysis.skylark;
import com.google.common.base.Preconditions;
-import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
+import com.google.devtools.build.lib.analysis.ProviderCollection;
/**
* An abstract class for adding a Skylark API for the native providers. Derived classes should
* declare functions to be used from Skylark.
*/
public abstract class SkylarkApiProvider {
- private TransitiveInfoCollection info;
+ private ProviderCollection info;
- protected TransitiveInfoCollection getInfo() {
+ protected ProviderCollection getInfo() {
return info;
}
- public final void init(TransitiveInfoCollection info) {
+ public final void init(ProviderCollection info) {
if (this.info != null) {
// todo(dslomov): nuke this weird initialization mechanism.