blob: c1e4cd2aa46def8fdd1bc76fb08c67fedd09ff2c [file] [log] [blame]
// 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;
}
}