// Copyright 2014 The Bazel Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.devtools.build.skyframe; import javax.annotation.Nullable; /** Wrapper for a value or the typed exception thrown when trying to compute it. */ public abstract class ValueOrException5 extends ValueOrUntypedException { /** Gets the stored value. Throws an exception if one was thrown when computing this value. */ @Nullable public abstract SkyValue get() throws E1, E2, E3, E4, E5; static < E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception, E5 extends Exception> ValueOrException5 fromUntypedException( ValueOrUntypedException voe, Class exceptionClass1, Class exceptionClass2, Class exceptionClass3, Class exceptionClass4, Class exceptionClass5) { SkyValue value = voe.getValue(); if (value != null) { return ofValue(value); } Exception e = voe.getException(); if (e != null) { if (exceptionClass1.isInstance(e)) { return ofExn1(exceptionClass1.cast(e)); } if (exceptionClass2.isInstance(e)) { return ofExn2(exceptionClass2.cast(e)); } if (exceptionClass3.isInstance(e)) { return ofExn3(exceptionClass3.cast(e)); } if (exceptionClass4.isInstance(e)) { return ofExn4(exceptionClass4.cast(e)); } if (exceptionClass5.isInstance(e)) { return ofExn5(exceptionClass5.cast(e)); } } return ofNullValue(); } private static < E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception, E5 extends Exception> ValueOrException5 ofNullValue() { return ValueOrException5ValueImpl.ofNullValue(); } private static < E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception, E5 extends Exception> ValueOrException5 ofValue(SkyValue value) { return new ValueOrException5ValueImpl<>(value); } private static < E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception, E5 extends Exception> ValueOrException5 ofExn1(E1 e) { return new ValueOrException5Exn1Impl<>(e); } private static < E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception, E5 extends Exception> ValueOrException5 ofExn2(E2 e) { return new ValueOrException5Exn2Impl<>(e); } private static < E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception, E5 extends Exception> ValueOrException5 ofExn3(E3 e) { return new ValueOrException5Exn3Impl<>(e); } private static < E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception, E5 extends Exception> ValueOrException5 ofExn4(E4 e) { return new ValueOrException5Exn4Impl<>(e); } private static < E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception, E5 extends Exception> ValueOrException5 ofExn5(E5 e) { return new ValueOrException5Exn5Impl<>(e); } private static class ValueOrException5ValueImpl< E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception, E5 extends Exception> extends ValueOrException5 { private static final ValueOrException5ValueImpl< Exception, Exception, Exception, Exception, Exception> NULL = new ValueOrException5ValueImpl<>(null); @Nullable private final SkyValue value; ValueOrException5ValueImpl(@Nullable SkyValue value) { this.value = value; } @Override @Nullable public SkyValue get() { return value; } @Override @Nullable public Exception getException() { return null; } @Override @Nullable public SkyValue getValue() { return value; } @SuppressWarnings("unchecked") static < E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception, E5 extends Exception> ValueOrException5ValueImpl ofNullValue() { return (ValueOrException5ValueImpl) NULL; } } private static class ValueOrException5Exn1Impl< E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception, E5 extends Exception> extends ValueOrException5 { private final E1 e; private ValueOrException5Exn1Impl(E1 e) { this.e = e; } @Override public SkyValue get() throws E1 { throw e; } @Override public Exception getException() { return e; } @Override @Nullable public SkyValue getValue() { return null; } } private static class ValueOrException5Exn2Impl< E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception, E5 extends Exception> extends ValueOrException5 { private final E2 e; private ValueOrException5Exn2Impl(E2 e) { this.e = e; } @Override public SkyValue get() throws E2 { throw e; } @Override public Exception getException() { return e; } @Override @Nullable public SkyValue getValue() { return null; } } private static class ValueOrException5Exn3Impl< E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception, E5 extends Exception> extends ValueOrException5 { private final E3 e; private ValueOrException5Exn3Impl(E3 e) { this.e = e; } @Override public SkyValue get() throws E3 { throw e; } @Override public Exception getException() { return e; } @Override @Nullable public SkyValue getValue() { return null; } } private static class ValueOrException5Exn4Impl< E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception, E5 extends Exception> extends ValueOrException5 { private final E4 e; private ValueOrException5Exn4Impl(E4 e) { this.e = e; } @Override public SkyValue get() throws E4 { throw e; } @Override public Exception getException() { return e; } @Override @Nullable public SkyValue getValue() { return null; } } private static class ValueOrException5Exn5Impl< E1 extends Exception, E2 extends Exception, E3 extends Exception, E4 extends Exception, E5 extends Exception> extends ValueOrException5 { private final E5 e; private ValueOrException5Exn5Impl(E5 e) { this.e = e; } @Override public SkyValue get() throws E5 { throw e; } @Override public Exception getException() { return e; } @Override @Nullable public SkyValue getValue() { return null; } } }