diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DefaultInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/DefaultInfo.java
index 290cfa7..dac9043 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/DefaultInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/DefaultInfo.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.syntax.Depset;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Starlark;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import javax.annotation.Nullable;
 
 /** DefaultInfo is provided by all targets implicitly and contains all standard fields. */
@@ -131,8 +132,13 @@
     }
 
     @Override
-    public DefaultInfo constructor(Object files, Object runfilesObj,
-        Object dataRunfilesObj, Object defaultRunfilesObj, Object executable, Location loc)
+    public DefaultInfo constructor(
+        Object files,
+        Object runfilesObj,
+        Object dataRunfilesObj,
+        Object defaultRunfilesObj,
+        Object executable,
+        StarlarkThread thread)
         throws EvalException {
 
       Runfiles statelessRunfiles = castNoneToNull(Runfiles.class, runfilesObj);
@@ -140,12 +146,13 @@
       Runfiles defaultRunfiles = castNoneToNull(Runfiles.class, defaultRunfilesObj);
 
       if ((statelessRunfiles != null) && (dataRunfiles != null || defaultRunfiles != null)) {
-        throw new EvalException(loc, "Cannot specify the provider 'runfiles' "
-            + "together with 'data_runfiles' or 'default_runfiles'");
+        throw Starlark.errorf(
+            "Cannot specify the provider 'runfiles' together with 'data_runfiles' or"
+                + " 'default_runfiles'");
       }
 
       return new DefaultInfo(
-          loc,
+          thread.getCallerLocation(),
           castNoneToNull(Depset.class, files),
           statelessRunfiles,
           dataRunfiles,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java
index a8c31f7..41bdca1 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/OutputGroupInfo.java
@@ -289,7 +289,7 @@
     }
 
     @Override
-    public OutputGroupInfoApi constructor(Dict<?, ?> kwargs, Location loc) throws EvalException {
+    public OutputGroupInfoApi constructor(Dict<?, ?> kwargs) throws EvalException {
       Map<String, Object> kwargsMap = kwargs.getContents(String.class, Object.class, "kwargs");
 
       ImmutableMap.Builder<String, NestedSet<Artifact>> builder = ImmutableMap.builder();
@@ -297,7 +297,7 @@
         builder.put(
             entry.getKey(),
             SkylarkRuleConfiguredTargetUtil.convertToOutputGroupValue(
-                loc, entry.getKey(), entry.getValue()));
+                entry.getKey(), entry.getValue()));
       }
       return new OutputGroupInfo(builder.build());
     }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TemplateVariableInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/TemplateVariableInfo.java
index 5067aa7..885636f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TemplateVariableInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TemplateVariableInfo.java
@@ -23,6 +23,7 @@
 import com.google.devtools.build.lib.skylarkbuildapi.TemplateVariableInfoApi;
 import com.google.devtools.build.lib.syntax.Dict;
 import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.Map;
 
 /** Provides access to make variables from the current fragments. */
@@ -40,11 +41,11 @@
     }
 
     @Override
-    public TemplateVariableInfo templateVariableInfo(Dict<?, ?> vars, Location loc)
+    public TemplateVariableInfo templateVariableInfo(Dict<?, ?> vars, StarlarkThread thread)
         throws EvalException {
       Map<String, String> varsMap =
           Dict.castSkylarkDictOrNoneToDict(vars, String.class, String.class, "vars");
-      return new TemplateVariableInfo(ImmutableMap.copyOf(varsMap), loc);
+      return new TemplateVariableInfo(ImmutableMap.copyOf(varsMap), thread.getCallerLocation());
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java
index 27cd1f0..7b699bf 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java
@@ -30,6 +30,7 @@
 import com.google.devtools.build.lib.syntax.Printer;
 import com.google.devtools.build.lib.syntax.Sequence;
 import com.google.devtools.build.lib.syntax.Starlark;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.util.StringUtilities;
 import java.util.HashMap;
@@ -70,7 +71,7 @@
         Object parentUnchecked,
         Sequence<?> constraintValuesUnchecked,
         Object execPropertiesUnchecked,
-        Location location)
+        StarlarkThread thread)
         throws EvalException {
       PlatformInfo.Builder builder = PlatformInfo.builder();
       builder.setLabel(label);
@@ -87,12 +88,12 @@
                 execPropertiesUnchecked, String.class, String.class, "exec_properties");
         builder.setExecProperties(ImmutableMap.copyOf(execProperties));
       }
-      builder.setLocation(location);
+      builder.setLocation(thread.getCallerLocation());
 
       try {
         return builder.build();
       } catch (DuplicateConstraintException | ExecPropertiesException e) {
-        throw new EvalException(location, e);
+        throw new EvalException(null, e);
       }
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java
index 412678f..2f23ac5 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/ToolchainInfo.java
@@ -28,6 +28,7 @@
 import com.google.devtools.build.lib.syntax.Dict;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Starlark;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.Map;
 
 /**
@@ -54,8 +55,8 @@
     }
 
     @Override
-    public ToolchainInfo toolchainInfo(Dict<String, Object> kwargs, Location loc) {
-      return new ToolchainInfo(kwargs, loc);
+    public ToolchainInfo toolchainInfo(Dict<String, Object> kwargs, StarlarkThread thread) {
+      return new ToolchainInfo(kwargs, thread.getCallerLocation());
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/Args.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/Args.java
index 1918c57..a0a82ad 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/Args.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/Args.java
@@ -38,6 +38,7 @@
 import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.syntax.StarlarkMutable;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -173,9 +174,9 @@
         Object beforeEach,
         Object joinWith,
         Object mapFn,
-        Location loc)
+        StarlarkThread thread)
         throws EvalException {
-      throw new EvalException(null, "cannot modify frozen value");
+      throw Starlark.errorf("cannot modify frozen value");
     }
 
     @Override
@@ -189,9 +190,9 @@
         Boolean uniquify,
         Boolean expandDirectories,
         Object terminateWith,
-        Location loc)
+        StarlarkThread thread)
         throws EvalException {
-      throw new EvalException(null, "cannot modify frozen value");
+      throw Starlark.errorf("cannot modify frozen value");
     }
 
     @Override
@@ -205,9 +206,9 @@
         Boolean omitIfEmpty,
         Boolean uniquify,
         Boolean expandDirectories,
-        Location loc)
+        StarlarkThread thread)
         throws EvalException {
-      throw new EvalException(null, "cannot modify frozen value");
+      throw Starlark.errorf("cannot modify frozen value");
     }
 
     @Override
@@ -216,7 +217,7 @@
       // TODO(cparsons): Even "frozen" Args may need to use params files.
       // If we go down this path, we will need to rename this class and update the documentation
       // (as this class no longe behaves exactly like a frozen Args object)
-      throw new EvalException(null, "cannot modify frozen value");
+      throw Starlark.errorf("cannot modify frozen value");
     }
 
     @Override
@@ -224,7 +225,7 @@
       // TODO(cparsons): Even "frozen" Args may need to use params files.
       // If we go down this path, we will need to rename this class and update the documentation
       // (as this class no longe behaves exactly like a frozen Args object)
-      throw new EvalException(null, "cannot modify frozen value");
+      throw Starlark.errorf("cannot modify frozen value");
     }
   }
 
@@ -265,41 +266,39 @@
         Object beforeEach,
         Object joinWith,
         Object mapFn,
-        Location loc)
+        StarlarkThread thread)
         throws EvalException {
-      checkMutable(loc);
+      checkMutable(null);
       final String argName;
       if (value == Starlark.UNBOUND) {
         value = argNameOrValue;
         argName = null;
       } else {
-        validateArgName(argNameOrValue, loc);
+        validateArgName(argNameOrValue);
         argName = (String) argNameOrValue;
       }
       if (argName != null) {
         commandLine.add(argName);
       }
       if (value instanceof Depset || value instanceof Sequence) {
-        throw new EvalException(
-            loc,
-            "Args#add doesn't accept vectorized arguments. "
-                + "Please use Args#add_all or Args#add_joined.");
+        throw Starlark.errorf(
+            "Args#add doesn't accept vectorized arguments. Please use Args#add_all or"
+                + " Args#add_joined.");
       }
       if (mapFn != Starlark.NONE) {
-        throw new EvalException(
-            loc, "Args#add doesn't accept map_fn. Please eagerly map the value.");
+        throw Starlark.errorf("Args#add doesn't accept map_fn. Please eagerly map the value.");
       }
       if (beforeEach != Starlark.NONE) {
-        throw new EvalException(null, "'before_each' is not supported for scalar arguments");
+        throw Starlark.errorf("'before_each' is not supported for scalar arguments");
       }
       if (joinWith != Starlark.NONE) {
-        throw new EvalException(null, "'join_with' is not supported for scalar arguments");
+        throw Starlark.errorf("'join_with' is not supported for scalar arguments");
       }
       addScalarArg(
           value,
           format != Starlark.NONE ? (String) format : null,
           mapFn != Starlark.NONE ? (BaseFunction) mapFn : null,
-          loc);
+          thread.getCallerLocation());
       return this;
     }
 
@@ -314,16 +313,16 @@
         Boolean uniquify,
         Boolean expandDirectories,
         Object terminateWith,
-        Location loc)
+        StarlarkThread thread)
         throws EvalException {
-      checkMutable(loc);
+      checkMutable(null);
       final String argName;
       if (values == Starlark.UNBOUND) {
         values = argNameOrValue;
-        validateValues(values, loc);
+        validateValues(values);
         argName = null;
       } else {
-        validateArgName(argNameOrValue, loc);
+        validateArgName(argNameOrValue);
         argName = (String) argNameOrValue;
       }
       addVectorArg(
@@ -339,7 +338,7 @@
           uniquify,
           expandDirectories,
           terminateWith != Starlark.NONE ? (String) terminateWith : null,
-          loc);
+          thread.getCallerLocation());
       return this;
     }
 
@@ -354,16 +353,16 @@
         Boolean omitIfEmpty,
         Boolean uniquify,
         Boolean expandDirectories,
-        Location loc)
+        StarlarkThread thread)
         throws EvalException {
-      checkMutable(loc);
+      checkMutable(null);
       final String argName;
       if (values == Starlark.UNBOUND) {
         values = argNameOrValue;
-        validateValues(values, loc);
+        validateValues(values);
         argName = null;
       } else {
-        validateArgName(argNameOrValue, loc);
+        validateArgName(argNameOrValue);
         argName = (String) argNameOrValue;
       }
       addVectorArg(
@@ -379,7 +378,7 @@
           uniquify,
           expandDirectories,
           /* terminateWith= */ null,
-          loc);
+          thread.getCallerLocation());
       return this;
     }
 
@@ -414,9 +413,9 @@
         }
         vectorArg = new SkylarkCustomCommandLine.VectorArg.Builder(skylarkList);
       }
-      validateMapEach(mapEach, loc);
-      validateFormatString("format_each", formatEach, loc);
-      validateFormatString("format_joined", formatJoined, loc);
+      validateMapEach(mapEach);
+      validateFormatString("format_each", formatEach);
+      validateFormatString("format_joined", formatJoined);
       vectorArg
           .setLocation(loc)
           .setArgName(argName)
@@ -433,28 +432,23 @@
       commandLine.add(vectorArg);
     }
 
-    private void validateArgName(Object argName, Location loc) throws EvalException {
+    private void validateArgName(Object argName) throws EvalException {
       if (!(argName instanceof String)) {
-        throw new EvalException(
-            loc,
-            String.format(
-                "expected value of type 'string' for arg name, got '%s'",
-                argName.getClass().getSimpleName()));
+        throw Starlark.errorf(
+            "expected value of type 'string' for arg name, got '%s'",
+            argName.getClass().getSimpleName());
       }
     }
 
-    private void validateValues(Object values, Location loc) throws EvalException {
+    private void validateValues(Object values) throws EvalException {
       if (!(values instanceof Sequence || values instanceof Depset)) {
-        throw new EvalException(
-            loc,
-            String.format(
-                "expected value of type 'sequence or depset' for values, got '%s'",
-                values.getClass().getSimpleName()));
+        throw Starlark.errorf(
+            "expected value of type 'sequence or depset' for values, got '%s'",
+            values.getClass().getSimpleName());
       }
     }
 
-    private void validateMapEach(@Nullable BaseFunction mapEach, Location loc)
-        throws EvalException {
+    private void validateMapEach(@Nullable BaseFunction mapEach) throws EvalException {
       if (mapEach == null) {
         return;
       }
@@ -465,27 +459,25 @@
               && sig.numMandatoryNamedOnly() == 0
               && sig.numOptionalPositionals() == 0;
       if (!valid) {
-        throw new EvalException(
-            loc, "map_each must be a function that accepts a single positional argument");
+        throw Starlark.errorf(
+            "map_each must be a function that accepts a single positional argument");
       }
     }
 
-    private void validateFormatString(String argumentName, @Nullable String formatStr, Location loc)
+    private void validateFormatString(String argumentName, @Nullable String formatStr)
         throws EvalException {
       if (formatStr != null
           && !SingleStringArgFormatter.isValid(formatStr)) {
-        throw new EvalException(
-            loc,
-            String.format(
-                "Invalid value for parameter \"%s\": Expected string with a single \"%%s\"",
-                argumentName));
+        throw Starlark.errorf(
+            "Invalid value for parameter \"%s\": Expected string with a single \"%%s\"",
+            argumentName);
       }
     }
 
     private void addScalarArg(Object value, String format, BaseFunction mapFn, Location loc)
         throws EvalException {
-      validateNoDirectory(value, loc);
-      validateFormatString("format", format, loc);
+      validateNoDirectory(value);
+      validateFormatString("format", format);
       if (format == null && mapFn == null) {
         commandLine.add(value);
       } else {
@@ -495,10 +487,9 @@
       }
     }
 
-    private void validateNoDirectory(Object value, Location loc) throws EvalException {
+    private void validateNoDirectory(Object value) throws EvalException {
       if (isDirectory(value)) {
-        throw new EvalException(
-            loc,
+        throw Starlark.errorf(
             "Cannot add directories to Args#add since they may expand to multiple values. "
                 + "Either use Args#add_all (if you want expansion) "
                 + "or args.add(directory.path) (if you do not).");
@@ -512,7 +503,7 @@
     @Override
     public CommandLineArgsApi useParamsFile(String paramFileArg, Boolean useAlways)
         throws EvalException {
-      checkMutable(/*loc=*/ null);
+      checkMutable(null);
       if (!SingleStringArgFormatter.isValid(paramFileArg)) {
         throw new EvalException(
             null,
@@ -528,7 +519,7 @@
 
     @Override
     public CommandLineArgsApi setParamFileFormat(String format) throws EvalException {
-      checkMutable(/*loc=*/ null);
+      checkMutable(null);
       final ParameterFileType parameterFileType;
       switch (format) {
         case "shell":
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/BazelBuildApiGlobals.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/BazelBuildApiGlobals.java
index aa5070e..415a08b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/BazelBuildApiGlobals.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/BazelBuildApiGlobals.java
@@ -14,10 +14,10 @@
 
 package com.google.devtools.build.lib.analysis.skylark;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.BazelStarlarkContext;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkBuildApiGlobals;
 import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
 
 /**
@@ -28,20 +28,17 @@
 
   @Override
   public SkylarkLateBoundDefault<?> configurationField(
-      String fragment, String name, Location loc, StarlarkThread thread) throws EvalException {
+      String fragment, String name, StarlarkThread thread) throws EvalException {
     BazelStarlarkContext bazelContext = BazelStarlarkContext.from(thread);
     Class<?> fragmentClass = bazelContext.getFragmentNameToClass().get(fragment);
-
     if (fragmentClass == null) {
-      throw new EvalException(
-          loc,
-          String.format("invalid configuration fragment name '%s'", fragment));
+      throw Starlark.errorf("invalid configuration fragment name '%s'", fragment);
     }
     try {
       return SkylarkLateBoundDefault.forConfigurationField(
           fragmentClass, name, bazelContext.getToolsRepository());
     } catch (SkylarkLateBoundDefault.InvalidConfigurationFieldException exception) {
-      throw new EvalException(loc, exception);
+      throw new EvalException(null, exception);
     }
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
index fd89266..0382952 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkActionFactory.java
@@ -46,7 +46,6 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.TargetUtils;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
@@ -95,9 +94,9 @@
    *
    * @throws EvalException if actions cannot be registered with this object
    */
-  public ActionRegistry asActionRegistry(
-      final Location location, SkylarkActionFactory skylarkActionFactory) throws EvalException {
-    validateActionCreation(location);
+  public ActionRegistry asActionRegistry(SkylarkActionFactory skylarkActionFactory)
+      throws EvalException {
+    validateActionCreation();
     return new ActionRegistry() {
 
       @Override
@@ -116,7 +115,7 @@
   }
 
   @Override
-  public Artifact declareFile(String filename, Object sibling, Location loc) throws EvalException {
+  public Artifact declareFile(String filename, Object sibling) throws EvalException {
     context.checkMutable("actions.declare_file");
 
     PathFragment fragment;
@@ -128,11 +127,9 @@
     }
 
     if (!fragment.startsWith(ruleContext.getPackageDirectory())) {
-      throw new EvalException(
-          loc,
-          String.format(
-              "the output artifact '%s' is not under package directory '%s' for target '%s'",
-              fragment, ruleContext.getPackageDirectory(), ruleContext.getLabel()));
+      throw Starlark.errorf(
+          "the output artifact '%s' is not under package directory '%s' for target '%s'",
+          fragment, ruleContext.getPackageDirectory(), ruleContext.getLabel());
     }
     return ruleContext.getDerivedArtifact(fragment, newFileRoot());
   }
@@ -167,13 +164,11 @@
   }
 
   @Override
-  public Artifact declareSymlink(String filename, Object sibling, Location location)
-      throws EvalException {
+  public Artifact declareSymlink(String filename, Object sibling) throws EvalException {
     context.checkMutable("actions.declare_symlink");
 
     if (!ruleContext.getConfiguration().allowUnresolvedSymlinks()) {
-      throw new EvalException(
-          location,
+      throw Starlark.errorf(
           "actions.declare_symlink() is not allowed; "
               + "use the --experimental_allow_unresolved_symlinks command line option");
     }
@@ -191,17 +186,15 @@
         ruleContext.getAnalysisEnvironment().getSymlinkArtifact(rootRelativePath, newFileRoot());
 
     if (!result.isSymlink()) {
-      throw new EvalException(
-          location,
-          String.format(
-              "'%s' has already been declared as something other than a symlink.", filename));
+      throw Starlark.errorf(
+          "'%s' has already been declared as something other than a symlink.", filename);
     }
 
     return result;
   }
 
   @Override
-  public void doNothing(String mnemonic, Object inputs, Location location) throws EvalException {
+  public void doNothing(String mnemonic, Object inputs) throws EvalException {
     context.checkMutable("actions.do_nothing");
     NestedSet<Artifact> inputSet =
         inputs instanceof Depset
@@ -220,7 +213,7 @@
             mnemonic,
             SPAWN_INFO,
             SpawnInfo.newBuilder().build());
-    registerAction(location, action);
+    registerAction(action);
   }
 
   @AutoCodec @AutoCodec.VisibleForSerialization
@@ -228,7 +221,7 @@
       SpawnInfo.spawnInfo;
 
   @Override
-  public void symlink(FileApi output, String path, Location location) throws EvalException {
+  public void symlink(FileApi output, String path) throws EvalException {
     context.checkMutable("actions.symlink");
 
     if (!ruleContext.getConfiguration().allowUnresolvedSymlinks()) {
@@ -241,8 +234,7 @@
     PathFragment targetPath = PathFragment.create(path);
     Artifact outputArtifact = (Artifact) output;
     if (!outputArtifact.isSymlink()) {
-      throw new EvalException(
-          location, "output of symlink action must be created by declare_symlink()");
+      throw Starlark.errorf("output of symlink action must be created by declare_symlink()");
     }
 
     Action action =
@@ -251,12 +243,11 @@
             outputArtifact,
             targetPath,
             "creating symlink " + ((Artifact) output).getRootRelativePathString());
-    registerAction(location, action);
+    registerAction(action);
   }
 
   @Override
-  public void write(FileApi output, Object content, Boolean isExecutable, Location location)
-      throws EvalException {
+  public void write(FileApi output, Object content, Boolean isExecutable) throws EvalException {
     context.checkMutable("actions.write");
     final Action action;
     if (content instanceof String) {
@@ -275,7 +266,7 @@
     } else {
       throw new AssertionError("Unexpected type: " + content.getClass().getSimpleName());
     }
-    registerAction(location, action);
+    registerAction(action);
   }
 
   @Override
@@ -291,8 +282,7 @@
       Boolean useDefaultShellEnv,
       Object envUnchecked,
       Object executionRequirementsUnchecked,
-      Object inputManifestsUnchecked,
-      Location location)
+      Object inputManifestsUnchecked)
       throws EvalException {
     context.checkMutable("actions.run");
     StarlarkAction.Builder builder = new StarlarkAction.Builder();
@@ -326,14 +316,12 @@
         envUnchecked,
         executionRequirementsUnchecked,
         inputManifestsUnchecked,
-        location,
         builder);
   }
 
-  private void validateActionCreation(Location location) throws EvalException {
+  private void validateActionCreation() throws EvalException {
     if (ruleContext.getRule().isAnalysisTest()) {
-      throw new EvalException(
-          location,
+      throw Starlark.errorf(
           "implementation function of a rule with "
               + "analysis_test=true may not register actions. Analysis test rules may only return "
               + "success/failure information via AnalysisTestResultInfo.");
@@ -346,15 +334,14 @@
    * <p>Use {@link #getActionConstructionContext()} to obtain the context required to create those
    * actions.
    */
-  public void registerAction(Location location, ActionAnalysisMetadata... actions)
-      throws EvalException {
-    validateActionCreation(location);
+  public void registerAction(ActionAnalysisMetadata... actions) throws EvalException {
+    validateActionCreation();
     ruleContext.registerAction(actions);
   }
 
   /**
    * Returns information needed to construct actions that can be registered with {@link
-   * #registerAction(Location, ActionAnalysisMetadata...)}.
+   * #registerAction(ActionAnalysisMetadata...)}.
    */
   public ActionConstructionContext getActionConstructionContext() {
     return ruleContext;
@@ -377,7 +364,6 @@
       Object envUnchecked,
       Object executionRequirementsUnchecked,
       Object inputManifestsUnchecked,
-      Location location,
       StarlarkThread thread)
       throws EvalException {
     context.checkMutable("actions.run_shell");
@@ -409,16 +395,14 @@
       }
     } else if (commandUnchecked instanceof Sequence) {
       if (thread.getSemantics().incompatibleRunShellCommandString()) {
-        throw new EvalException(
-            location,
+        throw Starlark.errorf(
             "'command' must be of type string. passing a sequence of strings as 'command'"
                 + " is deprecated. To temporarily disable this check,"
                 + " set --incompatible_objc_framework_cleanup=false.");
       }
       Sequence<?> commandList = (Sequence) commandUnchecked;
       if (argumentList.size() > 0) {
-        throw new EvalException(location,
-            "'arguments' must be empty if 'command' is a sequence of strings");
+        throw Starlark.errorf("'arguments' must be empty if 'command' is a sequence of strings");
       }
       List<String> command = commandList.getContents(String.class, "command");
       builder.setShellCommand(command);
@@ -446,7 +430,6 @@
         envUnchecked,
         executionRequirementsUnchecked,
         inputManifestsUnchecked,
-        location,
         builder);
   }
 
@@ -492,7 +475,6 @@
       Object envUnchecked,
       Object executionRequirementsUnchecked,
       Object inputManifestsUnchecked,
-      Location location,
       StarlarkAction.Builder builder)
       throws EvalException {
     Iterable<Artifact> inputArtifacts;
@@ -507,14 +489,13 @@
 
     List<Artifact> outputArtifacts = outputs.getContents(Artifact.class, "outputs");
     if (outputArtifacts.isEmpty()) {
-      throw new EvalException(location, "param 'outputs' may not be empty");
+      throw Starlark.errorf("param 'outputs' may not be empty");
     }
     builder.addOutputs(outputArtifacts);
 
     if (unusedInputsList != Starlark.NONE) {
       if (!starlarkSemantics.experimentalStarlarkUnusedInputsList()) {
-        throw new EvalException(
-            location,
+        throw Starlark.errorf(
             "'unused_inputs_list' attribute is experimental and disabled by default. "
                 + "This API is in development and subject to change at any time. "
                 + "Use --experimental_starlark_unused_inputs_list to use this experimental API.");
@@ -522,12 +503,10 @@
       if (unusedInputsList instanceof Artifact) {
         builder.setUnusedInputsList(Optional.of((Artifact) unusedInputsList));
       } else {
-        throw new EvalException(
-            location,
-            "expected value of type 'File' for "
-                + "a member of parameter 'unused_inputs_list' but got "
-                + EvalUtils.getDataTypeName(unusedInputsList)
-                + " instead");
+        throw Starlark.errorf(
+            "expected value of type 'File' for a member of parameter 'unused_inputs_list' but got"
+                + " %s instead",
+            EvalUtils.getDataTypeName(unusedInputsList));
       }
     }
 
@@ -578,18 +557,16 @@
                           .map(Artifact::getExecPathString)
                           .map(s -> "'" + s + "'")
                           .collect(toList()));
-          throw new EvalException(
-              location,
-              String.format(
-                  "Found tool(s) %s in inputs. "
-                      + "A tool is an input with executable=True set. "
-                      + "All tools should be passed using the 'tools' "
-                      + "argument instead of 'inputs' in order to make their runfiles available "
-                      + "to the action. This safety check will not be performed once the action "
-                      + "is modified to take a 'tools' argument. "
-                      + "To temporarily disable this check, "
-                      + "set --incompatible_no_support_tools_in_action_inputs=false.",
-                  toolsAsString));
+          throw Starlark.errorf(
+              "Found tool(s) %s in inputs. "
+                  + "A tool is an input with executable=True set. "
+                  + "All tools should be passed using the 'tools' "
+                  + "argument instead of 'inputs' in order to make their runfiles available "
+                  + "to the action. This safety check will not be performed once the action "
+                  + "is modified to take a 'tools' argument. "
+                  + "To temporarily disable this check, "
+                  + "set --incompatible_no_support_tools_in_action_inputs=false.",
+              toolsAsString);
         }
       } else {
         // Full legacy support -- add tools from inputs
@@ -631,7 +608,7 @@
       }
     }
     // Always register the action
-    registerAction(location, builder.build(ruleContext));
+    registerAction(builder.build(ruleContext));
   }
 
   private String getMnemonic(Object mnemonicUnchecked) {
@@ -648,11 +625,7 @@
 
   @Override
   public void expandTemplate(
-      FileApi template,
-      FileApi output,
-      Dict<?, ?> substitutionsUnchecked,
-      Boolean executable,
-      Location location)
+      FileApi template, FileApi output, Dict<?, ?> substitutionsUnchecked, Boolean executable)
       throws EvalException {
     context.checkMutable("actions.expand_template");
     ImmutableList.Builder<Substitution> substitutionsBuilder = ImmutableList.builder();
@@ -674,7 +647,7 @@
             (Artifact) output,
             substitutionsBuilder.build(),
             executable);
-    registerAction(location, action);
+    registerAction(action);
   }
 
   /**
@@ -689,7 +662,7 @@
 
   @Override
   public Args args(StarlarkThread thread) {
-    return Args.newArgs(thread.mutability(), starlarkSemantics);
+    return Args.newArgs(thread.mutability(), thread.getSemantics());
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java
index ae8d23e..c8aa38e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java
@@ -26,7 +26,6 @@
 import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
 import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.Attribute.AllowedValueSet;
 import com.google.devtools.build.lib.packages.Attribute.ImmutableAttributeFactory;
@@ -92,22 +91,21 @@
   }
 
   private static ImmutableAttributeFactory createAttributeFactory(
-      Type<?> type, String doc, Map<String, Object> arguments, Location loc, StarlarkThread thread)
+      Type<?> type, String doc, Map<String, Object> arguments, StarlarkThread thread)
       throws EvalException {
     // We use an empty name now so that we can set it later.
     // This trick makes sense only in the context of Skylark (builtin rules should not use it).
-    return createAttributeFactory(type, doc, arguments, loc, thread, "");
+    return createAttributeFactory(type, doc, arguments, thread, "");
   }
 
   private static ImmutableAttributeFactory createAttributeFactory(
       Type<?> type,
       String doc,
       Map<String, Object> arguments,
-      Location loc,
       StarlarkThread thread,
       String name)
       throws EvalException {
-    return createAttribute(type, doc, arguments, loc, thread, name).buildPartial();
+    return createAttribute(type, doc, arguments, thread, name).buildPartial();
   }
 
   @SuppressWarnings("unchecked")
@@ -115,7 +113,6 @@
       Type<?> type,
       String doc,
       Map<String, Object> arguments,
-      Location loc,
       StarlarkThread thread,
       String name)
       throws EvalException {
@@ -135,7 +132,7 @@
         // We solve this problem by asking the StarlarkCallbackHelper for the parameter names used
         // in the function definition, which must be the names of attributes used by the callback.
         builder.value(
-            new SkylarkComputedDefaultTemplate(type, callback.getParameterNames(), callback, loc));
+            new SkylarkComputedDefaultTemplate(type, callback.getParameterNames(), callback));
       } else if (defaultValue instanceof SkylarkLateBoundDefault) {
         builder.value((SkylarkLateBoundDefault) defaultValue); // unchecked cast
       } else {
@@ -290,7 +287,7 @@
 
       List<SkylarkAspect> aspects = ((Sequence<?>) obj).getContents(SkylarkAspect.class, "aspects");
       for (SkylarkAspect aspect : aspects) {
-        aspect.attachToAttribute(builder, loc);
+        aspect.attachToAttribute(builder);
       }
     }
 
@@ -303,7 +300,6 @@
    * providers (then the result is the list of sets).
    *
    * @param argumentName used in error messages.
-   * @param location location for error messages.
    */
   static ImmutableList<ImmutableSet<SkylarkProviderIdentifier>> buildProviderPredicate(
       Sequence<?> obj, String argumentName) throws EvalException {
@@ -389,10 +385,10 @@
   }
 
   private static Descriptor createAttrDescriptor(
-      String name, Map<String, Object> kwargs, Type<?> type, Location loc, StarlarkThread thread)
+      String name, Map<String, Object> kwargs, Type<?> type, StarlarkThread thread)
       throws EvalException {
     try {
-      return new Descriptor(name, createAttributeFactory(type, null, kwargs, loc, thread));
+      return new Descriptor(name, createAttributeFactory(type, null, kwargs, thread));
     } catch (ConversionException e) {
       throw new EvalException(null, e.getMessage());
     }
@@ -415,7 +411,7 @@
   }
 
   private static Descriptor createNonconfigurableAttrDescriptor(
-      String name, Map<String, Object> kwargs, Type<?> type, Location loc, StarlarkThread thread)
+      String name, Map<String, Object> kwargs, Type<?> type, StarlarkThread thread)
       throws EvalException {
     String whyNotConfigurableReason =
         Preconditions.checkNotNull(maybeGetNonConfigurableReason(type), type);
@@ -424,7 +420,7 @@
       // This trick makes sense only in the context of Skylark (builtin rules should not use it).
       return new Descriptor(
           name,
-          createAttribute(type, null, kwargs, loc, thread, "")
+          createAttribute(type, null, kwargs, thread, "")
               .nonconfigurable(whyNotConfigurableReason)
               .buildPartial());
     } catch (ConversionException e) {
@@ -443,7 +439,6 @@
       String doc,
       Boolean mandatory,
       Sequence<?> values,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     // TODO(bazel-team): Replace literal strings with constants.
@@ -452,7 +447,6 @@
         "int",
         optionMap(DEFAULT_ARG, defaultValue, MANDATORY_ARG, mandatory, VALUES_ARG, values),
         Type.INTEGER,
-        loc,
         thread);
   }
 
@@ -462,7 +456,6 @@
       String doc,
       Boolean mandatory,
       Sequence<?> values,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase("attr.string");
@@ -470,7 +463,6 @@
         "string",
         optionMap(DEFAULT_ARG, defaultValue, MANDATORY_ARG, mandatory, VALUES_ARG, values),
         Type.STRING,
-        loc,
         thread);
   }
 
@@ -487,7 +479,6 @@
       Boolean singleFile,
       Object cfg,
       Sequence<?> aspects,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase("attr.label");
@@ -517,7 +508,6 @@
                   cfg,
                   ASPECTS_ARG,
                   aspects),
-              loc,
               thread,
               "label");
       return new Descriptor("label", attribute);
@@ -533,7 +523,6 @@
       Boolean allowEmpty,
       Sequence<?> defaultValue,
       String doc,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase("attr.string_list");
@@ -549,7 +538,6 @@
             ALLOW_EMPTY_ARG,
             allowEmpty),
         Type.STRING_LIST,
-        loc,
         thread);
   }
 
@@ -560,7 +548,6 @@
       Boolean allowEmpty,
       Sequence<?> defaultValue,
       String doc,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase("attr.int_list");
@@ -576,7 +563,6 @@
             ALLOW_EMPTY_ARG,
             allowEmpty),
         Type.INTEGER_LIST,
-        loc,
         thread);
   }
 
@@ -593,7 +579,6 @@
       Boolean nonEmpty,
       Object cfg,
       Sequence<?> aspects,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase("attr.label_list");
@@ -621,7 +606,7 @@
             aspects);
     try {
       ImmutableAttributeFactory attribute =
-          createAttributeFactory(BuildType.LABEL_LIST, doc, kwargs, loc, thread, "label_list");
+          createAttributeFactory(BuildType.LABEL_LIST, doc, kwargs, thread, "label_list");
       return new Descriptor("label_list", attribute);
     } catch (EvalException e) {
       throw new EvalException(null, e.getMessage(), e);
@@ -641,7 +626,6 @@
       Boolean nonEmpty,
       Object cfg,
       Sequence<?> aspects,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase("attr.label_keyed_string_dict");
@@ -673,7 +657,6 @@
               BuildType.LABEL_KEYED_STRING_DICT,
               doc,
               kwargs,
-              loc,
               thread,
               "label_keyed_string_dict");
       return new Descriptor("label_keyed_string_dict", attribute);
@@ -684,14 +667,13 @@
 
   @Override
   public Descriptor boolAttribute(
-      Boolean defaultValue, String doc, Boolean mandatory, Location loc, StarlarkThread thread)
+      Boolean defaultValue, String doc, Boolean mandatory, StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase("attr.bool");
     return createAttrDescriptor(
         "bool",
         optionMap(DEFAULT_ARG, defaultValue, MANDATORY_ARG, mandatory),
         Type.BOOLEAN,
-        loc,
         thread);
   }
 
@@ -700,7 +682,6 @@
       Object defaultValue, // Label | StarlarkFunction
       String doc,
       Boolean mandatory,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase("attr.output");
@@ -709,7 +690,6 @@
         "output",
         optionMap(DEFAULT_ARG, defaultValue, MANDATORY_ARG, mandatory),
         BuildType.OUTPUT,
-        loc,
         thread);
   }
 
@@ -720,7 +700,6 @@
       String doc,
       Boolean mandatory,
       Boolean nonEmpty,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase("attr.output_list");
@@ -737,7 +716,6 @@
             ALLOW_EMPTY_ARG,
             allowEmpty),
         BuildType.OUTPUT_LIST,
-        loc,
         thread);
   }
 
@@ -748,7 +726,6 @@
       String doc,
       Boolean mandatory,
       Boolean nonEmpty,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase("attr.string_dict");
@@ -764,7 +741,6 @@
             ALLOW_EMPTY_ARG,
             allowEmpty),
         Type.STRING_DICT,
-        loc,
         thread);
   }
 
@@ -775,7 +751,6 @@
       String doc,
       Boolean mandatory,
       Boolean nonEmpty,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase("attr.string_list_dict");
@@ -791,20 +766,18 @@
             ALLOW_EMPTY_ARG,
             allowEmpty),
         Type.STRING_LIST_DICT,
-        loc,
         thread);
   }
 
   @Override
   public Descriptor licenseAttribute(
-      Object defaultValue, String doc, Boolean mandatory, Location loc, StarlarkThread thread)
+      Object defaultValue, String doc, Boolean mandatory, StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase("attr.license");
     return createNonconfigurableAttrDescriptor(
         "license",
         optionMap(DEFAULT_ARG, defaultValue, MANDATORY_ARG, mandatory),
         BuildType.LICENSE,
-        loc,
         thread);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkErrorReporter.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkErrorReporter.java
index 981aeec..6200946 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkErrorReporter.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkErrorReporter.java
@@ -13,7 +13,6 @@
 // limitations under the License
 package com.google.devtools.build.lib.analysis.skylark;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
 import com.google.devtools.build.lib.packages.RuleErrorConsumer;
 import com.google.devtools.build.lib.syntax.EvalException;
