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
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 f1c4b4d..6614c1a 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
@@ -31,7 +31,6 @@
 import com.google.devtools.build.lib.packages.ClassObjectConstructor;
 import com.google.devtools.build.lib.packages.ClassObjectConstructor.Key;
 import com.google.devtools.build.lib.packages.SkylarkClassObject;
-import com.google.devtools.build.lib.packages.SkylarkClassObjectConstructor;
 import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.util.Preconditions;
@@ -92,10 +91,6 @@
     return providers.getProvider(providerClass);
   }
 
-  SkylarkProviders getSkylarkProviders() {
-    return providers.getProvider(SkylarkProviders.class);
-  }
-
   public Object getProvider(SkylarkProviderIdentifier id) {
     if (id.isLegacy()) {
       return get(id.getLegacyId());
@@ -108,18 +103,14 @@
     if (OutputGroupProvider.SKYLARK_CONSTRUCTOR.getKey().equals(key)) {
       return getProvider(OutputGroupProvider.class);
     }
-    SkylarkProviders skylarkProviders = providers.getProvider(SkylarkProviders.class);
-    return skylarkProviders != null ? skylarkProviders.getDeclaredProvider(key) : null;
+    return providers.getProvider(key);
   }
 
   public Object get(String legacyKey) {
     if (OutputGroupProvider.SKYLARK_NAME.equals(legacyKey)) {
       return getProvider(OutputGroupProvider.class);
     }
-    SkylarkProviders skylarkProviders = providers.getProvider(SkylarkProviders.class);
-    return skylarkProviders != null
-        ? skylarkProviders.get(SkylarkProviderIdentifier.forLegacy(legacyKey))
-        : null;
+    return providers.getProvider(legacyKey);
   }
 
   public static ConfiguredAspect forAlias(ConfiguredAspect real) {
@@ -178,18 +169,11 @@
 
     private void checkProviderClass(Class<? extends TransitiveInfoProvider> providerClass) {
       Preconditions.checkNotNull(providerClass);
-      Preconditions.checkArgument(
-          !SkylarkProviders.class.equals(providerClass),
-          "Do not provide SkylarkProviders directly");
     }
 
     /** Adds providers to the aspect. */
     public Builder addProviders(TransitiveInfoProviderMap providers) {
-      for (int i = 0; i < providers.getProviderCount(); ++i) {
-        Class<? extends TransitiveInfoProvider> providerClass = providers.getProviderClassAt(i);
-        TransitiveInfoProvider provider = providers.getProviderAt(i);
-        addProvider(providerClass, providerClass.cast(provider));
-      }
+      this.providers.addAll(providers);
       return this;
     }
 
@@ -220,13 +204,13 @@
     }
 
     public Builder addSkylarkTransitiveInfo(String name, Object value) {
-      skylarkProviderBuilder.put(name, value);
+      providers.put(name, value);
       return this;
     }
 
     public Builder addSkylarkTransitiveInfo(String name, Object value, Location loc)
         throws EvalException {
-      skylarkProviderBuilder.put(name, value);
+      providers.put(name, value);
       return this;
     }
 
@@ -246,7 +230,7 @@
       if (OutputGroupProvider.SKYLARK_CONSTRUCTOR.getKey().equals(key)) {
         addProvider(OutputGroupProvider.class, (OutputGroupProvider) declaredProvider);
       } else {
-        skylarkDeclaredProvidersBuilder.put(key, declaredProvider);
+        providers.put(declaredProvider);
       }
     }
 
@@ -265,8 +249,7 @@
           outputGroups.put(entry.getKey(), entry.getValue().build());
         }
 
-        if (skylarkDeclaredProvidersBuilder.containsKey(
-            OutputGroupProvider.SKYLARK_CONSTRUCTOR.getKey())) {
+        if (providers.contains(OutputGroupProvider.SKYLARK_CONSTRUCTOR.getKey())) {
           throw new IllegalStateException(
               "OutputGroupProvider was provided explicitly; do not use addOutputGroup");
         }
@@ -274,13 +257,6 @@
             new OutputGroupProvider(outputGroups.build()));
       }
 
-      ImmutableMap<String, Object> skylarkProvidersMap = skylarkProviderBuilder.build();
-      ImmutableMap<SkylarkClassObjectConstructor.Key, SkylarkClassObject>
-          skylarkDeclaredProvidersMap = ImmutableMap.copyOf(skylarkDeclaredProvidersBuilder);
-      if (!skylarkProvidersMap.isEmpty() || !skylarkDeclaredProvidersMap.isEmpty()) {
-        providers.add(new SkylarkProviders(skylarkProvidersMap, skylarkDeclaredProvidersMap));
-      }
-
       addProvider(
           createExtraActionProvider(
               ImmutableSet.<ActionAnalysisMetadata>of() /* actionsWithoutExtraAction */,