Reland "Retain runtime exception when amending origin information."
This reverts commit 915b62b2d469c2a26edc94b530115513c6f4bece.
Bug: 151041137
Change-Id: I84635cbe6236d5cb15d8d5f8021484ce86fdec60
diff --git a/src/main/java/com/android/tools/r8/errors/CompilationError.java b/src/main/java/com/android/tools/r8/errors/CompilationError.java
index d165596..ccefc7b 100644
--- a/src/main/java/com/android/tools/r8/errors/CompilationError.java
+++ b/src/main/java/com/android/tools/r8/errors/CompilationError.java
@@ -40,6 +40,14 @@
this.position = position;
}
+ public Origin getOrigin() {
+ return origin;
+ }
+
+ public Position getPosition() {
+ return position;
+ }
+
public CompilationError withAdditionalOriginAndPositionInfo(Origin origin, Position position) {
if (this.origin == Origin.unknown() || this.position == Position.UNKNOWN) {
return new CompilationError(
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 5b3e1ed..5d12ded 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -95,6 +95,7 @@
import com.android.tools.r8.shaking.MainDexClasses;
import com.android.tools.r8.utils.CfgPrinter;
import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.ExceptionUtils;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.InternalOptions.DesugarState;
import com.android.tools.r8.utils.InternalOptions.OutlineOptions;
@@ -1066,18 +1067,10 @@
private Timing rewriteCode(
DexEncodedMethod method, OptimizationFeedback feedback, MethodProcessor methodProcessor) {
Origin origin = appView.appInfo().originFor(method.method.holder);
- try {
- return rewriteCodeInternal(method, feedback, methodProcessor, origin);
- } catch (CompilationError e) {
- // If rewriting throws a compilation error, attach the origin and method if missing.
- throw e.withAdditionalOriginAndPositionInfo(origin, new MethodPosition(method.method));
- } catch (NullPointerException e) {
- throw new CompilationError(
- "NullPointerException during IR Conversion",
- e,
- origin,
- new MethodPosition(method.method));
- }
+ return ExceptionUtils.withOriginAttachmentHandler(
+ origin,
+ new MethodPosition(method.method),
+ () -> rewriteCodeInternal(method, feedback, methodProcessor, origin));
}
private Timing rewriteCodeInternal(
diff --git a/src/main/java/com/android/tools/r8/utils/ExceptionDiagnostic.java b/src/main/java/com/android/tools/r8/utils/ExceptionDiagnostic.java
index 78d47c2..4dc6d48 100644
--- a/src/main/java/com/android/tools/r8/utils/ExceptionDiagnostic.java
+++ b/src/main/java/com/android/tools/r8/utils/ExceptionDiagnostic.java
@@ -18,10 +18,16 @@
public class ExceptionDiagnostic extends DiagnosticWithThrowable {
private final Origin origin;
+ private final Position position;
- public ExceptionDiagnostic(Throwable e, Origin origin) {
+ public ExceptionDiagnostic(Throwable e, Origin origin, Position position) {
super(e);
this.origin = origin;
+ this.position = position;
+ }
+
+ public ExceptionDiagnostic(Throwable e, Origin origin) {
+ this(e, origin, Position.UNKNOWN);
}
public ExceptionDiagnostic(ResourceException e) {
@@ -35,7 +41,7 @@
@Override
public Position getPosition() {
- return Position.UNKNOWN;
+ return position;
}
@Override
diff --git a/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java b/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
index d12c2a4..79e3818 100644
--- a/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
@@ -11,12 +11,14 @@
import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.PathOrigin;
+import com.android.tools.r8.position.Position;
import com.google.common.collect.ObjectArrays;
import java.io.IOException;
import java.nio.file.FileSystemException;
import java.nio.file.Paths;
import java.util.concurrent.ExecutionException;
import java.util.function.Consumer;
+import java.util.function.Supplier;
public abstract class ExceptionUtils {
@@ -68,7 +70,7 @@
} catch (IOException e) {
throw reporter.fatalError(new ExceptionDiagnostic(e, extractIOExceptionOrigin(e)));
} catch (CompilationError e) {
- throw reporter.fatalError(e.toStringDiagnostic());
+ throw reporter.fatalError(new ExceptionDiagnostic(e, e.getOrigin(), e.getPosition()));
} catch (ResourceException e) {
throw reporter.fatalError(new ExceptionDiagnostic(e, e.getOrigin()));
} catch (AssertionError e) {
@@ -132,4 +134,15 @@
throw new RuntimeException(executionException.getMessage(), cause);
}
}
+
+ public static <T> T withOriginAttachmentHandler(
+ Origin origin, Position position, Supplier<T> action) {
+ try {
+ return action.get();
+ } catch (CompilationError e) {
+ throw e.withAdditionalOriginAndPositionInfo(origin, position);
+ } catch (RuntimeException e) {
+ throw new CompilationError(e.getMessage(), e, origin, position);
+ }
+ }
}