@@ -30,15 +29,13 @@
  */
 public class SkylarkErrorReporter implements AutoCloseable, RuleErrorConsumer {
   private final RuleErrorConsumer ruleErrorConsumer;
-  private final Location location;
 
-  public static SkylarkErrorReporter from(RuleErrorConsumer ruleErrorConsumer, Location location) {
-    return new SkylarkErrorReporter(ruleErrorConsumer, location);
+  public static SkylarkErrorReporter from(RuleErrorConsumer ruleErrorConsumer) {
+    return new SkylarkErrorReporter(ruleErrorConsumer);
   }
 
-  private SkylarkErrorReporter(RuleErrorConsumer ruleErrorConsumer, Location location) {
+  private SkylarkErrorReporter(RuleErrorConsumer ruleErrorConsumer) {
     this.ruleErrorConsumer = ruleErrorConsumer;
-    this.location = location;
   }
 
   @Override
@@ -46,7 +43,7 @@
     try {
       assertNoErrors();
     } catch (RuleErrorException e) {
-      throw new EvalException(location, "error occurred while evaluating builtin function", e);
+      throw new EvalException(null, "error occurred while evaluating builtin function", e);
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
index d7a212a9..b07bb56 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
@@ -251,7 +251,7 @@
       };
 
   @Override
-  public Provider provider(String doc, Object fields, Location location) throws EvalException {
+  public Provider provider(String doc, Object fields, StarlarkThread thread) throws EvalException {
     Collection<String> fieldNames = null;
     if (fields instanceof Sequence) {
       @SuppressWarnings("unchecked")
@@ -261,7 +261,7 @@
                   fields,
                   Sequence.class,
                   String.class,
-                  location,
+                  null,
                   "Expected list of strings or dictionary of string -> string for 'fields'");
       fieldNames = list;
     } else if (fields instanceof Dict) {
@@ -271,7 +271,7 @@
           "Expected list of strings or dictionary of string -> string for 'fields'");
       fieldNames = dict.keySet();
     }
-    return SkylarkProvider.createUnexportedSchemaful(fieldNames, location);
+    return SkylarkProvider.createUnexportedSchemaful(fieldNames, thread.getCallerLocation());
   }
 
   // TODO(bazel-team): implement attribute copy and other rule properties
@@ -293,7 +293,6 @@
       Object analysisTest,
       Object buildSetting,
       Object cfg,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext bazelContext = BazelStarlarkContext.from(thread);
@@ -319,7 +318,6 @@
 
     if (executable || test) {
       addAttribute(
-          loc,
           builder,
           attr("$is_executable", BOOLEAN)
               .value(true)
@@ -334,7 +332,7 @@
             new StarlarkCallbackHelper(
                 (StarlarkFunction) implicitOutputs, thread.getSemantics(), bazelContext);
         builder.setImplicitOutputsFunction(
-            new SkylarkImplicitOutputsFunctionWithCallback(callback, loc));
+            new SkylarkImplicitOutputsFunctionWithCallback(callback, thread.getCallerLocation()));
       } else {
         builder.setImplicitOutputsFunction(
             new SkylarkImplicitOutputsFunctionWithMap(
@@ -366,8 +364,7 @@
             bazelContext.getRepoMapping()));
 
     if (!buildSetting.equals(Starlark.NONE) && !cfg.equals(Starlark.NONE)) {
-      throw new EvalException(
-          null,
+      throw Starlark.errorf(
           "Build setting rules cannot use the `cfg` param to apply transitions to themselves.");
     }
     if (!buildSetting.equals(Starlark.NONE)) {
@@ -375,8 +372,7 @@
     }
     if (!cfg.equals(Starlark.NONE)) {
       if (!(cfg instanceof StarlarkDefinedConfigTransition)) {
-        throw new EvalException(
-            null,
+        throw Starlark.errorf(
             "`cfg` must be set to a transition object initialized by the transition() function.");
       }
       StarlarkDefinedConfigTransition starlarkDefinedConfigTransition =
@@ -387,12 +383,10 @@
 
     for (Object o : providesArg) {
       if (!SkylarkAttr.isProvider(o)) {
-        throw new EvalException(
-            null,
-            String.format(
-                "Illegal argument: element in 'provides' is of unexpected type. "
-                    + "Should be list of providers, but got item of type %s.",
-                EvalUtils.getDataTypeName(o, true)));
+        throw Starlark.errorf(
+            "Illegal argument: element in 'provides' is of unexpected type. "
+                + "Should be list of providers, but got item of type %s.",
+            EvalUtils.getDataTypeName(o, true));
       }
     }
     for (SkylarkProviderIdentifier skylarkProvider :
@@ -404,16 +398,15 @@
       builder.addExecutionPlatformConstraints(
           collectConstraintLabels(
               execCompatibleWith.getContents(String.class, "exec_compatile_with"),
-              loc,
               bazelContext.getRepoMapping()));
     }
 
-    return new SkylarkRuleFunction(builder, type, attributes, loc);
+    return new SkylarkRuleFunction(builder, type, attributes, thread.getCallerLocation());
   }
 
   private static void checkAttributeName(String name) throws EvalException {
     if (!Identifier.isValid(name)) {
-      throw new EvalException(null, "attribute name `" + name + "` is not a valid identifier.");
+      throw Starlark.errorf("attribute name `%s` is not a valid identifier.", name);
     }
   }
 
@@ -434,12 +427,12 @@
     return attributes.build();
   }
 
-  private static void addAttribute(
-      Location location, RuleClass.Builder builder, Attribute attribute) throws EvalException {
+  private static void addAttribute(RuleClass.Builder builder, Attribute attribute)
+      throws EvalException {
     try {
       builder.addOrOverrideAttribute(attribute);
     } catch (IllegalArgumentException ex) {
-      throw new EvalException(location, ex);
+      throw new EvalException(null, ex);
     }
   }
 
@@ -463,7 +456,6 @@
 
   private static ImmutableList<Label> collectConstraintLabels(
       Iterable<String> rawLabels,
-      Location loc,
       ImmutableMap<RepositoryName, RepositoryName> mapping)
       throws EvalException {
     ImmutableList.Builder<Label> constraintLabels = new ImmutableList.Builder<>();
@@ -472,8 +464,7 @@
         Label constraintLabel = Label.parseAbsolute(rawLabel, mapping);
         constraintLabels.add(constraintLabel);
       } catch (LabelSyntaxException e) {
-        throw new EvalException(
-            loc, String.format("Unable to parse constraint %s: %s", rawLabel, e.getMessage()), e);
+        throw Starlark.errorf("Unable to parse constraint %s: %s", rawLabel, e.getMessage());
       }
     }
 
@@ -492,7 +483,6 @@
       Sequence<?> toolchains,
       String doc,
       Boolean applyToGeneratingRules,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     ImmutableList.Builder<String> attrAspects = ImmutableList.builder();
@@ -633,8 +623,7 @@
     }
 
     @Override
-    public Object call(
-        StarlarkThread thread, Location loc, Tuple<Object> args, Dict<String, Object> kwargs)
+    public Object call(StarlarkThread thread, Tuple<Object> args, Dict<String, Object> kwargs)
         throws EvalException, InterruptedException, ConversionException {
       if (!args.isEmpty()) {
         throw new EvalException(null, "unexpected positional arguments");
@@ -651,11 +640,9 @@
             attribute.getRequiredAspectParameters().entrySet()) {
           for (String required : attrRequirements.getValue()) {
             if (!ruleClass.hasAttr(required, Type.STRING)) {
-              throw new EvalException(definitionLocation, String.format(
+              throw Starlark.errorf(
                   "Aspect %s requires rule %s to specify attribute '%s' with type string.",
-                  attrRequirements.getKey(),
-                  ruleClass.getName(),
-                  required));
+                  attrRequirements.getKey(), ruleClass.getName(), required);
             }
           }
         }
@@ -672,9 +659,14 @@
                   + "Rules may be instantiated only in a BUILD thread.");
         }
         RuleFactory.createAndAddRule(
-            pkgContext, ruleClass, attributeValues, loc, thread, new AttributeContainer(ruleClass));
+            pkgContext,
+            ruleClass,
+            attributeValues,
+            thread.getCallerLocation(),
+            thread,
+            new AttributeContainer(ruleClass));
       } catch (InvalidRuleException | NameConflictException e) {
-        throw new EvalException(loc, e.getMessage());
+        throw new EvalException(null, e.getMessage());
       }
       return Starlark.NONE;
     }
@@ -740,7 +732,7 @@
           hasFunctionTransitionWhitelist = true;
           builder.setHasFunctionTransitionWhitelist();
         }
-        addAttribute(definitionLocation, builder, attr);
+        addAttribute(builder, attr);
       }
       // TODO(b/121385274): remove when we stop whitelisting starlark transitions
       if (hasStarlarkDefinedTransition) {
@@ -788,8 +780,7 @@
   }
 
   @Override
-  public Label label(
-      String labelString, Boolean relativeToCallerRepository, Location loc, StarlarkThread thread)
+  public Label label(String labelString, Boolean relativeToCallerRepository, StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext context = BazelStarlarkContext.from(thread);
 
@@ -860,7 +851,7 @@
       }
       return labelCache.get(labelString);
     } catch (LabelValidator.BadLabelException | LabelSyntaxException | ExecutionException e) {
-      throw new EvalException(loc, "Illegal absolute label syntax: " + labelString);
+      throw Starlark.errorf("Illegal absolute label syntax: %s", labelString);
     }
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
index ea2fb0f..11cbbbd 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
@@ -237,15 +237,14 @@
     }
   }
 
-  private static void addOutputGroups(Object value, Location loc,
-      RuleConfiguredTargetBuilder builder)
+  private static void addOutputGroups(Object value, RuleConfiguredTargetBuilder builder)
       throws EvalException {
     Map<String, StarlarkValue> outputGroups =
         SkylarkType.castMap(value, String.class, StarlarkValue.class, "output_groups");
 
     for (String outputGroup : outputGroups.keySet()) {
       StarlarkValue objects = outputGroups.get(outputGroup);
-      NestedSet<Artifact> artifacts = convertToOutputGroupValue(loc, outputGroup, objects);
+      NestedSet<Artifact> artifacts = convertToOutputGroupValue(outputGroup, objects);
       builder.addOutputGroup(outputGroup, artifacts);
     }
   }
@@ -270,7 +269,6 @@
     }
     InstrumentedFilesInfo instrumentedFilesProvider =
         CoverageCommon.createInstrumentedFilesInfo(
-            insStruct.getCreationLoc(),
             ruleContext,
             sourceAttributes,
             dependencyAttributes,
@@ -278,8 +276,8 @@
     builder.addNativeDeclaredProvider(instrumentedFilesProvider);
   }
 
-  public static NestedSet<Artifact> convertToOutputGroupValue(Location loc, String outputGroup,
-      Object objects) throws EvalException {
+  public static NestedSet<Artifact> convertToOutputGroupValue(String outputGroup, Object objects)
+      throws EvalException {
     String typeErrorMessage =
         "Output group '%s' is of unexpected type. "
             + "Should be list or set of Files, but got '%s' instead.";
@@ -290,12 +288,10 @@
         if (o instanceof Artifact) {
           nestedSetBuilder.add((Artifact) o);
         } else {
-          throw new EvalException(
-              loc,
-              String.format(
-                  typeErrorMessage,
-                  outputGroup,
-                  "list with an element of " + EvalUtils.getDataTypeNameFromClass(o.getClass())));
+          throw Starlark.errorf(
+              typeErrorMessage,
+              outputGroup,
+              "list with an element of " + EvalUtils.getDataTypeNameFromClass(o.getClass()));
         }
       }
       return nestedSetBuilder.build();
@@ -305,7 +301,7 @@
               objects,
               Depset.class,
               Artifact.class,
-              loc,
+              null,
               typeErrorMessage,
               outputGroup,
               EvalUtils.getDataTypeName(objects, true));
@@ -313,7 +309,7 @@
         return artifactsSet.getSet(Artifact.class);
       } catch (Depset.TypeException exception) {
         throw new EvalException(
-            loc,
+            null,
             String.format(
                 typeErrorMessage,
                 outputGroup,
@@ -420,7 +416,7 @@
                   + "' should be specified in DefaultInfo if it's provided explicitly.");
         }
       } else if (field.equals("output_groups")) {
-        addOutputGroups(oldStyleProviders.getValue(field), loc, builder);
+        addOutputGroups(oldStyleProviders.getValue(field), builder);
       } else if (field.equals("instrumented_files")) {
         StructImpl insStruct = cast("instrumented_files", oldStyleProviders, StructImpl.class, loc);
         addInstrumentedFiles(insStruct, context.getRuleContext(), builder);
@@ -536,7 +532,7 @@
       executable = defaultInfo.getExecutable();
 
     } else {
-      // Rule implementations aren't reqiured to return default-info fields via a DefaultInfo
+      // Rule implementations aren't required to return default-info fields via a DefaultInfo
       // provider. They can return them as fields on the returned struct. For example,
       // 'return struct(executable = foo)' instead of 'return DefaultInfo(executable = foo)'.
       // TODO(cparsons): Look into deprecating this option.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
index 3fbfe85..0c4cae2 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
@@ -737,11 +737,8 @@
   }
 
   @Override
-  public Artifact newFile(Object var1,
-      Object var2,
-      Object fileSuffix,
-      Location loc) throws EvalException {
-    checkDeprecated("ctx.actions.declare_file", "ctx.new_file", null, starlarkSemantics);
+  public Artifact newFile(Object var1, Object var2, Object fileSuffix) throws EvalException {
+    checkDeprecated("ctx.actions.declare_file", "ctx.new_file", starlarkSemantics);
     checkMutable("new_file");
 
     // Determine which of new_file's four signatures is being used. Yes, this is terrible.
@@ -749,11 +746,10 @@
     if (fileSuffix != Starlark.UNBOUND) {
       // new_file(file_root, sibling_file, suffix)
       ArtifactRoot root =
-          assertTypeForNewFile(var1, ArtifactRoot.class, loc,
-              "expected first param to be of type 'root'");
+          assertTypeForNewFile(
+              var1, ArtifactRoot.class, "expected first param to be of type 'root'");
       Artifact siblingFile =
-          assertTypeForNewFile(var2, Artifact.class, loc,
-              "expected second param to be of type 'File'");
+          assertTypeForNewFile(var2, Artifact.class, "expected second param to be of type 'File'");
       PathFragment original = siblingFile.getRootRelativePath();
       PathFragment fragment = original.replaceName(original.getBaseName() + fileSuffix);
       return ruleContext.getDerivedArtifact(fragment, root);
@@ -761,13 +757,12 @@
     } else if (var2 == Starlark.UNBOUND) {
       // new_file(filename)
       String filename =
-          assertTypeForNewFile(var1, String.class, loc,
-              "expected first param to be of type 'string'");
-      return actionFactory.declareFile(filename, Starlark.NONE, loc);
+          assertTypeForNewFile(var1, String.class, "expected first param to be of type 'string'");
+      return actionFactory.declareFile(filename, Starlark.NONE);
 
     } else {
-      String filename = assertTypeForNewFile(var2, String.class, loc,
-          "expected second param to be of type 'string'");
+      String filename =
+          assertTypeForNewFile(var2, String.class, "expected second param to be of type 'string'");
       if (var1 instanceof ArtifactRoot) {
         // new_file(root, filename)
         ArtifactRoot root = (ArtifactRoot) var1;
@@ -776,27 +771,27 @@
       } else {
         // new_file(sibling_file, filename)
         Artifact siblingFile =
-            assertTypeForNewFile(var1, Artifact.class, loc,
-                "expected first param to be of type 'File' or 'root'");
+            assertTypeForNewFile(
+                var1, Artifact.class, "expected first param to be of type 'File' or 'root'");
 
-        return actionFactory.declareFile(filename, siblingFile, loc);
+        return actionFactory.declareFile(filename, siblingFile);
       }
     }
   }
 
-  private static <T> T assertTypeForNewFile(Object obj, Class<T> type, Location loc,
-      String errorMessage) throws EvalException {
+  private static <T> T assertTypeForNewFile(Object obj, Class<T> type, String errorMessage)
+      throws EvalException {
     if (type.isInstance(obj)) {
       return type.cast(obj);
     } else {
-      throw new EvalException(loc, errorMessage);
+      throw new EvalException(null, errorMessage);
     }
   }
 
   @Override
   public Artifact newDirectory(String name, Object siblingArtifactUnchecked) throws EvalException {
     checkDeprecated(
-        "ctx.actions.declare_directory", "ctx.experimental_new_directory", null, starlarkSemantics);
+        "ctx.actions.declare_directory", "ctx.experimental_new_directory", starlarkSemantics);
     checkMutable("experimental_new_directory");
     return actionFactory.declareDirectory(name, siblingArtifactUnchecked);
   }
@@ -890,14 +885,13 @@
       Object envUnchecked,
       Object executionRequirementsUnchecked,
       Object inputManifestsUnchecked,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     checkDeprecated(
-        "ctx.actions.run or ctx.actions.run_shell", "ctx.action", loc, thread.getSemantics());
+        "ctx.actions.run or ctx.actions.run_shell", "ctx.action", thread.getSemantics());
     checkMutable("action");
     if ((commandUnchecked == Starlark.NONE) == (executableUnchecked == Starlark.NONE)) {
-      throw new EvalException(loc, "You must specify either 'command' or 'executable' argument");
+      throw Starlark.errorf("You must specify either 'command' or 'executable' argument");
     }
     boolean hasCommand = commandUnchecked != Starlark.NONE;
     if (!hasCommand) {
@@ -914,8 +908,7 @@
               useDefaultShellEnv,
               envUnchecked,
               executionRequirementsUnchecked,
-              inputManifestsUnchecked,
-              loc);
+              inputManifestsUnchecked);
 
     } else {
       actions()
@@ -931,15 +924,14 @@
               envUnchecked,
               executionRequirementsUnchecked,
               inputManifestsUnchecked,
-              loc,
               thread);
     }
     return Starlark.NONE;
   }
 
   @Override
-  public String expandLocation(
-      String input, Sequence<?> targets, Location loc, StarlarkThread thread) throws EvalException {
+  public String expandLocation(String input, Sequence<?> targets, StarlarkThread thread)
+      throws EvalException {
     checkMutable("expand_location");
     try {
       return LocationExpander.withExecPaths(
@@ -947,26 +939,26 @@
               makeLabelMap(targets.getContents(TransitiveInfoCollection.class, "targets")))
           .expand(input);
     } catch (IllegalStateException ise) {
-      throw new EvalException(loc, ise);
+      throw new EvalException(null, ise);
     }
   }
 
   @Override
   public NoneType fileAction(
-      FileApi output, String content, Boolean executable, Location loc, StarlarkThread thread)
+      FileApi output, String content, Boolean executable, StarlarkThread thread)
       throws EvalException {
-    checkDeprecated("ctx.actions.write", "ctx.file_action", loc, thread.getSemantics());
+    checkDeprecated("ctx.actions.write", "ctx.file_action", thread.getSemantics());
     checkMutable("file_action");
-    actions().write(output, content, executable, loc);
+    actions().write(output, content, executable);
     return Starlark.NONE;
   }
 
   @Override
-  public NoneType emptyAction(String mnemonic, Object inputs, Location loc, StarlarkThread thread)
+  public NoneType emptyAction(String mnemonic, Object inputs, StarlarkThread thread)
       throws EvalException {
-    checkDeprecated("ctx.actions.do_nothing", "ctx.empty_action", loc, thread.getSemantics());
+    checkDeprecated("ctx.actions.do_nothing", "ctx.empty_action", thread.getSemantics());
     checkMutable("empty_action");
-    actions().doNothing(mnemonic, inputs, loc);
+    actions().doNothing(mnemonic, inputs);
     return Starlark.NONE;
   }
 
@@ -976,13 +968,11 @@
       FileApi output,
       Dict<?, ?> substitutionsUnchecked,
       Boolean executable,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
-    checkDeprecated(
-        "ctx.actions.expand_template", "ctx.template_action", loc, thread.getSemantics());
+    checkDeprecated("ctx.actions.expand_template", "ctx.template_action", thread.getSemantics());
     checkMutable("template_action");
-    actions().expandTemplate(template, output, substitutionsUnchecked, executable, loc);
+    actions().expandTemplate(template, output, substitutionsUnchecked, executable);
     return Starlark.NONE;
   }
 
@@ -993,8 +983,7 @@
       Boolean collectData,
       Boolean collectDefault,
       Dict<?, ?> symlinks,
-      Dict<?, ?> rootSymlinks,
-      Location loc)
+      Dict<?, ?> rootSymlinks)
       throws EvalException, ConversionException {
     checkMutable("runfiles");
     Runfiles.Builder builder =
@@ -1045,12 +1034,11 @@
       Sequence<?> tools,
       Dict<?, ?> labelDictUnchecked,
       Dict<?, ?> executionRequirementsUnchecked,
-      Location loc,
       StarlarkThread thread)
       throws ConversionException, EvalException {
     checkMutable("resolve_command");
     Label ruleLabel = getLabel();
-    Map<Label, Iterable<Artifact>> labelDict = checkLabelDict(labelDictUnchecked, loc);
+    Map<Label, Iterable<Artifact>> labelDict = checkLabelDict(labelDictUnchecked);
     // The best way to fix this probably is to convert CommandHelper to Skylark.
     CommandHelper helper =
         CommandHelper.builder(getRuleContext())
@@ -1117,13 +1105,13 @@
    * corresponding map where any sets are replaced by iterables.
    */
   // TODO(bazel-team): find a better way to typecheck this argument.
-  private static Map<Label, Iterable<Artifact>> checkLabelDict(Map<?, ?> labelDict, Location loc)
+  private static Map<Label, Iterable<Artifact>> checkLabelDict(Map<?, ?> labelDict)
       throws EvalException {
     Map<Label, Iterable<Artifact>> convertedMap = new HashMap<>();
     for (Map.Entry<?, ?> entry : labelDict.entrySet()) {
       Object key = entry.getKey();
       if (!(key instanceof Label)) {
-        throw new EvalException(loc, Starlark.format("invalid key %r in 'label_dict'", key));
+        throw Starlark.errorf("invalid key %s in 'label_dict'", Starlark.repr(key));
       }
       ImmutableList.Builder<Artifact> files = ImmutableList.builder();
       Object val = entry.getValue();
@@ -1131,15 +1119,13 @@
       if (val instanceof Iterable) {
         valIter = (Iterable<?>) val;
       } else {
-        throw new EvalException(
-            loc,
-            Starlark.format(
-                "invalid value %r in 'label_dict': expected iterable, but got '%s'",
-                val, EvalUtils.getDataTypeName(val)));
+        throw Starlark.errorf(
+            "invalid value %s in 'label_dict': expected iterable, but got '%s'",
+            Starlark.repr(val), EvalUtils.getDataTypeName(val));
       }
       for (Object file : valIter) {
         if (!(file instanceof Artifact)) {
-          throw new EvalException(loc, Starlark.format("invalid value %r in 'label_dict'", val));
+          throw Starlark.errorf("invalid value %s in 'label_dict'", Starlark.repr(val));
         }
         files.add((Artifact) file);
       }
@@ -1151,18 +1137,13 @@
   /** suffix of script to be used in case the command is too long to fit on a single line */
   private static final String SCRIPT_SUFFIX = ".script.sh";
 
-  private static void checkDeprecated(
-      String newApi, String oldApi, Location loc, StarlarkSemantics semantics)
+  private static void checkDeprecated(String newApi, String oldApi, StarlarkSemantics semantics)
       throws EvalException {
     if (semantics.incompatibleNewActionsApi()) {
-      throw new EvalException(
-          loc,
-          "Use "
-              + newApi
-              + " instead of "
-              + oldApi
-              + ". \n"
-              + "Use --incompatible_new_actions_api=false to temporarily disable this check.");
+      throw Starlark.errorf(
+          "Use %s instead of %s. \n"
+              + "Use --incompatible_new_actions_api=false to temporarily disable this check.",
+          newApi, oldApi);
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/CoverageCommon.java b/src/main/java/com/google/devtools/build/lib/analysis/test/CoverageCommon.java
index f8c7a7a..ecd1252 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/CoverageCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/CoverageCommon.java
@@ -20,7 +20,6 @@
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.InstrumentationSpec;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.test.CoverageCommonApi;
 import com.google.devtools.build.lib.skylarkbuildapi.test.InstrumentedFilesInfoApi;
 import com.google.devtools.build.lib.syntax.EvalException;
@@ -42,8 +41,7 @@
       SkylarkRuleContext skylarkRuleContext,
       Sequence<?> sourceAttributes, // <String>
       Sequence<?> dependencyAttributes, // <String>
-      Object extensions,
-      Location location)
+      Object extensions)
       throws EvalException {
     List<String> extensionsList =
         extensions == Starlark.NONE
@@ -51,7 +49,6 @@
             : Sequence.castList((List<?>) extensions, String.class, "extensions");
 
     return createInstrumentedFilesInfo(
-        location,
         skylarkRuleContext.getRuleContext(),
         sourceAttributes.getContents(String.class, "source_attributes"),
         dependencyAttributes.getContents(String.class, "dependency_attributes"),
@@ -64,7 +61,6 @@
    * example, the instrumented sources are determined given the values of the attributes named in
    * {@code sourceAttributes} given by the {@code ruleContext}.
    *
-   * @param location the Starlark location that the instrumentation specification was defined
    * @param ruleContext the rule context
    * @param sourceAttributes a list of attribute names which contain source files for the rule
    * @param dependencyAttributes a list of attribute names which contain dependencies that might
@@ -74,7 +70,6 @@
    *     extensions listed in {@code extensions} will be used
    */
   public static InstrumentedFilesInfo createInstrumentedFilesInfo(
-      Location location,
       RuleContext ruleContext,
       List<String> sourceAttributes,
       List<String> dependencyAttributes,
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
index 17efe82..39540c3 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java
@@ -34,7 +34,6 @@
 import com.google.devtools.build.lib.bazel.repository.downloader.HttpUtils;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.ExtendedEventHandler.FetchProgress;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.StructImpl;
@@ -57,6 +56,7 @@
 import com.google.devtools.build.lib.syntax.Sequence;
 import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.util.OS;
 import com.google.devtools.build.lib.util.OsUtils;
 import com.google.devtools.build.lib.util.StringUtilities;
@@ -172,11 +172,10 @@
         return skylarkPath;
       }
     }
-    throw new EvalException(
-        Location.BUILTIN,
-        method
-            + " can only be applied to external paths"
-            + " (that is, outside the workspace or ignored in .bazelignore)");
+    throw Starlark.errorf(
+        "%s can only be applied to external paths (that is, outside the workspace or ignored in"
+            + " .bazelignore)",
+        method);
   }
 
   @Override
@@ -197,7 +196,7 @@
     } else if (path instanceof SkylarkPath) {
       return (SkylarkPath) path;
     } else {
-      throw new EvalException(Location.BUILTIN, method + " can only take a string or a label.");
+      throw Starlark.errorf("%s can only take a string or a label.", method);
     }
   }
 
@@ -227,13 +226,16 @@
   }
 
   @Override
-  public void symlink(Object from, Object to, Location location)
+  public void symlink(Object from, Object to, StarlarkThread thread)
       throws RepositoryFunctionException, EvalException, InterruptedException {
     SkylarkPath fromPath = getPath("symlink()", from);
     SkylarkPath toPath = getPath("symlink()", to);
     WorkspaceRuleEvent w =
         WorkspaceRuleEvent.newSymlinkEvent(
-            fromPath.toString(), toPath.toString(), rule.getLabel().toString(), location);
+            fromPath.toString(),
+            toPath.toString(),
+            rule.getLabel().toString(),
+            thread.getCallerLocation());
     env.getListener().post(w);
     try {
       checkInOutputDirectory("write", toPath);
@@ -252,16 +254,15 @@
       throws RepositoryFunctionException {
     if (!path.getPath().getPathString().startsWith(outputDirectory.getPathString())) {
       throw new RepositoryFunctionException(
-          new EvalException(
-              Location.fromFile(path.toString()),
-              "Cannot " + operation + " outside of the repository directory for path " + path),
+          Starlark.errorf(
+              "Cannot %s outside of the repository directory for path %s", operation, path),
           Transience.PERSISTENT);
     }
   }
 
   @Override
   public void createFile(
-      Object path, String content, Boolean executable, Boolean legacyUtf8, Location location)
+      Object path, String content, Boolean executable, Boolean legacyUtf8, StarlarkThread thread)
       throws RepositoryFunctionException, EvalException, InterruptedException {
     SkylarkPath p = getPath("file()", path);
     byte[] contentBytes;
@@ -272,7 +273,11 @@
     }
     WorkspaceRuleEvent w =
         WorkspaceRuleEvent.newFileEvent(
-            p.toString(), content, executable, rule.getLabel().toString(), location);
+            p.toString(),
+            content,
+            executable,
+            rule.getLabel().toString(),
+            thread.getCallerLocation());
     env.getListener().post(w);
     try {
       checkInOutputDirectory("write", p);
@@ -295,7 +300,7 @@
       Object template,
       Dict<?, ?> substitutions, // <String, String> expected
       Boolean executable,
-      Location location)
+      StarlarkThread thread)
       throws RepositoryFunctionException, EvalException, InterruptedException {
     SkylarkPath p = getPath("template()", path);
     SkylarkPath t = getPath("template()", template);
@@ -308,7 +313,7 @@
             substitutionMap,
             executable,
             rule.getLabel().toString(),
-            location);
+            thread.getCallerLocation());
     env.getListener().post(w);
     try {
       checkInOutputDirectory("write", p);
@@ -331,11 +336,12 @@
   }
 
   @Override
-  public String readFile(Object path, Location location)
+  public String readFile(Object path, StarlarkThread thread)
       throws RepositoryFunctionException, EvalException, InterruptedException {
     SkylarkPath p = getPath("read()", path);
     WorkspaceRuleEvent w =
-        WorkspaceRuleEvent.newReadEvent(p.toString(), rule.getLabel().toString(), location);
+        WorkspaceRuleEvent.newReadEvent(
+            p.toString(), rule.getLabel().toString(), thread.getCallerLocation());
     env.getListener().post(w);
     try {
       return FileSystemUtils.readContent(p.getPath(), StandardCharsets.ISO_8859_1);
@@ -400,16 +406,13 @@
     return ImmutableMap.copyOf(execPropertiesMap);
   }
 
-  private static void validateArguments(Sequence<?> arguments, Location location)
-      throws EvalException {
+  private static void validateArguments(Sequence<?> arguments) throws EvalException {
     for (Object arg : arguments) {
       if (arg instanceof SkylarkPath) {
-        throw new EvalException(
-            location,
-            "Argument '"
-                + arg
-                + "' is of type path. Paths are not supported for repository rules"
-                + " marked as remotable.");
+        throw Starlark.errorf(
+            "Argument '%s' is of type path. Paths are not supported for repository rules marked as"
+                + " remotable.",
+            arg);
       }
     }
   }
@@ -419,8 +422,7 @@
       int timeout,
       Map<String, String> environment,
       boolean quiet,
-      String workingDirectory,
-      Location location)
+      String workingDirectory)
       throws EvalException, InterruptedException {
     Preconditions.checkState(canExecuteRemote());
 
@@ -447,7 +449,7 @@
 
       return new SkylarkExecutionResult(result.exitCode(), stdout, stderr);
     } catch (IOException e) {
-      throw new EvalException(location, "remote_execute failed", e);
+      throw Starlark.errorf("remote_execute failed: %s", e.getMessage());
     }
   }
 
@@ -458,15 +460,15 @@
       Dict<?, ?> uncheckedEnvironment, // <String, String> expected
       boolean quiet,
       String workingDirectory,
-      Location location)
+      StarlarkThread thread)
       throws EvalException, RepositoryFunctionException, InterruptedException {
     Map<String, String> environment =
         uncheckedEnvironment.getContents(String.class, String.class, "environment");
     if (isRemotable()) {
-      validateArguments(arguments, location);
+      validateArguments(arguments);
     }
     if (canExecuteRemote()) {
-      return executeRemote(arguments, timeout, environment, quiet, workingDirectory, location);
+      return executeRemote(arguments, timeout, environment, quiet, workingDirectory);
     }
 
     // Execute on the local/host machine
@@ -479,7 +481,7 @@
             outputDirectory.getPathString(),
             quiet,
             rule.getLabel().toString(),
-            location);
+            thread.getCallerLocation());
     env.getListener().post(w);
     createDirectory(outputDirectory);
 
@@ -512,12 +514,12 @@
   }
 
   @Override
-  public boolean delete(Object pathObject, Location location)
+  public boolean delete(Object pathObject, StarlarkThread thread)
       throws EvalException, RepositoryFunctionException, InterruptedException {
     SkylarkPath skylarkPath = externalPath("delete()", pathObject);
     WorkspaceRuleEvent w =
         WorkspaceRuleEvent.newDeleteEvent(
-            skylarkPath.toString(), rule.getLabel().toString(), location);
+            skylarkPath.toString(), rule.getLabel().toString(), thread.getCallerLocation());
     env.getListener().post(w);
     try {
       Path path = skylarkPath.getPath();
@@ -530,19 +532,18 @@
   }
 
   @Override
-  public void patch(Object patchFile, Integer strip, Location location)
+  public void patch(Object patchFile, Integer strip, StarlarkThread thread)
       throws EvalException, RepositoryFunctionException, InterruptedException {
     SkylarkPath skylarkPath = getPath("patch()", patchFile);
     WorkspaceRuleEvent w =
         WorkspaceRuleEvent.newPatchEvent(
-            skylarkPath.toString(), strip, rule.getLabel().toString(), location);
+            skylarkPath.toString(), strip, rule.getLabel().toString(), thread.getCallerLocation());
     env.getListener().post(w);
     try {
       PatchUtil.apply(skylarkPath.getPath(), strip, outputDirectory);
     } catch (PatchFailedException e) {
       throw new RepositoryFunctionException(
-          new EvalException(
-              Location.BUILTIN, "Error applying patch " + skylarkPath + ": " + e.getMessage()),
+          Starlark.errorf("Error applying patch %s: %s", skylarkPath, e.getMessage()),
           Transience.TRANSIENT);
     } catch (IOException e) {
       throw new RepositoryFunctionException(e, Transience.TRANSIENT);
@@ -550,14 +551,14 @@
   }
 
   @Override
-  public SkylarkPath which(String program, Location location) throws EvalException {
+  public SkylarkPath which(String program, StarlarkThread thread) throws EvalException {
     WorkspaceRuleEvent w =
-        WorkspaceRuleEvent.newWhichEvent(program, rule.getLabel().toString(), location);
+        WorkspaceRuleEvent.newWhichEvent(
+            program, rule.getLabel().toString(), thread.getCallerLocation());
     env.getListener().post(w);
     if (program.contains("/") || program.contains("\\")) {
-      throw new EvalException(
-          Location.BUILTIN,
-          "Program argument of which() may not contains a / or a \\ ('" + program + "' given)");
+      throw Starlark.errorf(
+          "Program argument of which() may not contains a / or a \\ ('%s' given)", program);
     }
     try {
       SkylarkPath commandPath = findCommandOnPath(program);
@@ -626,7 +627,7 @@
       String canonicalId,
       Dict<?, ?> authUnchecked, // <String, Dict<?, ?>> expected
       String integrity,
-      Location location)
+      StarlarkThread thread)
       throws RepositoryFunctionException, EvalException, InterruptedException {
     Map<URI, Map<String, String>> authHeaders =
         getAuthHeaders(getAuthContents(authUnchecked, "auth"));
@@ -641,7 +642,7 @@
     Optional<Checksum> checksum;
     RepositoryFunctionException checksumValidation = null;
     try {
-      checksum = validateChecksum(sha256, integrity, urls, location);
+      checksum = validateChecksum(sha256, integrity, urls);
     } catch (RepositoryFunctionException e) {
       checksum = Optional.<Checksum>absent();
       checksumValidation = e;
@@ -656,7 +657,7 @@
             integrity,
             executable,
             rule.getLabel().toString(),
-            location);
+            thread.getCallerLocation());
     env.getListener().post(w);
     Path downloadedPath;
     try (SilentCloseable c =
@@ -683,7 +684,7 @@
     } catch (IOException e) {
       if (allowFail) {
         Dict<String, Object> dict = Dict.of((Mutability) null, "success", false);
-        return StructProvider.STRUCT.createStruct(dict, null);
+        return StructProvider.STRUCT.createWithBuiltinLocation(dict);
       } else {
         throw new RepositoryFunctionException(e, Transience.TRANSIENT);
       }
@@ -696,16 +697,13 @@
   }
 
   @Override
-  public void extract(Object archive, Object output, String stripPrefix, Location location)
+  public void extract(Object archive, Object output, String stripPrefix, StarlarkThread thread)
       throws RepositoryFunctionException, InterruptedException, EvalException {
     SkylarkPath archivePath = getPath("extract()", archive);
 
     if (!archivePath.exists()) {
       throw new RepositoryFunctionException(
-          new EvalException(
-              Location.fromFile(archivePath.toString()),
-              String.format("Archive path '%s' does not exist.", archivePath.toString())),
-          Transience.TRANSIENT);
+          Starlark.errorf("Archive path '%s' does not exist.", archivePath), Transience.TRANSIENT);
     }
 
     SkylarkPath outputPath = getPath("extract()", output);
@@ -717,7 +715,7 @@
             output.toString(),
             stripPrefix,
             rule.getLabel().toString(),
-            location);
+            thread.getCallerLocation());
     env.getListener().post(w);
 
     env.getListener()
@@ -746,7 +744,7 @@
       String canonicalId,
       Dict<?, ?> auth, // <String, Dict<?, ?>> expected
       String integrity,
-      Location location)
+      StarlarkThread thread)
       throws RepositoryFunctionException, InterruptedException, EvalException {
     Map<URI, Map<String, String>> authHeaders = getAuthHeaders(getAuthContents(auth, "auth"));
 
@@ -760,7 +758,7 @@
     Optional<Checksum> checksum;
     RepositoryFunctionException checksumValidation = null;
     try {
-      checksum = validateChecksum(sha256, integrity, urls, location);
+      checksum = validateChecksum(sha256, integrity, urls);
     } catch (RepositoryFunctionException e) {
       checksum = Optional.<Checksum>absent();
       checksumValidation = e;
@@ -775,7 +773,7 @@
             type,
             stripPrefix,
             rule.getLabel().toString(),
-            location);
+            thread.getCallerLocation());
 
     // Download to outputDirectory and delete it after extraction
     SkylarkPath outputPath = getPath("download_and_extract()", output);
