Refactor implementation of native and Skylark declared providers.

1) Instead of having a single class for both, split them into
   {Skylark,Native}ClassObjectConstructors
2) Allow NativeClassObjectConstructors to customize their instantiation
   logic.
3) Prepare ClassObjectConstructor.Key to be serializable.

--
PiperOrigin-RevId: 148997553
MOS_MIGRATED_REVID=148997553
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
index bf36646..14f783e 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
@@ -36,6 +36,7 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.packages.AttributeContainer;
 import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException;
+import com.google.devtools.build.lib.packages.ClassObjectConstructor;
 import com.google.devtools.build.lib.packages.SkylarkClassObject;
 import com.google.devtools.build.lib.packages.SkylarkClassObjectConstructor;
 import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider;
@@ -932,7 +933,7 @@
     );
 
     ConfiguredTarget configuredTarget = getConfiguredTarget("//test:r");
-    SkylarkClassObjectConstructor.Key key = new SkylarkClassObjectConstructor.SkylarkKey(
+    ClassObjectConstructor.Key key = new SkylarkClassObjectConstructor.SkylarkKey(
         Label.create(configuredTarget.getLabel().getPackageIdentifier(), "extension.bzl"),
         "my_provider");
     SkylarkProviders skylarkProviders = configuredTarget.getProvider(SkylarkProviders.class);
@@ -959,7 +960,7 @@
     );
 
     ConfiguredTarget configuredTarget  = getConfiguredTarget("//test:r");
-    SkylarkClassObjectConstructor.Key key = new SkylarkClassObjectConstructor.SkylarkKey(
+    ClassObjectConstructor.Key key = new SkylarkClassObjectConstructor.SkylarkKey(
         Label.create(configuredTarget.getLabel().getPackageIdentifier(), "extension.bzl"),
         "my_provider");
     SkylarkProviders skylarkProviders = configuredTarget.getProvider(SkylarkProviders.class);
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 9067b89..2966fc8 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -32,6 +32,7 @@
 import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition;
 import com.google.devtools.build.lib.packages.BuildType;
 import com.google.devtools.build.lib.packages.ImplicitOutputsFunction;
+import com.google.devtools.build.lib.packages.NativeClassObjectConstructor;
 import com.google.devtools.build.lib.packages.PredicateWithMessage;
 import com.google.devtools.build.lib.packages.RequiredProviders;
 import com.google.devtools.build.lib.packages.RuleClass;
@@ -1039,17 +1040,17 @@
   }
 
   private static SkylarkClassObject makeStruct(String field, Object value) {
-    return SkylarkClassObjectConstructor.STRUCT.create(
+    return NativeClassObjectConstructor.STRUCT.create(
         ImmutableMap.of(field, value),
         "no field '%'");
   }
 
   private static SkylarkClassObject makeBigStruct(Environment env) {
     // struct(a=[struct(x={1:1}), ()], b=(), c={2:2})
-    return SkylarkClassObjectConstructor.STRUCT.create(
+    return NativeClassObjectConstructor.STRUCT.create(
         ImmutableMap.<String, Object>of(
             "a", MutableList.<Object>of(env,
-                SkylarkClassObjectConstructor.STRUCT.create(ImmutableMap.<String, Object>of(
+                NativeClassObjectConstructor.STRUCT.create(ImmutableMap.<String, Object>of(
                     "x", SkylarkDict.<Object, Object>of(env, 1, 1)),
                     "no field '%s'"),
                 Tuple.of()),
@@ -1138,10 +1139,10 @@
         "data = struct(x = 1)"
     );
     SkylarkClassObject data = (SkylarkClassObject) lookup("data");
-    assertThat(SkylarkClassObjectConstructor.STRUCT.isExported()).isTrue();
-    assertThat(data.getConstructor()).isEqualTo(SkylarkClassObjectConstructor.STRUCT);
+    assertThat(NativeClassObjectConstructor.STRUCT.isExported()).isTrue();
+    assertThat(data.getConstructor()).isEqualTo(NativeClassObjectConstructor.STRUCT);
     assertThat(data.getConstructor().getKey())
-        .isEqualTo(SkylarkClassObjectConstructor.STRUCT.getKey());
+        .isEqualTo(NativeClassObjectConstructor.STRUCT.getKey());
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
index 36bdd8d..343e03c 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleImplementationFunctionsTest.java
@@ -886,7 +886,7 @@
     Object provider = configuredTarget.getProvider(SkylarkProviders.class).getValue("default");
     assertThat(provider).isInstanceOf(SkylarkClassObject.class);
     SkylarkClassObject defaultProvider = (SkylarkClassObject) provider;
-    assertThat((defaultProvider).getConstructor().getKey().getExportedName())
+    assertThat((defaultProvider).getConstructor().getPrintableName())
         .isEqualTo("default_provider");
 
     // Test .runfiles
@@ -936,7 +936,7 @@
     Object provider = configuredTarget.getProvider(SkylarkProviders.class).getValue("default");
     assertThat(provider).isInstanceOf(SkylarkClassObject.class);
     SkylarkClassObject defaultProvider = (SkylarkClassObject) provider;
-    assertThat((defaultProvider).getConstructor().getKey().getExportedName())
+    assertThat((defaultProvider).getConstructor().getPrintableName())
         .isEqualTo("default_provider");
   }
 
@@ -1008,7 +1008,7 @@
     ConfiguredTarget configuredTarget = getConfiguredTarget("//test:my_rule");
     Object provider = configuredTarget.getProvider(SkylarkProviders.class).getValue("proxy");
     assertThat(provider).isInstanceOf(SkylarkClassObject.class);
-    assertThat(((SkylarkClassObject) provider).getConstructor().getKey().getExportedName())
+    assertThat(((SkylarkClassObject) provider).getConstructor().getPrintableName())
         .isEqualTo("foo_provider");
   }
 
@@ -1054,7 +1054,7 @@
     ConfiguredTarget configuredTarget = getConfiguredTarget("//test:my_rule");
     Object provider = configuredTarget.getProvider(SkylarkProviders.class).getValue("proxy");
     assertThat(provider).isInstanceOf(SkylarkClassObject.class);
-    assertThat(((SkylarkClassObject) provider).getConstructor().getKey().getExportedName())
+    assertThat(((SkylarkClassObject) provider).getConstructor().getPrintableName())
         .isEqualTo("foo_provider");
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
index e0b48b8..e5f669e 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvalUtilsTest.java
@@ -22,7 +22,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.packages.SkylarkClassObjectConstructor;
+import com.google.devtools.build.lib.packages.NativeClassObjectConstructor;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.syntax.EvalUtils.ComparisonException;
 import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
@@ -129,7 +129,7 @@
         SkylarkDict.of(env, "key", 123),
         SkylarkDict.of(env, 123, "value"),
         NestedSetBuilder.stableOrder().add(1).add(2).add(3).build(),
-        SkylarkClassObjectConstructor.STRUCT.create(
+        NativeClassObjectConstructor.STRUCT.create(
             ImmutableMap.of("key", (Object) "value"), "no field %s"),
     };