Preserve the original location in EvalExceptionWithStackTrace

--
MOS_MIGRATED_REVID=102744198
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/EvalException.java b/src/main/java/com/google/devtools/build/lib/syntax/EvalException.java
index e7073bb..186153e 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/EvalException.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/EvalException.java
@@ -21,6 +21,7 @@
 import com.google.devtools.build.lib.util.LoggingUtil;
 
 import java.util.logging.Level;
+import javax.annotation.Nullable;
 
 /**
  * Exceptions thrown during evaluation of BUILD ASTs or Skylark extensions.
@@ -34,7 +35,7 @@
  */
 public class EvalException extends Exception {
 
-  private Location location;
+  @Nullable private Location location;
   private final String message;
   private final boolean dueToIncompleteAST;
 
@@ -133,6 +134,7 @@
   /**
    * Returns the location of the evaluation error.
    */
+  @Nullable
   public Location getLocation() {
     return location;
   }
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);
   }
 
   /**