@@ -804,7 +802,7 @@
       env.getListener().post(w);
       if (allowFail) {
         Dict<String, Object> dict = Dict.of((Mutability) null, "success", false);
-        return StructProvider.STRUCT.createStruct(dict, null);
+        return StructProvider.STRUCT.createWithBuiltinLocation(dict);
       } else {
         throw new RepositoryFunctionException(e, Transience.TRANSIENT);
       }
@@ -852,26 +850,20 @@
     return Checksum.fromString(KeyType.SHA256, RepositoryCache.getChecksum(KeyType.SHA256, path));
   }
 
-  private Optional<Checksum> validateChecksum(
-      String sha256, String integrity, List<URL> urls, Location loc)
+  private Optional<Checksum> validateChecksum(String sha256, String integrity, List<URL> urls)
       throws RepositoryFunctionException, EvalException {
     if (!sha256.isEmpty()) {
       if (!integrity.isEmpty()) {
-        throw new EvalException(loc, "Expected either 'sha256' or 'integrity', but not both");
+        throw Starlark.errorf("Expected either 'sha256' or 'integrity', but not both");
       }
       try {
         return Optional.of(Checksum.fromString(KeyType.SHA256, sha256));
       } catch (IllegalArgumentException e) {
         warnAboutChecksumError(urls, e.getMessage());
         throw new RepositoryFunctionException(
-            new EvalException(
-                loc,
-                "Definition of repository "
-                    + rule.getName()
-                    + ": "
-                    + e.getMessage()
-                    + " at "
-                    + rule.getLocation()),
+            Starlark.errorf(
+                "Definition of repository %s: %s at %s",
+                rule.getName(), e.getMessage(), rule.getLocation()),
             Transience.PERSISTENT);
       }
     }
@@ -885,14 +877,9 @@
     } catch (IllegalArgumentException e) {
       warnAboutChecksumError(urls, e.getMessage());
       throw new RepositoryFunctionException(
-          new EvalException(
-              loc,
-              "Definition of repository "
-                  + rule.getName()
-                  + ": "
-                  + e.getMessage()
-                  + " at "
-                  + rule.getLocation()),
+          Starlark.errorf(
+              "Definition of repository %s: %s at %s",
+              rule.getName(), e.getMessage(), rule.getLocation()),
           Transience.PERSISTENT);
     }
   }
@@ -917,7 +904,7 @@
     if (finalChecksum.getKeyType() == KeyType.SHA256) {
       out.put("sha256", finalChecksum.toString());
     }
-    return StructProvider.STRUCT.createStruct(Dict.copyOf(null, out.build()), null);
+    return StructProvider.STRUCT.createWithBuiltinLocation(Dict.copyOf(null, out.build()));
   }
 
   private static ImmutableList<String> checkAllUrls(Iterable<?> urlList) throws EvalException {
@@ -1014,22 +1001,21 @@
     try {
       fileValue = (FileValue) env.getValueOrThrow(fileSkyKey, IOException.class);
     } catch (IOException e) {
-      throw new EvalException(Location.BUILTIN, e);
+      throw Starlark.errorf("%s", e.getMessage());
     }
 
     if (fileValue == null) {
       throw RepositoryFunction.restart();
     }
     if (!fileValue.isFile() || fileValue.isSpecialFile()) {
-      throw new EvalException(
-          Location.BUILTIN, "Not a regular file: " + rootedPath.asPath().getPathString());
+      throw Starlark.errorf("Not a regular file: %s", rootedPath.asPath().getPathString());
     }
 
     // A label does not contains space so it safe to use as a key.
     try {
       markerData.put("FILE:" + label, RepositoryFunction.fileValueToMarkerValue(fileValue));
     } catch (IOException e) {
-      throw new EvalException(Location.BUILTIN, e);
+      throw Starlark.errorf("%s", e.getMessage());
     }
     return new SkylarkPath(rootedPath.asPath());
   }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java
index af47495..54520ac 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java
@@ -66,7 +66,6 @@
       Boolean configure,
       Boolean remotable,
       String doc,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase("repository_rule");
@@ -104,7 +103,7 @@
     builder.setRuleDefinitionEnvironmentLabelAndHashCode(
         (Label) thread.getGlobals().getLabel(), thread.getTransitiveContentHashCode());
     builder.setWorkspaceOnly();
-    return new RepositoryRuleFunction(builder, loc, implementation);
+    return new RepositoryRuleFunction(builder, thread.getCallerLocation(), implementation);
   }
 
   // RepositoryRuleFunction is the result of repository_rule(...).
@@ -157,8 +156,7 @@
     }
 
     @Override
-    public Object call(
-        StarlarkThread thread, Location loc, Tuple<Object> args, Dict<String, Object> kwargs)
+    public Object call(StarlarkThread thread, Tuple<Object> args, Dict<String, Object> kwargs)
         throws EvalException, InterruptedException {
       if (!args.isEmpty()) {
         throw new EvalException(null, "unexpected positional arguments");
@@ -189,7 +187,7 @@
       }
       try {
         RuleClass ruleClass = builder.build(ruleClassName, ruleClassName);
-        PackageContext context = PackageFactory.getContext(thread, loc);
+        PackageContext context = PackageFactory.getContext(thread);
         Package.Builder packageBuilder = context.getBuilder();
 
         // TODO(adonovan): is this safe? Check.
@@ -210,6 +208,7 @@
         WorkspaceFactoryHelper.addMainRepoEntry(
             packageBuilder, externalRepoName, thread.getSemantics());
 
+        Location loc = thread.getCallerLocation();
         WorkspaceFactoryHelper.addRepoMappings(packageBuilder, kwargs, externalRepoName, loc);
 
         Rule rule =
@@ -222,17 +221,16 @@
                 callStack.toString());
         return rule;
       } catch (InvalidRuleException | NameConflictException | LabelSyntaxException e) {
-        throw new EvalException(loc, e.getMessage());
+        throw Starlark.errorf("%s", e.getMessage());
       }
     }
   }
 
   @Override
