Make TransitiveInfoProviderMap an interface.

PiperOrigin-RevId: 155125357
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 116df61..25f2026 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
@@ -130,7 +130,7 @@
   }
 
   public static ConfiguredAspect forNonapplicableTarget(AspectDescriptor descriptor) {
-    return new ConfiguredAspect(descriptor, TransitiveInfoProviderMap.of());
+    return new ConfiguredAspect(descriptor, new TransitiveInfoProviderMapBuilder().add().build());
   }
 
   public static Builder builder(
@@ -142,7 +142,8 @@
    * Builder for {@link ConfiguredAspect}.
    */
   public static class Builder {
-    private final TransitiveInfoProviderMap.Builder providers = TransitiveInfoProviderMap.builder();
+    private final TransitiveInfoProviderMapBuilder providers =
+        new TransitiveInfoProviderMapBuilder();
     private final Map<String, NestedSetBuilder<Artifact>> outputGroupBuilders = new TreeMap<>();
     private final ImmutableMap.Builder<String, Object> skylarkProviderBuilder =
         ImmutableMap.builder();
@@ -174,7 +175,7 @@
     /** Adds a provider to the aspect. */
     public Builder addProvider(TransitiveInfoProvider provider) {
       Preconditions.checkNotNull(provider);
-      addProvider(TransitiveInfoProviderMap.getEffectiveProviderClass(provider), provider);
+      addProvider(TransitiveInfoProviderEffectiveClassHelper.get(provider), provider);
       return this;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/FileConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/FileConfiguredTarget.java
index 7f3f9f6..399ef6a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/FileConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/FileConfiguredTarget.java
@@ -40,8 +40,8 @@
     FileProvider fileProvider = new FileProvider(filesToBuild);
     FilesToRunProvider filesToRunProvider =
         FilesToRunProvider.fromSingleExecutableArtifact(artifact);
-    TransitiveInfoProviderMap.Builder builder =
-        TransitiveInfoProviderMap.builder()
+    TransitiveInfoProviderMapBuilder builder =
+        new TransitiveInfoProviderMapBuilder()
             .put(VisibilityProvider.class, this)
             .put(LicensesProvider.class, this)
             .add(fileProvider)
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java
index aff014f..f2a8781 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java
@@ -78,7 +78,7 @@
     ExtraActionArtifactsProvider mergedExtraActionProviders = ExtraActionArtifactsProvider.merge(
         getAllProviders(base, aspects, ExtraActionArtifactsProvider.class));
 
-    TransitiveInfoProviderMap.Builder aspectProviders = TransitiveInfoProviderMap.builder();
+    TransitiveInfoProviderMapBuilder aspectProviders = new TransitiveInfoProviderMapBuilder();
     if (mergedOutputGroupProvider != null) {
       aspectProviders.add(mergedOutputGroupProvider);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTarget.java
index 7c285aa..4c0785e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTarget.java
@@ -52,7 +52,7 @@
     super(ruleContext);
     // We don't use ImmutableMap.Builder here to allow augmenting the initial list of 'default'
     // providers by passing them in.
-    TransitiveInfoProviderMap.Builder providerBuilder = providers.toBuilder();
+    TransitiveInfoProviderMapBuilder providerBuilder = providers.toBuilder();
     Preconditions.checkState(providerBuilder.contains(RunfilesProvider.class));
     Preconditions.checkState(providerBuilder.contains(FileProvider.class));
     Preconditions.checkState(providerBuilder.contains(FilesToRunProvider.class));
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 512f576..a0bf3ad 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
@@ -58,8 +58,8 @@
  */
 public final class RuleConfiguredTargetBuilder {
   private final RuleContext ruleContext;
-  private final TransitiveInfoProviderMap.Builder providersBuilder =
-      TransitiveInfoProviderMap.builder();
+  private final TransitiveInfoProviderMapBuilder providersBuilder =
+      new TransitiveInfoProviderMapBuilder();
   private final ImmutableMap.Builder<String, Object> skylarkProviders = ImmutableMap.builder();
   private final ImmutableMap.Builder<ClassObjectConstructor.Key, SkylarkClassObject>
       skylarkDeclaredProviders = ImmutableMap.builder();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderEffectiveClassHelper.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderEffectiveClassHelper.java
new file mode 100644
index 0000000..c92072f
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderEffectiveClassHelper.java
@@ -0,0 +1,93 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.analysis;
+
+import com.google.common.base.Joiner;
+import com.google.common.base.Verify;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.devtools.build.lib.util.Preconditions;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+/**
+ * Provides the effective class for the provider. The effective class is inferred as the sole class
+ * in the provider's inheritence hierarchy that implements {@link TransitiveInfoProvider} directly.
+ * This allows for simple subclasses such as those created by AutoValue, but will fail if there's
+ * any ambiguity as to which implementor of the {@link TransitiveInfoProvider} is intended. If the
+ * provider implements multiple TransitiveInfoProvider interfaces, prefer the explicit put builder
+ * methods.
+ */
+class TransitiveInfoProviderEffectiveClassHelper {
+
+  private TransitiveInfoProviderEffectiveClassHelper() {}
+
+  private static final LoadingCache<
+          Class<? extends TransitiveInfoProvider>, Class<? extends TransitiveInfoProvider>>
+      EFFECTIVE_PROVIDER_CLASS_CACHE =
+          CacheBuilder.newBuilder()
+              .build(
+                  new CacheLoader<
+                      Class<? extends TransitiveInfoProvider>,
+                      Class<? extends TransitiveInfoProvider>>() {
+
+                    private Set<Class<? extends TransitiveInfoProvider>> getDirectImplementations(
+                        Class<? extends TransitiveInfoProvider> providerClass) {
+                      Set<Class<? extends TransitiveInfoProvider>> result = new LinkedHashSet<>();
+                      for (Class<?> clazz : providerClass.getInterfaces()) {
+                        if (TransitiveInfoProvider.class.equals(clazz)) {
+                          result.add(providerClass);
+                        } else if (TransitiveInfoProvider.class.isAssignableFrom(clazz)) {
+                          result.addAll(
+                              getDirectImplementations(
+                                  (Class<? extends TransitiveInfoProvider>) clazz));
+                        }
+                      }
+
+                      Class<?> superclass = providerClass.getSuperclass();
+                      if (superclass != null
+                          && TransitiveInfoProvider.class.isAssignableFrom(superclass)) {
+                        result.addAll(
+                            getDirectImplementations(
+                                (Class<? extends TransitiveInfoProvider>) superclass));
+                      }
+                      return result;
+                    }
+
+                    @Override
+                    public Class<? extends TransitiveInfoProvider> load(
+                        Class<? extends TransitiveInfoProvider> providerClass) {
+                      Set<Class<? extends TransitiveInfoProvider>> result =
+                          getDirectImplementations(providerClass);
+                      Verify.verify(!result.isEmpty()); // impossible
+                      Preconditions.checkState(
+                          result.size() == 1,
+                          "Effective provider class for %s is ambiguous (%s), specify explicitly.",
+                          providerClass,
+                          Joiner.on(',').join(result));
+                      return result.iterator().next();
+                    }
+                  });
+
+  // TODO(arielb): see if these can be made private?
+  static <T extends TransitiveInfoProvider> Class<T> get(T provider) {
+    return get((Class<T>) provider.getClass());
+  }
+
+  static <T extends TransitiveInfoProvider> Class<T> get(Class<T> providerClass) {
+    return (Class<T>) EFFECTIVE_PROVIDER_CLASS_CACHE.getUnchecked(providerClass);
+  }
+}
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 f046090..6319cf7 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,179 +14,24 @@
 
 package com.google.devtools.build.lib.analysis;
 
-import com.google.common.base.Joiner;
-import com.google.common.base.Verify;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
 import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.util.Preconditions;
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
 import java.util.Map;
-import java.util.Set;
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.Immutable;
 
 /** Provides a mapping between a TransitiveInfoProvider class and an instance. */
 @Immutable
-public final class TransitiveInfoProviderMap {
-
-  private final ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> map;
-
-  private TransitiveInfoProviderMap(
-      ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> map) {
-    this.map = map;
-  }
-
-  /** Initializes a {@link TransitiveInfoProviderMap} from the instances provided. */
-  public static TransitiveInfoProviderMap of(TransitiveInfoProvider... providers) {
-    return builder().add(providers).build();
-  }
+public interface TransitiveInfoProviderMap {
 
   /** Returns the instance for the provided providerClass, or <tt>null</tt> if not present. */
   @Nullable
-  public <P extends TransitiveInfoProvider> P getProvider(Class<P> providerClass) {
-    return (P) map.get(getEffectiveProviderClass(providerClass));
-  }
+  <P extends TransitiveInfoProvider> P getProvider(Class<P> providerClass);
 
-  public ImmutableSet<Map.Entry<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>>
-      entrySet() {
-    return map.entrySet();
-  }
+  ImmutableSet<Map.Entry<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>>
+      entrySet();
 
-  public ImmutableCollection<TransitiveInfoProvider> values() {
-    return map.values();
-  }
+  ImmutableCollection<TransitiveInfoProvider> values();
 
-  public Builder toBuilder() {
-    return builder().addAll(map.values());
-  }
-
-  public static Builder builder() {
-    return new Builder();
-  }
-
-  /** A builder for {@link TransitiveInfoProviderMap}. */
-  public static class Builder {
-
-    // TODO(arielb): share the instance with the outerclass and copy on write instead?
-    private final LinkedHashMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>
-        providers = new LinkedHashMap();
-
-    /**
-     * Returns <tt>true</tt> if a {@link TransitiveInfoProvider} has been added for the class
-     * provided.
-     */
-    public boolean contains(Class<? extends TransitiveInfoProvider> providerClass) {
-      return providers.containsKey(providerClass);
-    }
-
-    public <T extends TransitiveInfoProvider> Builder put(
-        Class<? extends T> providerClass, T provider) {
-      Preconditions.checkNotNull(providerClass);
-      Preconditions.checkNotNull(provider);
-      // TODO(arielb): throw an exception if the providerClass is already present?
-      // This is enforced by aspects but RuleConfiguredTarget presents violations
-      // particularly around LicensesProvider
-      providers.put(providerClass, provider);
-      return this;
-    }
-
-    public Builder add(TransitiveInfoProvider provider) {
-      return put(getEffectiveProviderClass(provider), provider);
-    }
-
-    public Builder add(TransitiveInfoProvider... providers) {
-      return addAll(Arrays.asList(providers));
-    }
-
-    public Builder addAll(TransitiveInfoProviderMap providers) {
-      return addAll(providers.values());
-    }
-
-    public Builder addAll(Iterable<TransitiveInfoProvider> providers) {
-      for (TransitiveInfoProvider provider : providers) {
-        add(provider);
-      }
-      return this;
-    }
-
-    @Nullable
-    public <P extends TransitiveInfoProvider> P getProvider(Class<P> providerClass) {
-      return (P) providers.get(providerClass);
-    }
-
-    public TransitiveInfoProviderMap build() {
-      return new TransitiveInfoProviderMap(ImmutableMap.copyOf(providers));
-    }
-  }
-
-  private static final LoadingCache<
-          Class<? extends TransitiveInfoProvider>, Class<? extends TransitiveInfoProvider>>
-      EFFECTIVE_PROVIDER_CLASS_CACHE =
-          CacheBuilder.newBuilder()
-              .build(
-                  new CacheLoader<
-                      Class<? extends TransitiveInfoProvider>,
-                      Class<? extends TransitiveInfoProvider>>() {
-
-                    private Set<Class<? extends TransitiveInfoProvider>> getDirectImplementations(
-                        Class<? extends TransitiveInfoProvider> providerClass) {
-                      Set<Class<? extends TransitiveInfoProvider>> result = new LinkedHashSet<>();
-                      for (Class<?> clazz : providerClass.getInterfaces()) {
-                        if (TransitiveInfoProvider.class.equals(clazz)) {
-                          result.add(providerClass);
-                        } else if (TransitiveInfoProvider.class.isAssignableFrom(clazz)) {
-                          result.addAll(
-                              getDirectImplementations(
-                                  (Class<? extends TransitiveInfoProvider>) clazz));
-                        }
-                      }
-
-                      Class<?> superclass = providerClass.getSuperclass();
-                      if (superclass != null
-                          && TransitiveInfoProvider.class.isAssignableFrom(superclass)) {
-                        result.addAll(
-                            getDirectImplementations(
-                                (Class<? extends TransitiveInfoProvider>) superclass));
-                      }
-                      return result;
-                    }
-
-                    @Override
-                    public Class<? extends TransitiveInfoProvider> load(
-                        Class<? extends TransitiveInfoProvider> providerClass) {
-                      Set<Class<? extends TransitiveInfoProvider>> result =
-                          getDirectImplementations(providerClass);
-                      Verify.verify(!result.isEmpty()); // impossible
-                      Preconditions.checkState(
-                          result.size() == 1,
-                          "Effective provider class for %s is ambiguous (%s), specify explicitly.",
-                          providerClass,
-                          Joiner.on(',').join(result));
-                      return result.iterator().next();
-                    }
-                  });
-
-  /**
-   * Provides the effective class for the provider. The effective class is inferred as the sole
-   * class in the provider's inheritence hierarchy that implements {@link TransitiveInfoProvider}
-   * directly. This allows for simple subclasses such as those created by AutoValue, but will fail
-   * if there's any ambiguity as to which implementor of the {@link TransitiveInfoProvider} is
-   * intended. If the provider implements multiple TransitiveInfoProvider interfaces, prefer the
-   * explicit put builder methods.
-   */
-  // TODO(arielb): see if these can be made private?
-  static <T extends TransitiveInfoProvider> Class<T> getEffectiveProviderClass(T provider) {
-    return getEffectiveProviderClass((Class<T>) provider.getClass());
-  }
-
-  private static <T extends TransitiveInfoProvider> Class<T> getEffectiveProviderClass(
-      Class<T> providerClass) {
-    return (Class<T>) EFFECTIVE_PROVIDER_CLASS_CACHE.getUnchecked(providerClass);
-  }
+  TransitiveInfoProviderMapBuilder toBuilder();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java
new file mode 100644
index 0000000..ac68e3b
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapBuilder.java
@@ -0,0 +1,76 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.analysis;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.util.Preconditions;
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import javax.annotation.Nullable;
+
+/** A builder for {@link TransitiveInfoProviderMap}. */
+public class TransitiveInfoProviderMapBuilder {
+
+  // TODO(arielb): share the instance with the outerclass and copy on write instead?
+  private final LinkedHashMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>
+      providers = new LinkedHashMap();
+
+  /**
+   * Returns <tt>true</tt> if a {@link TransitiveInfoProvider} has been added for the class
+   * provided.
+   */
+  public boolean contains(Class<? extends TransitiveInfoProvider> providerClass) {
+    return providers.containsKey(providerClass);
+  }
+
+  public <T extends TransitiveInfoProvider> TransitiveInfoProviderMapBuilder put(
+      Class<? extends T> providerClass, T provider) {
+    Preconditions.checkNotNull(providerClass);
+    Preconditions.checkNotNull(provider);
+    // TODO(arielb): throw an exception if the providerClass is already present?
+    // This is enforced by aspects but RuleConfiguredTarget presents violations
+    // particularly around LicensesProvider
+    providers.put(providerClass, provider);
+    return this;
+  }
+
+  public TransitiveInfoProviderMapBuilder add(TransitiveInfoProvider provider) {
+    return put(TransitiveInfoProviderEffectiveClassHelper.get(provider), provider);
+  }
+
+  public TransitiveInfoProviderMapBuilder add(TransitiveInfoProvider... providers) {
+    return addAll(Arrays.asList(providers));
+  }
+
+  public TransitiveInfoProviderMapBuilder addAll(TransitiveInfoProviderMap providers) {
+    return addAll(providers.values());
+  }
+
+  public TransitiveInfoProviderMapBuilder addAll(Iterable<TransitiveInfoProvider> providers) {
+    for (TransitiveInfoProvider provider : providers) {
+      add(provider);
+    }
+    return this;
+  }
+
+  @Nullable
+  public <P extends TransitiveInfoProvider> P getProvider(Class<P> providerClass) {
+    return (P) providers.get(providerClass);
+  }
+
+  public TransitiveInfoProviderMap build() {
+    return new TransitiveInfoProviderMapImmutableMapBased(ImmutableMap.copyOf(providers));
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImmutableMapBased.java b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImmutableMapBased.java
new file mode 100644
index 0000000..dcf2707
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TransitiveInfoProviderMapImmutableMapBased.java
@@ -0,0 +1,57 @@
+// Copyright 2014 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.analysis;
+
+import com.google.common.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import java.util.Map;
+import javax.annotation.Nullable;
+import javax.annotation.concurrent.Immutable;
+
+/** Provides a mapping between a TransitiveInfoProvider class and an instance. */
+@Immutable
+final class TransitiveInfoProviderMapImmutableMapBased implements TransitiveInfoProviderMap {
+
+  private final ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> map;
+
+  TransitiveInfoProviderMapImmutableMapBased(
+      ImmutableMap<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider> map) {
+    this.map = map;
+  }
+
+  /** Returns the instance for the provided providerClass, or <tt>null</tt> if not present. */
+  @Override
+  @Nullable
+  public <P extends TransitiveInfoProvider> P getProvider(Class<P> providerClass) {
+    return (P) map.get(TransitiveInfoProviderEffectiveClassHelper.get(providerClass));
+  }
+
+  @Override
+  public ImmutableSet<Map.Entry<Class<? extends TransitiveInfoProvider>, TransitiveInfoProvider>>
+      entrySet() {
+    return map.entrySet();
+  }
+
+  @Override
+  public ImmutableCollection<TransitiveInfoProvider> values() {
+    return map.values();
+  }
+
+  @Override
+  public TransitiveInfoProviderMapBuilder toBuilder() {
+    return new TransitiveInfoProviderMapBuilder().addAll(map.values());
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
index 3aaab4d..ca2595d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibraryHelper.java
@@ -35,6 +35,7 @@
 import com.google.devtools.build.lib.analysis.RunfilesProvider;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder;
 import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -182,7 +183,7 @@
    * context.
    */
   public static final class Info {
-    private final TransitiveInfoProviderMap.Builder providers;
+    private final TransitiveInfoProviderMapBuilder providers;
     private final ImmutableMap<String, NestedSet<Artifact>> outputGroups;
     private final CcCompilationOutputs compilationOutputs;
     private final CcLinkingOutputs linkingOutputs;
@@ -1038,8 +1039,8 @@
 
     // By very careful when adding new providers here - it can potentially affect a lot of rules.
     // We should consider merging most of these providers into a single provider.
-    TransitiveInfoProviderMap.Builder providers =
-        TransitiveInfoProviderMap.builder()
+    TransitiveInfoProviderMapBuilder providers =
+        new TransitiveInfoProviderMapBuilder()
             .add(
                 new CppRunfilesProvider(cppStaticRunfiles, cppSharedRunfiles),
                 cppCompilationContext,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java
index ff419be..239d991 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.ClassObjectConstructor;
 import com.google.devtools.build.lib.packages.NativeClassObjectConstructor;
@@ -170,14 +171,14 @@
    * A Builder for {@link JavaProvider}.
    */
   public static class Builder {
-    TransitiveInfoProviderMap.Builder providerMap;
-   
-    private Builder(TransitiveInfoProviderMap.Builder providerMap) {
+    TransitiveInfoProviderMapBuilder providerMap;
+
+    private Builder(TransitiveInfoProviderMapBuilder providerMap) {
       this.providerMap = providerMap;
     }
 
     public static Builder create() {
-      return new Builder(new TransitiveInfoProviderMap.Builder());
+      return new Builder(new TransitiveInfoProviderMapBuilder());
     }
 
     public static Builder copyOf(JavaProvider javaProvider) {