EvalException can now show a url for additional information

Add doc for the "read only" error message.

--
MOS_MIGRATED_REVID=138194709
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 97d695f..ed91459 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
@@ -51,6 +51,16 @@
     this.dueToIncompleteAST = false;
   }
 
+  public EvalException(Location location, String message, String url) {
+    this.location = location;
+    this.dueToIncompleteAST = false;
+    this.message =
+        Preconditions.checkNotNull(message)
+            + "\n"
+            + "Need help? See "
+            + Preconditions.checkNotNull(url);
+  }
+
   /**
    * @param location the location where evaluation/execution failed.
    * @param message the error message.
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java b/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java
index c1a94c5..6aa5a7d 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/ValidationEnvironment.java
@@ -90,7 +90,10 @@
 
   private void checkReadonly(String varname, Location location) throws EvalException {
     if (readOnlyVariables.contains(varname)) {
-      throw new EvalException(location, String.format("Variable %s is read only", varname));
+      throw new EvalException(
+          location,
+          String.format("Variable %s is read only", varname),
+          "https://bazel.build/versions/master/docs/skylark/errors/read-only-variable.html");
     }
   }