-  public void failWithIncompatibleUseCcConfigureFromRulesCc(
-      Location location, StarlarkThread thread) throws EvalException {
+  public void failWithIncompatibleUseCcConfigureFromRulesCc(StarlarkThread thread)
+      throws EvalException {
     if (thread.getSemantics().incompatibleUseCcConfigureFromRulesCc()) {
-      throw new EvalException(
-          location,
+      throw Starlark.errorf(
           "Incompatible flag "
               + "--incompatible_use_cc_configure_from_rules_cc has been flipped. Please use "
               + "cc_configure and related logic from https://github.com/bazelbuild/rules_cc. "
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
index 7ce69c8..d51b49a 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
@@ -19,7 +19,6 @@
 import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
 import com.google.devtools.build.lib.analysis.skylark.SkylarkActionFactory;
 import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.rules.cpp.CcCompilationContext;
 import com.google.devtools.build.lib.rules.cpp.CcCompilationOutputs;
 import com.google.devtools.build.lib.rules.cpp.CcLinkingContext;
@@ -87,7 +86,6 @@
       boolean disallowPicOutputs,
       boolean disallowNopicOutputs,
       Sequence<?> additionalInputs, // <Artifact> expected
-      Location location,
       StarlarkThread thread)
       throws EvalException, InterruptedException {
     return compile(
@@ -112,8 +110,7 @@
         /* headersForClifDoNotUseThisParam= */ ImmutableList.of(),
         StarlarkList.immutableCopyOf(
             additionalInputs.getContents(Artifact.class, "additional_inputs")),
-        location,
-        /* thread= */ null);
+        thread);
   }
 
   @Override
@@ -130,7 +127,6 @@
       boolean linkDepsStatically,
       Sequence<?> additionalInputs, // <Artifact> expected
       Object grepIncludes,
-      Location location,
       StarlarkThread thread)
       throws InterruptedException, EvalException {
     return super.link(
@@ -146,14 +142,13 @@
         linkDepsStatically,
         additionalInputs,
         /* grepIncludes= */ null,
-        location,
         thread);
   }
 
   @Override
   public CcCompilationOutputs createCompilationOutputsFromSkylark(
-      Object objectsObject, Object picObjectsObject, Location location) throws EvalException {
-    return super.createCompilationOutputsFromSkylark(objectsObject, picObjectsObject, location);
+      Object objectsObject, Object picObjectsObject) throws EvalException {
+    return super.createCompilationOutputsFromSkylark(objectsObject, picObjectsObject);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index b56e0c3..d52eae2 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -35,7 +35,6 @@
 import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.EventHandler;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassNamePredicate;
 import com.google.devtools.build.lib.packages.Type.ConversionException;
 import com.google.devtools.build.lib.packages.Type.LabelClass;
@@ -1038,13 +1037,11 @@
     @AutoCodec @AutoCodec.VisibleForSerialization
     static final Function<Rule, AspectParameters> EMPTY_FUNCTION = input -> AspectParameters.EMPTY;
 
-    public Builder<TYPE> aspect(SkylarkDefinedAspect skylarkAspect, Location location)
-        throws EvalException {
+    public Builder<TYPE> aspect(SkylarkDefinedAspect skylarkAspect) throws EvalException {
       SkylarkRuleAspect skylarkRuleAspect = new SkylarkRuleAspect(skylarkAspect);
       RuleAspect<?> oldAspect = this.aspects.put(skylarkAspect.getName(), skylarkRuleAspect);
       if (oldAspect != null) {
-        throw new EvalException(
-            location, String.format("aspect %s added more than once", skylarkAspect.getName()));
+        throw Starlark.errorf("aspect %s added more than once", skylarkAspect.getName());
       }
       return this;
     }
@@ -1380,7 +1377,6 @@
   public static final class SkylarkComputedDefaultTemplate {
     private final Type<?> type;
     private final StarlarkCallbackHelper callback;
-    private final Location location;
     private final ImmutableList<String> dependencies;
 
     /**
@@ -1391,19 +1387,14 @@
      * @param dependencies A list of all names of other attributes that are accessed by this
      *     attribute.
      * @param callback A function to compute the actual attribute value.
-     * @param location The location of the Skylark function.
      */
     public SkylarkComputedDefaultTemplate(
-        Type<?> type,
-        ImmutableList<String> dependencies,
-        StarlarkCallbackHelper callback,
-        Location location) {
+        Type<?> type, ImmutableList<String> dependencies, StarlarkCallbackHelper callback) {
       this.type = Preconditions.checkNotNull(type);
       // Order is important for #createDependencyAssignmentTuple.
       this.dependencies =
           Ordering.natural().immutableSortedCopy(Preconditions.checkNotNull(dependencies));
       this.callback = Preconditions.checkNotNull(callback);
-      this.location = Preconditions.checkNotNull(location);
     }
 
     /**
@@ -1494,10 +1485,8 @@
       try {
         return type.cast((result == Starlark.NONE) ? type.getDefaultValue() : result);
       } catch (ClassCastException ex) {
-        throw new EvalException(
-            location,
-            String.format(
-                "expected '%s', but got '%s'", type, EvalUtils.getDataTypeName(result, true)));
+        throw Starlark.errorf(
+            "expected '%s', but got '%s'", type, EvalUtils.getDataTypeName(result, true));
       }
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java b/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java
index 1cd0382..54d92b9 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java
@@ -18,6 +18,7 @@
 import com.google.devtools.build.lib.packages.NativeProvider.NativeKey;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Printer;
+import com.google.devtools.build.lib.syntax.Starlark;
 import javax.annotation.Nullable;
 
 /**
@@ -91,12 +92,11 @@
   }
 
   /**
-   * Convenience method for subclasses of this class to throw a consistent error when
-   * a provider is unable to be constructed from skylark.
+   * Convenience method for subclasses of this class to throw a consistent error when a provider is
+   * unable to be constructed from skylark.
    */
-  protected T throwUnsupportedConstructorException(Location loc) throws EvalException {
-    throw new EvalException(
-        loc, String.format("'%s' cannot be constructed from Starlark", getPrintableName()));
+  protected final T throwUnsupportedConstructorException() throws EvalException {
+    throw Starlark.errorf("'%s' cannot be constructed from Starlark", getPrintableName());
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
index f6df042..598c33f 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
@@ -108,8 +108,9 @@
       return name;
     }
 
-    private void convertAndProcess(
-        Package.Builder pkgBuilder, Location location, Object value)
+    // The location is used not just for exceptions (for which null would do),
+    // but also for reporting events.
+    private void convertAndProcess(Package.Builder pkgBuilder, Location location, Object value)
         throws EvalException {
       T typedValue = type.convert(value, "'package' argument", pkgBuilder.getBuildFileLabel());
       process(pkgBuilder, location, typedValue);
@@ -515,13 +516,12 @@
       }
 
       @Override
-      public Object call(
-          StarlarkThread thread, Location loc, Tuple<Object> args, Dict<String, Object> kwargs)
+      public Object call(StarlarkThread thread, Tuple<Object> args, Dict<String, Object> kwargs)
           throws EvalException {
         if (!args.isEmpty()) {
           throw new EvalException(null, "unexpected positional arguments");
         }
-        Package.Builder pkgBuilder = getContext(thread, loc).pkgBuilder;
+        Package.Builder pkgBuilder = getContext(thread).pkgBuilder;
 
         // Validate parameter list
         if (pkgBuilder.isPackageFunctionUsed()) {
@@ -534,6 +534,7 @@
           throw new EvalException(
               null, "at least one argument must be given to the 'package' function");
         }
+        Location loc = thread.getCallerLocation();
         for (Map.Entry<String, Object> kwarg : kwargs.entrySet()) {
           String name = kwarg.getKey();
           PackageArgument<?> pkgarg = packageArguments.get(name);
@@ -548,14 +549,12 @@
   }
 
   /** Get the PackageContext by looking up in the environment. */
-  public static PackageContext getContext(StarlarkThread thread, Location location)
-      throws EvalException {
+  public static PackageContext getContext(StarlarkThread thread) throws EvalException {
     PackageContext value = thread.getThreadLocal(PackageContext.class);
     if (value == null) {
       // if PackageContext is missing, we're not called from a BUILD file. This happens if someone
       // uses native.some_func() in the wrong place.
-      throw new EvalException(
-          location,
+      throw Starlark.errorf(
           "The native module can be accessed only from a BUILD thread. "
               + "Wrap the function in a macro and call it from a BUILD file");
     }
@@ -592,29 +591,32 @@
     }
 
     @Override
-    public NoneType call(
-        StarlarkThread thread, Location loc, Tuple<Object> args, Dict<String, Object> kwargs)
+    public NoneType call(StarlarkThread thread, Tuple<Object> args, Dict<String, Object> kwargs)
         throws EvalException, InterruptedException {
       if (!args.isEmpty()) {
-        throw new EvalException(null, "unexpected positional arguments");
+        throw Starlark.errorf("unexpected positional arguments");
       }
       BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase(ruleClass.getName());
       try {
-        addRule(getContext(thread, loc), kwargs, loc, thread);
+        addRule(getContext(thread), kwargs, thread);
       } catch (RuleFactory.InvalidRuleException | Package.NameConflictException e) {
-        throw new EvalException(loc, e.getMessage());
+        throw new EvalException(null, e.getMessage());
       }
       return Starlark.NONE;
     }
 
-    private void addRule(
-        PackageContext context, Map<String, Object> kwargs, Location loc, StarlarkThread thread)
+    private void addRule(PackageContext context, Map<String, Object> kwargs, StarlarkThread thread)
         throws RuleFactory.InvalidRuleException, Package.NameConflictException,
             InterruptedException {
       BuildLangTypedAttributeValuesMap attributeValues =
           new BuildLangTypedAttributeValuesMap(kwargs);
       RuleFactory.createAndAddRule(
-          context, ruleClass, attributeValues, loc, thread, new AttributeContainer(ruleClass));
+          context,
+          ruleClass,
+          attributeValues,
+          thread.getCallerLocation(),
+          thread,
+          new AttributeContainer(ruleClass));
     }
 
     @Override
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkAspect.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkAspect.java
index 473df91..780333a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkAspect.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.lib.packages;
 
 import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkAspectApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 
@@ -26,10 +25,9 @@
    * Attaches this aspect to an attribute.
    *
    * @param attrBuilder the builder of the attribute to add this aspect to
-   * @param loc the location in skylark which adds this aspect to an attribute
    * @throws EvalException if this aspect cannot be successfully applied to the given attribute
    */
-  void attachToAttribute(Attribute.Builder<?> attrBuilder, Location loc) throws EvalException;
+  void attachToAttribute(Attribute.Builder<?> attrBuilder) throws EvalException;
 
   /** Returns the aspect class for this aspect. */
   AspectClass getAspectClass();
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkDefinedAspect.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkDefinedAspect.java
index be38ce1..310ed74 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkDefinedAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkDefinedAspect.java
@@ -20,12 +20,12 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransition;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.syntax.BaseFunction;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Printer;
+import com.google.devtools.build.lib.syntax.Starlark;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
@@ -235,13 +235,12 @@
   }
 
   @Override
-  public void attachToAttribute(Attribute.Builder<?> attrBuilder, Location loc)
-      throws EvalException {
+  public void attachToAttribute(Attribute.Builder<?> attrBuilder) throws EvalException {
     if (!isExported()) {
-      throw new EvalException(
-          loc, "Aspects should be top-level values in extension files that define them.");
+      throw Starlark.errorf(
+          "Aspects should be top-level values in extension files that define them.");
     }
-    attrBuilder.aspect(this, loc);
+    attrBuilder.aspect(this);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkNativeAspect.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkNativeAspect.java
index c29badc..ee5983c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkNativeAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkNativeAspect.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.lib.packages;
 
 import com.google.common.collect.ImmutableSet;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.syntax.Printer;
 
 /** A natively-defined aspect that is may be referenced by skylark attribute definitions. */
@@ -26,7 +25,7 @@
   }
 
   @Override
-  public void attachToAttribute(Attribute.Builder<?> attrBuilder, Location loc) {
+  public void attachToAttribute(Attribute.Builder<?> attrBuilder) {
     attrBuilder.aspect(this);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkNativeModule.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkNativeModule.java
index f267a59..c35e3c8 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkNativeModule.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkNativeModule.java
@@ -78,11 +78,10 @@
       Sequence<?> exclude,
       Integer excludeDirs,
       Object allowEmptyArgument,
-      Location loc,
       StarlarkThread thread)
       throws EvalException, ConversionException, InterruptedException {
     BazelStarlarkContext.from(thread).checkLoadingPhase("native.glob");
-    PackageContext context = getContext(thread, loc);
+    PackageContext context = getContext(thread);
 
     List<String> includes = Type.STRING_LIST.convert(include, "'glob' argument");
     List<String> excludes = Type.STRING_LIST.convert(exclude, "'glob' argument");
@@ -94,8 +93,8 @@
     } else if (allowEmptyArgument instanceof Boolean) {
       allowEmpty = (Boolean) allowEmptyArgument;
     } else {
-      throw new EvalException(
-          loc, "expected boolean for argument `allow_empty`, got `" + allowEmptyArgument + "`");
+      throw Starlark.errorf(
+          "expected boolean for argument `allow_empty`, got `%s`", allowEmptyArgument);
     }
 
     try {
@@ -109,25 +108,26 @@
               Joiner.on(", ").join(includes),
               excludes.isEmpty() ? "" : " - [" + Joiner.on(", ").join(excludes) + "]",
               e.getMessage());
+      Location loc = thread.getCallerLocation();
       context.eventHandler.handle(Event.error(loc, errorMessage));
       context.pkgBuilder.setIOExceptionAndMessage(e, errorMessage);
       matches = ImmutableList.of();
     } catch (BadGlobException e) {
-      throw new EvalException(loc, e.getMessage());
+      throw new EvalException(null, e.getMessage());
     } catch (IllegalArgumentException e) {
-      throw new EvalException(loc, "illegal argument in call to glob", e);
+      throw new EvalException(null, "illegal argument in call to glob", e);
     }
 
     return StarlarkList.copyOf(thread.mutability(), matches);
   }
 
   @Override
-  public Object existingRule(String name, Location loc, StarlarkThread thread)
+  public Object existingRule(String name, StarlarkThread thread)
       throws EvalException, InterruptedException {
     BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase("native.existing_rule");
-    PackageContext context = getContext(thread, loc);
+    PackageContext context = getContext(thread);
     Target target = context.pkgBuilder.getTarget(name);
-    Dict<String, Object> rule = targetDict(target, loc, thread.mutability());
+    Dict<String, Object> rule = targetDict(target, thread.mutability());
     return rule != null ? rule : Starlark.NONE;
   }
 
@@ -136,18 +136,18 @@
     For now, we ignore this, since users can implement it in Skylark.
   */
   @Override
-  public Dict<String, Dict<String, Object>> existingRules(Location loc, StarlarkThread thread)
+  public Dict<String, Dict<String, Object>> existingRules(StarlarkThread thread)
       throws EvalException, InterruptedException {
     BazelStarlarkContext.from(thread).checkLoadingOrWorkspacePhase("native.existing_rules");
-    PackageContext context = getContext(thread, loc);
+    PackageContext context = getContext(thread);
     Collection<Target> targets = context.pkgBuilder.getTargets();
     Mutability mu = thread.mutability();
     Dict<String, Dict<String, Object>> rules = Dict.of(mu);
     for (Target t : targets) {
       if (t instanceof Rule) {
-        Dict<String, Object> rule = targetDict(t, loc, mu);
+        Dict<String, Object> rule = targetDict(t, mu);
         Preconditions.checkNotNull(rule);
-        rules.put(t.getName(), rule, loc);
+        rules.put(t.getName(), rule, (Location) null);
       }
     }
 
@@ -159,11 +159,10 @@
       String name,
       Sequence<?> packagesO,
       Sequence<?> includesO,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingPhase("native.package_group");
-    PackageContext context = getContext(thread, loc);
+    PackageContext context = getContext(thread);
 
     List<String> packages =
         Type.STRING_LIST.convert(packagesO, "'package_group.packages argument'");
@@ -171,57 +170,51 @@
         BuildType.LABEL_LIST.convert(
             includesO, "'package_group.includes argument'", context.pkgBuilder.getBuildFileLabel());
 
+    Location loc = thread.getCallerLocation();
     try {
       context.pkgBuilder.addPackageGroup(name, packages, includes, context.eventHandler, loc);
       return Starlark.NONE;
     } catch (LabelSyntaxException e) {
-      throw new EvalException(
-          loc, "package group has invalid name: " + name + ": " + e.getMessage());
+      throw Starlark.errorf("package group has invalid name: %s: %s", name, e.getMessage());
     } catch (Package.NameConflictException e) {
-      throw new EvalException(loc, e.getMessage());
+      throw new EvalException(null, e.getMessage());
     }
   }
 
   @Override
   public NoneType exportsFiles(
-      Sequence<?> srcs, Object visibilityO, Object licensesO, Location loc, StarlarkThread thread)
+      Sequence<?> srcs, Object visibilityO, Object licensesO, StarlarkThread thread)
       throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingPhase("native.exports_files");
-    Package.Builder pkgBuilder = getContext(thread, loc).pkgBuilder;
+    Package.Builder pkgBuilder = getContext(thread).pkgBuilder;
     List<String> files = Type.STRING_LIST.convert(srcs, "'exports_files' operand");
 
-    RuleVisibility visibility;
-    try {
-      visibility =
-          EvalUtils.isNullOrNone(visibilityO)
-              ? ConstantRuleVisibility.PUBLIC
-              : PackageFactory.getVisibility(
-                  pkgBuilder.getBuildFileLabel(),
-                  BuildType.LABEL_LIST.convert(
-                      visibilityO, "'exports_files' operand", pkgBuilder.getBuildFileLabel()));
-    } catch (EvalException e) {
-      throw new EvalException(loc, e.getMessage());
-    }
+    RuleVisibility visibility =
+        EvalUtils.isNullOrNone(visibilityO)
+            ? ConstantRuleVisibility.PUBLIC
+            : PackageFactory.getVisibility(
+                pkgBuilder.getBuildFileLabel(),
+                BuildType.LABEL_LIST.convert(
+                    visibilityO, "'exports_files' operand", pkgBuilder.getBuildFileLabel()));
+
     // TODO(bazel-team): is licenses plural or singular?
     License license = BuildType.LICENSE.convertOptional(licensesO, "'exports_files' operand");
 
+    Location loc = thread.getCallerLocation();
     for (String file : files) {
       String errorMessage = LabelValidator.validateTargetName(file);
       if (errorMessage != null) {
-        throw new EvalException(loc, errorMessage);
+        throw Starlark.errorf("%s", errorMessage);
       }
       try {
         InputFile inputFile = pkgBuilder.createInputFile(file, loc);
         if (inputFile.isVisibilitySpecified() && inputFile.getVisibility() != visibility) {
-          throw new EvalException(
-              loc,
-              String.format(
-                  "visibility for exported file '%s' declared twice", inputFile.getName()));
+          throw Starlark.errorf(
+              "visibility for exported file '%s' declared twice", inputFile.getName());
         }
         if (license != null && inputFile.isLicenseSpecified()) {
-          throw new EvalException(
-              loc,
-              String.format("licenses for exported file '%s' declared twice", inputFile.getName()));
+          throw Starlark.errorf(
+              "licenses for exported file '%s' declared twice", inputFile.getName());
         }
 
         // See if we should check third-party licenses: first checking for any hard-coded policy,
@@ -241,41 +234,38 @@
             && license == null
             && !pkgBuilder.getDefaultLicense().isSpecified()
             && RuleClass.isThirdPartyPackage(pkgBuilder.getPackageIdentifier())) {
-          throw new EvalException(
-              loc,
-              "third-party file '"
-                  + inputFile.getName()
-                  + "' lacks a license declaration "
-                  + "with one of the following types: notice, reciprocal, permissive, "
-                  + "restricted, unencumbered, by_exception_only");
+          throw Starlark.errorf(
+              "third-party file '%s' lacks a license declaration with one of the following types:"
+                  + " notice, reciprocal, permissive, restricted, unencumbered, by_exception_only",
+              inputFile.getName());
         }
 
         pkgBuilder.setVisibilityAndLicense(inputFile, visibility, license);
       } catch (Package.Builder.GeneratedLabelConflict e) {
-        throw new EvalException(loc, e.getMessage());
+        throw Starlark.errorf("%s", e.getMessage());
       }
     }
     return Starlark.NONE;
   }
 
   @Override
-  public String packageName(Location loc, StarlarkThread thread) throws EvalException {
+  public String packageName(StarlarkThread thread) throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingPhase("native.package_name");
     PackageIdentifier packageId =
-        PackageFactory.getContext(thread, loc).getBuilder().getPackageIdentifier();
+        PackageFactory.getContext(thread).getBuilder().getPackageIdentifier();
     return packageId.getPackageFragment().getPathString();
   }
 
   @Override
-  public String repositoryName(Location location, StarlarkThread thread) throws EvalException {
+  public String repositoryName(StarlarkThread thread) throws EvalException {
     BazelStarlarkContext.from(thread).checkLoadingPhase("native.repository_name");
     PackageIdentifier packageId =
-        PackageFactory.getContext(thread, location).getBuilder().getPackageIdentifier();
+        PackageFactory.getContext(thread).getBuilder().getPackageIdentifier();
     return packageId.getRepository().toString();
   }
 
   @Nullable
-  private static Dict<String, Object> targetDict(Target target, Location loc, Mutability mu)
+  private static Dict<String, Object> targetDict(Target target, Mutability mu)
       throws EvalException {
     if (!(target instanceof Rule)) {
       return null;
@@ -300,7 +290,7 @@
         if (val == null) {
           continue;
         }
-        values.put(attr.getName(), val, loc);
+        values.put(attr.getName(), val, (Location) null);
       } catch (NotRepresentableException e) {
         throw new NotRepresentableException(
             String.format(
@@ -308,8 +298,8 @@
       }
     }
 
-    values.put("name", rule.getName(), loc);
-    values.put("kind", rule.getRuleClass(), loc);
+    values.put("name", rule.getName(), (Location) null);
+    values.put("kind", rule.getRuleClass(), (Location) null);
     return values;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkProvider.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkProvider.java
index d8ccc30..95a17c3 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkProvider.java
@@ -149,13 +149,14 @@
   }
 
   @Override
-  public Object fastcall(StarlarkThread thread, Location loc, Object[] positional, Object[] named)
+  public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named)
       throws EvalException, InterruptedException {
     // TODO(adonovan): we can likely come up with a more efficient implementation
     // ...then make matchSignature private again?
     Object[] arguments =
         Starlark.matchSignature(
             signature, this, /*defaults=*/ null, thread.mutability(), positional, named);
+    Location loc = thread.getCallerLocation();
     if (fields == null) {
       // provider(**kwargs)
       @SuppressWarnings("unchecked")
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkBuildLibrary.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkBuildLibrary.java
index f8ee7c8..ce9afaf 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkBuildLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkBuildLibrary.java
@@ -85,16 +85,14 @@
       // Not documented by docgen, as this is only available in BUILD files.
       // TODO(cparsons): Devise a solution to document BUILD functions.
       documented = false,
-      useLocation = true,
       useStarlarkThread = true)
   public NoneType environmentGroup(
       String name,
       Sequence<?> environmentsList, // <Label>
       Sequence<?> defaultsList, // <Label>
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
-    PackageContext context = getContext(thread, loc);
+    PackageContext context = getContext(thread);
     List<Label> environments =
         BuildType.LABEL_LIST.convert(
             environmentsList,
@@ -105,18 +103,17 @@
             defaultsList, "'environment_group argument'", context.pkgBuilder.getBuildFileLabel());
 
     if (environments.isEmpty()) {
-      throw new EvalException(
-          loc, "environment group " + name + " must contain at least one environment");
+      throw Starlark.errorf("environment group %s must contain at least one environment", name);
     }
     try {
+      Location loc = thread.getCallerLocation();
       context.pkgBuilder.addEnvironmentGroup(
           name, environments, defaults, context.eventHandler, loc);
       return Starlark.NONE;
     } catch (LabelSyntaxException e) {
-      throw new EvalException(
-          loc, "environment group has invalid name: " + name + ": " + e.getMessage());
+      throw Starlark.errorf("environment group has invalid name: %s: %s", name, e.getMessage());
     } catch (Package.NameConflictException e) {
-      throw new EvalException(loc, e.getMessage());
+      throw Starlark.errorf("%s", e.getMessage());
     }
   }
 
@@ -133,19 +130,17 @@
       // Not documented by docgen, as this is only available in BUILD files.
       // TODO(cparsons): Devise a solution to document BUILD functions.
       documented = false,
-      useStarlarkThread = true,
-      useLocation = true)
+      useStarlarkThread = true)
   public NoneType licenses(
       Sequence<?> licensesList, // list of license strings
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
-    PackageContext context = getContext(thread, loc);
+    PackageContext context = getContext(thread);
     try {
       License license = BuildType.LICENSE.convert(licensesList, "'licenses' operand");
       context.pkgBuilder.setDefaultLicense(license);
     } catch (ConversionException e) {
-      context.eventHandler.handle(Event.error(loc, e.getMessage()));
+      context.eventHandler.handle(Event.error(thread.getCallerLocation(), e.getMessage()));
       context.pkgBuilder.setContainsErrors();
     }
     return Starlark.NONE;
@@ -160,18 +155,16 @@
       // Not documented by docgen, as this is only available in BUILD files.
       // TODO(cparsons): Devise a solution to document BUILD functions.
       documented = false,
-      useStarlarkThread = true,
-      useLocation = true)
-  public NoneType distribs(Object object, Location loc, StarlarkThread thread)
-      throws EvalException {
-    PackageContext context = getContext(thread, loc);
+      useStarlarkThread = true)
+  public NoneType distribs(Object object, StarlarkThread thread) throws EvalException {
+    PackageContext context = getContext(thread);
 
     try {
       Set<DistributionType> distribs =
           BuildType.DISTRIBUTIONS.convert(object, "'distribs' operand");
       context.pkgBuilder.setDefaultDistribs(distribs);
     } catch (ConversionException e) {
-      context.eventHandler.handle(Event.error(loc, e.getMessage()));
+      context.eventHandler.handle(Event.error(thread.getCallerLocation(), e.getMessage()));
       context.pkgBuilder.setContainsErrors();
     }
     return Starlark.NONE;
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StructImpl.java b/src/main/java/com/google/devtools/build/lib/packages/StructImpl.java
index 845c677..0b0cc35 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StructImpl.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StructImpl.java
@@ -170,34 +170,34 @@
   }
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     StringBuilder sb = new StringBuilder();
-    printProtoTextMessage(this, sb, 0, loc);
+    printProtoTextMessage(this, sb, 0);
     return sb.toString();
   }
 
-  private void printProtoTextMessage(ClassObject object, StringBuilder sb, int indent, Location loc)
+  private static void printProtoTextMessage(ClassObject object, StringBuilder sb, int indent)
       throws EvalException {
     // For determinism sort the fields alphabetically.
     List<String> fields = new ArrayList<>(object.getFieldNames());
     Collections.sort(fields);
     for (String field : fields) {
-      printProtoTextMessage(field, object.getValue(field), sb, indent, loc);
+      printProtoTextMessage(field, object.getValue(field), sb, indent);
     }
   }
 
-  private void printProtoTextMessage(
-      String key, Object value, StringBuilder sb, int indent, Location loc, String container)
+  private static void printProtoTextMessage(
+      String key, Object value, StringBuilder sb, int indent, String container)
       throws EvalException {
     if (value instanceof Map.Entry) {
       Map.Entry<?, ?> entry = (Map.Entry<?, ?>) value;
       print(sb, key + " {", indent);
-      printProtoTextMessage("key", entry.getKey(), sb, indent + 1, loc);
-      printProtoTextMessage("value", entry.getValue(), sb, indent + 1, loc);
+      printProtoTextMessage("key", entry.getKey(), sb, indent + 1);
+      printProtoTextMessage("value", entry.getValue(), sb, indent + 1);
       print(sb, "}", indent);
     } else if (value instanceof ClassObject) {
       print(sb, key + " {", indent);
-      printProtoTextMessage((ClassObject) value, sb, indent + 1, loc);
+      printProtoTextMessage((ClassObject) value, sb, indent + 1);
       print(sb, "}", indent);
     } else if (value instanceof String) {
       print(
@@ -211,36 +211,31 @@
       // as the protocol buffers do.
       print(sb, key + ": " + value, indent);
     } else {
-      throw new EvalException(
-          loc,
-          "Invalid text format, expected a struct, a dict, a string, a bool, or an int but got a "
-              + EvalUtils.getDataTypeName(value)
-              + " for "
-              + container
-              + " '"
-              + key
-              + "'");
+      throw Starlark.errorf(
+          "Invalid text format, expected a struct, a dict, a string, a bool, or an int but got a"
+              + " %s for %s '%s'",
+          EvalUtils.getDataTypeName(value), container, key);
     }
   }
 
-  private void printProtoTextMessage(
-      String key, Object value, StringBuilder sb, int indent, Location loc) throws EvalException {
+  private static void printProtoTextMessage(String key, Object value, StringBuilder sb, int indent)
+      throws EvalException {
     if (value instanceof Sequence) {
       for (Object item : ((Sequence) value)) {
         // TODO(bazel-team): There should be some constraint on the fields of the structs
         // in the same list but we ignore that for now.
-        printProtoTextMessage(key, item, sb, indent, loc, "list element in struct field");
+        printProtoTextMessage(key, item, sb, indent, "list element in struct field");
       }
     } else if (value instanceof Dict) {
       for (Map.Entry<?, ?> entry : ((Dict<?, ?>) value).entrySet()) {
-        printProtoTextMessage(key, entry, sb, indent, loc, "entry of dictionary");
+        printProtoTextMessage(key, entry, sb, indent, "entry of dictionary");
       }
     } else {
-      printProtoTextMessage(key, value, sb, indent, loc, "struct field");
+      printProtoTextMessage(key, value, sb, indent, "struct field");
     }
   }
 
-  private void print(StringBuilder sb, String text, int indent) {
+  private static void print(StringBuilder sb, String text, int indent) {
     for (int i = 0; i < indent; i++) {
       sb.append("  ");
     }
@@ -258,13 +253,13 @@
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     StringBuilder sb = new StringBuilder();
-    printJson(this, sb, loc, "struct field", null);
+    printJson(this, sb, "struct field", null);
     return sb.toString();
   }
 
-  private void printJson(Object value, StringBuilder sb, Location loc, String container, String key)
+  private static void printJson(Object value, StringBuilder sb, String container, String key)
       throws EvalException {
     if (value == Starlark.NONE) {
       sb.append("null");
@@ -278,7 +273,7 @@
         sb.append("\"");
         sb.append(field);
         sb.append("\":");
-        printJson(((ClassObject) value).getValue(field), sb, loc, "struct field", field);
+        printJson(((ClassObject) value).getValue(field), sb, "struct field", field);
       }
       sb.append("}");
     } else if (value instanceof Dict) {
@@ -288,20 +283,16 @@
         sb.append(join);
         join = ",";
         if (!(entry.getKey() instanceof String)) {
-          String errorMessage =
-              "Keys must be a string but got a "
-                  + EvalUtils.getDataTypeName(entry.getKey())
-                  + " for "
-                  + container;
-          if (key != null) {
-            errorMessage += " '" + key + "'";
-          }
-          throw new EvalException(loc, errorMessage);
+          throw Starlark.errorf(
+              "Keys must be a string but got a %s for %s%s",
+              EvalUtils.getDataTypeName(entry.getKey()),
+              container,
+              key != null ? " '" + key + "'" : "");
         }
         sb.append("\"");
         sb.append(entry.getKey());
         sb.append("\":");
-        printJson(entry.getValue(), sb, loc, "dict value", String.valueOf(entry.getKey()));
+        printJson(entry.getValue(), sb, "dict value", String.valueOf(entry.getKey()));
       }
       sb.append("}");
     } else if (value instanceof List) {
@@ -310,7 +301,7 @@
       for (Object item : ((List) value)) {
         sb.append(join);
         join = ",";
-        printJson(item, sb, loc, "list element in struct field", key);
+        printJson(item, sb, "list element in struct field", key);
       }
       sb.append("]");
     } else if (value instanceof String) {
@@ -320,20 +311,14 @@
     } else if (value instanceof Integer || value instanceof Boolean) {
       sb.append(value);
     } else {
-      String errorMessage =
-          "Invalid text format, expected a struct, a string, a bool, or an int "
-              + "but got a "
-              + EvalUtils.getDataTypeName(value)
-              + " for "
-              + container;
-      if (key != null) {
-        errorMessage += " '" + key + "'";
-      }
-      throw new EvalException(loc, errorMessage);
+      throw Starlark.errorf(
+          "Invalid text format, expected a struct, a string, a bool, or an int but got a %s for"
+              + " %s%s",
+          EvalUtils.getDataTypeName(value), container, key != null ? " '" + key + "'" : "");
     }
   }
 
-  private String jsonEscapeString(String string) {
+  private static String jsonEscapeString(String string) {
     return escapeDoubleQuotesAndBackslashesAndNewlines(string)
         .replace("\r", "\\r")
         .replace("\t", "\\t");
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java b/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java
index 998f632..ca75eb8 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StructProvider.java
@@ -18,6 +18,8 @@
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.syntax.Dict;
 import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.Starlark;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.Map;
 
 /**
@@ -36,26 +38,34 @@
   }
 
   @Override
-  public StructImpl createStruct(Dict<?, ?> kwargs, Location loc) throws EvalException {
-    Map<String, Object> kwargsMap = kwargs.getContents(String.class, Object.class, "kwargs");
-    if (kwargsMap.containsKey("to_json")) {
-      throw new EvalException(loc, "cannot override built-in struct function 'to_json'");
+  public StructImpl createStruct(Dict<String, Object> kwargs, StarlarkThread thread)
+      throws EvalException {
+    return create(kwargs, thread.getCallerLocation());
+  }
+
+  // Called from SkylarkRepositoryContext. TODO(adonovan): eliminate.
+  public StructImpl createWithBuiltinLocation(Dict<String, Object> kwargs) throws EvalException {
+    return create(kwargs, Location.BUILTIN);
+  }
+
+  private StructImpl create(Dict<String, Object> kwargs, Location location) throws EvalException {
+    if (kwargs.containsKey("to_json")) {
+      throw Starlark.errorf("cannot override built-in struct function 'to_json'");
     }
-    if (kwargsMap.containsKey("to_proto")) {
-      throw new EvalException(loc, "cannot override built-in struct function 'to_proto'");
+    if (kwargs.containsKey("to_proto")) {
+      throw Starlark.errorf("cannot override built-in struct function 'to_proto'");
     }
-    return SkylarkInfo.create(this, kwargsMap, loc);
+    return SkylarkInfo.create(this, kwargs, location);
   }
 
   /**
    * Creates a struct with the given field values and message format for unknown fields.
    *
    * <p>The custom message is useful for objects that have fields but aren't exactly used as
-   * providers, such as the {@code native} object, and the struct fields of {@code ctx} like
-   * {@code ctx.attr}.
-   * */
-  public SkylarkInfo create(
-      Map<String, Object> values, String errorMessageFormatForUnknownField) {
+   * providers, such as the {@code native} object, and the struct fields of {@code ctx} like {@code
+   * ctx.attr}.
+   */
+  public SkylarkInfo create(Map<String, Object> values, String errorMessageFormatForUnknownField) {
     return SkylarkInfo.createWithCustomMessage(this, values, errorMessageFormatForUnknownField);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
index 656dfbe..f59f28e 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactory.java
@@ -274,14 +274,13 @@
       }
 
       @Override
-      public Object call(
-          StarlarkThread thread, Location loc, Tuple<Object> args, Dict<String, Object> kwargs)
+      public Object call(StarlarkThread thread, Tuple<Object> args, Dict<String, Object> kwargs)
           throws EvalException, InterruptedException {
         if (!args.isEmpty()) {
           throw new EvalException(null, "unexpected positional arguments");
         }
         try {
-          Package.Builder builder = PackageFactory.getContext(thread, loc).pkgBuilder;
+          Package.Builder builder = PackageFactory.getContext(thread).pkgBuilder;
           // TODO(adonovan): this doesn't look safe!
           String externalRepoName = (String) kwargs.get("name");
           if (!allowOverride
@@ -298,6 +297,7 @@
           // @<mainRepoName> as a separate repository. This will be overridden if the main
           // repository has a repo_mapping entry from <mainRepoName> to something.
           WorkspaceFactoryHelper.addMainRepoEntry(builder, externalRepoName, thread.getSemantics());
+          Location loc = thread.getCallerLocation();
           WorkspaceFactoryHelper.addRepoMappings(builder, kwargs, externalRepoName, loc);
           RuleClass ruleClass = ruleFactory.getRuleClass(ruleClassName);
           RuleClass bindRuleClass = ruleFactory.getRuleClass("bind");
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceGlobals.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceGlobals.java
index cabe2c1..c7658b4 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceGlobals.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceGlobals.java
@@ -27,7 +27,6 @@
 import com.google.devtools.build.lib.cmdline.LabelValidator;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.cmdline.TargetPattern;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.Package.NameConflictException;
 import com.google.devtools.build.lib.packages.RuleFactory.InvalidRuleException;
 import com.google.devtools.build.lib.skylarkbuildapi.WorkspaceGlobalsApi;
@@ -35,6 +34,7 @@
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.NoneType;
 import com.google.devtools.build.lib.syntax.Sequence;
+import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.List;
@@ -69,19 +69,18 @@
   public NoneType workspace(
       String name,
       Dict<?, ?> managedDirectories, // <String, Object>
-      Location loc,
       StarlarkThread thread)
       throws EvalException, InterruptedException {
     if (allowOverride) {
       if (!isLegalWorkspaceName(name)) {
-        throw new EvalException(loc, name + " is not a legal workspace name");
+        throw Starlark.errorf("%s is not a legal workspace name", name);
       }
       String errorMessage = LabelValidator.validateTargetName(name);
       if (errorMessage != null) {
-        throw new EvalException(loc, errorMessage);
+        throw Starlark.errorf("%s", errorMessage);
       }
-      PackageFactory.getContext(thread, loc).pkgBuilder.setWorkspaceName(name);
-      Package.Builder builder = PackageFactory.getContext(thread, loc).pkgBuilder;
+      PackageFactory.getContext(thread).pkgBuilder.setWorkspaceName(name);
+      Package.Builder builder = PackageFactory.getContext(thread).pkgBuilder;
       RuleClass localRepositoryRuleClass = ruleFactory.getRuleClass("local_repository");
       RuleClass bindRuleClass = ruleFactory.getRuleClass("bind");
       Map<String, Object> kwargs = ImmutableMap.<String, Object>of("name", name, "path", ".");
@@ -89,9 +88,9 @@
         // This effectively adds a "local_repository(name = "<ws>", path = ".")"
         // definition to the WORKSPACE file.
         WorkspaceFactoryHelper.createAndAddRepositoryRule(
-            builder, localRepositoryRuleClass, bindRuleClass, kwargs, loc);
+            builder, localRepositoryRuleClass, bindRuleClass, kwargs, thread.getCallerLocation());
       } catch (InvalidRuleException | NameConflictException | LabelSyntaxException e) {
-        throw new EvalException(loc, e.getMessage());
+        throw Starlark.errorf("%s", e.getMessage());
       }
       // Add entry in repository map from "@name" --> "@" to avoid issue where bazel
       // treats references to @name as a separate external repo
@@ -100,51 +99,42 @@
           RepositoryName.createFromValidStrippedName(name),
           RepositoryName.MAIN);
       parseManagedDirectories(
-          managedDirectories.getContents(String.class, Object.class, "managed_directories"), loc);
+          managedDirectories.getContents(String.class, Object.class, "managed_directories"));
       return NONE;
     } else {
-      throw new EvalException(
-          loc, "workspace() function should be used only at the top of the WORKSPACE file");
+      throw Starlark.errorf(
+          "workspace() function should be used only at the top of the WORKSPACE file");
     }
   }
 
   @Override
-  public NoneType dontSymlinkDirectoriesInExecroot(
-      Sequence<?> paths, Location location, StarlarkThread thread)
+  public NoneType dontSymlinkDirectoriesInExecroot(Sequence<?> paths, StarlarkThread thread)
       throws EvalException, InterruptedException {
     List<String> pathsList = paths.getContents(String.class, "paths");
     Set<String> set = Sets.newHashSet();
     for (String path : pathsList) {
       PathFragment pathFragment = PathFragment.create(path);
       if (pathFragment.isEmpty()) {
-        throw new EvalException(
-            location, "Empty path can not be passed to dont_symlink_directories_in_execroot.");
+        throw Starlark.errorf(
+            "Empty path can not be passed to dont_symlink_directories_in_execroot.");
       }
       if (pathFragment.containsUplevelReferences() || pathFragment.segmentCount() > 1) {
-        throw new EvalException(
-            location,
-            String.format(
-                "dont_symlink_directories_in_execroot can only accept "
-                    + "top level directories under workspace, "
-                    + "\"%s\" can not be specified as an attribute.",
-                path));
+        throw Starlark.errorf(
+            "dont_symlink_directories_in_execroot can only accept top level directories under"
+                + " workspace, \"%s\" can not be specified as an attribute.",
+            path);
       }
       if (pathFragment.isAbsolute()) {
-        throw new EvalException(
-            location,
-            String.format(
-                "dont_symlink_directories_in_execroot can only accept "
-                    + "top level directories under workspace, "
-                    + "absolute path \"%s\" can not be specified as an attribute.",
-                path));
+        throw Starlark.errorf(
+            "dont_symlink_directories_in_execroot can only accept top level directories under"
+                + " workspace, absolute path \"%s\" can not be specified as an attribute.",
+            path);
       }
       if (!set.add(pathFragment.getBaseName())) {
-        throw new EvalException(
-            location,
-            String.format(
-                "dont_symlink_directories_in_execroot should not "
-                    + "contain duplicate values: \"%s\" is specified more then once.",
-                path));
+        throw Starlark.errorf(
+            "dont_symlink_directories_in_execroot should not contain duplicate values: \"%s\" is"
+                + " specified more then once.",
+            path);
       }
     }
     doNotSymlinkInExecrootPaths = ImmutableSortedSet.copyOf(set);
@@ -152,89 +142,72 @@
   }
 
   private void parseManagedDirectories(
-      Map<String, ?> managedDirectories, // <String, Sequence<String>>
-      Location loc)
+      Map<String, ?> managedDirectories) // <String, Sequence<String>>
       throws EvalException {
     Map<PathFragment, String> nonNormalizedPathsMap = Maps.newHashMap();
     for (Map.Entry<String, ?> entry : managedDirectories.entrySet()) {
-      RepositoryName repositoryName = createRepositoryName(entry.getKey(), loc);
+      RepositoryName repositoryName = createRepositoryName(entry.getKey());
       List<PathFragment> paths =
-          getManagedDirectoriesPaths(entry.getValue(), loc, nonNormalizedPathsMap);
+          getManagedDirectoriesPaths(entry.getValue(), nonNormalizedPathsMap);
       for (PathFragment dir : paths) {
         PathFragment floorKey = managedDirectoriesMap.floorKey(dir);
         if (dir.equals(floorKey)) {
-          throw new EvalException(
-              loc,
-              String.format(
-                  "managed_directories attribute should not contain multiple"
-                      + " (or duplicate) repository mappings for the same directory ('%s').",
-                  nonNormalizedPathsMap.get(dir)));
+          throw Starlark.errorf(
+              "managed_directories attribute should not contain multiple"
+                  + " (or duplicate) repository mappings for the same directory ('%s').",
+              nonNormalizedPathsMap.get(dir));
         }
         PathFragment ceilingKey = managedDirectoriesMap.ceilingKey(dir);
         boolean isDescendant = floorKey != null && dir.startsWith(floorKey);
         if (isDescendant || (ceilingKey != null && ceilingKey.startsWith(dir))) {
-          throw new EvalException(
-              loc,
-              String.format(
-                  "managed_directories attribute value can not contain nested mappings."
-                      + " '%s' is a descendant of '%s'.",
-                  nonNormalizedPathsMap.get(isDescendant ? dir : ceilingKey),
-                  nonNormalizedPathsMap.get(isDescendant ? floorKey : dir)));
+          throw Starlark.errorf(
+              "managed_directories attribute value can not contain nested mappings."
+                  + " '%s' is a descendant of '%s'.",
+              nonNormalizedPathsMap.get(isDescendant ? dir : ceilingKey),
+              nonNormalizedPathsMap.get(isDescendant ? floorKey : dir));
         }
         managedDirectoriesMap.put(dir, repositoryName);
       }
     }
   }
 
-  private static RepositoryName createRepositoryName(String key, Location location)
-      throws EvalException {
+  private static RepositoryName createRepositoryName(String key) throws EvalException {
     if (!key.startsWith("@")) {
-      throw new EvalException(
-          location,
-          String.format(
-              "Cannot parse repository name '%s'. Repository name should start with '@'.", key));
+      throw Starlark.errorf(
+          "Cannot parse repository name '%s'. Repository name should start with '@'.", key);
     }
     try {
       return RepositoryName.create(key);
     } catch (LabelSyntaxException e) {
-      throw new EvalException(location, e);
+      throw Starlark.errorf("%s", e);
     }
   }
 
   private static List<PathFragment> getManagedDirectoriesPaths(
-      Object directoriesList, Location location, Map<PathFragment, String> nonNormalizedPathsMap)
+      Object directoriesList, Map<PathFragment, String> nonNormalizedPathsMap)
       throws EvalException {
     if (!(directoriesList instanceof Sequence)) {
-      throw new EvalException(
-          location,
+      throw Starlark.errorf(
           "managed_directories attribute value should be of the type attr.string_list_dict(),"
               + " mapping repository name to the list of managed directories.");
     }
     List<PathFragment> result = Lists.newArrayList();
     for (Object obj : (Sequence) directoriesList) {
       if (!(obj instanceof String)) {
-        throw new EvalException(
-            location,
-            String.format("Expected managed directory path (as string), but got '%s'.", obj));
+        throw Starlark.errorf("Expected managed directory path (as string), but got '%s'.", obj);
       }
       String path = ((String) obj).trim();
       if (path.isEmpty()) {
-        throw new EvalException(
-            location, "Expected managed directory path to be non-empty string.");
+        throw Starlark.errorf("Expected managed directory path to be non-empty string.");
       }
       PathFragment pathFragment = PathFragment.create(path);
       if (pathFragment.isAbsolute()) {
-        throw new EvalException(
-            location,
-            String.format(
-                "Expected managed directory path ('%s') to be relative to the workspace root.",
-                path));
+        throw Starlark.errorf(
+            "Expected managed directory path ('%s') to be relative to the workspace root.", path);
       }
       if (pathFragment.containsUplevelReferences()) {
-        throw new EvalException(
-            location,
-            String.format(
-                "Expected managed directory path ('%s') to be under the workspace root.", path));
+        throw Starlark.errorf(
+            "Expected managed directory path ('%s') to be under the workspace root.", path);
       }
       nonNormalizedPathsMap.put(pathFragment, path);
       result.add(pathFragment);
@@ -270,52 +243,50 @@
   }
 
   @Override
-  public NoneType registerExecutionPlatforms(
-      Sequence<?> platformLabels, Location location, StarlarkThread thread)
+  public NoneType registerExecutionPlatforms(Sequence<?> platformLabels, StarlarkThread thread)
       throws EvalException, InterruptedException {
     // Add to the package definition for later.
-    Package.Builder builder = PackageFactory.getContext(thread, location).pkgBuilder;
+    Package.Builder builder = PackageFactory.getContext(thread).pkgBuilder;
     List<String> patterns = platformLabels.getContents(String.class, "platform_labels");
     builder.addRegisteredExecutionPlatforms(renamePatterns(patterns, builder, thread));
     return NONE;
   }
 
   @Override
-  public NoneType registerToolchains(
-      Sequence<?> toolchainLabels, Location location, StarlarkThread thread)
+  public NoneType registerToolchains(Sequence<?> toolchainLabels, StarlarkThread thread)
       throws EvalException, InterruptedException {
     // Add to the package definition for later.
-    Package.Builder builder = PackageFactory.getContext(thread, location).pkgBuilder;
+    Package.Builder builder = PackageFactory.getContext(thread).pkgBuilder;
     List<String> patterns = toolchainLabels.getContents(String.class, "toolchain_labels");
     builder.addRegisteredToolchains(renamePatterns(patterns, builder, thread));
     return NONE;
   }
 
   @Override
-  public NoneType bind(String name, Object actual, Location loc, StarlarkThread thread)
+  public NoneType bind(String name, Object actual, StarlarkThread thread)
       throws EvalException, InterruptedException {
     Label nameLabel;
     try {
       nameLabel = Label.parseAbsolute("//external:" + name, ImmutableMap.of());
-      try {
-        Package.Builder builder = PackageFactory.getContext(thread, loc).pkgBuilder;
-        RuleClass ruleClass = ruleFactory.getRuleClass("bind");
-        WorkspaceFactoryHelper.addBindRule(
-            builder,
-            ruleClass,
-            nameLabel,
-            actual == NONE ? null : Label.parseAbsolute((String) actual, ImmutableMap.of()),
-            loc,
-            new AttributeContainer(ruleClass));
-      } catch (RuleFactory.InvalidRuleException
-          | Package.NameConflictException
-          | LabelSyntaxException e) {
-        throw new EvalException(loc, e.getMessage());
-      }
-
     } catch (LabelSyntaxException e) {
-      throw new EvalException(loc, e.getMessage());
+      throw Starlark.errorf("%s", e.getMessage());
     }
+    try {
+      Package.Builder builder = PackageFactory.getContext(thread).pkgBuilder;
+      RuleClass ruleClass = ruleFactory.getRuleClass("bind");
+      WorkspaceFactoryHelper.addBindRule(
+          builder,
+          ruleClass,
+          nameLabel,
+          actual == NONE ? null : Label.parseAbsolute((String) actual, ImmutableMap.of()),
+          thread.getCallerLocation(),
+          new AttributeContainer(ruleClass));
+    } catch (RuleFactory.InvalidRuleException
+        | Package.NameConflictException
+        | LabelSyntaxException e) {
+      throw Starlark.errorf("%s", e.getMessage());
+    }
+
     return NONE;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java
index 3d919ab..1168eaa 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkData.java
@@ -90,12 +90,10 @@
       Sequence<?> deps, // <AndroidResourcesInfo>
       Sequence<?> assets, // <AndroidAssetsInfo>
       boolean neverlink,
-      String customPackage,
-      Location location,
-      StarlarkThread thread)
+      String customPackage)
       throws InterruptedException, EvalException {
     try (SkylarkErrorReporter errorReporter =
-        SkylarkErrorReporter.from(ctx.getRuleErrorConsumer(), location)) {
+        SkylarkErrorReporter.from(ctx.getRuleErrorConsumer())) {
       return ResourceApk.processFromTransitiveLibraryData(
               ctx,
               DataBinding.getDisabledDataBindingContext(ctx),
@@ -113,16 +111,11 @@
 
   @Override
   public AndroidManifestInfo stampAndroidManifest(
-      AndroidDataContext ctx,
-      Object manifest,
-      Object customPackage,
-      boolean exported,
-      Location location,
-      StarlarkThread thread)
+      AndroidDataContext ctx, Object manifest, Object customPackage, boolean exported)
       throws InterruptedException, EvalException {
     String pkg = fromNoneable(customPackage, String.class);
     try (SkylarkErrorReporter errorReporter =
-        SkylarkErrorReporter.from(ctx.getRuleErrorConsumer(), location)) {
+        SkylarkErrorReporter.from(ctx.getRuleErrorConsumer())) {
       return AndroidManifest.from(
               ctx,
               errorReporter,
@@ -141,12 +134,9 @@
       Object assets,
       Object assetsDir,
       Sequence<?> deps, // <AndroidAssetsInfo>
-      boolean neverlink,
-      Location location,
-      StarlarkThread thread)
+      boolean neverlink)
       throws EvalException, InterruptedException {
-    SkylarkErrorReporter errorReporter =
-        SkylarkErrorReporter.from(ctx.getRuleErrorConsumer(), location);
+    SkylarkErrorReporter errorReporter = SkylarkErrorReporter.from(ctx.getRuleErrorConsumer());
     try {
       return AndroidAssets.from(
               errorReporter,
@@ -169,12 +159,9 @@
       Sequence<?> resources, // <ConfiguredTarget>
       Sequence<?> deps, // <AndroidResourcesInfo>
       boolean neverlink,
-      boolean enableDataBinding,
-      Location location,
-      StarlarkThread thread)
+      boolean enableDataBinding)
       throws EvalException, InterruptedException {
-    SkylarkErrorReporter errorReporter =
-        SkylarkErrorReporter.from(ctx.getRuleErrorConsumer(), location);
+    SkylarkErrorReporter errorReporter = SkylarkErrorReporter.from(ctx.getRuleErrorConsumer());
     try {
       return AndroidResources.from(
               errorReporter,
@@ -199,12 +186,10 @@
       Sequence<?> resources, // <ConfiguredTarget>
       Sequence<?> deps, // <AndroidResourcesInfo>
       boolean neverlink,
-      boolean enableDataBinding,
-      Location location,
-      StarlarkThread thread)
+      boolean enableDataBinding)
       throws EvalException, InterruptedException {
     ValidatedAndroidResources validated =
-        mergeRes(ctx, manifest, resources, deps, neverlink, enableDataBinding, location, thread);
+        mergeRes(ctx, manifest, resources, deps, neverlink, enableDataBinding);
     JavaInfo javaInfo =
         getJavaInfoForRClassJar(validated.getClassJar(), validated.getJavaSourceJar());
     return Dict.of(
@@ -313,12 +298,9 @@
       String aaptVersionString,
       Dict<?, ?> manifestValues, // <String, String>
       Sequence<?> deps, // <ConfiguredTarget>
-      Sequence<?> noCompressExtensions, // <String>
-      Location location,
-      StarlarkThread thread)
+      Sequence<?> noCompressExtensions) // <String>
       throws InterruptedException, EvalException {
-    SkylarkErrorReporter errorReporter =
-        SkylarkErrorReporter.from(ctx.getRuleErrorConsumer(), location);
+    SkylarkErrorReporter errorReporter = SkylarkErrorReporter.from(ctx.getRuleErrorConsumer());
     List<ConfiguredTarget> depsTargets = deps.getContents(ConfiguredTarget.class, "deps");
 
     try {
@@ -386,9 +368,7 @@
       Object shrinkResources,
       Sequence<?> resourceConfigurationFilters, // <String>
       Sequence<?> densities, // <String>
-      Sequence<?> noCompressExtensions, // <String>
-      Location location,
-      StarlarkThread thread)
+      Sequence<?> noCompressExtensions) // <String>
       throws EvalException {
     return new BinaryDataSettings(
         fromNoneableOrDefault(
@@ -410,16 +390,10 @@
    * Helper method to get default {@link
    * com.google.devtools.build.lib.rules.android.AndroidSkylarkData.BinaryDataSettings}.
    */
-  private BinaryDataSettings defaultBinaryDataSettings(
-      AndroidDataContext ctx, Location location, StarlarkThread thread) throws EvalException {
+  private BinaryDataSettings defaultBinaryDataSettings(AndroidDataContext ctx)
+      throws EvalException {
     return makeBinarySettings(
-        ctx,
-        Starlark.NONE,
-        StarlarkList.empty(),
-        StarlarkList.empty(),
-        StarlarkList.empty(),
-        location,
-        thread);
+        ctx, Starlark.NONE, StarlarkList.empty(), StarlarkList.empty(), StarlarkList.empty());
   }
 
   private static class BinaryDataSettings implements AndroidBinaryDataSettingsApi {
@@ -450,12 +424,9 @@
       String manifestMerger,
       Object maybeSettings,
       boolean crunchPng,
-      boolean dataBindingEnabled,
-      Location location,
-      StarlarkThread thread)
+      boolean dataBindingEnabled)
       throws InterruptedException, EvalException {
-    SkylarkErrorReporter errorReporter =
-        SkylarkErrorReporter.from(ctx.getRuleErrorConsumer(), location);
+    SkylarkErrorReporter errorReporter = SkylarkErrorReporter.from(ctx.getRuleErrorConsumer());
     List<ConfiguredTarget> depsTargets = deps.getContents(ConfiguredTarget.class, "deps");
     Map<String, String> manifestValueMap =
         manifestValues.getContents(String.class, String.class, "manifest_values");
@@ -463,9 +434,7 @@
     try {
       BinaryDataSettings settings =
           fromNoneableOrDefault(
-              maybeSettings,
-              BinaryDataSettings.class,
-              defaultBinaryDataSettings(ctx, location, thread));
+              maybeSettings, BinaryDataSettings.class, defaultBinaryDataSettings(ctx));
 
       AndroidManifest rawManifest =
           AndroidManifest.from(
@@ -542,15 +511,11 @@
       Object maybeSettings,
       Sequence<?> deps, // <ConfiguredTarget>
       Sequence<?> localProguardSpecs, // <ConfiguredTarget>
-      Sequence<?> extraProguardSpecs, // <ConfiguredTarget>
-      Location location,
-      StarlarkThread thread)
+      Sequence<?> extraProguardSpecs) // <ConfiguredTarget>
       throws EvalException, InterruptedException {
     BinaryDataSettings settings =
         fromNoneableOrDefault(
-            maybeSettings,
-            BinaryDataSettings.class,
-            defaultBinaryDataSettings(ctx, location, thread));
+            maybeSettings, BinaryDataSettings.class, defaultBinaryDataSettings(ctx));
     List<ConfiguredTarget> depsTargets = deps.getContents(ConfiguredTarget.class, "deps");
 
     if (!settings.shrinkResources) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/ApkInfo.java b/src/main/java/com/google/devtools/build/lib/rules/android/ApkInfo.java
index e5ee6b9..ef451b8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/ApkInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/ApkInfo.java
@@ -15,7 +15,6 @@
 
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.skylarkbuildapi.android.ApkInfoApi;
@@ -93,9 +92,8 @@
     }
 
     @Override
-    public ApkInfoApi<?> createInfo(Dict<String, Object> kwargs, Location loc)
-        throws EvalException {
-      return throwUnsupportedConstructorException(loc);
+    public ApkInfoApi<?> createInfo(Dict<String, Object> kwargs) throws EvalException {
+      return throwUnsupportedConstructorException();
     }
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigGlobalLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigGlobalLibrary.java
index b6b1321..e67acae 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigGlobalLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigGlobalLibrary.java
@@ -20,13 +20,13 @@
 import com.google.devtools.build.lib.analysis.config.StarlarkDefinedConfigTransition;
 import com.google.devtools.build.lib.analysis.skylark.StarlarkTransition.Settings;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.config.ConfigGlobalLibraryApi;
 import com.google.devtools.build.lib.skylarkbuildapi.config.ConfigurationTransitionApi;
 import com.google.devtools.build.lib.syntax.BaseFunction;
 import com.google.devtools.build.lib.syntax.Dict;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Sequence;
+import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.HashSet;
@@ -45,16 +45,15 @@
       BaseFunction implementation,
       Sequence<?> inputs, // <String> expected
       Sequence<?> outputs, // <String> expected
-      Location location,
       StarlarkThread thread)
       throws EvalException {
     StarlarkSemantics semantics = thread.getSemantics();
     List<String> inputsList = inputs.getContents(String.class, "inputs");
     List<String> outputsList = outputs.getContents(String.class, "outputs");
     validateBuildSettingKeys(
-        inputsList, Settings.INPUTS, location, semantics.experimentalStarlarkConfigTransitions());
+        inputsList, Settings.INPUTS, semantics.experimentalStarlarkConfigTransitions());
     validateBuildSettingKeys(
-        outputsList, Settings.OUTPUTS, location, semantics.experimentalStarlarkConfigTransitions());
+        outputsList, Settings.OUTPUTS, semantics.experimentalStarlarkConfigTransitions());
     return StarlarkDefinedConfigTransition.newRegularTransition(
         implementation, inputsList, outputsList, semantics, thread);
   }
@@ -62,18 +61,18 @@
   @Override
   public ConfigurationTransitionApi analysisTestTransition(
       Dict<?, ?> changedSettings, // <String, String> expected
-      Location location)
+      StarlarkThread thread)
       throws EvalException {
     Map<String, Object> changedSettingsMap =
         changedSettings.getContents(String.class, Object.class, "changed_settings dict");
-    validateBuildSettingKeys(changedSettingsMap.keySet(), Settings.OUTPUTS, location, true);
-    return StarlarkDefinedConfigTransition.newAnalysisTestTransition(changedSettingsMap, location);
+    validateBuildSettingKeys(changedSettingsMap.keySet(), Settings.OUTPUTS, true);
+    return StarlarkDefinedConfigTransition.newAnalysisTestTransition(
+        changedSettingsMap, thread.getCallerLocation());
   }
 
   private void validateBuildSettingKeys(
       Iterable<String> optionKeys,
       Settings keyErrorDescriptor,
-      Location location,
       boolean starlarkTransitionsEnabled)
       throws EvalException {
 
@@ -83,8 +82,7 @@
     for (String optionKey : optionKeys) {
       if (!optionKey.startsWith(COMMAND_LINE_OPTION_PREFIX)) {
         if (!starlarkTransitionsEnabled) {
-          throw new EvalException(
-              location,
+          throw Starlark.errorf(
               "transitions on Starlark-defined build settings is experimental and "
                   + "disabled by default. This API is in development and subject to change at any"
                   + "time. Use --experimental_starlark_config_transitions to use this experimental "
@@ -93,29 +91,22 @@
         try {
           Label.parseAbsoluteUnchecked(optionKey);
         } catch (IllegalArgumentException e) {
-          throw new EvalException(
-              location,
-              String.format(
-                  "invalid transition %s '%s'. If this is intended as a native option, "
-                      + "it must begin with //command_line_option:",
-                  singularErrorDescriptor, optionKey),
-              e);
+          throw Starlark.errorf(
+              "invalid transition %s '%s'. If this is intended as a native option, "
+                  + "it must begin with //command_line_option: %s",
+              singularErrorDescriptor, optionKey, e.getMessage());
         }
       } else {
         String optionName = optionKey.substring(COMMAND_LINE_OPTION_PREFIX.length());
         if (optionName.startsWith("experimental_") || optionName.startsWith("incompatible_")) {
-          throw new EvalException(
-              location,
-              String.format(
-                  "Invalid transition %s '%s'. Cannot transition on --experimental_* or "
-                      + "--incompatible_* options",
-                  singularErrorDescriptor, optionKey));
+          throw Starlark.errorf(
+              "Invalid transition %s '%s'. Cannot transition on --experimental_* or "
+                  + "--incompatible_* options",
+              singularErrorDescriptor, optionKey);
         }
       }
       if (!processedOptions.add(optionKey)) {
-        throw new EvalException(
-            location,
-            String.format("duplicate transition %s '%s'", singularErrorDescriptor, optionKey));
+        throw Starlark.errorf("duplicate transition %s '%s'", singularErrorDescriptor, optionKey);
       }
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java
index c92e031..a8c1cef 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationOutputs.java
@@ -21,7 +21,6 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcCompilationOutputsApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Sequence;
@@ -104,11 +103,11 @@
   }
 
   @Override
-  public Sequence<Artifact> getSkylarkObjectFiles(
-      boolean usePic, Location location, StarlarkThread thread) throws EvalException {
+  public Sequence<Artifact> getSkylarkObjectFiles(boolean usePic, StarlarkThread thread)
+      throws EvalException {
     CcCommon.checkLocationWhitelisted(
         thread.getSemantics(),
-        location,
+        thread.getCallerLocation(),
         ((Label) thread.getGlobals().getLabel()).getPackageIdentifier().toString());
     return StarlarkList.immutableCopyOf(getObjectFiles(usePic));
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcInfo.java
index d7f3717..e97d95a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcInfo.java
@@ -18,13 +18,11 @@
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Starlark;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.Collection;
 import javax.annotation.Nullable;
 
@@ -156,11 +154,7 @@
     }
 
     @Override
-    public CcInfoApi createInfo(
-        Object skylarkCcCompilationContext,
-        Object skylarkCcLinkingInfo,
-        Location location,
-        StarlarkThread thread)
+    public CcInfoApi createInfo(Object skylarkCcCompilationContext, Object skylarkCcLinkingInfo)
         throws EvalException {
       CcCompilationContext ccCompilationContext =
           nullIfNone(skylarkCcCompilationContext, CcCompilationContext.class);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
index 8806e8f..4527907 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
@@ -136,8 +136,7 @@
     if (ruleContext == null
         && toolchain
             .requireCtxInConfigureFeatures()) {
-      throw new EvalException(
-          Location.BUILTIN,
+      throw Starlark.errorf(
           "Incompatible flag --incompatible_require_ctx_in_configure_features has been flipped, "
               + "and the mandatory parameter 'ctx' of cc_common.configure_features is missing. "
               + "Please add 'ctx' as a named parameter. See "
@@ -354,7 +353,7 @@
     } else if (o instanceof NoneType) {
       return ImmutableList.of();
     } else {
-      throw new EvalException(Location.BUILTIN, "Only list is allowed.");
+      throw Starlark.errorf("Only list is allowed.");
     }
   }
 
@@ -387,7 +386,6 @@
       boolean alwayslink,
       String dynamicLibraryPath,
       String interfaceLibraryPath,
-      Location location,
       StarlarkThread thread)
       throws EvalException, InterruptedException {
     SkylarkActionFactory skylarkActionFactory =
@@ -408,7 +406,6 @@
     if (!Strings.isNullOrEmpty(dynamicLibraryPath)) {
       dynamicLibraryPathFragment = PathFragment.create(dynamicLibraryPath);
       validateSymlinkPath(
-          location,
           "dynamic_library_symlink_path",
           dynamicLibraryPathFragment,
           Link.ONLY_SHARED_LIBRARY_FILETYPES,
@@ -419,7 +416,6 @@
     if (!Strings.isNullOrEmpty(interfaceLibraryPath)) {
       interfaceLibraryPathFragment = PathFragment.create(interfaceLibraryPath);
       validateSymlinkPath(
-          location,
           "interface_library_symlink_path",
           interfaceLibraryPathFragment,
           Link.ONLY_INTERFACE_LIBRARY_FILETYPES,
@@ -477,11 +473,11 @@
       notNullArtifactForIdentifier = interfaceLibrary;
     }
     if (notNullArtifactForIdentifier == null) {
-      throw new EvalException(location, "Must pass at least one artifact");
+      throw Starlark.errorf("Must pass at least one artifact");
     }
     String extensionErrors = extensionErrorsBuilder.toString();
     if (!extensionErrors.isEmpty()) {
-      throw new EvalException(location, extensionErrors);
+      throw Starlark.errorf("%s", extensionErrors);
     }
 
     Artifact resolvedSymlinkDynamicLibrary = null;
@@ -491,15 +487,13 @@
         resolvedSymlinkDynamicLibrary = dynamicLibrary;
         if (dynamicLibraryPathFragment != null) {
           if (dynamicLibrary.getRootRelativePath().getSegment(0).startsWith("_solib_")) {
-            throw new EvalException(
-                location,
-                String.format(
-                    "dynamic_library must not be a symbolic link in the solib directory. Got '%s'",
-                    dynamicLibrary.getRootRelativePath()));
+            throw Starlark.errorf(
+                "dynamic_library must not be a symbolic link in the solib directory. Got '%s'",
+                dynamicLibrary.getRootRelativePath());
           }
           dynamicLibrary =
               SolibSymlinkAction.getDynamicLibrarySymlink(
-                  skylarkActionFactory.asActionRegistry(location, skylarkActionFactory),
+                  skylarkActionFactory.asActionRegistry(skylarkActionFactory),
                   skylarkActionFactory.getActionConstructionContext(),
                   ccToolchainProvider.getSolibDirectory(),
                   dynamicLibrary,
@@ -507,7 +501,7 @@
         } else {
           dynamicLibrary =
               SolibSymlinkAction.getDynamicLibrarySymlink(
-                  skylarkActionFactory.asActionRegistry(location, skylarkActionFactory),
+                  skylarkActionFactory.asActionRegistry(skylarkActionFactory),
                   skylarkActionFactory.getActionConstructionContext(),
                   ccToolchainProvider.getSolibDirectory(),
                   dynamicLibrary,
@@ -519,17 +513,13 @@
         resolvedSymlinkInterfaceLibrary = interfaceLibrary;
         if (interfaceLibraryPathFragment != null) {
           if (interfaceLibrary.getRootRelativePath().getSegment(0).startsWith("_solib_")) {
-            throw new EvalException(
-                location,
-                String.format(
-                    "interface_library must not be a symbolic link in the solib directory. Got"
-                        + " '%s'",
-                    interfaceLibrary.getRootRelativePath()));
+            throw Starlark.errorf(
+                "interface_library must not be a symbolic link in the solib directory. Got '%s'",
+                interfaceLibrary.getRootRelativePath());
           }
           interfaceLibrary =
               SolibSymlinkAction.getDynamicLibrarySymlink(
-                  /* actionRegistry= */ skylarkActionFactory.asActionRegistry(
-                      location, skylarkActionFactory),
+                  /* actionRegistry= */ skylarkActionFactory.asActionRegistry(skylarkActionFactory),
                   /* actionConstructionContext= */ skylarkActionFactory
                       .getActionConstructionContext(),
                   ccToolchainProvider.getSolibDirectory(),
@@ -538,8 +528,7 @@
         } else {
           interfaceLibrary =
               SolibSymlinkAction.getDynamicLibrarySymlink(
-                  /* actionRegistry= */ skylarkActionFactory.asActionRegistry(
-                      location, skylarkActionFactory),
+                  /* actionRegistry= */ skylarkActionFactory.asActionRegistry(skylarkActionFactory),
                   /* actionConstructionContext= */ skylarkActionFactory
                       .getActionConstructionContext(),
                   ccToolchainProvider.getSolibDirectory(),
@@ -553,8 +542,7 @@
         && picStaticLibrary == null
         && dynamicLibrary == null
         && interfaceLibrary == null) {
-      throw new EvalException(
-          location,
+      throw Starlark.errorf(
           "Must pass at least one of the following parameters: static_library, pic_static_library, "
               + "dynamic_library and interface_library.");
     }
@@ -571,7 +559,6 @@
   }
 
   private static void validateSymlinkPath(
-      Location location,
       String attrName,
       PathFragment symlinkPath,
       FileTypeSet filetypes,
@@ -580,9 +567,7 @@
     if (symlinkPath.isEmpty()
         || symlinkPath.isAbsolute()
         || symlinkPath.containsUplevelReferences()) {
-      throw new EvalException(
-          location,
-          String.format("%s must be a relative file path. Got '%s'", attrName, symlinkPath));
+      throw Starlark.errorf("%s must be a relative file path. Got '%s'", attrName, symlinkPath);
     }
     if (!filetypes.matches(symlinkPath.getBaseName())) {
       errorsBuilder.append(
@@ -660,10 +645,8 @@
       Object librariesToLinkObject,
       Object userLinkFlagsObject,
       Object nonCodeInputs, // <FileT> expected
-      Location location,
       StarlarkThread thread)
       throws EvalException, InterruptedException {
-
     LinkOptions options =
         LinkOptions.of(
             Depset.getSetFromNoneableParam(userLinkFlagsObject, String.class, "user_link_flags")
@@ -688,7 +671,6 @@
       Object librariesToLinkObject,
       Object userLinkFlagsObject,
       Object nonCodeInputsObject,
-      Location location,
       StarlarkThread thread)
       throws EvalException {
     if (EvalUtils.isNullOrNone(linkerInputs)) {
@@ -720,7 +702,7 @@
         return ccLinkingContextBuilder.build();
       }
 
-      throw new EvalException(location, "Must pass libraries_to_link, user_link_flags or both.");
+      throw Starlark.errorf("Must pass libraries_to_link, user_link_flags or both.");
     } else {
       CcLinkingContext.Builder ccLinkingContextBuilder = CcLinkingContext.builder();
       ccLinkingContextBuilder.addTransitiveLinkerInputs(
@@ -735,8 +717,7 @@
       Sequence<String> nonCodeInputs = nullIfNone(nonCodeInputsObject, Sequence.class);
 
       if (librariesToLink != null || userLinkFlags != null || nonCodeInputs != null) {
-        throw new EvalException(
-            location,
+        throw Starlark.errorf(
             "If you pass linker_inputs you are using the new API. "
                 + "Just pass linker_inputs. Do not mix old and new API parameters.");
       }
@@ -956,14 +937,12 @@
   private static void checkRightSkylarkInfoProvider(
       Object o, String parameterName, String expectedProvider) throws EvalException {
     if (!(o instanceof SkylarkInfo)) {
-      throw new EvalException(
-          Location.BUILTIN,
-          String.format(
-              "'%s' parameter of cc_common.create_cc_toolchain_config_info() contains an element"
-                  + " of type '%s' instead of a '%s' provider. Use the methods provided in"
-                  + " https://source.bazel.build/bazel/+/master:tools/cpp/cc_toolchain_config_lib.bzl"
-                  + " for obtaining the right providers.",
-              parameterName, EvalUtils.getDataTypeName(o), expectedProvider));
+      throw Starlark.errorf(
+          "'%s' parameter of cc_common.create_cc_toolchain_config_info() contains an element"
+              + " of type '%s' instead of a '%s' provider. Use the methods provided in"
+              + " https://source.bazel.build/bazel/+/master:tools/cpp/cc_toolchain_config_lib.bzl"
+              + " for obtaining the right providers.",
+          parameterName, EvalUtils.getDataTypeName(o), expectedProvider);
     }
   }
 
@@ -1475,15 +1454,14 @@
       boolean disallowStaticLibraries,
       boolean disallowDynamicLibraries,
       Object grepIncludes,
-      Location location,
       StarlarkThread thread)
       throws InterruptedException, EvalException {
-    validateLanguage(location, language);
+    validateLanguage(language);
     SkylarkActionFactory actions = skylarkActionFactoryApi;
     CcToolchainProvider ccToolchainProvider = convertFromNoneable(skylarkCcToolchainProvider, null);
     FeatureConfigurationForStarlark featureConfiguration =
         convertFromNoneable(skylarkFeatureConfiguration, null);
-    Label label = getCallerLabel(location, actions, name);
+    Label label = getCallerLabel(actions, name);
     FdoContext fdoContext = ccToolchainProvider.getFdoContext();
     LinkTargetType staticLinkTargetType = null;
     if (language.equals(Language.CPP.getRepresentation())) {
@@ -1498,7 +1476,7 @@
         new CcLinkingHelper(
                 actions.getActionConstructionContext().getRuleErrorConsumer(),
                 label,
-                actions.asActionRegistry(location, actions),
+                actions.asActionRegistry(actions),
                 actions.getActionConstructionContext(),
                 getSemantics(),
                 featureConfiguration.getFeatureConfiguration(),
@@ -1549,41 +1527,33 @@
                   .build()),
           ccLinkingOutputs);
     } catch (RuleErrorException e) {
-      throw new EvalException(location, e);
+      throw Starlark.errorf("%s", e.getMessage());
     }
   }
 
-  protected void validateLanguage(Location location, String language) throws EvalException {
+  protected void validateLanguage(String language) throws EvalException {
     if (!Arrays.stream(Language.values())
         .map(Language::getRepresentation)
         .collect(ImmutableList.toImmutableList())
         .contains(language)) {
-      throw new EvalException(location, "Language '" + language + "' is not supported");
+      throw Starlark.errorf("Language '%s' is not supported", language);
     }
   }
 
-  protected void validateOutputType(Location location, String outputType) throws EvalException {
+  protected void validateOutputType(String outputType) throws EvalException {
     if (!SUPPORTED_OUTPUT_TYPES.contains(outputType)) {
-      throw new EvalException(location, "Output type '" + outputType + "' is not supported");
+      throw Starlark.errorf("Output type '%s' is not supported", outputType);
     }
   }
 
-  protected Label getCallerLabel(Location location, SkylarkActionFactory actions, String name)
-      throws EvalException {
-    Label label;
+  protected Label getCallerLabel(SkylarkActionFactory actions, String name) throws EvalException {
     try {
-      label =
-          Label.create(
-              actions
-                  .getActionConstructionContext()
-                  .getActionOwner()
-                  .getLabel()
-                  .getPackageIdentifier(),
-              name);
+      return Label.create(
+          actions.getActionConstructionContext().getActionOwner().getLabel().getPackageIdentifier(),
+          name);
     } catch (LabelSyntaxException e) {
-      throw new EvalException(location, e);
+      throw Starlark.errorf("%s", e.getMessage());
     }
-    return label;
   }
 
   protected Tuple<Object> compile(
@@ -1607,8 +1577,7 @@
       Artifact grepIncludes,
       List<Artifact> headersForClifDoNotUseThisParam,
       Sequence<?> additionalInputs,
-      Location location,
-      @Nullable StarlarkThread thread)
+      StarlarkThread thread)
       throws EvalException, InterruptedException {
     List<Artifact> sources = sourcesUnchecked.getContents(Artifact.class, "srcs");
     List<Artifact> publicHeaders = publicHeadersUnchecked.getContents(Artifact.class, "srcs");
@@ -1618,35 +1587,32 @@
     CcToolchainProvider ccToolchainProvider = convertFromNoneable(skylarkCcToolchainProvider, null);
     FeatureConfigurationForStarlark featureConfiguration =
         convertFromNoneable(skylarkFeatureConfiguration, null);
-    Label label = getCallerLabel(location, actions, name);
+    Label label = getCallerLabel(actions, name);
     FdoContext fdoContext = ccToolchainProvider.getFdoContext();
     validateExtensions(
-        location,
         "srcs",
         sources,
         CppFileTypes.ALL_C_CLASS_SOURCE,
         FileTypeSet.of(CppFileTypes.CPP_SOURCE, CppFileTypes.C_SOURCE));
     validateExtensions(
-        location,
         "public_hdrs",
         publicHeaders,
         FileTypeSet.of(CppFileTypes.CPP_HEADER),
         FileTypeSet.of(CppFileTypes.CPP_HEADER));
     validateExtensions(
-        location,
         "private_hdrs",
         privateHeaders,
         FileTypeSet.of(CppFileTypes.CPP_HEADER),
         FileTypeSet.of(CppFileTypes.CPP_HEADER));
 
     if (disallowNopicOutputs && disallowPicOutputs) {
-      throw new EvalException(location, "Either PIC or no PIC actions have to be created.");
+      throw Starlark.errorf("Either PIC or no PIC actions have to be created.");
     }
 
     CcCommon common = new CcCommon(actions.getRuleContext());
     CcCompilationHelper helper =
         new CcCompilationHelper(
-                actions.asActionRegistry(location, actions),
+                actions.asActionRegistry(actions),
                 actions.getActionConstructionContext(),
                 label,
                 grepIncludes,
@@ -1701,7 +1667,7 @@
       return Tuple.of(
           compilationInfo.getCcCompilationContext(), compilationInfo.getCcCompilationOutputs());
     } catch (RuleErrorException e) {
-      throw new EvalException(location, e);
+      throw Starlark.errorf("%s", e.getMessage());
     }
   }
 
@@ -1718,15 +1684,14 @@
       boolean linkDepsStatically,
       Sequence<?> additionalInputs,
       Object grepIncludes,
-      Location location,
       StarlarkThread thread)
       throws InterruptedException, EvalException {
-    validateLanguage(location, language);
-    validateOutputType(location, outputType);
+    validateLanguage(language);
+    validateOutputType(outputType);
     CcToolchainProvider ccToolchainProvider = convertFromNoneable(skylarkCcToolchainProvider, null);
     FeatureConfigurationForStarlark featureConfiguration =
         convertFromNoneable(skylarkFeatureConfiguration, null);
-    Label label = getCallerLabel(location, actions, name);
+    Label label = getCallerLabel(actions, name);
     FdoContext fdoContext = ccToolchainProvider.getFdoContext();
     LinkTargetType dynamicLinkTargetType = null;
     if (language.equals(Language.CPP.getRepresentation())) {
@@ -1742,8 +1707,7 @@
         && outputType.equals("executable")) {
       dynamicLinkTargetType = LinkTargetType.OBJCPP_EXECUTABLE;
     } else {
-      throw new EvalException(
-          location, "Language '" + language + "' does not support " + outputType);
+      throw Starlark.errorf("Language '%s' does not support %s", language, outputType);
     }
     FeatureConfiguration actualFeatureConfiguration =
         featureConfiguration.getFeatureConfiguration();
@@ -1756,7 +1720,7 @@
         new CcLinkingHelper(
                 actions.getActionConstructionContext().getRuleErrorConsumer(),
                 label,
-                actions.asActionRegistry(location, actions),
+                actions.asActionRegistry(actions),
                 actions.getActionConstructionContext(),
                 getSemantics(),
                 actualFeatureConfiguration,
@@ -1786,27 +1750,25 @@
       return helper.link(
           compilationOutputs != null ? compilationOutputs : CcCompilationOutputs.EMPTY);
     } catch (RuleErrorException e) {
-      throw new EvalException(location, e);
+      throw Starlark.errorf("%s", e.getMessage());
     }
   }
 
   protected CcCompilationOutputs createCompilationOutputsFromSkylark(
-      Object objectsObject, Object picObjectsObject, Location location) throws EvalException {
+      Object objectsObject, Object picObjectsObject) throws EvalException {
     CcCompilationOutputs.Builder ccCompilationOutputsBuilder = CcCompilationOutputs.builder();
     NestedSet<Artifact> objects = convertToNestedSet(objectsObject, Artifact.class, "objects");
-    validateExtensions(
-        location, "objects", objects.toList(), Link.OBJECT_FILETYPES, Link.OBJECT_FILETYPES);
+    validateExtensions("objects", objects.toList(), Link.OBJECT_FILETYPES, Link.OBJECT_FILETYPES);
     NestedSet<Artifact> picObjects =
         convertToNestedSet(picObjectsObject, Artifact.class, "pic_objects");
     validateExtensions(
-        location, "pic_objects", picObjects.toList(), Link.OBJECT_FILETYPES, Link.OBJECT_FILETYPES);
+        "pic_objects", picObjects.toList(), Link.OBJECT_FILETYPES, Link.OBJECT_FILETYPES);
     ccCompilationOutputsBuilder.addObjectFiles(objects.toList());
     ccCompilationOutputsBuilder.addPicObjectFiles(picObjects.toList());
     return ccCompilationOutputsBuilder.build();
   }
 
   private void validateExtensions(
-      Location location,
       String paramName,
       List<Artifact> files,
       FileTypeSet validFileTypeSet,
@@ -1814,14 +1776,11 @@
       throws EvalException {
     for (Artifact file : files) {
       if (!validFileTypeSet.matches(file.getFilename())) {
-        throw new EvalException(
-            location,
-            String.format(
-                "'%s' has wrong extension. The list of possible extensions for '"
-                    + paramName
-                    + "' are: %s",
-                file.getExecPathString(),
-                Joiner.on(",").join(fileTypeForErrorMessage.getExtensions())));
+        throw Starlark.errorf(
+            "'%s' has wrong extension. The list of possible extensions for '%s' is: %s",
+            file.getExecPathString(),
+            paramName,
+            Joiner.on(",").join(fileTypeForErrorMessage.getExtensions()));
       }
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
index 03ba47d..5de4841 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
@@ -419,7 +419,6 @@
         Sequence<?> runtimeDeps,
         Sequence<?> exports,
         Object jdepsApi,
-        Location loc,
         StarlarkThread thread)
         throws EvalException {
       Artifact outputJar = (Artifact) outputJarApi;
@@ -427,7 +426,7 @@
       @Nullable Artifact sourceJar = nullIfNone(sourceJarApi, Artifact.class);
       @Nullable Artifact jdeps = nullIfNone(jdepsApi, Artifact.class);
       if (compileJar == null) {
-        throw new EvalException(loc, "Expected 'File' for 'compile_jar', found 'None'");
+        throw Starlark.errorf("Expected 'File' for 'compile_jar', found 'None'");
       }
       return JavaInfoBuildHelper.getInstance()
           .createJavaInfo(
@@ -439,7 +438,7 @@
               (Sequence<JavaInfo>) runtimeDeps,
               (Sequence<JavaInfo>) exports,
               jdeps,
-              loc);
+              thread.getCallerLocation());
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
index dfb2789..9c67e38 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
@@ -42,6 +42,7 @@
 import com.google.devtools.build.lib.shell.ShellUtils;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Sequence;
+import com.google.devtools.build.lib.syntax.Starlark;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import java.util.ArrayList;
@@ -152,8 +153,7 @@
       List<Artifact> sourceFiles,
       List<Artifact> sourceJars,
       JavaToolchainProvider javaToolchain,
-      JavaRuntimeInfo hostJavabase,
-      Location location)
+      JavaRuntimeInfo hostJavabase)
       throws EvalException {
     // No sources to pack, return None
     if (sourceFiles.isEmpty() && sourceJars.isEmpty()) {
@@ -163,7 +163,7 @@
     if (sourceFiles.isEmpty() && sourceJars.size() == 1) {
       return sourceJars.get(0);
     }
-    ActionRegistry actionRegistry = actions.asActionRegistry(location, actions);
+    ActionRegistry actionRegistry = actions.asActionRegistry(actions);
     if (outputSourceJar == null) {
       outputSourceJar = getDerivedSourceJar(actions.getActionConstructionContext(), outputJar);
     }
@@ -236,7 +236,6 @@
       List<Artifact> resources,
       Boolean neverlink,
       JavaSemantics javaSemantics,
-      Location location,
       StarlarkThread thread)
       throws EvalException, InterruptedException {
 
@@ -244,8 +243,7 @@
         && sourceFiles.isEmpty()
         && exports.isEmpty()
         && exportedPlugins.isEmpty()) {
-      throw new EvalException(
-          location,
+      throw Starlark.errorf(
           "source_jars, sources, exports and exported_plugins cannot be simultaneously empty");
     }
 
@@ -268,7 +266,7 @@
                     .addAll(
                         JavaCommon.computePerPackageJavacOpts(
                             skylarkRuleContext.getRuleContext(), toolchainProvider))
-                    .addAll(tokenize(location, javacOpts))
+                    .addAll(tokenize(javacOpts))
                     .build());
 
     streamProviders(deps, JavaCompilationArgsProvider.class).forEach(helper::addDep);
@@ -335,13 +333,13 @@
         .build();
   }
 
-  private static List<String> tokenize(Location location, List<String> input) throws EvalException {
+  private static List<String> tokenize(List<String> input) throws EvalException {
     List<String> output = new ArrayList<>();
     for (String token : input) {
       try {
         ShellUtils.tokenize(output, token);
       } catch (ShellUtils.TokenizationException e) {
-        throw new EvalException(location, e.getMessage());
+        throw Starlark.errorf("%s", e.getMessage());
       }
     }
     return output;
@@ -351,11 +349,10 @@
       SkylarkActionFactory actions,
       Artifact inputJar,
       @Nullable Label targetLabel,
-      JavaToolchainProvider javaToolchain,
-      Location location)
+      JavaToolchainProvider javaToolchain)
       throws EvalException {
     String ijarBasename = FileSystemUtils.removeExtension(inputJar.getFilename()) + "-ijar.jar";
-    Artifact interfaceJar = actions.declareFile(ijarBasename, inputJar, location);
+    Artifact interfaceJar = actions.declareFile(ijarBasename, inputJar);
     FilesToRunProvider ijarTarget = javaToolchain.getIjar();
     CustomCommandLine.Builder commandLine =
         CustomCommandLine.builder().addExecPath(inputJar).addExecPath(interfaceJar);
@@ -371,7 +368,7 @@
             .addCommandLine(commandLine.build())
             .useDefaultShellEnvironment()
             .setMnemonic("JavaIjar");
-    actions.registerAction(location, actionBuilder.build(actions.getActionConstructionContext()));
+    actions.registerAction(actionBuilder.build(actions.getActionConstructionContext()));
     return interfaceJar;
   }
 
@@ -379,11 +376,10 @@
       SkylarkActionFactory actions,
       Artifact inputJar,
       Label targetLabel,
-      JavaToolchainProvider javaToolchain,
-      Location location)
+      JavaToolchainProvider javaToolchain)
       throws EvalException {
     String basename = FileSystemUtils.removeExtension(inputJar.getFilename()) + "-stamped.jar";
-    Artifact outputJar = actions.declareFile(basename, inputJar, location);
+    Artifact outputJar = actions.declareFile(basename, inputJar);
     // ijar doubles as a stamping tool
     FilesToRunProvider ijarTarget = (javaToolchain).getIjar();
     CustomCommandLine.Builder commandLine =
@@ -401,7 +397,7 @@
             .addCommandLine(commandLine.build())
             .useDefaultShellEnvironment()
             .setMnemonic("JavaIjar");
-    actions.registerAction(location, actionBuilder.build(actions.getActionConstructionContext()));
+    actions.registerAction(actionBuilder.build(actions.getActionConstructionContext()));
     return outputJar;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
index bc8e19b..c43e62f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
@@ -21,7 +21,6 @@
 import com.google.devtools.build.lib.analysis.skylark.SkylarkActionFactory;
 import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.Provider;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.java.JavaCommonApi;
@@ -74,7 +73,6 @@
       Sequence<?> sourcepathEntries, // <Artifact> expected
       Sequence<?> resources, // <Artifact> expected
       Boolean neverlink,
-      Location location,
       StarlarkThread thread)
       throws EvalException, InterruptedException {
 
@@ -103,7 +101,6 @@
             resources.getContents(Artifact.class, "resources"),
             neverlink,
             javaSemantics,
-            location,
             thread);
   }
 
@@ -112,16 +109,11 @@
       SkylarkActionFactory actions,
       Artifact jar,
       Object targetLabel,
-      JavaToolchainProvider javaToolchain,
-      Location location)
+      JavaToolchainProvider javaToolchain)
       throws EvalException {
     return JavaInfoBuildHelper.getInstance()
         .buildIjar(
-            actions,
-            jar,
-            targetLabel != Starlark.NONE ? (Label) targetLabel : null,
-            javaToolchain,
-            location);
+            actions, jar, targetLabel != Starlark.NONE ? (Label) targetLabel : null, javaToolchain);
   }
 
   @Override
@@ -129,11 +121,9 @@
       SkylarkActionFactory actions,
       Artifact jar,
       Label targetLabel,
-      JavaToolchainProvider javaToolchain,
-      Location location)
+      JavaToolchainProvider javaToolchain)
       throws EvalException {
-    return JavaInfoBuildHelper.getInstance()
-        .stampJar(actions, jar, targetLabel, javaToolchain, location);
+    return JavaInfoBuildHelper.getInstance().stampJar(actions, jar, targetLabel, javaToolchain);
   }
 
   @Override
@@ -143,8 +133,7 @@
       Sequence<?> sourceFiles, // <Artifact> expected.
       Sequence<?> sourceJars, // <Artifact> expected.
       JavaToolchainProvider javaToolchain,
-      JavaRuntimeInfo hostJavabase,
-      Location location)
+      JavaRuntimeInfo hostJavabase)
       throws EvalException {
     return JavaInfoBuildHelper.getInstance()
         .packSourceFiles(
@@ -154,15 +143,14 @@
             sourceFiles.getContents(Artifact.class, "sources"),
             sourceJars.getContents(Artifact.class, "source_jars"),
             javaToolchain,
-            hostJavabase,
-            location);
+            hostJavabase);
   }
 
   @Override
   // TODO(b/78512644): migrate callers to passing explicit javacopts or using custom toolchains, and
   // delete
-  public ImmutableList<String> getDefaultJavacOpts(
-      JavaToolchainProvider javaToolchain, Location location) throws EvalException {
+  public ImmutableList<String> getDefaultJavacOpts(JavaToolchainProvider javaToolchain)
+      throws EvalException {
     // We don't have a rule context if the default_javac_opts.java_toolchain parameter is set
     return ((JavaToolchainProvider) javaToolchain).getJavacOptions(/* ruleContext= */ null);
   }
@@ -242,8 +230,8 @@
   }
 
   @Override
-  public Label getJavaToolchainLabel(
-      JavaToolchainSkylarkApiProviderApi toolchain, Location location) throws EvalException {
+  public Label getJavaToolchainLabel(JavaToolchainSkylarkApiProviderApi toolchain)
+      throws EvalException {
     // No implementation in Bazel. This method not callable in Starlark except through
     // (discouraged) use of --experimental_google_legacy_api.
     return null;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/MessageBundleInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/MessageBundleInfo.java
index 90a9f68..eb20b2b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/MessageBundleInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/MessageBundleInfo.java
@@ -30,6 +30,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Sequence;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.syntax.StarlarkValue;
 import java.util.List;
 import javax.annotation.Nullable;
@@ -59,11 +60,11 @@
           @Param(name = "messages", positional = false, named = true, type = Sequence.class),
         },
         selfCall = true,
-        useLocation = true)
-    public MessageBundleInfo messageBundleInfo(Sequence<?> messages, Location loc)
+        useStarlarkThread = true)
+    public MessageBundleInfo messageBundleInfo(Sequence<?> messages, StarlarkThread thread)
         throws EvalException {
       List<Artifact> messagesList = Sequence.castList(messages, Artifact.class, "messages");
-      return new MessageBundleInfo(ImmutableList.copyOf(messagesList), loc);
+      return new MessageBundleInfo(ImmutableList.copyOf(messagesList), thread.getCallerLocation());
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyInfo.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyInfo.java
index eb5ef40..b2781c4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyInfo.java
@@ -29,6 +29,7 @@
 import com.google.devtools.build.lib.syntax.EvalUtils;
 import com.google.devtools.build.lib.syntax.SkylarkType;
 import com.google.devtools.build.lib.syntax.Starlark;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.Objects;
 import javax.annotation.Nullable;
 
@@ -190,7 +191,7 @@
         Object importsUncast,
         boolean hasPy2OnlySources,
         boolean hasPy3OnlySources,
-        Location loc)
+        StarlarkThread thread)
         throws EvalException {
       Depset imports =
           importsUncast.equals(Starlark.UNBOUND)
@@ -198,26 +199,21 @@
               : (Depset) importsUncast;
 
       if (!depsetHasTypeAndCompatibleOrder(transitiveSources, Artifact.TYPE, Order.COMPILE_ORDER)) {
-        throw new EvalException(
-            loc,
-            String.format(
-                "'transitive_sources' field should be a postorder-compatible depset of Files (got "
-                    + "a '%s')",
-                describeType(transitiveSources)));
+        throw Starlark.errorf(
+            "'transitive_sources' field should be a postorder-compatible depset of Files (got a"
+                + " '%s')",
+            describeType(transitiveSources));
       }
       if (!depsetHasTypeAndCompatibleOrder(imports, SkylarkType.STRING, Order.STABLE_ORDER)) {
-        throw new EvalException(
-            loc,
-            String.format(
-                "'imports' field should be a depset of strings (got a '%s')",
-                describeType(imports)));
+        throw Starlark.errorf(
+            "'imports' field should be a depset of strings (got a '%s')", describeType(imports));
       }
       // Validate depset parameters
       transitiveSources.getSetFromParam(Artifact.class, "transitive_sources");
       imports.getSetFromParam(String.class, "imports");
 
       return new PyInfo(
-          loc,
+          thread.getCallerLocation(),
           transitiveSources,
           usesSharedLibraries,
           imports,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfo.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfo.java
index 3ed639c..e0fb6ce 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyRuntimeInfo.java
@@ -28,6 +28,8 @@
 import com.google.devtools.build.lib.syntax.Depset;
 import com.google.devtools.build.lib.syntax.Depset.TypeException;
 import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.Starlark;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.Objects;
 import javax.annotation.Nullable;
@@ -191,7 +193,7 @@
         Object interpreterUncast,
         Object filesUncast,
         String pythonVersion,
-        Location loc)
+        StarlarkThread thread)
         throws EvalException {
       String interpreterPath =
           interpreterPathUncast == NONE ? null : (String) interpreterPathUncast;
@@ -204,22 +206,22 @@
       }
 
       if ((interpreter == null) == (interpreterPath == null)) {
-        throw new EvalException(
-            loc,
+        throw Starlark.errorf(
             "exactly one of the 'interpreter' or 'interpreter_path' arguments must be specified");
       }
       boolean isInBuildRuntime = interpreter != null;
       if (!isInBuildRuntime && filesDepset != null) {
-        throw new EvalException(loc, "cannot specify 'files' if 'interpreter_path' is given");
+        throw Starlark.errorf("cannot specify 'files' if 'interpreter_path' is given");
       }
 
       PythonVersion parsedPythonVersion;
       try {
         parsedPythonVersion = PythonVersion.parseTargetValue(pythonVersion);
       } catch (IllegalArgumentException ex) {
-        throw new EvalException(loc, "illegal value for 'python_version'", ex);
+        throw Starlark.errorf("illegal value for 'python_version': %s", ex.getMessage());
       }
 
+      Location loc = thread.getCallerLocation();
       if (isInBuildRuntime) {
         if (filesDepset == null) {
           filesDepset = Depset.of(Artifact.TYPE, NestedSetBuilder.emptySet(Order.STABLE_ORDER));
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java
index 07ff3a0..54cccdd 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java
@@ -23,7 +23,6 @@
 import com.google.devtools.build.lib.analysis.SkylarkProviderValidationUtil;
 import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleConfiguredTargetUtil;
 import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.AspectDescriptor;
 import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.BazelStarlarkContext;
@@ -135,26 +134,25 @@
     } else {
       // Either an old-style struct or a single declared provider (not in a list)
       Info info = (Info) aspectSkylarkObject;
-      Location loc = info.getCreationLoc();
       if (info.getProvider().getKey().equals(StructProvider.STRUCT.getKey())) {
         // Old-style struct, that may contain declared providers.
         StructImpl struct = (StructImpl) aspectSkylarkObject;
         for (String field : struct.getFieldNames()) {
           if (field.equals("output_groups")) {
-            addOutputGroups(struct.getValue(field), loc, builder);
+            addOutputGroups(struct.getValue(field), builder);
           } else if (field.equals("providers")) {
             Object value = struct.getValue(field);
             Iterable<?> providers =
                 SkylarkType.cast(
                     value,
                     Iterable.class,
-                    loc,
+                    null,
                     "The value for \"providers\" should be a list of declared providers, "
                         + "got %s instead",
                     EvalUtils.getDataTypeName(value, false));
             addDeclaredProviders(builder, providers);
           } else {
-            builder.addSkylarkTransitiveInfo(field, struct.getValue(field), loc);
+            builder.addSkylarkTransitiveInfo(field, struct.getValue(field));
           }
         }
       } else {
@@ -171,12 +169,11 @@
       ConfiguredAspect.Builder builder, Iterable<?> aspectSkylarkObject) throws EvalException {
     int i = 0;
     for (Object o : aspectSkylarkObject) {
-      Location loc = skylarkAspect.getImplementation().getLocation();
       Info declaredProvider =
           SkylarkType.cast(
               o,
               Info.class,
-              loc,
+              null,
               "A return value of an aspect implementation function should be "
                   + "a sequence of declared providers, instead got a %s at index %d",
               o.getClass(),
@@ -186,7 +183,7 @@
     }
   }
 
-  private static void addOutputGroups(Object value, Location loc, ConfiguredAspect.Builder builder)
+  private static void addOutputGroups(Object value, ConfiguredAspect.Builder builder)
       throws EvalException {
     Map<String, StarlarkValue> outputGroups =
         SkylarkType.castMap(value, String.class, StarlarkValue.class, "output_groups");
@@ -196,7 +193,7 @@
 
       builder.addOutputGroup(
           outputGroup,
-          SkylarkRuleConfiguredTargetUtil.convertToOutputGroupValue(loc, outputGroup, objects));
+          SkylarkRuleConfiguredTargetUtil.convertToOutputGroupValue(outputGroup, objects));
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/CommandLineArgsApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/CommandLineArgsApi.java
index 016e969..2e74568 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/CommandLineArgsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/CommandLineArgsApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.ParamType;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
@@ -24,6 +23,7 @@
 import com.google.devtools.build.lib.syntax.Depset;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Sequence;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.syntax.StarlarkValue;
 
 /** Command line args module. */
@@ -193,7 +193,7 @@
                     + "list's length must equal the number of items. Use <code>map_each</code> "
                     + "of <code>add_all</code> or <code>add_joined</code> instead.")
       },
-      useLocation = true)
+      useStarlarkThread = true)
   CommandLineArgsApi addArgument(
       Object argNameOrValue,
       Object value,
@@ -201,7 +201,7 @@
       Object beforeEach,
       Object joinWith,
       Object mapFn,
-      Location loc)
+      StarlarkThread thread)
       throws EvalException;
 
   @SkylarkCallable(
@@ -349,7 +349,7 @@
                     + "items are appended (as happens if <code>values</code> is empty or all of "
                     + "its items are filtered)."),
       },
-      useLocation = true)
+      useStarlarkThread = true)
   CommandLineArgsApi addAll(
       Object argNameOrValue,
       Object values,
@@ -360,7 +360,7 @@
       Boolean uniquify,
       Boolean expandDirectories,
       Object terminateWith,
-      Location loc)
+      StarlarkThread thread)
       throws EvalException;
 
   @SkylarkCallable(
@@ -465,7 +465,7 @@
             defaultValue = "True",
             doc = "Same as for <a href='#add_all.expand_directories'><code>add_all</code></a>.")
       },
-      useLocation = true)
+      useStarlarkThread = true)
   CommandLineArgsApi addJoined(
       Object argNameOrValue,
       Object values,
@@ -476,7 +476,7 @@
       Boolean omitIfEmpty,
       Boolean uniquify,
       Boolean expandDirectories,
-      Location loc)
+      StarlarkThread thread)
       throws EvalException;
 
   @SkylarkCallable(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/DefaultInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/DefaultInfoApi.java
index 2450bfa..393ffc1 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/DefaultInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/DefaultInfoApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.skylarkinterface.Param;
@@ -24,6 +23,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
 import com.google.devtools.build.lib.syntax.Depset;
 import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 
 /** A provider that gives general information about a target's direct and transitive files. */
 @SkylarkModule(
@@ -149,8 +149,8 @@
                       + " should be executed to run the target. By default it is the predeclared"
                       + " output <code>ctx.outputs.executable</code>.")
         },
-        useLocation = true,
-        selfCall = true)
+        selfCall = true,
+        useStarlarkThread = true)
     @SkylarkConstructor(objectType = DefaultInfoApi.class, receiverNameForDoc = "DefaultInfo")
     DefaultInfoApi constructor(
         // TODO(cparsons): Use stricter types when Runfiles.NONE is passed as null.
@@ -159,7 +159,7 @@
         Object dataRunfiles,
         Object defaultRunfiles,
         Object executable,
-        Location loc)
+        StarlarkThread thread)
         throws EvalException;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/OutputGroupInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/OutputGroupInfoApi.java
index 43e4952..26b6f60 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/OutputGroupInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/OutputGroupInfoApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.skylarkinterface.Param;
@@ -55,11 +54,10 @@
                 type = Dict.class,
                 defaultValue = "{}",
                 doc = "Dictionary of arguments."),
-        useLocation = true,
         selfCall = true)
     @SkylarkConstructor(
         objectType = OutputGroupInfoApi.class,
         receiverNameForDoc = "OutputGroupInfo")
-    OutputGroupInfoApi constructor(Dict<?, ?> kwargs, Location loc) throws EvalException;
+    OutputGroupInfoApi constructor(Dict<?, ?> kwargs) throws EvalException;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkActionFactoryApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkActionFactoryApi.java
index acea0a9..ec0bf1f 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkActionFactoryApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkActionFactoryApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.ParamType;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
@@ -72,9 +71,8 @@
             positional = false,
             named = true,
             defaultValue = "None")
