aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar brandjon <brandjon@google.com>2018-01-18 14:55:26 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-01-18 14:56:58 -0800
commit33a7cad5c2c82267638cc2ae3081592cef90bc8b (patch)
tree5bea7c0bf3c57aefcd91711a6ad91ba81edcec82 /src/main/java/com/google/devtools
parent7fa23eaf4617431875acbb63052f7349546343ba (diff)
Add a way for BaseCodecs to register association with subtypes
Also add accessor to SkylarkInfo for the custom error message, and expose its concrete implementation classes for the benefit of reflection. PiperOrigin-RevId: 182443146
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/SkylarkInfo.java28
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/serialization/BaseCodec.java20
2 files changed, 48 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkInfo.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkInfo.java
index 5445f80f64..a2da054efa 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkInfo.java
@@ -17,6 +17,7 @@ package com.google.devtools.build.lib.packages;
import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
@@ -27,6 +28,7 @@ import com.google.devtools.build.lib.syntax.Concatable;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.EvalUtils;
import java.util.Arrays;
+import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
@@ -71,6 +73,13 @@ public abstract class SkylarkInfo extends Info implements Concatable {
*/
protected abstract Iterable<Object> getValues();
+ /**
+ * Returns the custom (i.e. per-instance, as opposed to per-provider-type) error message string
+ * format used by this provider instance, or null if not set.
+ */
+ @Nullable
+ public abstract String getCustomErrorMessageFormatForUnknownField();
+
/** Returns the layout for this provider if it is schemaful, null otherwise. */
@Nullable
public abstract Layout getLayout();
@@ -136,6 +145,15 @@ public abstract class SkylarkInfo extends Info implements Concatable {
}
/**
+ * Returns the concrete implementation classes of this abstract class.
+ *
+ * <p>This is useful for code that depends on reflection.
+ */
+ public static List<Class<? extends SkylarkInfo>> getImplementationClasses() {
+ return ImmutableList.of(MapBackedSkylarkInfo.class, CompactSkylarkInfo.class);
+ }
+
+ /**
* A specification of what fields a provider instance has, and how they are ordered in an
* array-backed implementation.
*
@@ -261,6 +279,11 @@ public abstract class SkylarkInfo extends Info implements Concatable {
}
@Override
+ public String getCustomErrorMessageFormatForUnknownField() {
+ return errorMessageFormatForUnknownField;
+ }
+
+ @Override
public Layout getLayout() {
return null;
}
@@ -318,6 +341,11 @@ public abstract class SkylarkInfo extends Info implements Concatable {
}
@Override
+ public String getCustomErrorMessageFormatForUnknownField() {
+ return null;
+ }
+
+ @Override
public Layout getLayout() {
return layout;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BaseCodec.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BaseCodec.java
index dd286fc7eb..abec3f1007 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BaseCodec.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BaseCodec.java
@@ -14,8 +14,10 @@
package com.google.devtools.build.lib.skyframe.serialization;
+import com.google.common.collect.ImmutableList;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
+import java.util.List;
/** An opaque interface for codecs that just reveals the {@link Class} of its objects. */
interface BaseCodec<T> {
@@ -28,4 +30,22 @@ interface BaseCodec<T> {
* (b/26186886).
*/
Class<T> getEncodedClass();
+
+ /**
+ * Returns additional subtypes of {@code T} that may be serialized/deserialized using this codec
+ * without loss of information.
+ *
+ * <p>This method is intended for when {@code T} has multiple concrete implementations whose
+ * details are known to the codec but not to the codec dispatching mechanism. It signals that the
+ * dispatcher may choose to use this codec for the subtype, rather than raise {@link
+ * SerializationException.NoCodecException}.
+ *
+ * <p>This method should not be used if the codec's serialization and deserialization methods
+ * perform their own dispatching to other codecs for subtypes of {@code T}.
+ *
+ * <p>{@code T} itself should not be included in the returned list.
+ */
+ default List<Class<? extends T>> additionalEncodedSubclasses() {
+ return ImmutableList.of();
+ }
}