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