-      },
-      useLocation = true)
-  FileApi declareFile(String filename, Object sibling, Location loc) throws EvalException;
+      })
+  FileApi declareFile(String filename, Object sibling) throws EvalException;
 
   @SkylarkCallable(
       name = "declare_directory",
@@ -129,9 +127,8 @@
             positional = false,
             named = true,
             defaultValue = "None")
-      },
-      useLocation = true)
-  FileApi declareSymlink(String filename, Object sibling, Location location) throws EvalException;
+      })
+  FileApi declareSymlink(String filename, Object sibling) throws EvalException;
 
   @SkylarkCallable(
       name = "do_nothing",
@@ -156,9 +153,8 @@
             positional = false,
             defaultValue = "[]",
             doc = "List of the input files of the action."),
-      },
-      useLocation = true)
-  void doNothing(String mnemonic, Object inputs, Location location) throws EvalException;
+      })
+  void doNothing(String mnemonic, Object inputs) throws EvalException;
 
   @SkylarkCallable(
       name = "symlink",
@@ -172,9 +168,8 @@
       parameters = {
         @Param(name = "output", type = FileApi.class, doc = "The output path.", named = true),
         @Param(name = "target", type = String.class, doc = "The target.", named = true),
-      },
-      useLocation = true)
-  void symlink(FileApi output, String targetPath, Location location) throws EvalException;
+      })
+  void symlink(FileApi output, String targetPath) throws EvalException;
 
   @SkylarkCallable(
       name = "write",
@@ -203,10 +198,8 @@
             defaultValue = "False",
             doc = "Whether the output file should be executable.",
             named = true)
-      },
-      useLocation = true)
-  void write(FileApi output, Object content, Boolean isExecutable, Location location)
-      throws EvalException;
+      })
+  void write(FileApi output, Object content, Boolean isExecutable) throws EvalException;
 
   @SkylarkCallable(
       name = "run",
@@ -344,8 +337,7 @@
             doc =
                 "(Experimental) sets the input runfiles metadata; "
                     + "they are typically generated by resolve_command.")
-      },
-      useLocation = true)
+      })
   void run(
       Sequence<?> outputs,
       Object inputs,
@@ -358,8 +350,7 @@
       Boolean useDefaultShellEnv,
       Object envUnchecked,
       Object executionRequirementsUnchecked,
-      Object inputManifestsUnchecked,
-      Location location)
+      Object inputManifestsUnchecked)
       throws EvalException;
 
   @SkylarkCallable(
@@ -515,8 +506,7 @@
                 "(Experimental) sets the input runfiles metadata; "
                     + "they are typically generated by resolve_command.")
       },
