Implemented declared providers interface #1727 -- MOS_MIGRATED_REVID=133699895
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java index ca5aac4..718c67b 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/AbstractConfiguredTarget.java
@@ -22,9 +22,13 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.PackageSpecification; +import com.google.devtools.build.lib.packages.SkylarkClassObjectConstructor; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.syntax.ClassObject; +import com.google.devtools.build.lib.syntax.EvalException; +import com.google.devtools.build.lib.syntax.EvalUtils; import com.google.devtools.build.lib.syntax.SkylarkNestedSet; import javax.annotation.Nullable; @@ -115,6 +119,27 @@ } @Override + public Object getIndex(Object key, Location loc) throws EvalException { + if (!(key instanceof SkylarkClassObjectConstructor)) { + throw new EvalException(loc, String.format( + "Type Target only supports indexing by object constructors, got %s instead", + EvalUtils.getDataTypeName(key))); + } + SkylarkClassObjectConstructor constructor = (SkylarkClassObjectConstructor) key; + SkylarkProviders provider = getProvider(SkylarkProviders.class); + if (provider != null) { + Object declaredProvider = provider.getDeclaredProvider(constructor.getKey()); + if (declaredProvider != null) { + return declaredProvider; + } + } + // Either provider or declaredProvider is null + throw new EvalException(loc, String.format( + "Object of type Target doesn't contain declared provider %s", + constructor.getKey().getExportedName())); + } + + @Override public String errorMessage(String name) { return null; }
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 6dd8dd7..d1a9ece 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
@@ -18,7 +18,7 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; - +import com.google.devtools.build.lib.syntax.SkylarkIndexable; import javax.annotation.Nullable; /** @@ -52,7 +52,7 @@ + "These extra providers are defined in the <code>struct</code> returned by the rule " + "implementation function.</li>" + "</ul>") -public interface TransitiveInfoCollection { +public interface TransitiveInfoCollection extends SkylarkIndexable { /** * Returns the transitive information provider requested, or null if the provider is not found.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java index 596675f..ec184b4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java +++ b/src/main/java/com/google/devtools/build/lib/rules/AliasConfiguredTarget.java
@@ -26,11 +26,12 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.syntax.ClassObject; +import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.SkylarkNestedSet; import com.google.devtools.build.lib.util.Preconditions; - import javax.annotation.Nullable; /** @@ -75,6 +76,11 @@ } @Override + public Object getIndex(Object key, Location loc) throws EvalException { + return actual == null ? null : actual.getIndex(key, loc); + } + + @Override public Target getTarget() { return actual == null ? null : actual.getTarget(); }