aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java
diff options
context:
space:
mode:
authorGravatar dslomov <dslomov@google.com>2017-07-05 07:23:31 -0400
committerGravatar John Cater <jcater@google.com>2017-07-05 10:58:56 -0400
commitf6a7e5a39ee5669c0fdfce93032cab45d6c89358 (patch)
tree9905a5e85f19a94eb4cd0082d6a146d9e06a0c3b /src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java
parent2843eadf4c1d9175c60d32ffd2cba2100256c1fd (diff)
Use the same data structure for native and Skylark providers.
The memory cost of adding Skylark provider is now the same as native. Skylark providers (declared and legacy) benefit from the same shape-sharing optimization as native providers. RELNOTES: None. PiperOrigin-RevId: 160944263
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMap.java70
1 files changed, 66 insertions, 4 deletions
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 96f9cb7cab..d8fa9ae4ae 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
@@ -14,19 +14,81 @@
package com.google.devtools.build.lib.analysis;
+import com.google.devtools.build.lib.packages.ClassObjectConstructor;
+import com.google.devtools.build.lib.packages.SkylarkClassObject;
+import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
-/** Provides a mapping between a TransitiveInfoProvider class and an instance. */
+/**
+ * Provides a mapping between an identifier for transitive information and its instance.
+ * (between provider identifier and provider instance)
+ *
+ * We have three kinds of provider identifiers:
+ * <ul>
+ * <li>Declared providers. They are exposed to Skylark and identified by
+ * {@link ClassObjectConstructor.Key}. Provider instances are {@link SkylarkClassObject}s.</li>
+ * <li>Native providers. They are identified by their {@link Class} and their instances
+ * are instances of that class. They should implement {@link TransitiveInfoProvider} marker
+ * interface.
+ * </li>
+ * <li>Legacy Skylark providers (deprecated). They are identified by simple strings,
+ * and their instances are more-less random objects.</li>
+ * </ul>
+ */
@Immutable
public interface TransitiveInfoProviderMap {
- /** Returns the instance for the provided providerClass, or <tt>null</tt> if not present. */
+ /** 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
+ SkylarkClassObject getProvider(ClassObjectConstructor.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())
+ );
+ }
+
+ /**
+ * Returns a count of providers.
+ *
+ * Upper bound for {@code index} in {@link #getProviderKeyAt(int index)}
+ * and {@link #getProviderInstanceAt(int index)} }.
+ *
+ * Low-level method, use with care.
+ */
int getProviderCount();
- Class<? extends TransitiveInfoProvider> getProviderClassAt(int i);
+ /**
+ * Return value is one of:
+ * <ul>
+ * <li>{@code Class<? extends TransitiveInfoProvider>}</li>
+ * <li>String</li>
+ * <li>{@link ClassObjectConstructor.Key}</li>
+ * </ul>
+ *
+ * Low-level method, use with care.
+ */
+ Object getProviderKeyAt(int index);
- TransitiveInfoProvider getProviderAt(int i);
+ Object getProviderInstanceAt(int index);
}