-      useStarlarkThread = true,
-      useLocation = true)
+      useStarlarkThread = true)
   void runShell(
       Sequence<?> outputs,
       Object inputs,
@@ -529,7 +519,6 @@
       Object envUnchecked,
       Object executionRequirementsUnchecked,
       Object inputManifestsUnchecked,
-      Location location,
       StarlarkThread thread)
       throws EvalException;
 
@@ -572,14 +561,9 @@
             named = true,
             positional = false,
             doc = "Whether the output file should be executable.")
-      },
-      useLocation = true)
+      })
   void expandTemplate(
-      FileApi template,
-      FileApi output,
-      Dict<?, ?> substitutionsUnchecked,
-      Boolean executable,
-      Location location)
+      FileApi template, FileApi output, Dict<?, ?> substitutionsUnchecked, Boolean executable)
       throws EvalException;
 
   @SkylarkCallable(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkAttrApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkAttrApi.java
index 9719968..24f39a6 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkAttrApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkAttrApi.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.lib.skylarkbuildapi;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.ParamType;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
@@ -177,14 +176,12 @@
             named = true,
             positional = false)
       },
-      useLocation = true,
       useStarlarkThread = true)
   Descriptor intAttribute(
       Integer defaultValue,
       String doc,
       Boolean mandatory,
       Sequence<?> values,
-      Location loc,
       StarlarkThread thread)
       throws EvalException;
 
@@ -222,14 +219,12 @@
             named = true,
             positional = false)
       },
-      useLocation = true,
       useStarlarkThread = true)
   Descriptor stringAttribute(
       String defaultValue,
       String doc,
       Boolean mandatory,
       Sequence<?> values,
-      Location loc,
       StarlarkThread thread)
       throws EvalException;
 
@@ -359,7 +354,6 @@
             positional = false,
             doc = ASPECTS_ARG_DOC),
       },
-      useLocation = true,
       useStarlarkThread = true)
   Descriptor labelAttribute(
       Object defaultValue,
@@ -373,7 +367,6 @@
       Boolean singleFile,
       Object cfg,
       Sequence<?> aspects,
-      Location loc,
       StarlarkThread thread)
       throws EvalException;
 
@@ -415,7 +408,6 @@
             named = true,
             positional = false)
       },
-      useLocation = true,
       useStarlarkThread = true)
   Descriptor stringListAttribute(
       Boolean mandatory,
@@ -423,7 +415,6 @@
       Boolean allowEmpty,
       Sequence<?> defaultValue,
       String doc,
-      Location loc,
       StarlarkThread thread)
       throws EvalException;
 
@@ -465,7 +456,6 @@
             named = true,
             positional = false)
       },
-      useLocation = true,
       useStarlarkThread = true)
   Descriptor intListAttribute(
       Boolean mandatory,
@@ -473,7 +463,6 @@
       Boolean allowEmpty,
       Sequence<?> defaultValue,
       String doc,
-      Location loc,
       StarlarkThread thread)
       throws EvalException;
 
@@ -573,7 +562,6 @@
             positional = false,
             doc = ASPECTS_ARG_DOC),
       },
-      useLocation = true,
       useStarlarkThread = true)
   Descriptor labelListAttribute(
       Boolean allowEmpty,
@@ -587,7 +575,6 @@
       Boolean nonEmpty,
       Object cfg,
       Sequence<?> aspects,
-      Location loc,
       StarlarkThread thread)
       throws EvalException;
 
@@ -689,7 +676,6 @@
             positional = false,
             doc = ASPECTS_ARG_DOC)
       },
-      useLocation = true,
       useStarlarkThread = true)
   Descriptor labelKeyedStringDictAttribute(
       Boolean allowEmpty,
@@ -703,7 +689,6 @@
       Boolean nonEmpty,
       Object cfg,
       Sequence<?> aspects,
-      Location loc,
       StarlarkThread thread)
       throws EvalException;
 
@@ -733,10 +718,9 @@
             positional = false,
             doc = MANDATORY_DOC)
       },
-      useLocation = true,
       useStarlarkThread = true)
   Descriptor boolAttribute(
-      Boolean defaultValue, String doc, Boolean mandatory, Location loc, StarlarkThread thread)
+      Boolean defaultValue, String doc, Boolean mandatory, StarlarkThread thread)
       throws EvalException;
 
   @SkylarkCallable(
@@ -771,10 +755,9 @@
             positional = false,
             doc = MANDATORY_DOC)
       },
-      useLocation = true,
       useStarlarkThread = true)
   Descriptor outputAttribute(
-      Object defaultValue, String doc, Boolean mandatory, Location loc, StarlarkThread thread)
+      Object defaultValue, String doc, Boolean mandatory, StarlarkThread thread)
       throws EvalException;
 
   @SkylarkCallable(
@@ -822,7 +805,6 @@
             positional = false,
             doc = NON_EMPTY_DOC)
       },
-      useLocation = true,
       useStarlarkThread = true)
   Descriptor outputListAttribute(
       Boolean allowEmpty,
@@ -830,7 +812,6 @@
       String doc,
       Boolean mandatory,
       Boolean nonEmpty,
-      Location loc,
       StarlarkThread thread)
       throws EvalException;
 
@@ -875,7 +856,6 @@
             positional = false,
             doc = NON_EMPTY_DOC)
       },
-      useLocation = true,
       useStarlarkThread = true)
   Descriptor stringDictAttribute(
       Boolean allowEmpty,
@@ -883,7 +863,6 @@
       String doc,
       Boolean mandatory,
       Boolean nonEmpty,
-      Location loc,
       StarlarkThread thread)
       throws EvalException;
 
@@ -928,7 +907,6 @@
             positional = false,
             doc = NON_EMPTY_DOC)
       },
-      useLocation = true,
       useStarlarkThread = true)
   Descriptor stringListDictAttribute(
       Boolean allowEmpty,
@@ -936,7 +914,6 @@
       String doc,
       Boolean mandatory,
       Boolean nonEmpty,
-      Location loc,
       StarlarkThread thread)
       throws EvalException;
 
@@ -969,10 +946,9 @@
             doc = MANDATORY_DOC)
       },
       disableWithFlag = FlagIdentifier.INCOMPATIBLE_NO_ATTR_LICENSE,
-      useLocation = true,
       useStarlarkThread = true)
   Descriptor licenseAttribute(
-      Object defaultValue, String doc, Boolean mandatory, Location loc, StarlarkThread thread)
+      Object defaultValue, String doc, Boolean mandatory, StarlarkThread thread)
       throws EvalException;
 
   /** An attribute descriptor. */
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkBuildApiGlobals.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkBuildApiGlobals.java
index 1eccbd2..100211e 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkBuildApiGlobals.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkBuildApiGlobals.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkGlobalLibrary;
@@ -55,8 +54,7 @@
             named = true,
             doc = "The name of the value to obtain from the configuration fragment."),
       },
-      useLocation = true,
       useStarlarkThread = true)
-  LateBoundDefaultApi configurationField(
-      String fragment, String name, Location loc, StarlarkThread thread) throws EvalException;
+  LateBoundDefaultApi configurationField(String fragment, String name, StarlarkThread thread)
+      throws EvalException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkNativeModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkNativeModuleApi.java
index 960ae79..d68e0b3 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkNativeModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkNativeModuleApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
@@ -83,14 +82,12 @@
                     + " result must be non-empty (after the matches of the `exclude` patterns are"
                     + " excluded).")
       },
-      useLocation = true,
       useStarlarkThread = true)
   Sequence<?> glob(
       Sequence<?> include,
       Sequence<?> exclude,
       Integer excludeDirectories,
       Object allowEmpty,
-      Location loc,
       StarlarkThread thread)
       throws EvalException, InterruptedException;
 
@@ -127,9 +124,8 @@
             legacyNamed = true,
             doc = "The name of the target.")
       },
-      useLocation = true,
       useStarlarkThread = true)
-  Object existingRule(String name, Location loc, StarlarkThread thread)
+  Object existingRule(String name, StarlarkThread thread)
       throws EvalException, InterruptedException;
 
   @SkylarkCallable(
@@ -140,9 +136,8 @@
               + " would be returned by <code>existing_rule(name)</code>.<p><i>Note: If possible,"
               + " avoid using this function. It makes BUILD files brittle and order-dependent, and"
               + " it may be expensive especially if called within a loop.</i>",
-      useLocation = true,
       useStarlarkThread = true)
-  Dict<String, Dict<String, Object>> existingRules(Location loc, StarlarkThread thread)
+  Dict<String, Dict<String, Object>> existingRules(StarlarkThread thread)
       throws EvalException, InterruptedException;
 
   @SkylarkCallable(
@@ -174,10 +169,9 @@
             positional = false,
             doc = "Other package groups that are included in this one.")
       },
-      useLocation = true,
       useStarlarkThread = true)
   NoneType packageGroup(
-      String name, Sequence<?> packages, Sequence<?> includes, Location loc, StarlarkThread thread)
+      String name, Sequence<?> packages, Sequence<?> includes, StarlarkThread thread)
       throws EvalException;
 
   @SkylarkCallable(
@@ -212,10 +206,8 @@
             defaultValue = "None",
             doc = "Licenses to be specified.")
       },
-      useLocation = true,
       useStarlarkThread = true)
-  NoneType exportsFiles(
-      Sequence<?> srcs, Object visibility, Object licenses, Location loc, StarlarkThread thread)
+  NoneType exportsFiles(Sequence<?> srcs, Object visibility, Object licenses, StarlarkThread thread)
       throws EvalException;
 
   @SkylarkCallable(
@@ -227,10 +219,8 @@
               + "If the BUILD file calls a function defined in a .bzl file, "
               + "<code>package_name()</code> will match the caller BUILD file package. "
               + "This function is equivalent to the deprecated variable <code>PACKAGE_NAME</code>.",
-      parameters = {},
-      useLocation = true,
       useStarlarkThread = true)
-  String packageName(Location loc, StarlarkThread thread) throws EvalException;
+  String packageName(StarlarkThread thread) throws EvalException;
 
   @SkylarkCallable(
       name = "repository_name",
@@ -241,8 +231,6 @@
               + "<code>@local</code>. In packages in the main repository, it will be set to "
               + "<code>@</code>. This function is equivalent to the deprecated variable "
               + "<code>REPOSITORY_NAME</code>.",
-      parameters = {},
-      useLocation = true,
       useStarlarkThread = true)
-  String repositoryName(Location location, StarlarkThread thread) throws EvalException;
+  String repositoryName(StarlarkThread thread) throws EvalException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleContextApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleContextApi.java
index 8a134cc..eb292c5 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleContextApi.java
@@ -16,7 +16,6 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.TransitiveInfoCollectionApi;
@@ -422,9 +421,8 @@
             },
             defaultValue = "unbound",
             doc = "")
-      },
-      useLocation = true)
-  FileApi newFile(Object var1, Object var2, Object var3, Location loc) throws EvalException;
+      })
+  FileApi newFile(Object var1, Object var2, Object var3) throws EvalException;
 
   @SkylarkCallable(
       name = "experimental_new_directory",
@@ -669,7 +667,6 @@
                     + "they are typically generated by resolve_command.")
       },
       allowReturnNones = true,
-      useLocation = true,
       useStarlarkThread = true)
   NoneType action(
       Sequence<?> outputs,
@@ -684,7 +681,6 @@
       Object envUnchecked,
       Object executionRequirementsUnchecked,
       Object inputManifestsUnchecked,
-      Location loc,
       StarlarkThread thread)
       throws EvalException;
 
@@ -717,9 +713,8 @@
             doc = "List of targets for additional lookup information."),
       },
       allowReturnNones = true,
-      useLocation = true,
       useStarlarkThread = true)
-  String expandLocation(String input, Sequence<?> targets, Location loc, StarlarkThread thread)
+  String expandLocation(String input, Sequence<?> targets, StarlarkThread thread)
       throws EvalException;
 
   @SkylarkCallable(
@@ -742,10 +737,8 @@
             doc = "Whether the output file should be executable (default is False).")
       },
       allowReturnNones = true,
-      useLocation = true,
       useStarlarkThread = true)
-  NoneType fileAction(
-      FileApi output, String content, Boolean executable, Location loc, StarlarkThread thread)
+  NoneType fileAction(FileApi output, String content, Boolean executable, StarlarkThread thread)
       throws EvalException;
 
   @SkylarkCallable(
@@ -775,10 +768,8 @@
             doc = "List of the input files of the action."),
       },
       allowReturnNones = true,
-      useLocation = true,
       useStarlarkThread = true)
-  NoneType emptyAction(String mnemonic, Object inputs, Location loc, StarlarkThread thread)
-      throws EvalException;
+  NoneType emptyAction(String mnemonic, Object inputs, StarlarkThread thread) throws EvalException;
 
   @SkylarkCallable(
       name = "template_action",
@@ -814,14 +805,12 @@
             doc = "Whether the output file should be executable (default is False).")
       },
       allowReturnNones = true,
-      useLocation = true,
       useStarlarkThread = true)
   NoneType templateAction(
       FileApi template,
       FileApi output,
       Dict<?, ?> substitutionsUnchecked,
       Boolean executable,
-      Location loc,
       StarlarkThread thread)
       throws EvalException;
 
@@ -882,16 +871,14 @@
             defaultValue = "{}",
             named = true,
             doc = "The map of symlinks to be added to the runfiles.")
-      },
-      useLocation = true)
+      })
   RunfilesApi runfiles(
       Sequence<?> files,
       Object transitiveFiles,
       Boolean collectData,
       Boolean collectDefault,
       Dict<?, ?> symlinks,
-      Dict<?, ?> rootSymlinks,
-      Location loc)
+      Dict<?, ?> rootSymlinks)
       throws EvalException;
 
   @SkylarkCallable(
@@ -966,7 +953,6 @@
                     + "<a href=\"$BE_ROOT/common-definitions.html#common.tags\">tags</a> "
                     + "for useful keys."),
       },
-      useLocation = true,
       useStarlarkThread = true)
   Tuple<Object> resolveCommand(
       String command,
@@ -976,7 +962,6 @@
       Sequence<?> tools,
       Dict<?, ?> labelDictUnchecked,
       Dict<?, ?> executionRequirementsUnchecked,
-      Location loc,
       StarlarkThread thread)
       throws EvalException;
 
@@ -998,8 +983,6 @@
             named = true,
             positional = false,
             doc = "List of tools (list of targets)."),
-      },
-      useLocation = false,
-      useStarlarkThread = false)
+      })
   Tuple<Object> resolveTools(Sequence<?> tools) throws EvalException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java
index c21396f..3d2d8a8 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.lib.skylarkbuildapi;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.StarlarkConfigApi.BuildSettingApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkinterface.Param;
@@ -85,8 +84,8 @@
             positional = false,
             defaultValue = "None")
       },
-      useLocation = true)
-  ProviderApi provider(String doc, Object fields, Location location) throws EvalException;
+      useStarlarkThread = true)
+  ProviderApi provider(String doc, Object fields, StarlarkThread thread) throws EvalException;
 
   @SkylarkCallable(
       name = "rule",
@@ -330,7 +329,6 @@
                 "If set, points to the configuration transition the rule will "
                     + "apply to its own configuration before analysis.")
       },
-      useLocation = true,
       useStarlarkThread = true)
   BaseFunction rule(
       StarlarkFunction implementation,
@@ -349,7 +347,6 @@
       Object analysisTest,
       Object buildSetting,
       Object cfg,
-      Location loc,
       StarlarkThread thread)
       throws EvalException;
 
@@ -488,8 +485,7 @@
                     + "will propagate through `alpha`, `beta`, and `charlie`. If False, then the "
                     + "aspect will propagate only to `alpha`. </p><p>False by default.</p>")
       },
-      useStarlarkThread = true,
-      useLocation = true)
+      useStarlarkThread = true)
   SkylarkAspectApi aspect(
       StarlarkFunction implementation,
       Sequence<?> attributeAspects,
@@ -501,7 +497,6 @@
       Sequence<?> toolchains,
       String doc,
       Boolean applyToGeneratingRules,
-      Location loc,
       StarlarkThread thread)
       throws EvalException;
 
@@ -533,10 +528,8 @@
                     + "False, a repo-relative label is resolved relative to the file in which the "
                     + "Label() call appears.")
       },
-      useLocation = true,
       useStarlarkThread = true)
   @SkylarkConstructor(objectType = Label.class)
-  Label label(
-      String labelString, Boolean relativeToCallerRepository, Location loc, StarlarkThread thread)
+  Label label(String labelString, Boolean relativeToCallerRepository, StarlarkThread thread)
       throws EvalException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TemplateVariableInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TemplateVariableInfoApi.java
index 2845b19..83057f7 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TemplateVariableInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TemplateVariableInfoApi.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.lib.skylarkbuildapi;
 
 import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.skylarkinterface.Param;
@@ -24,6 +23,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
 import com.google.devtools.build.lib.syntax.Dict;
 import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 
 /** Provides access to make variables from the current fragments. */
 @SkylarkModule(
@@ -62,8 +62,8 @@
           @Param(name = "vars", positional = true, named = true, type = Dict.class),
         },
         selfCall = true,
-        useLocation = true)
-    TemplateVariableInfoApi templateVariableInfo(Dict<?, ?> vars, Location loc)
+        useStarlarkThread = true)
+    TemplateVariableInfoApi templateVariableInfo(Dict<?, ?> vars, StarlarkThread thread)
         throws EvalException;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/WorkspaceGlobalsApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/WorkspaceGlobalsApi.java
index a620a47..736507b 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/WorkspaceGlobalsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/WorkspaceGlobalsApi.java
@@ -15,7 +15,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkGlobalLibrary;
@@ -78,12 +77,10 @@
                     + "\nManaged directories must be excluded from the source tree by listing"
                     + " them (or their parent directories) in the .bazelignore file."),
       },
-      useLocation = true,
       useStarlarkThread = true)
   NoneType workspace(
       String name,
       Dict<?, ?> managedDirectories, // <String, Sequence<String>>
-      Location loc,
       StarlarkThread thread)
       throws EvalException, InterruptedException;
 
@@ -112,10 +109,9 @@
             named = true,
             positional = false)
       },
-      useLocation = true,
       useStarlarkThread = true,
       enableOnlyWithFlag = FlagIdentifier.EXPERIMENTAL_NINJA_ACTIONS)
-  NoneType dontSymlinkDirectoriesInExecroot(Sequence<?> paths, Location loc, StarlarkThread thread)
+  NoneType dontSymlinkDirectoriesInExecroot(Sequence<?> paths, StarlarkThread thread)
       throws EvalException, InterruptedException;
 
   @SkylarkCallable(
@@ -128,10 +124,8 @@
               type = Sequence.class,
               generic1 = String.class,
               doc = "The labels of the platforms to register."),
-      useLocation = true,
       useStarlarkThread = true)
-  NoneType registerExecutionPlatforms(
-      Sequence<?> platformLabels, Location location, StarlarkThread thread)
+  NoneType registerExecutionPlatforms(Sequence<?> platformLabels, StarlarkThread thread)
       throws EvalException, InterruptedException;
 
   @SkylarkCallable(
@@ -146,9 +140,8 @@
               type = Sequence.class,
               generic1 = String.class,
               doc = "The labels of the toolchains to register."),
-      useLocation = true,
       useStarlarkThread = true)
-  NoneType registerToolchains(Sequence<?> toolchainLabels, Location location, StarlarkThread thread)
+  NoneType registerToolchains(Sequence<?> toolchainLabels, StarlarkThread thread)
       throws EvalException, InterruptedException;
 
   @SkylarkCallable(
@@ -175,8 +168,7 @@
             defaultValue = "None",
             doc = "The real label to be aliased")
       },
-      useLocation = true,
       useStarlarkThread = true)
-  NoneType bind(String name, Object actual, Location loc, StarlarkThread thread)
+  NoneType bind(String name, Object actual, StarlarkThread thread)
       throws EvalException, InterruptedException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataProcessingApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataProcessingApi.java
index 19eba87..be67ec0 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataProcessingApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidDataProcessingApi.java
@@ -13,7 +13,6 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skylarkbuildapi.android;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.FileProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
@@ -126,8 +125,6 @@
             named = true,
             doc = "The Android application package to stamp the manifest with."),
       },
-      useLocation = true,
-      useStarlarkThread = true,
       doc =
           "Creates an AndroidResourcesInfoApi from this target's resource dependencies, ignoring"
               + " local resources. Only processing of deps will be done. This method is deprecated"
@@ -140,9 +137,7 @@
       Sequence<?> deps, // <AndroidResourcesInfoT>
       Sequence<?> assets, // <AndroidAssetsInfoT>
       boolean neverlink,
-      String customPackage,
-      Location location,
-      StarlarkThread thread)
+      String customPackage)
       throws InterruptedException, EvalException;
 
   @SkylarkCallable(
@@ -185,17 +180,10 @@
                     + " eventually merged into targets that depend on it. Otherwise, it won't be"
                     + " inherited."),
       },
-      useLocation = true,
-      useStarlarkThread = true,
       doc = "Stamps a manifest with package information.",
       documented = false)
   AndroidManifestInfoT stampAndroidManifest(
-      AndroidDataContextT ctx,
-      Object manifest,
-      Object customPackage,
-      boolean exported,
-      Location location,
-      StarlarkThread thread)
+      AndroidDataContextT ctx, Object manifest, Object customPackage, boolean exported)
       throws InterruptedException, EvalException;
 
   @SkylarkCallable(
@@ -248,8 +236,6 @@
                 "Defaults to False. If passed as True, these assets will not be inherited by"
                     + " targets that depend on this one.")
       },
-      useLocation = true,
-      useStarlarkThread = true,
       doc =
           "Merges this target's assets together with assets inherited from dependencies. Note that,"
               + " by default, actions for validating the merge are created but may not be called."
@@ -261,9 +247,7 @@
       Object assets,
       Object assetsDir,
       Sequence<?> deps, // <AndroidAssetsInfoT>
-      boolean neverlink,
-      Location location,
-      StarlarkThread thread)
+      boolean neverlink)
       throws EvalException, InterruptedException;
 
   @SkylarkCallable(
@@ -320,8 +304,6 @@
                 "Defaults to False. If True, processes data binding expressions in layout"
                     + " resources."),
       },
-      useLocation = true,
-      useStarlarkThread = true,
       doc =
           "Merges this target's resources together with resources inherited from dependencies."
               + " Returns a dict of provider type to actual info, with elements for"
@@ -339,9 +321,7 @@
       Sequence<?> resources, // <TransitiveInfoCollectionT>
       Sequence<?> deps, // <AndroidResourcesInfoT>
       boolean neverlink,
-      boolean enableDataBinding,
-      Location location,
-      StarlarkThread thread)
+      boolean enableDataBinding)
       throws EvalException, InterruptedException;
 
   @SkylarkCallable(
@@ -398,8 +378,6 @@
                 "Defaults to False. If True, processes data binding expressions in layout"
                     + " resources."),
       },
-      useLocation = true,
-      useStarlarkThread = true,
       doc =
           "Merges this target's resources together with resources inherited from dependencies."
               + " Returns a dict of provider type to actual info, with elements for"
@@ -416,9 +394,7 @@
       Sequence<?> resources, // <TransitiveInfoCollectionT>
       Sequence<?> deps, // <AndroidResourcesInfoT>
       boolean neverlink,
-      boolean enableDataBinding,
-      Location location,
-      StarlarkThread thread)
+      boolean enableDataBinding)
       throws EvalException, InterruptedException;
 
   @SkylarkCallable(
@@ -639,8 +615,6 @@
             named = true,
             doc = "A list of file extensions to leave uncompressed in the resource apk.")
       },
-      useLocation = true,
-      useStarlarkThread = true,
       doc =
           "Processes resources, assets, and manifests for android_local_test and returns a dict"
               + " from provider type to the appropriate provider.",
@@ -655,9 +629,7 @@
       String aaptVersionString,
       Dict<?, ?> manifestValues, // <String, String>
       Sequence<?> deps, // <TransitiveInfoCollectionT>
-      Sequence<?> noCompressExtensions, // <String>
-      Location location,
-      StarlarkThread thread)
+      Sequence<?> noCompressExtensions) // <String>
       throws InterruptedException, EvalException;
 
   @SkylarkCallable(
@@ -711,8 +683,6 @@
                 "A list of file extension to leave uncompressed in apk. Templates must be"
                     + " expanded before passing this value in."),
       },
-      useLocation = true,
-      useStarlarkThread = true,
       doc =
           "Returns a wrapper object containing various settings shared across multiple methods for"
               + " processing binary data.",
@@ -722,9 +692,7 @@
       Object shrinkResources,
       Sequence<?> resourceConfigurationFilters, // <String>
       Sequence<?> densities, // <String>
-      Sequence<?> noCompressExtensions, // <String>
-      Location location,
-      StarlarkThread thread)
+      Sequence<?> noCompressExtensions) // <String>
       throws EvalException;
 
   @SkylarkCallable(
@@ -843,8 +811,6 @@
                 "Defaults to False. If True, processes data binding expressions in layout"
                     + " resources."),
       },
-      useLocation = true,
-      useStarlarkThread = true,
       doc =
           "Processes resources, assets, and manifests for android_binary and returns the"
               + " appropriate providers.",
@@ -861,9 +827,7 @@
       String manifestMerger,
       Object maybeSettings,
       boolean crunchPng,
-      boolean dataBindingEnabled,
-      Location location,
-      StarlarkThread thread)
+      boolean dataBindingEnabled)
       throws InterruptedException, EvalException;
 
   @SkylarkCallable(
@@ -934,8 +898,6 @@
                 "Additional proguard specs that should be added for top-level targets. This  value"
                     + " is controlled by Java configuration.")
       },
-      useLocation = true,
-      useStarlarkThread = true,
       doc =
           "Possibly shrinks the data APK by removing resources that were marked as unused during"
               + " proguarding.",
@@ -948,9 +910,7 @@
       Object maybeSettings,
       Sequence<?> deps, // <TransitiveInfoCollectionT>
       Sequence<?> localProguardSpecs, // <TransitiveInfoCollectionT>
-      Sequence<?> extraProguardSpecs, // <TransitiveInfoCollectionT>
-      Location location,
-      StarlarkThread thread)
+      Sequence<?> extraProguardSpecs) // <TransitiveInfoCollectionT>
       throws EvalException, InterruptedException;
 
   @SkylarkCallable(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/ApkInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/ApkInfoApi.java
index 152dcfa..1eef012 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/ApkInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/ApkInfoApi.java
@@ -13,7 +13,6 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skylarkbuildapi.android;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
@@ -85,8 +84,7 @@
         // This is left undocumented as it throws a "not-implemented in Skylark" error when invoked.
         documented = false,
         extraKeywords = @Param(name = "kwargs"),
-        useLocation = true,
         selfCall = true)
-    ApkInfoApi<?> createInfo(Dict<String, Object> kwargs, Location loc) throws EvalException;
+    ApkInfoApi<?> createInfo(Dict<String, Object> kwargs) throws EvalException;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/config/ConfigGlobalLibraryApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/config/ConfigGlobalLibraryApi.java
index 111d662..5fc9b28 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/config/ConfigGlobalLibraryApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/config/ConfigGlobalLibraryApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.config;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkConstructor;
@@ -97,14 +96,12 @@
                 "List of build settings that can be written by this transition. This must be "
                     + "a superset of the key set of the dictionary returned by this transition."),
       },
-      useLocation = true,
       useStarlarkThread = true)
   @SkylarkConstructor(objectType = ConfigurationTransitionApi.class)
   ConfigurationTransitionApi transition(
       BaseFunction implementation,
       Sequence<?> inputs, // <String> expected
       Sequence<?> outputs, // <String> expected
-      Location location,
       StarlarkThread thread)
       throws EvalException;
 
@@ -131,9 +128,9 @@
                     + "are unchanged. Use this to declare specific configuration settings that "
                     + "an analysis test requires to be set in order to pass."),
       },
-      useLocation = true)
+      useStarlarkThread = true)
   ConfigurationTransitionApi analysisTestTransition(
       Dict<?, ?> changedSettings, // <String, String> expected
-      Location location)
+      StarlarkThread thread)
       throws EvalException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/core/StructApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/core/StructApi.java
index 1bc6aac..d0e6ae8 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/core/StructApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/core/StructApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.core;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkConstructor;
@@ -22,6 +21,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
 import com.google.devtools.build.lib.syntax.Dict;
 import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.syntax.StarlarkValue;
 
 /** Interface for the "struct" object in the build API. */
@@ -62,9 +62,8 @@
               + "#   key: 2\n"
               + "#   value: 1\n"
               + "# }\n"
-              + "</pre>",
-      useLocation = true)
-  String toProto(Location loc) throws EvalException;
+              + "</pre>")
+  String toProto() throws EvalException;
 
   @SkylarkCallable(
       name = "to_json",
@@ -83,9 +82,8 @@
               + "struct(key=[struct(inner_key=1), struct(inner_key=2)]).to_json()\n"
               + "# {\"key\":[{\"inner_key\":1},{\"inner_key\":2}]}\n\n"
               + "struct(key=struct(inner_key=struct(inner_inner_key='text'))).to_json()\n"
-              + "# {\"key\":{\"inner_key\":{\"inner_inner_key\":\"text\"}}}\n</pre>",
-      useLocation = true)
-  String toJson(Location loc) throws EvalException;
+              + "# {\"key\":{\"inner_key\":{\"inner_inner_key\":\"text\"}}}\n</pre>")
+  String toJson() throws EvalException;
 
   /** Callable Provider for new struct objects. */
   @SkylarkModule(name = "Provider", documented = false, doc = "")
@@ -104,9 +102,9 @@
                 type = Dict.class,
                 defaultValue = "{}",
                 doc = "Dictionary of arguments."),
-        useLocation = true,
+        useStarlarkThread = true,
         selfCall = true)
     @SkylarkConstructor(objectType = StructApi.class, receiverNameForDoc = "struct")
-    StructApi createStruct(Dict<?, ?> kwargs, Location loc) throws EvalException;
+    StructApi createStruct(Dict<String, Object> kwargs, StarlarkThread thread) throws EvalException;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java
index b213f58..30f697e 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.cpp;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkActionFactoryApi;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
@@ -70,7 +69,6 @@
           "Should be used for C++ compilation. Returns tuple of "
               + "(<code>CompilationContext</code>, <code>CcCompilationOutputs</code>).",
       useStarlarkThread = true,
-      useLocation = true,
       parameters = {
         @Param(
             name = "actions",
@@ -237,7 +235,6 @@
       boolean disallowPicOutputs,
       boolean disallowNopicOutputs,
       Sequence<?> additionalInputs, // <FileT> expected
-      Location location,
       StarlarkThread thread)
       throws EvalException, InterruptedException;
 
@@ -245,7 +242,6 @@
       name = "link",
       doc = "Should be used for C++ transitive linking.",
       useStarlarkThread = true,
-      useLocation = true,
       parameters = {
         @Param(
             name = "actions",
@@ -349,14 +345,12 @@
       boolean linkDepsStatically,
       Sequence<?> additionalInputs, // <FileT> expected
       Object grepIncludes,
-      Location location,
       StarlarkThread thread)
       throws InterruptedException, EvalException;
 
   @SkylarkCallable(
       name = "create_compilation_outputs",
       doc = "Create compilation outputs object.",
-      useLocation = true,
       parameters = {
         @Param(
             name = "objects",
@@ -376,7 +370,7 @@
             allowedTypes = {@ParamType(type = Depset.class), @ParamType(type = NoneType.class)}),
       })
   CompilationOutputsT createCompilationOutputsFromSkylark(
-      Object objectsObject, Object picObjectsObject, Location location) throws EvalException;
+      Object objectsObject, Object picObjectsObject) throws EvalException;
 
   @SkylarkCallable(
       name = "merge_compilation_outputs",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcCompilationOutputsApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcCompilationOutputsApi.java
index 1248dd4..3a80faf 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcCompilationOutputsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcCompilationOutputsApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.cpp;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
@@ -38,13 +37,11 @@
       name = "object_files",
       doc = "Do not use. Use eiher 'objects' or 'pic_objects'.",
       useStarlarkThread = true,
-      useLocation = true,
       parameters = {
         @Param(name = "use_pic", doc = "use_pic", positional = false, named = true),
       })
   @Deprecated
-  Sequence<FileT> getSkylarkObjectFiles(boolean usePic, Location location, StarlarkThread thread)
-      throws EvalException;
+  Sequence<FileT> getSkylarkObjectFiles(boolean usePic, StarlarkThread thread) throws EvalException;
 
   @SkylarkCallable(name = "objects", documented = false, structField = true)
   Sequence<FileT> getSkylarkObjects() throws EvalException;
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcInfoApi.java
index 7e5a2c3..c24fc1c 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcInfoApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.cpp;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.skylarkinterface.Param;
@@ -25,7 +24,6 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.NoneType;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 
 /** Wrapper for every C++ compilation and linking provider. */
 @SkylarkModule(
@@ -63,8 +61,6 @@
     @SkylarkCallable(
         name = NAME,
         doc = "The <code>CcInfo</code> constructor.",
-        useLocation = true,
-        useStarlarkThread = true,
         parameters = {
           @Param(
               name = "compilation_context",
@@ -91,8 +87,6 @@
         },
         selfCall = true)
     @SkylarkConstructor(objectType = CcInfoApi.class, receiverNameForDoc = NAME)
-    CcInfoApi createInfo(
-        Object ccCompilationContext, Object ccLinkingInfo, Location location, StarlarkThread thread)
-        throws EvalException;
+    CcInfoApi createInfo(Object ccCompilationContext, Object ccLinkingInfo) throws EvalException;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
index abab54f..475d488 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.lib.skylarkbuildapi.cpp;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkActionFactoryApi;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
@@ -507,7 +506,6 @@
   @SkylarkCallable(
       name = "create_library_to_link",
       doc = "Creates <code>LibraryToLink</code>",
-      useLocation = true,
       useStarlarkThread = true,
       parameters = {
         @Param(
@@ -598,14 +596,12 @@
       boolean alwayslink,
       String dynamicLibraryPath,
       String interfaceLibraryPath,
-      Location location,
       StarlarkThread thread)
       throws EvalException, InterruptedException;
 
   @SkylarkCallable(
       name = "create_linker_input",
       doc = "Creates a <code>LinkingContext</code>.",
-      useLocation = true,
       useStarlarkThread = true,
       enableOnlyWithFlag = FlagIdentifier.EXPERIMENTAL_CC_SHARED_LIBRARY,
       parameters = {
@@ -645,14 +641,12 @@
       Object librariesToLinkObject,
       Object userLinkFlagsObject,
       Object nonCodeInputs,
-      Location location,
       StarlarkThread thread)
       throws EvalException, InterruptedException;
 
   @SkylarkCallable(
       name = "create_linking_context",
       doc = "Creates a <code>LinkingContext</code>.",
-      useLocation = true,
       useStarlarkThread = true,
       parameters = {
         @Param(
@@ -693,7 +687,6 @@
       Object librariesToLinkObject,
       Object userLinkFlagsObject,
       Object nonCodeInputs, // <FileT> expected
-      Location location,
       StarlarkThread thread)
       throws EvalException, InterruptedException;
 
@@ -985,7 +978,6 @@
           "Should be used for creating library rules that can propagate information downstream in"
               + " order to be linked later by a top level rule that does transitive linking to"
               + " create an executable or dynamic library.",
-      useLocation = true,
       useStarlarkThread = true,
       parameters = {
         @Param(
@@ -1093,7 +1085,6 @@
       boolean disallowStaticLibraries,
       boolean disallowDynamicLibraries,
       Object grepIncludes,
-      Location location,
       StarlarkThread thread)
       throws InterruptedException, EvalException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCommonApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCommonApi.java
index b4189e9..0e95078 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCommonApi.java
@@ -16,7 +16,6 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkActionFactoryApi;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
@@ -214,7 +213,6 @@
             type = Boolean.class,
             defaultValue = "False")
       },
-      useLocation = true,
       useStarlarkThread = true)
   JavaInfoT createJavaCompileAction(
       SkylarkRuleContextT skylarkRuleContext,
@@ -236,7 +234,6 @@
       Sequence<?> sourcepathEntries, // <FileT> expected.
       Sequence<?> resources, // <FileT> expected.
       Boolean neverlink,
-      Location loc,
       StarlarkThread thread)
       throws EvalException, InterruptedException;
 
@@ -278,14 +275,9 @@
             type = Object.class,
             allowedTypes = {@ParamType(type = JavaToolchainSkylarkApiProviderApi.class)},
             doc = "A JavaToolchainInfo to used to find the ijar tool."),
-      },
-      useLocation = true)
+      })
   FileApi runIjar(
-      SkylarkActionFactoryT actions,
-      FileT jar,
-      Object targetLabel,
-      JavaToolchainT javaToolchain,
-      Location location)
+      SkylarkActionFactoryT actions, FileT jar, Object targetLabel, JavaToolchainT javaToolchain)
       throws EvalException;
 
   @SkylarkCallable(
@@ -326,14 +318,9 @@
             type = Object.class,
             allowedTypes = {@ParamType(type = JavaToolchainSkylarkApiProviderApi.class)},
             doc = "A JavaToolchainInfo to used to find the stamp_jar tool."),
