Skylark: make ConversionException an EvalException

This avoids using a RuntimeException (IllegalArgumentException)
to circumvent declaration issues, which when we were catching it too well
was hiding actual issues of RuntimeException.

--
MOS_MIGRATED_REVID=95767534
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 ae9c04d..361ce9f 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
@@ -32,7 +32,7 @@
  */
 public class EvalException extends Exception {
 
-  private final Location location;
+  private Location location;
   private final String message;
   private final boolean dueToIncompleteAST;
 
@@ -118,6 +118,18 @@
   }
 
   /**
+   * Ensures that this EvalException has proper location information.
+   * Does nothing if the exception already had a location, or if no location is provided.
+   * @return this EvalException, in fluent style.
+   */
+  public EvalException ensureLocation(Location loc) {
+    if (location == null && loc != null) {
+      location = loc;
+    }
+    return this;
+  }
+
+  /**
    * A class to support a special case of EvalException when the cause of the error is an
    * Exception during a direct Java call. Allow the throwing code to provide context in a message.
    */