Make all WithLegacySkylarkName providers declared providers.

RELNOTES: None.
PiperOrigin-RevId: 163343931
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
index 966471c..a5ad97e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.analysis;
 
-import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.actions.Artifact;
@@ -100,15 +99,19 @@
    */
   public static <S extends TransitiveInfoCollection, C extends TransitiveInfoProvider> Iterable<S>
       filterByProvider(Iterable<S> prerequisites, final Class<C> provider) {
-    return Iterables.filter(prerequisites, new Predicate<S>() {
-      @Override
-      public boolean apply(S target) {
-        return target.getProvider(provider) != null;
-      }
-    });
+    return Iterables.filter(prerequisites, target -> target.getProvider(provider) != null);
   }
 
   /**
+   * Returns the iterable of collections that have the specified provider.
+   */
+  public static <S extends TransitiveInfoCollection, C extends SkylarkClassObject> Iterable<S>
+  filterByProvider(Iterable<S> prerequisites, final NativeClassObjectConstructor<C> provider) {
+    return Iterables.filter(prerequisites, target -> target.get(provider) != null);
+  }
+
+
+  /**
    * Returns the path of the associated manifest file for the path of a Fileset. Works for both
    * exec paths and root relative paths.
    */
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
index 6bf2ee2..c4afb4f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
@@ -30,6 +30,7 @@
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.ClassObjectConstructor;
+import com.google.devtools.build.lib.packages.NativeClassObjectConstructor;
 import com.google.devtools.build.lib.packages.SkylarkClassObject;
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.packages.TargetUtils;
@@ -212,7 +213,6 @@
   public <T extends TransitiveInfoProvider> RuleConfiguredTargetBuilder addProvider(
       TransitiveInfoProvider provider) {
     providersBuilder.add(provider);
-    maybeAddSkylarkProvider(provider);
     return this;
   }
 
@@ -220,9 +220,6 @@
   public <T extends TransitiveInfoProvider> RuleConfiguredTargetBuilder addProviders(
       Iterable<TransitiveInfoProvider> providers) {
     providersBuilder.addAll(providers);
-    for (TransitiveInfoProvider provider : providers) {
-      maybeAddSkylarkProvider(provider);
-    }
     return this;
   }
 
@@ -250,14 +247,15 @@
     Preconditions.checkNotNull(key);
     Preconditions.checkNotNull(value);
     providersBuilder.put(key, value);
-    maybeAddSkylarkProvider(value);
     return this;
   }
 
-  protected <T extends TransitiveInfoProvider> void maybeAddSkylarkProvider(T value) {
-    if (value instanceof TransitiveInfoProvider.WithLegacySkylarkName) {
+  private <T extends TransitiveInfoProvider> void maybeAddSkylarkLegacyProvider(
+      SkylarkClassObject value) {
+    if (value.getConstructor() instanceof NativeClassObjectConstructor.WithLegacySkylarkName) {
       addSkylarkTransitiveInfo(
-          ((TransitiveInfoProvider.WithLegacySkylarkName) value).getSkylarkName(),
+          ((NativeClassObjectConstructor.WithLegacySkylarkName) value.getConstructor())
+              .getSkylarkName(),
           value);
     }
   }
@@ -328,6 +326,7 @@
     ClassObjectConstructor constructor = provider.getConstructor();
     Preconditions.checkState(constructor.isExported());
     providersBuilder.put(provider);
+    maybeAddSkylarkLegacyProvider(provider);
     return this;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 986a93b..80b2c4e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -902,6 +902,17 @@
   }
 
   /**
+   * Returns all the providers of the specified type that are listed under the specified attribute
+   * of this target in the BUILD file, and that contain the specified provider.
+   */
+  public <C extends SkylarkClassObject>
+  Iterable<? extends TransitiveInfoCollection> getPrerequisitesIf(
+      String attributeName, Mode mode, final NativeClassObjectConstructor<C> classType) {
+    return AnalysisUtils.filterByProvider(getPrerequisites(attributeName, mode), classType);
+  }
+
+
+  /**
    * Returns the prerequisite referred to by the specified attribute. Also checks whether
    * the attribute is marked as executable and that the target referred to can actually be
    * executed.
@@ -2094,7 +2105,7 @@
         String missingProviders = getMissingMandatoryProviders(prerequisite, attribute);
         if (missingProviders != null) {
           unfulfilledRequirements.add(
-              "'" + prerequisite.getLabel() + "' does not have mandatory provider "
+              "'" + prerequisite.getLabel() + "' does not have mandatory providers: "
                   + missingProviders);
           hadAllMandatoryProviders = false;
         }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProvider.java
index 9ee8933..f2b4919 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProvider.java
@@ -61,18 +61,4 @@
  */
 public interface TransitiveInfoProvider {
 
-  /**
-   * Implement this to mark that a native provider should be exported with
-   * certain name to Skylark.
-   * Broken: only works for rules, not for aspects.
-   * DO NOT USE FOR NEW CODE!
-   *
-   * Use native declared providers
-   * ({@link com.google.devtools.build.lib.packages.NativeClassObjectConstructor}) to
-   * expose providers to both native and Skylark code.
-   */
-  @Deprecated
-  interface WithLegacySkylarkName {
-    String getSkylarkName();
-  }
 }