-      },
-      useLocation = true)
+      })
   FileApi stampJar(
-      SkylarkActionFactoryT actions,
-      FileT jar,
-      Label targetLabel,
-      JavaToolchainT javaToolchain,
-      Location location)
+      SkylarkActionFactoryT actions, FileT jar, Label targetLabel, JavaToolchainT javaToolchain)
       throws EvalException;
 
   @SkylarkCallable(
@@ -386,16 +373,14 @@
             allowedTypes = {@ParamType(type = JavaRuntimeInfoApi.class)},
             doc = "A JavaRuntimeInfo to be used for packing sources."),
       },
-      allowReturnNones = true,
-      useLocation = true)
+      allowReturnNones = true)
   FileApi packSources(
       SkylarkActionFactoryT actions,
       FileT outputJar,
       Sequence<?> sourceFiles, // <FileT> expected.
       Sequence<?> sourceJars, // <FileT> expected.
       JavaToolchainT javaToolchain,
-      JavaRuntimeT hostJavabase,
-      Location location)
+      JavaRuntimeT hostJavabase)
       throws EvalException;
 
   @SkylarkCallable(
@@ -412,12 +397,10 @@
             doc =
                 "A JavaToolchainInfo to be used for retrieving the ijar "
                     + "tool. Only set when use_ijar is True."),
-      },
-      useLocation = true)
+      })
   // TODO(b/78512644): migrate callers to passing explicit javacopts or using custom toolchains, and
   // delete
-  ImmutableList<String> getDefaultJavacOpts(JavaToolchainT javaToolchain, Location loc)
-      throws EvalException;
+  ImmutableList<String> getDefaultJavacOpts(JavaToolchainT javaToolchain) throws EvalException;
 
   @SkylarkCallable(
       name = "merge",
@@ -576,8 +559,6 @@
             type = JavaToolchainSkylarkApiProviderApi.class,
             doc = "The toolchain."),
       },
-      useLocation = true,
       enableOnlyWithFlag = FlagIdentifier.EXPERIMENTAL_GOOGLE_LEGACY_API)
-  Label getJavaToolchainLabel(JavaToolchainSkylarkApiProviderApi toolchain, Location location)
-      throws EvalException;
+  Label getJavaToolchainLabel(JavaToolchainSkylarkApiProviderApi toolchain) throws EvalException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaInfoApi.java
index 271cb71..069dec6 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaInfoApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.java;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
@@ -236,7 +235,6 @@
                       + " tools can use this information for more efficient processing."),
         },
         selfCall = true,
-        useLocation = true,
         useStarlarkThread = true)
     @SkylarkConstructor(objectType = JavaInfoApi.class, receiverNameForDoc = "JavaInfo")
     JavaInfoApi<?> javaInfo(
@@ -248,7 +246,6 @@
         Sequence<?> runtimeDeps,
         Sequence<?> exports,
         Object jdepsApi,
-        Location loc,
         StarlarkThread thread)
         throws EvalException;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/PlatformInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/PlatformInfoApi.java
index 08a4944..c188bf8 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/PlatformInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/PlatformInfoApi.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.lib.skylarkbuildapi.platform;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.skylarkinterface.Param;
@@ -27,6 +26,7 @@
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Sequence;
 import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.Map;
 
 /** Info object representing data about a specific platform. */
@@ -120,7 +120,7 @@
               doc = "The exec properties for the platform.")
         },
         selfCall = true,
-        useLocation = true,
+        useStarlarkThread = true,
         enableOnlyWithFlag = FlagIdentifier.EXPERIMENTAL_PLATFORM_API)
     @SkylarkConstructor(objectType = PlatformInfoApi.class, receiverNameForDoc = "PlatformInfo")
     PlatformInfoT platformInfo(
@@ -128,7 +128,7 @@
         Object parent,
         Sequence<?> constraintValues,
         Object execProperties,
-        Location location)
+        StarlarkThread thread)
         throws EvalException;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/ToolchainInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/ToolchainInfoApi.java
index b953eb5..b8e5be3 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/ToolchainInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/ToolchainInfoApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.platform;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.skylarkinterface.Param;
@@ -23,6 +22,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
 import com.google.devtools.build.lib.syntax.Dict;
 import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 
 /** Info object representing data about a specific toolchain. */
 @SkylarkModule(
@@ -44,7 +44,8 @@
         documented = false,
         extraKeywords = @Param(name = "kwargs", doc = "Dictionary of additional entries."),
         selfCall = true,
-        useLocation = true)
-    ToolchainInfoApi toolchainInfo(Dict<String, Object> kwargs, Location loc) throws EvalException;
+        useStarlarkThread = true)
+    ToolchainInfoApi toolchainInfo(Dict<String, Object> kwargs, StarlarkThread thread)
+        throws EvalException;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python/PyInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python/PyInfoApi.java
index 11b051f..d5a9c55 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python/PyInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python/PyInfoApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.python;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkinterface.Param;
@@ -24,6 +23,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
 import com.google.devtools.build.lib.syntax.Depset;
 import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.syntax.StarlarkValue;
 
 /** Provider instance for the Python rules. */
@@ -122,7 +122,7 @@
               doc = "The value for the new object's <code>has_py3_only_sources</code> field.")
         },
         selfCall = true,
-        useLocation = true)
+        useStarlarkThread = true)
     @SkylarkConstructor(objectType = PyInfoApi.class, receiverNameForDoc = "PyInfo")
     PyInfoApi<?> constructor(
         Depset transitiveSources,
@@ -130,7 +130,7 @@
         Object importsUncast,
         boolean hasPy2OnlySources,
         boolean hasPy3OnlySources,
-        Location loc)
+        StarlarkThread thread)
         throws EvalException;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python/PyRuntimeInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python/PyRuntimeInfoApi.java
index 6235a2a..f053951 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python/PyRuntimeInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python/PyRuntimeInfoApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.python;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkinterface.Param;
@@ -24,6 +23,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
 import com.google.devtools.build.lib.syntax.Depset;
 import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.syntax.StarlarkValue;
 import javax.annotation.Nullable;
 
@@ -134,15 +134,15 @@
               named = true,
               doc = "The value for the new object's <code>python_version</code> field."),
         },
-        selfCall = true,
-        useLocation = true)
+        useStarlarkThread = true,
+        selfCall = true)
     @SkylarkConstructor(objectType = PyRuntimeInfoApi.class, receiverNameForDoc = "PyRuntimeInfo")
     PyRuntimeInfoApi<?> constructor(
         Object interpreterPathUncast,
         Object interpreterUncast,
         Object filesUncast,
         String pythonVersion,
-        Location loc)
+        StarlarkThread thread)
         throws EvalException;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/RepositoryModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/RepositoryModuleApi.java
index e9119e7..a5203f5 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/RepositoryModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/RepositoryModuleApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.repository;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkGlobalLibrary;
@@ -108,7 +107,6 @@
             named = true,
             positional = false)
       },
-      useLocation = true,
       useStarlarkThread = true)
   BaseFunction repositoryRule(
       StarlarkFunction implementation,
@@ -118,7 +116,6 @@
       Boolean configure,
       Boolean remotable,
       String doc,
-      Location loc,
       StarlarkThread thread)
       throws EvalException;
 
@@ -128,8 +125,6 @@
           "When --incompatible_use_cc_configure_from_rules_cc is set to true, Bazel will "
               + "fail the build. Please see https://github.com/bazelbuild/bazel/issues/10134 for "
               + "details and migration instructions.",
-      useLocation = true,
       useStarlarkThread = true)
-  void failWithIncompatibleUseCcConfigureFromRulesCc(Location location, StarlarkThread thread)
-      throws EvalException;
+  void failWithIncompatibleUseCcConfigureFromRulesCc(StarlarkThread thread) throws EvalException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkRepositoryContextApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkRepositoryContextApi.java
index 510d377..57fcdfc 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkRepositoryContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/SkylarkRepositoryContextApi.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.lib.skylarkbuildapi.repository;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.ParamType;
@@ -25,6 +24,7 @@
 import com.google.devtools.build.lib.syntax.Dict;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Sequence;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.syntax.StarlarkValue;
 
 /** Skylark API for the repository_rule's context. */
@@ -88,7 +88,7 @@
   @SkylarkCallable(
       name = "symlink",
       doc = "Creates a symlink on the filesystem.",
-      useLocation = true,
+      useStarlarkThread = true,
       parameters = {
         @Param(
             name = "from",
@@ -107,13 +107,13 @@
             },
             doc = "path of the symlink to create, relative to the repository directory."),
       })
-  void symlink(Object from, Object to, Location location)
+  void symlink(Object from, Object to, StarlarkThread thread)
       throws RepositoryFunctionExceptionT, EvalException, InterruptedException;
 
   @SkylarkCallable(
       name = "file",
       doc = "Generates a file in the repository directory with the provided content.",
-      useLocation = true,
+      useStarlarkThread = true,
       parameters = {
         @Param(
             name = "path",
@@ -145,7 +145,7 @@
                     + " the default and remove this parameter."),
       })
   void createFile(
-      Object path, String content, Boolean executable, Boolean legacyUtf8, Location location)
+      Object path, String content, Boolean executable, Boolean legacyUtf8, StarlarkThread thread)
       throws RepositoryFunctionExceptionT, EvalException, InterruptedException;
 
   @SkylarkCallable(
@@ -156,7 +156,7 @@
               + "the corresponding value. The result is written in <code>path</code>. An optional"
               + "<code>executable</code> argument (default to true) can be set to turn on or off"
               + "the executable bit.",
-      useLocation = true,
+      useStarlarkThread = true,
       parameters = {
         @Param(
             name = "path",
@@ -192,13 +192,13 @@
       Object template,
       Dict<?, ?> substitutions, // <String, String> expected
       Boolean executable,
-      Location location)
+      StarlarkThread thread)
       throws RepositoryFunctionExceptionT, EvalException, InterruptedException;
 
   @SkylarkCallable(
       name = "read",
       doc = "Reads the content of a file on the filesystem.",
-      useLocation = true,
+      useStarlarkThread = true,
       parameters = {
         @Param(
             name = "path",
@@ -209,7 +209,7 @@
             },
             doc = "path of the file to read from."),
       })
-  String readFile(Object path, Location location)
+  String readFile(Object path, StarlarkThread thread)
       throws RepositoryFunctionExceptionT, EvalException, InterruptedException;
 
   @SkylarkCallable(
@@ -226,7 +226,7 @@
               + " returns an <code>exec_result</code> structure containing the output of the"
               + " command. The <code>environment</code> map can be used to override some"
               + " environment variables to be passed to the process.",
-      useLocation = true,
+      useStarlarkThread = true,
       parameters = {
         @Param(
             name = "arguments",
@@ -267,7 +267,7 @@
       Dict<?, ?> environment, // <String, String> expected
       boolean quiet,
       String workingDirectory,
-      Location location)
+      StarlarkThread thread)
       throws EvalException, RepositoryFunctionExceptionT, InterruptedException;
 
   @SkylarkCallable(
@@ -275,7 +275,7 @@
       doc =
           "Deletes a file or a directory. Returns a bool, indicating whether the file or directory"
               + " was actually deleted by this call.",
-      useLocation = true,
+      useStarlarkThread = true,
       parameters = {
         @Param(
             name = "path",
@@ -287,7 +287,7 @@
                 "Path of the file to delete, relative to the repository directory, or absolute."
                     + " Can be a path or a string."),
       })
-  boolean delete(Object path, Location location)
+  boolean delete(Object path, StarlarkThread thread)
       throws EvalException, RepositoryFunctionExceptionT, InterruptedException;
 
   @SkylarkCallable(
@@ -299,7 +299,7 @@
               + "unified diff format</a> file. "
               + "The Bazel-native patch implementation doesn't support fuzz match and binary patch "
               + "like the patch command line tool.",
-      useLocation = true,
+      useStarlarkThread = true,
       parameters = {
         @Param(
             name = "patch_file",
@@ -318,7 +318,7 @@
             defaultValue = "0",
             doc = "strip the specified number of leading components from file names."),
       })
-  void patch(Object patchFile, Integer strip, Location location)
+  void patch(Object patchFile, Integer strip, StarlarkThread thread)
       throws EvalException, RepositoryFunctionExceptionT, InterruptedException;
 
   @SkylarkCallable(
@@ -327,7 +327,7 @@
           "Returns the path of the corresponding program or None "
               + "if there is no such program in the path.",
       allowReturnNones = true,
-      useLocation = true,
+      useStarlarkThread = true,
       parameters = {
         @Param(
             name = "program",
@@ -335,7 +335,7 @@
             named = false,
             doc = "Program to find in the path."),
       })
-  RepositoryPathApi<?> which(String program, Location location) throws EvalException;
+  RepositoryPathApi<?> which(String program, StarlarkThread thread) throws EvalException;
 
   @SkylarkCallable(
       name = "download",
@@ -343,7 +343,7 @@
           "Downloads a file to the output path for the provided url and returns a struct"
               + " containing a hash of the file with the fields <code>sha256</code> and"
               + " <code>integrity</code>.",
-      useLocation = true,
+      useStarlarkThread = true,
       parameters = {
         @Param(
             name = "url",
@@ -424,13 +424,13 @@
       String canonicalId,
       Dict<?, ?> auth, // <String, Dict<?, ?>> expected
       String integrity,
-      Location location)
+      StarlarkThread thread)
       throws RepositoryFunctionExceptionT, EvalException, InterruptedException;
 
   @SkylarkCallable(
       name = "extract",
       doc = "Extract an archive to the repository directory.",
-      useLocation = true,
+      useStarlarkThread = true,
       parameters = {
         @Param(
             name = "archive",
@@ -467,7 +467,7 @@
                     + " <code>build_file</code>, this field can be used to strip it from extracted"
                     + " files."),
       })
-  void extract(Object archive, Object output, String stripPrefix, Location location)
+  void extract(Object archive, Object output, String stripPrefix, StarlarkThread thread)
       throws RepositoryFunctionExceptionT, InterruptedException, EvalException;
 
   @SkylarkCallable(
@@ -476,7 +476,7 @@
           "Downloads a file to the output path for the provided url, extracts it, and returns"
               + " a struct containing a hash of the downloaded file with the fields"
               + " <code>sha256</code> and <code>integrity</code>.",
-      useLocation = true,
+      useStarlarkThread = true,
       parameters = {
         @Param(
             name = "url",
@@ -580,6 +580,6 @@
       String canonicalId,
       Dict<?, ?> auth, // <String, Dict<?, ?>> expected
       String integrity,
-      Location location)
+      StarlarkThread thread)
       throws RepositoryFunctionExceptionT, InterruptedException, EvalException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/test/CoverageCommonApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/test/CoverageCommonApi.java
index bd605d6..d595eb8 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/test/CoverageCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/test/CoverageCommonApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.test;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
 import com.google.devtools.build.lib.skylarkbuildapi.platform.ConstraintValueInfoApi;
 import com.google.devtools.build.lib.skylarkinterface.Param;
@@ -75,13 +74,11 @@
             noneable = true,
             defaultValue = "None",
             type = Sequence.class),
-      },
-      useLocation = true)
+      })
   InstrumentedFilesInfoApi instrumentedFilesInfo(
       RuleContextT skylarkRuleContext,
       Sequence<?> sourceAttributes, // <String> expected
       Sequence<?> dependencyAttributes, // <String> expected
-      Object extensions,
-      Location location)
+      Object extensions)
       throws EvalException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkCallable.java b/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkCallable.java
index 2b7a08e..af2cf2f 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkCallable.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkinterface/SkylarkCallable.java
@@ -56,7 +56,6 @@
  *             {@code extraPositionals};
  *         <li>a {@code Dict<String, Object>} of extra keyword arguments ({@code **kwargs}), if
  *             {@code extraKeywords};
- *         <li>a {@code Location}, if {@code useLocation};
  *         <li>a {@code StarlarkThread}, if {@code useStarlarkThread};
  *         <li>a {@code StarlarkSemantics}, if {@code useStarlarkSemantics}.
  *       </ol>
@@ -171,15 +170,6 @@
   boolean allowReturnNones() default false;
 
   /**
-   * If true, the location of the call site will be passed as an argument of the annotated function.
-   * (Thus, the annotated method signature must contain Location as a parameter. See the
-   * interface-level javadoc for details.)
-   *
-   * <p>This is incompatible with structField=true. If structField is true, this must be false.
-   */
-  boolean useLocation() default false;
-
-  /**
    * If true, the StarlarkThread will be passed as an argument of the annotated function. (Thus, the
    * annotated method signature must contain StarlarkThread as a parameter. See the interface-level
    * javadoc for details.)
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessor.java b/src/main/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessor.java
index 78464b3..234ec2e 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessor.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessor.java
@@ -215,13 +215,6 @@
           "a SkylarkCallable-annotated method with structField=true may not also specify"
               + " useStarlarkThread");
     }
-    if (annot.useLocation()) {
-      errorf(
-          method,
-          "a SkylarkCallable-annotated method with structField=true may not also specify"
-              + " useLocation");
-    }
-
     if (!annot.extraPositionals().name().isEmpty()) {
       errorf(
           method,
@@ -510,18 +503,6 @@
       }
     }
 
-    if (annot.useLocation()) {
-      VariableElement param = params.get(index++);
-      TypeMirror locationType = getType("com.google.devtools.build.lib.events.Location");
-      if (!types.isSameType(locationType, param.asType())) {
-        errorf(
-            param,
-            "for useLocation special parameter '%s', got type %s, want Location",
-            param.getSimpleName(),
-            param.asType());
-      }
-    }
-
     if (annot.useStarlarkThread()) {
       VariableElement param = params.get(index++);
       TypeMirror threadType = getType("com.google.devtools.build.lib.syntax.StarlarkThread");
@@ -563,7 +544,6 @@
     int n = 0;
     n += annot.extraPositionals().name().isEmpty() ? 0 : 1;
     n += annot.extraKeywords().name().isEmpty() ? 0 : 1;
-    n += annot.useLocation() ? 1 : 0;
     n += annot.useStarlarkThread() ? 1 : 0;
     n += annot.useStarlarkSemantics() ? 1 : 0;
     return n;
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BuiltinCallable.java b/src/main/java/com/google/devtools/build/lib/syntax/BuiltinCallable.java
index a95d20f..2692e0d 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BuiltinCallable.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BuiltinCallable.java
@@ -16,7 +16,6 @@
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.util.SpellChecker;
 import java.util.ArrayList;
@@ -63,14 +62,14 @@
   }
 
   @Override
-  public Object fastcall(StarlarkThread thread, Location loc, Object[] positional, Object[] named)
+  public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named)
       throws EvalException, InterruptedException {
     MethodDescriptor desc =
         this.desc != null ? this.desc : getMethodDescriptor(thread.getSemantics());
     Preconditions.checkArgument(
         !desc.isStructField(),
         "struct field methods should be handled by DotExpression separately");
-    Object[] vector = getArgumentVector(thread, loc, desc, positional, named);
+    Object[] vector = getArgumentVector(thread, desc, positional, named);
     return desc.call(
         obj instanceof String ? StringModule.INSTANCE : obj, vector, thread.mutability());
   }
@@ -120,7 +119,6 @@
    */
   private Object[] getArgumentVector(
       StarlarkThread thread,
-      Location loc,
       MethodDescriptor desc, // intentionally shadows this.desc
       Object[] positional,
       Object[] named)
@@ -148,9 +146,6 @@
     if (desc.acceptsExtraKwargs()) {
       n++;
     }
-    if (desc.isUseLocation()) {
-      n++;
-    }
     if (desc.isUseStarlarkThread()) {
       n++;
     }
@@ -319,9 +314,6 @@
     if (desc.acceptsExtraKwargs()) {
       vector[i++] = Dict.wrap(thread.mutability(), kwargs);
     }
-    if (desc.isUseLocation()) {
-      vector[i++] = loc;
-    }
     if (desc.isUseStarlarkThread()) {
       vector[i++] = thread;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Eval.java b/src/main/java/com/google/devtools/build/lib/syntax/Eval.java
index 90f8312..eb05aa0 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Eval.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Eval.java
@@ -526,7 +526,7 @@
             }
             return result;
           } catch (EvalException ex) {
-            throw ex.ensureLocation(dot.getStartLocation());
+            throw ex.ensureLocation(dot.getStartLocation()); // TODO(adonovan): use dot token
           }
         }
 
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/MethodDescriptor.java b/src/main/java/com/google/devtools/build/lib/syntax/MethodDescriptor.java
index b8997b4..82399b9 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/MethodDescriptor.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/MethodDescriptor.java
@@ -42,7 +42,6 @@
   private final boolean extraKeywords;
   private final boolean selfCall;
   private final boolean allowReturnNones;
-  private final boolean useLocation;
   private final boolean useStarlarkThread;
   private final boolean useStarlarkSemantics;
 
@@ -58,7 +57,6 @@
       boolean extraKeywords,
       boolean selfCall,
       boolean allowReturnNones,
-      boolean useLocation,
       boolean useStarlarkThread,
       boolean useStarlarkSemantics) {
     this.method = method;
@@ -72,7 +70,6 @@
     this.extraKeywords = extraKeywords;
     this.selfCall = selfCall;
     this.allowReturnNones = allowReturnNones;
-    this.useLocation = useLocation;
     this.useStarlarkThread = useStarlarkThread;
     this.useStarlarkSemantics = useStarlarkSemantics;
   }
@@ -102,7 +99,6 @@
         !annotation.extraKeywords().name().isEmpty(),
         annotation.selfCall(),
         annotation.allowReturnNones(),
-        annotation.useLocation(),
         annotation.useStarlarkThread(),
         annotation.useStarlarkSemantics());
   }
@@ -194,11 +190,6 @@
     return useStarlarkSemantics;
   }
 
-  /** @see SkylarkCallable#useLocation() */
-  boolean isUseLocation() {
-    return useLocation;
-  }
-
   /** @see SkylarkCallable#allowReturnNones() */
   boolean isAllowReturnNones() {
     return allowReturnNones;
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Starlark.java b/src/main/java/com/google/devtools/build/lib/syntax/Starlark.java
index c491581..113ab58 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Starlark.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Starlark.java
@@ -354,7 +354,7 @@
 
     thread.push(callable);
     try {
-      return callable.fastcall(thread, thread.getCallerLocation(), positional, named);
+      return callable.fastcall(thread, positional, named);
     } finally {
       thread.pop();
     }
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkCallable.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkCallable.java
index ca405b1..b28d923 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkCallable.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkCallable.java
@@ -38,13 +38,11 @@
    * <p>The default implementation throws an exception.
    *
    * @param thread the StarlarkThread in which the function is called
-   * @param loc source location of the Starlark call expression, or BUILTIN; (going away)
    * @param args a tuple of the arguments passed by position
    * @param kwargs a new, mutable dict of the arguments passed by keyword. Iteration order is
    *     determined by keyword order in the call expression.
    */
-  default Object call(
-      StarlarkThread thread, Location loc, Tuple<Object> args, Dict<String, Object> kwargs)
+  default Object call(StarlarkThread thread, Tuple<Object> args, Dict<String, Object> kwargs)
       throws EvalException, InterruptedException {
     throw Starlark.errorf("function %s not implemented", getName());
   }
@@ -66,13 +64,11 @@
    * named arguments. Other implementations of this method should similarly reject duplicates.
    *
    * @param thread the StarlarkThread in which the function is called
-   * @param loc source location of the Starlark call expression, or BUILTIN; (going away)
    * @param positional a list of positional arguments
    * @param named a list of named arguments, as alternating Strings/Objects. May contain dups.
    */
   default Object fastcall(
       StarlarkThread thread,
-      Location loc, // TODO(adonovan): eliminate
       Object[] positional,
       Object[] named)
       throws EvalException, InterruptedException {
@@ -88,7 +84,7 @@
     Tuple<Object> args = (Tuple<Object>) arguments[0];
     @SuppressWarnings("unchecked")
     Dict<String, Object> kwargs = (Dict<String, Object>) arguments[1];
-    return call(thread, loc, args, kwargs);
+    return call(thread, args, kwargs);
   }
 
   /** Returns the form this callable value should take in a stack trace. */
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkFunction.java
index b9bf93b..4d36be6 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkFunction.java
@@ -92,7 +92,7 @@
   }
 
   @Override
-  public Object fastcall(StarlarkThread thread, Location loc, Object[] positional, Object[] named)
+  public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named)
       throws EvalException, InterruptedException {
     if (thread.mutability().isFrozen()) {
       throw Starlark.errorf("Trying to call in frozen environment");
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeBuildApiGlobals.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeBuildApiGlobals.java
index a89f105..d05ff68 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeBuildApiGlobals.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeBuildApiGlobals.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.LateBoundDefaultApi;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkBuildApiGlobals;
 import com.google.devtools.build.lib.syntax.EvalException;
@@ -26,8 +25,8 @@
 public class FakeBuildApiGlobals implements SkylarkBuildApiGlobals {
 
   @Override
-  public LateBoundDefaultApi configurationField(
-      String fragment, String name, Location loc, StarlarkThread thread) throws EvalException {
+  public LateBoundDefaultApi configurationField(String fragment, String name, StarlarkThread thread)
+      throws EvalException {
     return new FakeLateBoundDefaultApi();
   }
 }
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeDefaultInfoProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeDefaultInfoProvider.java
index 980f6e7..57fa579 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeDefaultInfoProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeDefaultInfoProvider.java
@@ -14,13 +14,13 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.DefaultInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.DefaultInfoApi.DefaultInfoApiProvider;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.RunfilesApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Printer;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 
 /**
  * Fake implementation of {@link DefaultInfoApiProvider}.
@@ -28,8 +28,14 @@
 public class FakeDefaultInfoProvider implements DefaultInfoApiProvider<RunfilesApi, FileApi> {
 
   @Override
-  public DefaultInfoApi constructor(Object files, Object runfiles, Object dataRunfiles,
-      Object defaultRunfiles, Object executable, Location loc) throws EvalException {
+  public DefaultInfoApi constructor(
+      Object files,
+      Object runfiles,
+      Object dataRunfiles,
+      Object defaultRunfiles,
+      Object executable,
+      StarlarkThread thread)
+      throws EvalException {
     return null;
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeOutputGroupInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeOutputGroupInfo.java
index f64e0b3..ea491d6 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeOutputGroupInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeOutputGroupInfo.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.OutputGroupInfoApi;
 import com.google.devtools.build.lib.syntax.Dict;
 import com.google.devtools.build.lib.syntax.EvalException;
@@ -26,12 +25,12 @@
 public class FakeOutputGroupInfo implements OutputGroupInfoApi {
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return "";
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return "";
   }
 
@@ -44,7 +43,7 @@
   public static class FakeOutputGroupInfoProvider implements OutputGroupInfoApiProvider {
 
     @Override
-    public OutputGroupInfoApi constructor(Dict<?, ?> kwargs, Location loc) throws EvalException {
+    public OutputGroupInfoApi constructor(Dict<?, ?> kwargs) throws EvalException {
       return new FakeOutputGroupInfo();
     }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeProviderApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeProviderApi.java
index f152933..5f5f470 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeProviderApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeProviderApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.syntax.BaseFunction;
 import com.google.devtools.build.lib.syntax.Dict;
@@ -34,8 +33,7 @@
   private final String name = "ProviderIdentifier" + idCounter++;
 
   @Override
-  public Object call(
-      StarlarkThread thread, Location loc, Tuple<Object> args, Dict<String, Object> kwargs) {
+  public Object call(StarlarkThread thread, Tuple<Object> args, Dict<String, Object> kwargs) {
     return new FakeStructApi();
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkAttrApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkAttrApi.java
index b42dde6..545e0da 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkAttrApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkAttrApi.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.skydoc.fakebuildapi;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkAttrApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.syntax.Dict;
@@ -40,7 +39,6 @@
       String doc,
       Boolean mandatory,
       Sequence<?> values,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     return new FakeDescriptor(AttributeType.INT, doc, mandatory, ImmutableList.of(), defaultInt);
@@ -52,7 +50,6 @@
       String doc,
       Boolean mandatory,
       Sequence<?> values,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     return new FakeDescriptor(
@@ -76,7 +73,6 @@
       Boolean singleFile,
       Object cfg,
       Sequence<?> aspects,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     List<List<String>> allNameGroups = new ArrayList<>();
@@ -93,7 +89,6 @@
       Boolean allowEmpty,
       Sequence<?> defaultList,
       String doc,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     return new FakeDescriptor(
@@ -107,7 +102,6 @@
       Boolean allowEmpty,
       Sequence<?> defaultList,
       String doc,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     return new FakeDescriptor(
@@ -127,7 +121,6 @@
       Boolean nonEmpty,
       Object cfg,
       Sequence<?> aspects,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     List<List<String>> allNameGroups = new ArrayList<>();
@@ -150,7 +143,6 @@
       Boolean nonEmpty,
       Object cfg,
       Sequence<?> aspects,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     List<List<String>> allNameGroups = new ArrayList<>();
@@ -163,8 +155,7 @@
 
   @Override
   public Descriptor boolAttribute(
-      Boolean defaultO, String doc, Boolean mandatory, Location loc, StarlarkThread thread)
-      throws EvalException {
+      Boolean defaultO, String doc, Boolean mandatory, StarlarkThread thread) throws EvalException {
     return new FakeDescriptor(
         AttributeType.BOOLEAN,
         doc,
@@ -175,8 +166,7 @@
 
   @Override
   public Descriptor outputAttribute(
-      Object defaultO, String doc, Boolean mandatory, Location loc, StarlarkThread thread)
-      throws EvalException {
+      Object defaultO, String doc, Boolean mandatory, StarlarkThread thread) throws EvalException {
     return new FakeDescriptor(AttributeType.OUTPUT, doc, mandatory, ImmutableList.of(), defaultO);
   }
 
@@ -187,7 +177,6 @@
       String doc,
       Boolean mandatory,
       Boolean nonEmpty,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     return new FakeDescriptor(
@@ -201,7 +190,6 @@
       String doc,
       Boolean mandatory,
       Boolean nonEmpty,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     return new FakeDescriptor(
@@ -215,7 +203,6 @@
       String doc,
       Boolean mandatory,
       Boolean nonEmpty,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     return new FakeDescriptor(
@@ -224,8 +211,7 @@
 
   @Override
   public Descriptor licenseAttribute(
-      Object defaultO, String doc, Boolean mandatory, Location loc, StarlarkThread thread)
-      throws EvalException {
+      Object defaultO, String doc, Boolean mandatory, StarlarkThread thread) throws EvalException {
     return new FakeDescriptor(
         AttributeType.STRING_LIST, doc, mandatory, ImmutableList.of(), defaultO);
   }
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkNativeModuleApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkNativeModuleApi.java
index be27cc9..26e07ec 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkNativeModuleApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkNativeModuleApi.java
@@ -39,45 +39,40 @@
       Sequence<?> exclude,
       Integer excludeDirectories,
       Object allowEmpty,
-      Location loc,
       StarlarkThread thread)
       throws EvalException, InterruptedException {
     return StarlarkList.of(thread.mutability());
   }
 
   @Override
-  public Object existingRule(String name, Location loc, StarlarkThread thread)
-      throws EvalException, InterruptedException {
+  public Object existingRule(String name, StarlarkThread thread) {
     return null;
   }
 
   @Override
-  public Dict<String, Dict<String, Object>> existingRules(Location loc, StarlarkThread thread)
-      throws EvalException, InterruptedException {
+  public Dict<String, Dict<String, Object>> existingRules(StarlarkThread thread) {
     return Dict.of(thread.mutability());
   }
 
   @Override
   public NoneType packageGroup(
-      String name, Sequence<?> packages, Sequence<?> includes, Location loc, StarlarkThread thread)
-      throws EvalException {
+      String name, Sequence<?> packages, Sequence<?> includes, StarlarkThread thread) {
     return null;
   }
 
   @Override
   public NoneType exportsFiles(
-      Sequence<?> srcs, Object visibility, Object licenses, Location loc, StarlarkThread thread)
-      throws EvalException {
+      Sequence<?> srcs, Object visibility, Object licenses, StarlarkThread thread) {
     return null;
   }
 
   @Override
-  public String packageName(Location loc, StarlarkThread thread) throws EvalException {
+  public String packageName(StarlarkThread thread) {
     return "";
   }
 
   @Override
-  public String repositoryName(Location location, StarlarkThread thread) throws EvalException {
+  public String repositoryName(StarlarkThread thread) {
     return "";
   }
 
@@ -90,8 +85,7 @@
     // "native".
     return new StarlarkCallable() {
       @Override
-      public Object fastcall(
-          StarlarkThread thread, Location loc, Object[] positional, Object[] named) {
+      public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named) {
         return Starlark.NONE;
       }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java
index 902fc3e..72cc829 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java
@@ -85,7 +85,8 @@
   }
 
   @Override
-  public ProviderApi provider(String doc, Object fields, Location location) throws EvalException {
+  public ProviderApi provider(String doc, Object fields, StarlarkThread thread)
+      throws EvalException {
     FakeProviderApi fakeProvider = new FakeProviderApi();
     // Field documentation will be output preserving the order in which the fields are listed.
     ImmutableList.Builder<ProviderFieldInfo> providerFieldInfos = ImmutableList.builder();
@@ -97,7 +98,7 @@
                   fields,
                   Sequence.class,
                   String.class,
-                  location,
+                  null,
                   "Expected list of strings or dictionary of string -> string for 'fields'");
       for (String fieldName : fieldNames) {
         providerFieldInfos.add(asProviderFieldInfo(fieldName, "(Undocumented)"));
@@ -146,8 +147,7 @@
       Object analysisTest,
       Object buildSetting,
       Object cfg,
-      Location loc,
-      StarlarkThread funcallThread)
+      StarlarkThread thread)
       throws EvalException {
     ImmutableMap.Builder<String, FakeDescriptor> attrsMapBuilder = ImmutableMap.builder();
     if (attrs != null && attrs != Starlark.NONE) {
@@ -168,14 +168,14 @@
     // Only the Builder is passed to RuleInfoWrapper as the rule name is not yet available.
     RuleInfo.Builder ruleInfo = RuleInfo.newBuilder().setDocString(doc).addAllAttribute(attrInfos);
 
+    Location loc = thread.getCallerLocation();
     ruleInfoList.add(new RuleInfoWrapper(functionIdentifier, loc, ruleInfo));
 
     return functionIdentifier;
   }
 
   @Override
-  public Label label(
-      String labelString, Boolean relativeToCallerRepository, Location loc, StarlarkThread thread)
+  public Label label(String labelString, Boolean relativeToCallerRepository, StarlarkThread thread)
       throws EvalException {
     try {
       return Label.parseAbsolute(
@@ -183,7 +183,7 @@
           /* defaultToMain= */ false,
           /* repositoryMapping= */ ImmutableMap.of());
     } catch (LabelSyntaxException e) {
-      throw new EvalException(loc, "Illegal absolute label syntax: " + labelString);
+      throw Starlark.errorf("Illegal absolute label syntax: %s", labelString);
     }
   }
 
@@ -199,8 +199,7 @@
       Sequence<?> toolchains,
       String doc,
       Boolean applyToFiles,
-      Location loc,
-      StarlarkThread funcallThread)
+      StarlarkThread thread)
       throws EvalException {
     FakeSkylarkAspect fakeAspect = new FakeSkylarkAspect();
     ImmutableMap.Builder<String, FakeDescriptor> attrsMapBuilder = ImmutableMap.builder();
@@ -232,7 +231,7 @@
             .addAllAttribute(attrInfos)
             .addAllAspectAttribute(aspectAttrs);
 
-    aspectInfoList.add(new AspectInfoWrapper(fakeAspect, loc, aspectInfo));
+    aspectInfoList.add(new AspectInfoWrapper(fakeAspect, thread.getCallerLocation(), aspectInfo));
 
     return fakeAspect;
   }
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStructApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStructApi.java
index 8e869af..70ad497 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStructApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeStructApi.java
@@ -19,12 +19,12 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Ordering;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.syntax.ClassObject;
 import com.google.devtools.build.lib.syntax.Dict;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Printer;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 import java.util.Map;
 import javax.annotation.Nullable;
 
@@ -44,12 +44,12 @@
   }
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return "";
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return "";
   }
 
@@ -107,8 +107,8 @@
   public static class FakeStructProviderApi implements StructProviderApi {
 
     @Override
-    public StructApi createStruct(Dict<?, ?> kwargs, Location loc) throws EvalException {
-      return new FakeStructApi(kwargs.getContents(String.class, Object.class, "kwargs"));
+    public StructApi createStruct(Dict<String, Object> kwargs, StarlarkThread thread) {
+      return new FakeStructApi(kwargs);
     }
 
     @Override
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidApplicationResourceInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidApplicationResourceInfo.java
index 956af77..43900e2 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidApplicationResourceInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidApplicationResourceInfo.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.android;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidApplicationResourceInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidApplicationResourceInfoApi.AndroidApplicationResourceInfoApiProvider;
@@ -26,12 +25,12 @@
 public class FakeAndroidApplicationResourceInfo implements AndroidDeviceBrokerInfoApi {
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return "";
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return "";
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidDeviceBrokerInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidDeviceBrokerInfo.java
index b2e555c..b81fe4f 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidDeviceBrokerInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidDeviceBrokerInfo.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.android;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidDeviceBrokerInfoApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Printer;
@@ -25,12 +24,12 @@
 public class FakeAndroidDeviceBrokerInfo implements AndroidDeviceBrokerInfoApi {
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return "";
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return "";
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidInstrumentationInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidInstrumentationInfo.java
index 803ebc3..d7bd9f5 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidInstrumentationInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidInstrumentationInfo.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.android;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidInstrumentationInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.android.ApkInfoApi;
 import com.google.devtools.build.lib.syntax.EvalException;
@@ -30,12 +29,12 @@
   }
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return "";
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return "";
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidNativeLibsInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidNativeLibsInfo.java
index dbc17b3..95cedc1 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidNativeLibsInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidNativeLibsInfo.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.android;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidNativeLibsInfoApi;
 import com.google.devtools.build.lib.syntax.Depset;
@@ -32,12 +31,12 @@
   }
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return "";
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return "";
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidResourcesInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidResourcesInfo.java
index 36dfe23..1551fed 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidResourcesInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeAndroidResourcesInfo.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.skydoc.fakebuildapi.android;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidManifestInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidResourcesInfoApi;
@@ -102,12 +101,12 @@
   }
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return "";
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return "";
   }
 
