| // Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| package com.android.tools.r8.utils; | |
| import com.android.tools.r8.Diagnostic; | |
| import com.android.tools.r8.origin.Origin; | |
| import com.android.tools.r8.position.Position; | |
| /** | |
| * Exception thrown to interrupt processing after a fatal error or fail-if-error barrier. | |
| * | |
| * <p>The abort always contains the diagnostic causing the fatal error, or in the case of multiple | |
| * pending errors, one of the errors. In all cases, the abort exception signifies that the error has | |
| * been reported to the {@link com.android.tools.r8.DiagnosticsHandler}. | |
| */ | |
| public class AbortException extends RuntimeException { | |
| private final Diagnostic diagnostic; | |
| public AbortException(Diagnostic diagnostic) { | |
| assert diagnostic != null; | |
| this.diagnostic = diagnostic; | |
| } | |
| @Override | |
| public synchronized Throwable getCause() { | |
| // In the case of exception diagnostics, treat that as the parent cause. | |
| return diagnostic instanceof ExceptionDiagnostic | |
| ? ((ExceptionDiagnostic) diagnostic).getCause() | |
| : null; | |
| } | |
| @Override | |
| public String getMessage() { | |
| return diagnostic.getDiagnosticMessage(); | |
| } | |
| public Origin getOrigin() { | |
| return diagnostic != null ? diagnostic.getOrigin() : Origin.unknown(); | |
| } | |
| public Position getPosition() { | |
| return diagnostic != null ? diagnostic.getPosition() : Position.UNKNOWN; | |
| } | |
| } |