Preserve the original location in EvalExceptionWithStackTrace
--
MOS_MIGRATED_REVID=102744198
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/EvalExceptionWithStackTrace.java b/src/main/java/com/google/devtools/build/lib/syntax/EvalExceptionWithStackTrace.java
index 82ca835..8688465 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/EvalExceptionWithStackTrace.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/EvalExceptionWithStackTrace.java
@@ -14,6 +14,7 @@
package com.google.devtools.build.lib.syntax;
import com.google.common.base.Joiner;
+import com.google.common.base.MoreObjects;
import com.google.common.base.Preconditions;
import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.packages.Rule;
@@ -30,7 +31,19 @@
private StackTraceElement mostRecentElement;
public EvalExceptionWithStackTrace(Exception original, Location callLocation) {
- super(callLocation, getNonEmptyMessage(original), getCause(original));
+ super(
+ originalLocation(original, callLocation), getNonEmptyMessage(original), getCause(original));
+ }
+
+ /**
+ * Returns the location of the {@code original} exception, or {@code callLocation}
+ * if there's none.
+ */
+ private static Location originalLocation(Exception original, Location callLocation) {
+ if (!(original instanceof EvalException)) {
+ return callLocation;
+ }
+ return MoreObjects.firstNonNull(((EvalException) original).getLocation(), callLocation);
}
/**