@@ -213,12 +212,12 @@
     }
 
     @Override
-    public String toProto(Location loc) throws EvalException {
+    public String toProto() throws EvalException {
       return "";
     }
 
     @Override
-    public String toJson(Location loc) throws EvalException {
+    public String toJson() throws EvalException {
       return "";
     }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeApkInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeApkInfo.java
index f065a37..ac37732 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeApkInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android/FakeApkInfo.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.android;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.android.ApkInfoApi;
 import com.google.devtools.build.lib.syntax.Dict;
@@ -47,12 +46,12 @@
   }
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return "";
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return "";
   }
 
@@ -65,7 +64,7 @@
   public static class FakeApkInfoProvider implements ApkInfoApiProvider {
 
     @Override
-    public ApkInfoApi<?> createInfo(Dict<String, Object> kwargs, Location loc) {
+    public ApkInfoApi<?> createInfo(Dict<String, Object> kwargs) {
       return new FakeApkInfo();
     }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleDynamicFrameworkInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleDynamicFrameworkInfo.java
index 8130ff8..e5e6683 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleDynamicFrameworkInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleDynamicFrameworkInfo.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.apple;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.apple.AppleDynamicFrameworkInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.apple.ObjcProviderApi;
@@ -46,12 +45,12 @@
   }
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return "";
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return "";
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleStaticLibraryInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleStaticLibraryInfo.java
index 1247342..9963ca8 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleStaticLibraryInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/apple/FakeAppleStaticLibraryInfo.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.apple;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.apple.AppleStaticLibraryInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.apple.ObjcProviderApi;
@@ -37,12 +36,12 @@
   }
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return "";
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return "";
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config/FakeConfigGlobalLibrary.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config/FakeConfigGlobalLibrary.java
index 0df3d6d..20582d8 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config/FakeConfigGlobalLibrary.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/config/FakeConfigGlobalLibrary.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.config;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.config.ConfigGlobalLibraryApi;
 import com.google.devtools.build.lib.skylarkbuildapi.config.ConfigurationTransitionApi;
 import com.google.devtools.build.lib.syntax.BaseFunction;
@@ -32,14 +31,13 @@
       BaseFunction implementation,
       Sequence<?> inputs,
       Sequence<?> outputs,
-      Location location,
       StarlarkThread thread) {
     return new FakeConfigurationTransition();
   }
 
   @Override
   public ConfigurationTransitionApi analysisTestTransition(
-      Dict<?, ?> changedSettings, Location location) {
+      Dict<?, ?> changedSettings, StarlarkThread thread) {
     return new FakeConfigurationTransition();
   }
 }
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcInfo.java
index 95a3224..54b5259 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcInfo.java
@@ -14,13 +14,11 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.cpp;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcCompilationContextApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcLinkingContextApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Printer;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
 
 /** Fake implementation of {@link CcInfoApi}. */
 public class FakeCcInfo implements CcInfoApi {
@@ -36,12 +34,12 @@
   }
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return null;
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return null;
   }
 
@@ -52,8 +50,7 @@
   public static class Provider implements CcInfoApi.Provider {
 
     @Override
-    public CcInfoApi createInfo(
-        Object ccCompilationContext, Object ccLinkingInfo, Location location, StarlarkThread thread)
+    public CcInfoApi createInfo(Object ccCompilationContext, Object ccLinkingInfo)
         throws EvalException {
       return new FakeCcInfo();
     }
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
index 080980e..7c033c7 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.skydoc.fakebuildapi.cpp;
 
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkActionFactoryApi;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
@@ -166,7 +165,6 @@
       boolean alwayslink,
       String dynamicLibraryPath,
       String interfaceLibraryPath,
-      Location location,
       StarlarkThread thread) {
     return null;
   }
@@ -177,7 +175,6 @@
       Object librariesToLinkObject,
       Object userLinkFlagsObject,
       Object nonCodeInputs,
-      Location location,
       StarlarkThread thread) {
     return null;
   }
@@ -188,7 +185,6 @@
       Object librariesToLinkObject,
       Object userLinkFlagsObject,
       Object nonCodeInputs,
-      Location location,
       StarlarkThread thread) {
     return null;
   }
@@ -243,7 +239,6 @@
       boolean disallowPicOutputs,
       boolean disallowNopicOutputs,
       Sequence<?> additionalInputs,
-      Location location,
       StarlarkThread thread)
       throws EvalException, InterruptedException {
     return null;
@@ -264,7 +259,6 @@
       boolean disallowStaticLibraries,
       boolean disallowDynamicLibraries,
       Object grepIncludes,
-      Location location,
       StarlarkThread thread)
       throws InterruptedException, EvalException {
     return null;
@@ -284,7 +278,6 @@
       boolean linkDepsStatically,
       Sequence<?> additionalInputs,
       Object grepIncludes,
-      Location location,
       StarlarkThread thread)
       throws InterruptedException, EvalException {
     return null;
@@ -315,7 +308,7 @@
 
   @Override
   public CcCompilationOutputsApi<FileApi> createCompilationOutputsFromSkylark(
-      Object objectsObject, Object picObjectsObject, Location location) {
+      Object objectsObject, Object picObjectsObject) {
     return null;
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcToolchainConfigInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcToolchainConfigInfo.java
index d6d2476..a1b2aec 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcToolchainConfigInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcToolchainConfigInfo.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.cpp;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcToolchainConfigInfoApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Printer;
@@ -28,12 +27,12 @@
   }
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return null;
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return null;
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeGoWrapCcHelper.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeGoWrapCcHelper.java
index adf110f..389fc64 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeGoWrapCcHelper.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeGoWrapCcHelper.java
@@ -117,7 +117,7 @@
 
   @Override
   public Depset /*<FileApi>*/ getGopackageFilesForStarlark(
-      SkylarkRuleContextApi skylarkRuleContext, FileApi skylarkGopkg) {
+      SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext, FileApi skylarkGopkg) {
     return null;
   }
 
@@ -129,7 +129,8 @@
   }
 
   @Override
-  public Depset skylarkCollectTransitiveSwigIncludes(SkylarkRuleContextApi skylarkRuleContext) {
+  public Depset skylarkCollectTransitiveSwigIncludes(
+      SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext) {
     return null;
   }
 
@@ -146,13 +147,14 @@
   }
 
   @Override
-  public String skylarkGetMangledTargetName(SkylarkRuleContextApi skylarkRuleContext) {
+  public String skylarkGetMangledTargetName(
+      SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext) {
     return null;
   }
 
   @Override
   public WrapCcIncludeProviderApi getWrapCcIncludeProvider(
-      SkylarkRuleContextApi skylarkRuleContext, Depset swigIncludes) {
+      SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext, Depset swigIncludes) {
     return null;
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyCcLinkParamsProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyCcLinkParamsProvider.java
index dfd2cb7..b4954ee 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyCcLinkParamsProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyCcLinkParamsProvider.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.cpp;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.PyCcLinkParamsProviderApi;
 import com.google.devtools.build.lib.syntax.EvalException;
@@ -29,12 +28,12 @@
   }
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return null;
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return null;
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcHelper.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcHelper.java
index 4a6e082..8d45288 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcHelper.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcHelper.java
@@ -87,7 +87,7 @@
 
   @Override
   public WrapCcIncludeProviderApi getWrapCcIncludeProvider(
-      SkylarkRuleContextApi skylarkRuleContext, Depset swigIncludes) {
+      SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext, Depset swigIncludes) {
     return null;
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcInfo.java
index f7a3be9..a8648aa 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcInfo.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.cpp;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.PyWrapCcHelperApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.PyWrapCcInfoApi;
@@ -33,12 +32,12 @@
   public void repr(Printer printer) {}
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return null;
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return null;
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java
index a7b2888..0fc383a 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java
@@ -16,7 +16,6 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkActionFactoryApi;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
@@ -67,9 +66,7 @@
       Sequence<?> sourcepathEntries,
       Sequence<?> resources,
       Boolean neverlink,
-      Location loc,
-      StarlarkThread thread)
-      throws EvalException, InterruptedException {
+      StarlarkThread thread) {
     return new FakeJavaInfo();
   }
 
@@ -78,9 +75,7 @@
       SkylarkActionFactoryApi actions,
       FileApi jar,
       Object targetLabel,
-      FakeJavaToolchainSkylarkApiProviderApi javaToolchain,
-      Location location)
-      throws EvalException {
+      FakeJavaToolchainSkylarkApiProviderApi javaToolchain) {
     return null;
   }
 
@@ -89,9 +84,7 @@
       SkylarkActionFactoryApi actions,
       FileApi jar,
       Label targetLabel,
-      FakeJavaToolchainSkylarkApiProviderApi javaToolchain,
-      Location location)
-      throws EvalException {
+      FakeJavaToolchainSkylarkApiProviderApi javaToolchain) {
     return null;
   }
 
@@ -102,15 +95,13 @@
       Sequence<?> sourceFiles,
       Sequence<?> sourceJars,
       FakeJavaToolchainSkylarkApiProviderApi javaToolchain,
-      FakeJavaRuntimeInfoApi hostJavabase,
-      Location location)
-      throws EvalException {
+      FakeJavaRuntimeInfoApi hostJavabase) {
     return null;
   }
 
   @Override
   public ImmutableList<String> getDefaultJavacOpts(
-      FakeJavaToolchainSkylarkApiProviderApi javaToolchain, Location loc) throws EvalException {
+      FakeJavaToolchainSkylarkApiProviderApi javaToolchain) throws EvalException {
     return ImmutableList.of();
   }
 
@@ -167,8 +158,8 @@
   }
 
   @Override
-  public Label getJavaToolchainLabel(
-      JavaToolchainSkylarkApiProviderApi toolchain, Location location) throws EvalException {
+  public Label getJavaToolchainLabel(JavaToolchainSkylarkApiProviderApi toolchain)
+      throws EvalException {
     return null;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaInfo.java
index 670e73c..bd653e4 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaInfo.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.java;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.java.JavaAnnotationProcessingApi;
 import com.google.devtools.build.lib.skylarkbuildapi.java.JavaCompilationInfoProviderApi;
@@ -97,12 +96,12 @@
   }
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return "";
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return "";
   }
 
@@ -124,7 +123,6 @@
         Sequence<?> runtimeDeps,
         Sequence<?> exports,
         Object jdepsApi,
-        Location loc,
         StarlarkThread thread)
         throws EvalException {
       return new FakeJavaInfo();
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaRuntimeInfoApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaRuntimeInfoApi.java
index 70439e9..cd7f697 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaRuntimeInfoApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaRuntimeInfoApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.java;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.java.JavaRuntimeInfoApi;
 import com.google.devtools.build.lib.syntax.Depset;
 import com.google.devtools.build.lib.syntax.EvalException;
@@ -48,12 +47,12 @@
   }
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return "";
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return "";
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaToolchainSkylarkApiProviderApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaToolchainSkylarkApiProviderApi.java
index 717a376..aed2a62 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaToolchainSkylarkApiProviderApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaToolchainSkylarkApiProviderApi.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.java;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.java.JavaToolchainSkylarkApiProviderApi;
 import com.google.devtools.build.lib.syntax.Depset;
@@ -60,12 +59,12 @@
   }
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return "";
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return "";
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyInfo.java
index 186ce93..79532b1 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyInfo.java
@@ -14,12 +14,12 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.python;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.python.PyInfoApi;
 import com.google.devtools.build.lib.syntax.Depset;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Printer;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 
 /** Fake implementation of {@link PyInfoApi}. */
 public class FakePyInfo implements PyInfoApi<FileApi> {
@@ -62,7 +62,7 @@
         Object importsUncast,
         boolean hasPy2OnlySources,
         boolean hasPy3OnlySources,
-        Location loc)
+        StarlarkThread thread)
         throws EvalException {
       return new FakePyInfo();
     }
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyRuntimeInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyRuntimeInfo.java
index 2ff962d..fe9af06 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyRuntimeInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python/FakePyRuntimeInfo.java
@@ -14,12 +14,12 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.python;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.python.PyRuntimeInfoApi;
 import com.google.devtools.build.lib.syntax.Depset;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Printer;
+import com.google.devtools.build.lib.syntax.StarlarkThread;
 
 /** Fake implementation of {@link PyRuntimeInfoApi}. */
 public class FakePyRuntimeInfo implements PyRuntimeInfoApi<FileApi> {
@@ -56,7 +56,7 @@
         Object interpreterUncast,
         Object filesUncast,
         String pythonVersion,
-        Location loc)
+        StarlarkThread thread)
         throws EvalException {
       return new FakePyRuntimeInfo();
     }
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java
index 9862bcb..f380bf9 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java
@@ -58,7 +58,6 @@
       Boolean configure,
       Boolean remotable,
       String doc,
-      Location loc,
       StarlarkThread thread)
       throws EvalException {
     List<AttributeInfo> attrInfos;
@@ -82,6 +81,7 @@
     // Only the Builder is passed to RuleInfoWrapper as the rule name is not yet available.
     RuleInfo.Builder ruleInfo = RuleInfo.newBuilder().setDocString(doc).addAllAttribute(attrInfos);
 
+    Location loc = thread.getCallerLocation();
     ruleInfoList.add(new RuleInfoWrapper(functionIdentifier, loc, ruleInfo));
     return functionIdentifier;
   }
@@ -110,8 +110,8 @@
   }
 
   @Override
-  public void failWithIncompatibleUseCcConfigureFromRulesCc(
-      Location location, StarlarkThread thread) throws EvalException {
+  public void failWithIncompatibleUseCcConfigureFromRulesCc(StarlarkThread thread)
+      throws EvalException {
     // Noop until --incompatible_use_cc_configure_from_rules_cc is implemented.
   }
 }
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeCoverageCommon.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeCoverageCommon.java
index 9d18026..2049bc1 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeCoverageCommon.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeCoverageCommon.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.test;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.SkylarkRuleContextApi;
 import com.google.devtools.build.lib.skylarkbuildapi.platform.ConstraintValueInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.test.CoverageCommonApi;
@@ -32,8 +31,7 @@
       SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext,
       Sequence<?> sourceAttributes,
       Sequence<?> dependencyAttributes,
-      Object extensions,
-      Location location) {
+      Object extensions) {
     return null;
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeExecutionInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeExecutionInfo.java
index 9621fca..e856b80 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeExecutionInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeExecutionInfo.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.skydoc.fakebuildapi.test;
 
 import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.test.ExecutionInfoApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Printer;
@@ -31,12 +30,12 @@
   }
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return "";
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return "";
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeTestingEnvironmentInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeTestingEnvironmentInfo.java
index 6d73729..20e301d 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeTestingEnvironmentInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test/FakeTestingEnvironmentInfo.java
@@ -15,7 +15,6 @@
 package com.google.devtools.build.skydoc.fakebuildapi.test;
 
 import com.google.common.collect.ImmutableMap;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkbuildapi.test.TestEnvironmentInfoApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Printer;
@@ -32,12 +31,12 @@
   }
 
   @Override
-  public String toProto(Location loc) throws EvalException {
+  public String toProto() throws EvalException {
     return "";
   }
 
   @Override
-  public String toJson(Location loc) throws EvalException {
+  public String toJson() throws EvalException {
     return "";
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java
index d6d0656..e886a73 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContextTest.java
@@ -76,6 +76,8 @@
   private Root root;
   private Path workspaceFile;
   private SkylarkRepositoryContext context;
+  private StarlarkThread thread =
+      StarlarkThread.builder(Mutability.create("test")).useDefaultSemantics().build();
 
   private static String ONE_LINE_PATCH = "@@ -1,1 +1,2 @@\n line one\n+line two\n";
 
@@ -181,26 +183,26 @@
     scratch.file("/path/bin/def").setExecutable(true);
     scratch.file("/bin/undef");
 
-    assertThat(context.which("anything", null)).isNull();
-    assertThat(context.which("def", null)).isNull();
-    assertThat(context.which("undef", null)).isNull();
-    assertThat(context.which("true", null).toString()).isEqualTo("/bin/true");
-    assertThat(context.which("false", null).toString()).isEqualTo("/path/sbin/false");
+    assertThat(context.which("anything", thread)).isNull();
+    assertThat(context.which("def", thread)).isNull();
+    assertThat(context.which("undef", thread)).isNull();
+    assertThat(context.which("true", thread).toString()).isEqualTo("/bin/true");
+    assertThat(context.which("false", thread).toString()).isEqualTo("/path/sbin/false");
   }
 
   @Test
   public void testFile() throws Exception {
     setUpContexForRule("test");
-    context.createFile(context.path("foobar"), "", true, true, null);
-    context.createFile(context.path("foo/bar"), "foobar", true, true, null);
-    context.createFile(context.path("bar/foo/bar"), "", true, true, null);
+    context.createFile(context.path("foobar"), "", true, true, thread);
+    context.createFile(context.path("foo/bar"), "foobar", true, true, thread);
+    context.createFile(context.path("bar/foo/bar"), "", true, true, thread);
 
     testOutputFile(outputDirectory.getChild("foobar"), "");
     testOutputFile(outputDirectory.getRelative("foo/bar"), "foobar");
     testOutputFile(outputDirectory.getRelative("bar/foo/bar"), "");
 
     try {
-      context.createFile(context.path("/absolute"), "", true, true, null);
+      context.createFile(context.path("/absolute"), "", true, true, thread);
       fail("Expected error on creating path outside of the repository directory");
     } catch (RepositoryFunctionException ex) {
       assertThat(ex)
@@ -209,7 +211,7 @@
           .isEqualTo("Cannot write outside of the repository directory for path /absolute");
     }
     try {
-      context.createFile(context.path("../somepath"), "", true, true, null);
+      context.createFile(context.path("../somepath"), "", true, true, thread);
       fail("Expected error on creating path outside of the repository directory");
     } catch (RepositoryFunctionException ex) {
       assertThat(ex)
@@ -218,7 +220,7 @@
           .isEqualTo("Cannot write outside of the repository directory for path /somepath");
     }
     try {
-      context.createFile(context.path("foo/../../somepath"), "", true, true, null);
+      context.createFile(context.path("foo/../../somepath"), "", true, true, thread);
       fail("Expected error on creating path outside of the repository directory");
     } catch (RepositoryFunctionException ex) {
       assertThat(ex)
@@ -233,23 +235,23 @@
     setUpContexForRule("testDelete");
     Path bar = outputDirectory.getRelative("foo/bar");
     SkylarkPath barPath = context.path(bar.getPathString());
-    context.createFile(barPath, "content", true, true, null);
-    assertThat(context.delete(barPath, null)).isTrue();
+    context.createFile(barPath, "content", true, true, thread);
+    assertThat(context.delete(barPath, thread)).isTrue();
 
-    assertThat(context.delete(barPath, null)).isFalse();
+    assertThat(context.delete(barPath, thread)).isFalse();
 
     Path tempFile = scratch.file("/abcde/b", "123");
-    assertThat(context.delete(context.path(tempFile.getPathString()), null)).isTrue();
+    assertThat(context.delete(context.path(tempFile.getPathString()), thread)).isTrue();
 
     Path innerDir = scratch.dir("/some/inner");
     scratch.dir("/some/inner/deeper");
     scratch.file("/some/inner/deeper.txt");
     scratch.file("/some/inner/deeper/1.txt");
-    assertThat(context.delete(innerDir.toString(), null)).isTrue();
+    assertThat(context.delete(innerDir.toString(), thread)).isTrue();
 
     Path underWorkspace = root.getRelative("under_workspace");
     try {
-      context.delete(underWorkspace.toString(), null);
+      context.delete(underWorkspace.toString(), thread);
       fail();
     } catch (EvalException expected) {
       assertThat(expected.getMessage())
@@ -262,15 +264,15 @@
         ImmutableSet.of(PathFragment.create("under_workspace")),
         StarlarkSemantics.DEFAULT_SEMANTICS,
         /* repoRemoteExecutor= */ null);
-    assertThat(context.delete(underWorkspace.toString(), null)).isTrue();
+    assertThat(context.delete(underWorkspace.toString(), thread)).isTrue();
   }
 
   @Test
   public void testRead() throws Exception {
     setUpContexForRule("test");
-    context.createFile(context.path("foo/bar"), "foobar", true, true, null);
+    context.createFile(context.path("foo/bar"), "foobar", true, true, thread);
 
-    String content = context.readFile(context.path("foo/bar"), null);
+    String content = context.readFile(context.path("foo/bar"), thread);
     assertThat(content).isEqualTo("foobar");
   }
 
@@ -278,11 +280,11 @@
   public void testPatch() throws Exception {
     setUpContexForRule("test");
     SkylarkPath foo = context.path("foo");
-    context.createFile(foo, "line one\n", false, true, null);
+    context.createFile(foo, "line one\n", false, true, thread);
     SkylarkPath patchFile = context.path("my.patch");
     context.createFile(
-        context.path("my.patch"), "--- foo\n+++ foo\n" + ONE_LINE_PATCH, false, true, null);
-    context.patch(patchFile, 0, null);
+        context.path("my.patch"), "--- foo\n+++ foo\n" + ONE_LINE_PATCH, false, true, thread);
+    context.patch(patchFile, 0, thread);
     testOutputFile(foo.getPath(), String.format("line one%nline two%n"));
   }
 
@@ -291,9 +293,9 @@
     setUpContexForRule("test");
     SkylarkPath patchFile = context.path("my.patch");
     context.createFile(
-        context.path("my.patch"), "--- foo\n+++ foo\n" + ONE_LINE_PATCH, false, true, null);
+        context.path("my.patch"), "--- foo\n+++ foo\n" + ONE_LINE_PATCH, false, true, thread);
     try {
-      context.patch(patchFile, 0, null);
+      context.patch(patchFile, 0, thread);
       fail("Expected RepositoryFunctionException");
     } catch (RepositoryFunctionException ex) {
       assertThat(ex)
@@ -314,9 +316,9 @@
         "--- ../other_root/foo\n" + "+++ ../other_root/foo\n" + ONE_LINE_PATCH,
         false,
         true,
-        null);
+        thread);
     try {
-      context.patch(patchFile, 0, null);
+      context.patch(patchFile, 0, thread);
       fail("Expected RepositoryFunctionException");
     } catch (RepositoryFunctionException ex) {
       assertThat(ex)
@@ -333,11 +335,11 @@
     setUpContexForRule("test");
     SkylarkPath foo = context.path("foo");
     SkylarkPath patchFile = context.path("my.patch");
-    context.createFile(foo, "line three\n", false, true, null);
+    context.createFile(foo, "line three\n", false, true, thread);
     context.createFile(
-        context.path("my.patch"), "--- foo\n+++ foo\n" + ONE_LINE_PATCH, false, true, null);
+        context.path("my.patch"), "--- foo\n+++ foo\n" + ONE_LINE_PATCH, false, true, thread);
     try {
-      context.patch(patchFile, 0, null);
+      context.patch(patchFile, 0, thread);
       fail("Expected RepositoryFunctionException");
     } catch (RepositoryFunctionException ex) {
       assertThat(ex)
@@ -393,10 +395,10 @@
         context.execute(
             StarlarkList.of(/*mutability=*/ null, "/bin/cmd", "arg1"),
             /*timeout=*/ 10,
-            /* uncheckedEnvironment=*/ Dict.empty(),
-            /* quiet= */ true,
-            /* workingDirectory= */ "",
-            Location.BUILTIN);
+            /*uncheckedEnvironment=*/ Dict.empty(),
+            /*quiet=*/ true,
+            /*workingDirectory=*/ "",
+            thread);
 
     // Assert
     verify(repoRemoteExecutor)
@@ -414,9 +416,9 @@
   @Test
   public void testSymlink() throws Exception {
     setUpContexForRule("test");
-    context.createFile(context.path("foo"), "foobar", true, true, null);
+    context.createFile(context.path("foo"), "foobar", true, true, thread);
 
-    context.symlink(context.path("foo"), context.path("bar"), null);
+    context.symlink(context.path("foo"), context.path("bar"), thread);
     testOutputFile(outputDirectory.getChild("bar"), "foobar");
 
     assertThat(context.path("bar").realpath()).isEqualTo(context.path("foo"));
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessorTest.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessorTest.java
index 3cd9136..c2921cb 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/SkylarkCallableProcessorTest.java
@@ -137,43 +137,19 @@
   }
 
   @Test
-  public void testLocationMissing() throws Exception {
-    assertAbout(javaSource())
-        .that(getFile("LocationMissing.java"))
-        .processedWith(new SkylarkCallableProcessor())
-        .failsToCompile()
-        .withErrorContaining(
-            "for useLocation special parameter 'shouldBeLoc', got type java.lang.String, want"
-                + " Location");
-  }
-
-  @Test
   public void testSkylarkInfoBeforeParams() throws Exception {
     assertAbout(javaSource())
         .that(getFile("SkylarkInfoBeforeParams.java"))
         .processedWith(new SkylarkCallableProcessor())
         .failsToCompile()
         .withErrorContaining(
-            "for useLocation special parameter 'two', got type java.lang.Integer, want Location");
+            "for useStarlarkThread special parameter 'three', got type java.lang.String, want"
+                + " StarlarkThread");
     // Also reports:
     // - annotated type java.lang.String of parameter 'one' is not assignable
-    //   to variable of type com.google.devtools.build.lib.events.Location
+    //   to variable of type com.google.devtools.build.lib.events.StarlarkThread
     // - annotated type java.lang.Integer of parameter 'two' is not assignable
-    //   to variable of type com.google.devtools.build.lib.syntax.StarlarkThread
-    // - for useStarlarkThread special parameter 'three',
-    //   got type java.lang.String, want StarlarkThread
-  }
-
-  @Test
-  public void testSkylarkInfoParamsWrongOrder() throws Exception {
-    assertAbout(javaSource())
-        .that(getFile("SkylarkInfoParamsWrongOrder.java"))
-        .processedWith(new SkylarkCallableProcessor())
-        .failsToCompile()
-        .withErrorContaining(
-            "for useLocation special parameter 'thread', got type"
-                + " com.google.devtools.build.lib.syntax.StarlarkThread, want Location");
-    // It also reports the converse error with location and thread swapped.
+    //   to variable of type java.lang.String
   }
 
   @Test
@@ -267,8 +243,8 @@
         .processedWith(new SkylarkCallableProcessor())
         .failsToCompile()
         .withErrorContaining(
-            "method threeArgMethod is annotated with 1 Params plus 3 special parameters, but has"
-                + " only 3 parameter variables");
+            "method threeArgMethod is annotated with 1 Params plus 2 special parameters, but has"
+                + " only 2 parameter variables");
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ExtraKeywordsOutOfOrder.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ExtraKeywordsOutOfOrder.java
index 37d6a3c..3647138 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ExtraKeywordsOutOfOrder.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ExtraKeywordsOutOfOrder.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkinterface.processor.testsources;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.syntax.Dict;
@@ -32,10 +31,8 @@
       documented = false,
       parameters = {@Param(name = "one")},
       extraKeywords = @Param(name = "kwargs"),
-      useLocation = true,
       useStarlarkThread = true)
-  public String threeArgMethod(
-      Dict<?, ?> kwargs, String one, Location location, StarlarkThread thread) {
+  public String threeArgMethod(Dict<?, ?> kwargs, String one, StarlarkThread thread) {
     return "bar";
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ExtraPositionalsMissing.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ExtraPositionalsMissing.java
index 4c65916..d97376b 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ExtraPositionalsMissing.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ExtraPositionalsMissing.java
@@ -14,7 +14,6 @@
 
 package com.google.devtools.build.lib.skylarkinterface.processor.testsources;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
@@ -30,9 +29,8 @@
       documented = false,
       parameters = {@Param(name = "one")},
       extraPositionals = @Param(name = "args"),
-      useLocation = true,
       useStarlarkThread = true)
-  public String threeArgMethod(String one, Location location, StarlarkThread thread) {
+  public String threeArgMethod(String one, StarlarkThread thread) {
     return "bar";
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/GoldenCase.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/GoldenCase.java
index 64c6dea..c241066 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/GoldenCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/GoldenCase.java
@@ -14,9 +14,7 @@
 
 package com.google.devtools.build.lib.skylarkinterface.processor.testsources;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
-import com.google.devtools.build.lib.skylarkinterface.ParamType;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.syntax.Dict;
 import com.google.devtools.build.lib.syntax.Sequence;
@@ -46,12 +44,12 @@
       name = "zero_arg_method_with_thread",
       documented = false,
       useStarlarkThread = true)
-  public Integer zeroArgMethod(StarlarkThread thread) {
+  public Integer zeroArgMethodWithThread(StarlarkThread thread) {
     return 0;
   }
 
   @SkylarkCallable(
-      name = "three_arg_method_with_loc",
+      name = "three_arg_method",
       documented = false,
       parameters = {
         @Param(name = "one", type = String.class, named = true),
@@ -62,27 +60,9 @@
             named = true,
             defaultValue = "None",
             noneable = true),
-      },
-      useLocation = true)
-  public String threeArgMethod(String one, Integer two, Object three, Location loc) {
-    return "bar";
-  }
-
-  @SkylarkCallable(
-    name = "three_arg_method_with_params",
-    documented = false,
-    parameters = {
-      @Param(name = "one", type = String.class, named = true),
-      @Param(name = "two", type = Integer.class, named = true),
-      @Param(name = "three",
-          allowedTypes = {
-              @ParamType(type = String.class),
-              @ParamType(type = Integer.class),
-          },
-          named = true, defaultValue = "None", noneable = true),
-    })
+      })
   public String threeArgMethod(String one, Integer two, Object three) {
-    return "baz";
+    return "bar";
   }
 
   @SkylarkCallable(
@@ -93,10 +73,9 @@
         @Param(name = "two", type = Integer.class, named = true),
         @Param(name = "three", type = String.class, named = true),
       },
-      useLocation = true,
       useStarlarkThread = true)
   public String threeArgMethodWithParams(
-      String one, Integer two, String three, Location loc, StarlarkThread thread) {
+      String one, Integer two, String three, StarlarkThread thread) {
     return "baz";
   }
 
@@ -120,10 +99,9 @@
             named = true,
             defaultValue = "five"),
         @Param(name = "six", type = String.class, positional = false, named = true),
-      },
-      useLocation = true)
-  public String manyArgMethodMixingPositoinalAndNamed(
-      String one, String two, String three, String four, String five, String six, Location loc) {
+      })
+  public String manyArgMethodMixingPositionalAndNamed(
+      String one, String two, String three, String four, String five, String six) {
     return "baz";
   }
 
@@ -135,10 +113,9 @@
         @Param(name = "two", type = Integer.class, named = true),
       },
       extraKeywords = @Param(name = "kwargs"),
-      useLocation = true,
       useStarlarkThread = true)
   public String twoArgMethodWithParamsAndInfoAndKwargs(
-      String one, Integer two, Dict<?, ?> kwargs, Location loc, StarlarkThread thread) {
+      String one, Integer two, Dict<String, Object> kwargs, StarlarkThread thread) {
     return "blep";
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/LocationMissing.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/LocationMissing.java
deleted file mode 100644
index ae26751..0000000
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/LocationMissing.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2018 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.skylarkinterface.processor.testsources;
-
-import com.google.devtools.build.lib.skylarkinterface.Param;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
-
-/**
- * Test case for a SkylarkCallable method which does not have an appropriate StarlarkThread
- * parameter despite having useLocation set.
- */
-public class LocationMissing implements StarlarkValue {
-
-  @SkylarkCallable(
-      name = "three_arg_method_missing_location",
-      documented = false,
-      parameters = {
-        @Param(name = "one", type = String.class, named = true),
-        @Param(name = "two", type = Integer.class, named = true),
-      },
-      useLocation = true,
-      useStarlarkThread = true)
-  public String threeArgMethod(String one, Integer two, String shouldBeLoc, StarlarkThread thread) {
-    return "bar";
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoBeforeParams.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoBeforeParams.java
index 14a43c5..d07a7e7 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoBeforeParams.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoBeforeParams.java
@@ -14,15 +14,13 @@
 
 package com.google.devtools.build.lib.skylarkinterface.processor.testsources;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.syntax.StarlarkThread;
 import com.google.devtools.build.lib.syntax.StarlarkValue;
 
 /**
- * Test case for a SkylarkCallable method which specifies skylark-info parameters (for example
- * StarlarkThread) before other parameters.
+ * Test case for a SkylarkCallable method which specifies StarlarkThread before other parameters.
  */
 public class SkylarkInfoBeforeParams implements StarlarkValue {
 
@@ -34,10 +32,8 @@
         @Param(name = "two", type = Integer.class, named = true),
         @Param(name = "three", type = String.class, named = true)
       },
-      useLocation = true,
       useStarlarkThread = true)
-  public String threeArgMethod(
-      Location location, StarlarkThread thread, String one, Integer two, String three) {
+  public String threeArgMethod(StarlarkThread thread, String one, Integer two, String three) {
     return "bar";
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoParamsWrongOrder.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoParamsWrongOrder.java
deleted file mode 100644
index 0cfdbc8..0000000
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/SkylarkInfoParamsWrongOrder.java
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2018 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//    http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.skylarkinterface.processor.testsources;
-
-import com.google.devtools.build.lib.events.Location;
-import com.google.devtools.build.lib.skylarkinterface.Param;
-import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
-import com.google.devtools.build.lib.syntax.StarlarkThread;
-import com.google.devtools.build.lib.syntax.StarlarkValue;
-
-/**
- * Test case for a SkylarkCallable method which specifies skylark-info parameters in the incorrect
- * relative order.
- */
-public class SkylarkInfoParamsWrongOrder implements StarlarkValue {
-
-  @SkylarkCallable(
-      name = "skylark_info_params_wrong_order",
-      documented = false,
-      parameters = {@Param(name = "some_param", type = String.class, named = true)},
-      useLocation = true,
-      useStarlarkThread = true)
-  public String threeArgMethod(
-      // Note environment should come after location.
-      String someParam, StarlarkThread thread, Location location) {
-    return "bar";
-  }
-}
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java b/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java
index 35c00d7..e65bb23 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/BaseFunctionTest.java
@@ -17,7 +17,6 @@
 import static com.google.common.truth.Truth.assertWithMessage;
 import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
 import java.util.Arrays;
 import java.util.Map;
@@ -87,8 +86,7 @@
           }
 
           @Override
-          public Object fastcall(
-              StarlarkThread thread, Location loc, Object[] positional, Object[] named)
+          public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named)
               throws EvalException {
             Object[] arguments =
                 Starlark.matchSignature(
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
index 236aea0..60a0d1d 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/EvaluationTest.java
@@ -18,7 +18,6 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.events.EventCollector;
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
 import com.google.devtools.build.lib.testutil.TestMode;
 import java.util.Collections;
@@ -152,8 +151,7 @@
     }
 
     @Override
-    public Object fastcall(
-        StarlarkThread thread, Location loc, Object[] positional, Object[] named) {
+    public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named) {
       callCount++;
       if (positional.length > 0 && Starlark.truth(positional[0])) {
         Thread.currentThread().interrupt();
@@ -241,8 +239,7 @@
           }
 
           @Override
-          public Object fastcall(
-              StarlarkThread thread, Location loc, Object[] positional, Object[] named) {
+          public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named) {
             int sum = 0;
             for (Object arg : positional) {
               sum += (Integer) arg;
@@ -286,7 +283,6 @@
           @Override
           public Object call(
               StarlarkThread thread,
-              Location loc,
               Tuple<Object> args,
               Dict<String, Object> kwargs) {
             return kwargs;
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java b/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
index 096247b..808884b 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/FunctionTest.java
@@ -15,7 +15,6 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import java.util.ArrayList;
@@ -76,7 +75,7 @@
 
           @Override
           public NoneType call(
-              StarlarkThread thread, Location loc, Tuple<Object> args, Dict<String, Object> kwargs)
+              StarlarkThread thread, Tuple<Object> args, Dict<String, Object> kwargs)
               throws EvalException {
             params.addAll(args);
             return Starlark.NONE;
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
index 98b0ee3..7256e3c 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/SkylarkEvaluationTest.java
@@ -2061,8 +2061,7 @@
           }
 
           @Override
-          public Object fastcall(
-              StarlarkThread thread, Location loc, Object[] positional, Object[] named) {
+          public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named) {
             return "fromValues";
           }
         };
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadDebuggingTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadDebuggingTest.java
index 749f5ee..e667499 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadDebuggingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkThreadDebuggingTest.java
@@ -62,8 +62,7 @@
           }
 
           @Override
-          public Object fastcall(
-              StarlarkThread thread, Location loc, Object[] positional, Object[] named) {
+          public Object fastcall(StarlarkThread thread, Object[] positional, Object[] named) {
             result[0] = Debug.getCallStack(thread);
             result[1] = thread.getCallStack();
             return Starlark.NONE;
