Simplify AbstractSkyFunctionEnvironment to more directly call getValueOrUntypedExceptions.
PiperOrigin-RevId: 192329649
diff --git a/src/main/java/com/google/devtools/build/skyframe/ValueOrException.java b/src/main/java/com/google/devtools/build/skyframe/ValueOrException.java
index a4ad569..e26cb1d 100644
--- a/src/main/java/com/google/devtools/build/skyframe/ValueOrException.java
+++ b/src/main/java/com/google/devtools/build/skyframe/ValueOrException.java
@@ -21,4 +21,89 @@
/** Gets the stored value. Throws an exception if one was thrown when computing this value. */
@Nullable
public abstract SkyValue get() throws E;
+
+ static <E extends Exception> ValueOrException<E> fromUntypedException(
+ ValueOrUntypedException voe, Class<E> exceptionClass) {
+ SkyValue value = voe.getValue();
+ if (value != null) {
+ return ofValue(value);
+ }
+ Exception e = voe.getException();
+ if (e != null) {
+ if (exceptionClass.isInstance(e)) {
+ return ofExn1(exceptionClass.cast(e));
+ }
+ }
+ return ofNullValue();
+ }
+
+ private static <E extends Exception> ValueOrException<E> ofExn1(E e) {
+ return new ValueOrExceptionExnImpl<>(e);
+ }
+
+ private static <E extends Exception> ValueOrException<E> ofNullValue() {
+ return ValueOrExceptionValueImpl.ofNullValue();
+ }
+
+ private static <E extends Exception> ValueOrException<E> ofValue(SkyValue value) {
+ return new ValueOrExceptionValueImpl<>(value);
+ }
+
+ private static class ValueOrExceptionValueImpl<E extends Exception> extends ValueOrException<E> {
+ private static final ValueOrExceptionValueImpl<Exception> NULL =
+ new ValueOrExceptionValueImpl<>(null);
+
+ @Nullable private final SkyValue value;
+
+ private ValueOrExceptionValueImpl(@Nullable SkyValue value) {
+ this.value = value;
+ }
+
+ @Override
+ @Nullable
+ public SkyValue get() {
+ return value;
+ }
+
+ @Override
+ @Nullable
+ public SkyValue getValue() {
+ return value;
+ }
+
+ @Override
+ @Nullable
+ public Exception getException() {
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ static <E extends Exception> ValueOrExceptionValueImpl<E> ofNullValue() {
+ return (ValueOrExceptionValueImpl<E>) NULL;
+ }
+ }
+
+ private static class ValueOrExceptionExnImpl<E extends Exception> extends ValueOrException<E> {
+ private final E e;
+
+ private ValueOrExceptionExnImpl(E e) {
+ this.e = e;
+ }
+
+ @Override
+ public SkyValue get() throws E {
+ throw e;
+ }
+
+ @Override
+ @Nullable
+ public SkyValue getValue() {
+ return null;
+ }
+
+ @Override
+ public Exception getException() {
+ return e;
+ }
+ }
}