diff options
author | brandjon <brandjon@google.com> | 2018-01-18 14:55:26 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-01-18 14:56:58 -0800 |
commit | 33a7cad5c2c82267638cc2ae3081592cef90bc8b (patch) | |
tree | 5bea7c0bf3c57aefcd91711a6ad91ba81edcec82 /src/main/java/com/google/devtools | |
parent | 7fa23eaf4617431875acbb63052f7349546343ba (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.java | 28 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/serialization/BaseCodec.java | 20 |
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(); + } } |