diff --git a/src/main/java/com/google/devtools/build/docgen/ApiExporter.java b/src/main/java/com/google/devtools/build/docgen/ApiExporter.java
index de5d682..8e1dad6 100644
--- a/src/main/java/com/google/devtools/build/docgen/ApiExporter.java
+++ b/src/main/java/com/google/devtools/build/docgen/ApiExporter.java
@@ -30,9 +30,9 @@
 import com.google.devtools.build.lib.syntax.FuncallExpression;
 import com.google.devtools.build.lib.syntax.FunctionSignature;
 import com.google.devtools.build.lib.syntax.MethodDescriptor;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
 import com.google.devtools.build.lib.syntax.SkylarkSignatureProcessor;
 import com.google.devtools.build.lib.syntax.SkylarkType;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.common.options.OptionsParser;
 import java.io.BufferedOutputStream;
 import java.io.FileOutputStream;
@@ -113,10 +113,10 @@
         SkylarkModule typeModule = SkylarkInterfaceUtils.getSkylarkModule(obj.getClass());
         if (typeModule != null) {
           if (FuncallExpression.hasSelfCallMethod(
-              SkylarkSemantics.DEFAULT_SEMANTICS, obj.getClass())) {
+              StarlarkSemantics.DEFAULT_SEMANTICS, obj.getClass())) {
             MethodDescriptor descriptor =
                 FuncallExpression.getSelfCallMethodDescriptor(
-                    SkylarkSemantics.DEFAULT_SEMANTICS, obj);
+                    StarlarkSemantics.DEFAULT_SEMANTICS, obj);
 
             value = collectFunctionInfo(
                 descriptor.getName(),
diff --git a/src/main/java/com/google/devtools/build/docgen/skylark/SkylarkJavaMethodDoc.java b/src/main/java/com/google/devtools/build/docgen/skylark/SkylarkJavaMethodDoc.java
index 8819f96..6c45539 100644
--- a/src/main/java/com/google/devtools/build/docgen/skylark/SkylarkJavaMethodDoc.java
+++ b/src/main/java/com/google/devtools/build/docgen/skylark/SkylarkJavaMethodDoc.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkInterfaceUtils;
 import com.google.devtools.build.lib.syntax.EvalUtils;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/main/java/com/google/devtools/build/docgen/skylark/SkylarkParamDoc.java b/src/main/java/com/google/devtools/build/docgen/skylark/SkylarkParamDoc.java
index aa1c167..87a4910 100644
--- a/src/main/java/com/google/devtools/build/docgen/skylark/SkylarkParamDoc.java
+++ b/src/main/java/com/google/devtools/build/docgen/skylark/SkylarkParamDoc.java
@@ -15,7 +15,7 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.ParamType;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /**
  * A class containing the documentation for a Skylark method parameter.
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 1615493..00a0f4b 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -410,7 +410,7 @@
 java_library(
     name = "skylark_semantics",
     srcs = [
-        "syntax/SkylarkSemantics.java",
+        "syntax/StarlarkSemantics.java",
     ],
     deps = [
         "//third_party:auto_value",
@@ -456,7 +456,7 @@
 
 java_library(
     name = "skylark-semantics",
-    srcs = ["syntax/SkylarkSemantics.java"],
+    srcs = ["syntax/StarlarkSemantics.java"],
     deps = [
         "//third_party:auto_value",
         "//third_party:guava",
@@ -469,7 +469,7 @@
         [
             "syntax/**/*.java",
         ],
-        exclude = ["syntax/SkylarkSemantics.java"],
+        exclude = ["syntax/StarlarkSemantics.java"],
     ),
     deps = [
         ":events",
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
index 5a8b535..23d1589 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java
@@ -27,7 +27,7 @@
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoKey;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.events.ExtendedEventHandler;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.SkyFunction;
 
@@ -123,7 +123,7 @@
    * Returns the options that affect the Skylark interpreter used for evaluating Skylark rule
    * implementation functions.
    */
-  SkylarkSemantics getSkylarkSemantics() throws InterruptedException;
+  StarlarkSemantics getSkylarkSemantics() throws InterruptedException;
 
   /**
    * Returns the Artifact that is used to hold the non-volatile workspace status for the current
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
index f54f723..266122a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java
@@ -36,7 +36,7 @@
 import com.google.devtools.build.lib.skyframe.BuildInfoCollectionValue;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
 import com.google.devtools.build.lib.skyframe.WorkspaceStatusValue;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.SkyFunction;
 import java.io.PrintWriter;
@@ -305,7 +305,7 @@
   }
 
   @Override
-  public SkylarkSemantics getSkylarkSemantics() throws InterruptedException {
+  public StarlarkSemantics getSkylarkSemantics() throws InterruptedException {
     return PrecomputedValue.SKYLARK_SEMANTICS.get(skyframeEnv);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
index 127acdd..f24fb4d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
@@ -61,9 +61,9 @@
 import com.google.devtools.build.lib.syntax.Environment.Extension;
 import com.google.devtools.build.lib.syntax.Environment.GlobalFrame;
 import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
 import com.google.devtools.build.lib.syntax.SkylarkUtils;
 import com.google.devtools.build.lib.syntax.SkylarkUtils.Phase;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.common.options.OptionDefinition;
 import com.google.devtools.common.options.OptionsProvider;
@@ -777,7 +777,7 @@
   private Environment createSkylarkRuleClassEnvironment(
       Mutability mutability,
       GlobalFrame globals,
-      SkylarkSemantics skylarkSemantics,
+      StarlarkSemantics starlarkSemantics,
       EventHandler eventHandler,
       String astFileContentHashCode,
       Map<String, Extension> importMap,
@@ -792,7 +792,7 @@
     Environment env =
         Environment.builder(mutability)
             .setGlobals(globals)
-            .setSemantics(skylarkSemantics)
+            .setSemantics(starlarkSemantics)
             .setEventHandler(eventHandler)
             .setFileContentHashCode(astFileContentHashCode)
             .setStarlarkContext(context)
@@ -806,7 +806,7 @@
   public Environment createSkylarkRuleClassEnvironment(
       Label extensionLabel,
       Mutability mutability,
-      SkylarkSemantics skylarkSemantics,
+      StarlarkSemantics starlarkSemantics,
       EventHandler eventHandler,
       String astFileContentHashCode,
       Map<String, Extension> importMap,
@@ -814,7 +814,7 @@
     return createSkylarkRuleClassEnvironment(
         mutability,
         globals.withLabel(extensionLabel),
-        skylarkSemantics,
+        starlarkSemantics,
         eventHandler,
         astFileContentHashCode,
         importMap,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
index c613acd..5117376 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkDefinedConfigTransition.java
@@ -27,7 +27,7 @@
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Mutability;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -106,7 +106,7 @@
       BaseFunction impl,
       List<String> inputs,
       List<String> outputs,
-      SkylarkSemantics semantics,
+      StarlarkSemantics semantics,
       StarlarkContext context) {
     return new RegularTransition(impl, inputs, outputs, semantics, context);
   }
@@ -162,14 +162,14 @@
 
   private static class RegularTransition extends StarlarkDefinedConfigTransition {
     private final BaseFunction impl;
-    private final SkylarkSemantics semantics;
+    private final StarlarkSemantics semantics;
     private final StarlarkContext starlarkContext;
 
     public RegularTransition(
         BaseFunction impl,
         List<String> inputs,
         List<String> outputs,
-        SkylarkSemantics semantics,
+        StarlarkSemantics semantics,
         StarlarkContext context) {
       super(inputs, outputs, impl.getLocation());
       this.impl = impl;
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 b794c48..01e0da3 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
@@ -66,7 +66,7 @@
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.SkylarkMutable;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.protobuf.GeneratedMessage;
 import java.nio.charset.StandardCharsets;
@@ -81,17 +81,15 @@
 /** Provides a Skylark interface for all action creation needs. */
 public class SkylarkActionFactory implements SkylarkActionFactoryApi {
   private final SkylarkRuleContext context;
-  private final SkylarkSemantics skylarkSemantics;
+  private final StarlarkSemantics starlarkSemantics;
   private RuleContext ruleContext;
   /** Counter for actions.run_shell helper scripts. Every script must have a unique name. */
   private int runShellOutputCounter = 0;
 
   public SkylarkActionFactory(
-      SkylarkRuleContext context,
-      SkylarkSemantics skylarkSemantics,
-      RuleContext ruleContext) {
+      SkylarkRuleContext context, StarlarkSemantics starlarkSemantics, RuleContext ruleContext) {
     this.context = context;
-    this.skylarkSemantics = skylarkSemantics;
+    this.starlarkSemantics = starlarkSemantics;
     this.ruleContext = ruleContext;
   }
 
@@ -198,7 +196,7 @@
       action =
           new ParameterFileWriteAction(
               ruleContext.getActionOwner(),
-              skylarkSemantics.incompatibleExpandDirectories()
+              starlarkSemantics.incompatibleExpandDirectories()
                   ? args.getDirectoryArtifacts()
                   : ImmutableList.of(),
               (Artifact) output,
@@ -459,7 +457,7 @@
       }
     } else {
       // Users didn't pass 'tools', kick in compatibility modes
-      if (skylarkSemantics.incompatibleNoSupportToolsInActionInputs()) {
+      if (starlarkSemantics.incompatibleNoSupportToolsInActionInputs()) {
         // In this mode we error out if we find any tools among the inputs
         List<Artifact> tools = null;
         for (Artifact artifact : inputArtifacts) {
@@ -594,7 +592,7 @@
   @VisibleForTesting
   public static class Args extends SkylarkMutable implements CommandLineArgsApi {
     private final Mutability mutability;
-    private final SkylarkSemantics skylarkSemantics;
+    private final StarlarkSemantics starlarkSemantics;
     private final SkylarkCustomCommandLine.Builder commandLine;
     private List<NestedSet<Object>> potentialDirectoryArtifacts = new ArrayList<>();
     private final Set<Artifact> directoryArtifacts = new HashSet<>();
@@ -627,7 +625,7 @@
         commandLine.add(argName);
       }
       if (value instanceof SkylarkNestedSet || value instanceof SkylarkList) {
-        if (skylarkSemantics.incompatibleDisallowOldStyleArgsAdd()) {
+        if (starlarkSemantics.incompatibleDisallowOldStyleArgsAdd()) {
           throw new EvalException(
               loc,
               "Args#add no longer accepts vectorized arguments when "
@@ -645,12 +643,12 @@
             /* formatJoined= */ null,
             /* omitIfEmpty= */ false,
             /* uniquify= */ false,
-            skylarkSemantics.incompatibleExpandDirectories(),
+            starlarkSemantics.incompatibleExpandDirectories(),
             /* terminateWith= */ null,
             loc);
 
       } else {
-        if (mapFn != Runtime.NONE && skylarkSemantics.incompatibleDisallowOldStyleArgsAdd()) {
+        if (mapFn != Runtime.NONE && starlarkSemantics.incompatibleDisallowOldStyleArgsAdd()) {
           throw new EvalException(
               loc,
               "Args#add no longer accepts map_fn when"
@@ -709,7 +707,7 @@
           omitIfEmpty,
           uniquify,
           expandDirectories == Runtime.UNBOUND
-              ? skylarkSemantics.incompatibleExpandDirectories()
+              ? starlarkSemantics.incompatibleExpandDirectories()
               : (Boolean) expandDirectories,
           terminateWith != Runtime.NONE ? (String) terminateWith : null,
           loc);
@@ -753,7 +751,7 @@
           omitIfEmpty,
           uniquify,
           expandDirectories == Runtime.UNBOUND
-              ? skylarkSemantics.incompatibleExpandDirectories()
+              ? starlarkSemantics.incompatibleExpandDirectories()
               : (Boolean) expandDirectories,
           /* terminateWith= */ null,
           loc);
@@ -850,7 +848,7 @@
     private void validateFormatString(String argumentName, @Nullable String formatStr, Location loc)
         throws EvalException {
       if (formatStr != null
-          && skylarkSemantics.incompatibleDisallowOldStyleArgsAdd()
+          && starlarkSemantics.incompatibleDisallowOldStyleArgsAdd()
           && !SingleStringArgFormatter.isValid(formatStr)) {
         throw new EvalException(
             loc,
@@ -874,7 +872,7 @@
     }
 
     private void validateNoDirectory(Object value, Location loc) throws EvalException {
-      if (skylarkSemantics.incompatibleExpandDirectories() && isDirectory(value)) {
+      if (starlarkSemantics.incompatibleExpandDirectories() && isDirectory(value)) {
         throw new EvalException(
             loc,
             "Cannot add directories to Args#add since they may expand to multiple values. "
@@ -928,10 +926,10 @@
       return this;
     }
 
-    private Args(@Nullable Mutability mutability, SkylarkSemantics skylarkSemantics) {
+    private Args(@Nullable Mutability mutability, StarlarkSemantics starlarkSemantics) {
       this.mutability = mutability != null ? mutability : Mutability.IMMUTABLE;
-      this.skylarkSemantics = skylarkSemantics;
-      this.commandLine = new SkylarkCustomCommandLine.Builder(skylarkSemantics);
+      this.starlarkSemantics = starlarkSemantics;
+      this.commandLine = new SkylarkCustomCommandLine.Builder(starlarkSemantics);
     }
 
     public SkylarkCustomCommandLine build() {
@@ -976,7 +974,7 @@
 
   @Override
   public Args args(Environment env) {
-    return new Args(env.mutability(), skylarkSemantics);
+    return new Args(env.mutability(), starlarkSemantics);
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java
index 133aaf3..237bb51 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkCustomCommandLine.java
@@ -44,7 +44,7 @@
 import com.google.devtools.build.lib.syntax.Printer;
 import com.google.devtools.build.lib.syntax.Runtime;
 import com.google.devtools.build.lib.syntax.SkylarkList;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.io.IOException;
@@ -59,7 +59,7 @@
 /** Supports ctx.actions.args() from Skylark. */
 @AutoCodec
 public class SkylarkCustomCommandLine extends CommandLine {
-  private final SkylarkSemantics skylarkSemantics;
+  private final StarlarkSemantics starlarkSemantics;
   private final ImmutableList<Object> arguments;
 
   private static final Joiner LINE_JOINER = Joiner.on("\n").skipNulls();
@@ -182,7 +182,7 @@
         int argi,
         ImmutableList.Builder<String> builder,
         @Nullable ArtifactExpander artifactExpander,
-        SkylarkSemantics skylarkSemantics)
+        StarlarkSemantics starlarkSemantics)
         throws CommandLineExpansionException {
       final Location location =
           ((features & HAS_LOCATION) != 0) ? (Location) arguments.get(argi++) : null;
@@ -208,9 +208,9 @@
       List<String> stringValues;
       if (mapEach != null) {
         stringValues = new ArrayList<>(expandedValues.size());
-        applyMapEach(mapEach, expandedValues, stringValues::add, location, skylarkSemantics);
+        applyMapEach(mapEach, expandedValues, stringValues::add, location, starlarkSemantics);
       } else if (mapAll != null) {
-        Object result = applyMapFn(mapAll, expandedValues, location, skylarkSemantics);
+        Object result = applyMapFn(mapAll, expandedValues, location, starlarkSemantics);
         if (!(result instanceof List)) {
           throw new CommandLineExpansionException(
               errorMessage(
@@ -266,7 +266,7 @@
       }
       if ((features & HAS_FORMAT_EACH) != 0) {
         String formatStr = (String) arguments.get(argi++);
-        Formatter formatter = Formatter.get(location, skylarkSemantics);
+        Formatter formatter = Formatter.get(location, starlarkSemantics);
         try {
           int count = stringValues.size();
           for (int i = 0; i < count; ++i) {
@@ -290,7 +290,7 @@
         if (!isEmptyAndShouldOmit) {
           String result = Joiner.on(joinWith).join(stringValues);
           if (formatJoined != null) {
-            Formatter formatter = Formatter.get(location, skylarkSemantics);
+            Formatter formatter = Formatter.get(location, starlarkSemantics);
             try {
               result = formatter.format(formatJoined, result);
             } catch (IllegalFormatException e) {
@@ -372,10 +372,10 @@
         int argi,
         ActionKeyContext actionKeyContext,
         Fingerprint fingerprint,
-        SkylarkSemantics skylarkSemantics)
+        StarlarkSemantics starlarkSemantics)
         throws CommandLineExpansionException {
       if ((features & HAS_MAP_ALL) != 0) {
-        return addToFingerprintLegacy(arguments, argi, fingerprint, skylarkSemantics);
+        return addToFingerprintLegacy(arguments, argi, fingerprint, starlarkSemantics);
       }
       final Location location =
           ((features & HAS_LOCATION) != 0) ? (Location) arguments.get(argi++) : null;
@@ -385,7 +385,7 @@
         NestedSet<Object> values = (NestedSet<Object>) arguments.get(argi++);
         if (mapEach != null) {
           CommandLineItem.MapFn<Object> commandLineItemMapFn =
-              new CommandLineItemMapEachAdaptor(mapEach, location, skylarkSemantics);
+              new CommandLineItemMapEachAdaptor(mapEach, location, starlarkSemantics);
           try {
             actionKeyContext.addNestedSetToFingerprint(commandLineItemMapFn, fingerprint, values);
           } catch (UncheckedCommandLineExpansionException e) {
@@ -401,7 +401,7 @@
         argi += count;
         if (mapEach != null) {
           List<String> stringValues = new ArrayList<>(count);
-          applyMapEach(mapEach, originalValues, stringValues::add, location, skylarkSemantics);
+          applyMapEach(mapEach, originalValues, stringValues::add, location, starlarkSemantics);
           for (String s : stringValues) {
             fingerprint.addString(s);
           }
@@ -456,10 +456,10 @@
         List<Object> arguments,
         int argi,
         Fingerprint fingerprint,
-        SkylarkSemantics skylarkSemantics)
+        StarlarkSemantics starlarkSemantics)
         throws CommandLineExpansionException {
       ImmutableList.Builder<String> builder = ImmutableList.builder();
-      argi = eval(arguments, argi, builder, null, skylarkSemantics);
+      argi = eval(arguments, argi, builder, null, starlarkSemantics);
       for (String s : builder.build()) {
         fingerprint.addString(s);
       }
@@ -613,18 +613,18 @@
         List<Object> arguments,
         int argi,
         ImmutableList.Builder<String> builder,
-        SkylarkSemantics skylarkSemantics)
+        StarlarkSemantics starlarkSemantics)
         throws CommandLineExpansionException {
       Object object = arguments.get(argi++);
       final Location location = hasLocation ? (Location) arguments.get(argi++) : null;
       if (hasMapFn) {
         BaseFunction mapFn = (BaseFunction) arguments.get(argi++);
-        object = applyMapFn(mapFn, object, location, skylarkSemantics);
+        object = applyMapFn(mapFn, object, location, starlarkSemantics);
       }
       String stringValue = CommandLineItem.expandToCommandLine(object);
       if (hasFormat) {
         String formatStr = (String) arguments.get(argi++);
-        Formatter formatter = Formatter.get(location, skylarkSemantics);
+        Formatter formatter = Formatter.get(location, starlarkSemantics);
         stringValue = formatter.format(formatStr, stringValue);
       }
       builder.add(stringValue);
@@ -635,10 +635,10 @@
         List<Object> arguments,
         int argi,
         Fingerprint fingerprint,
-        SkylarkSemantics skylarkSemantics)
+        StarlarkSemantics starlarkSemantics)
         throws CommandLineExpansionException {
       if (hasMapFn) {
-        return addToFingerprintLegacy(arguments, argi, fingerprint, skylarkSemantics);
+        return addToFingerprintLegacy(arguments, argi, fingerprint, starlarkSemantics);
       }
       Object object = arguments.get(argi++);
       String stringValue = CommandLineItem.expandToCommandLine(object);
@@ -658,10 +658,10 @@
         List<Object> arguments,
         int argi,
         Fingerprint fingerprint,
-        SkylarkSemantics skylarkSemantics)
+        StarlarkSemantics starlarkSemantics)
         throws CommandLineExpansionException {
       ImmutableList.Builder<String> builder = ImmutableList.builderWithExpectedSize(1);
-      argi = eval(arguments, argi, builder, skylarkSemantics);
+      argi = eval(arguments, argi, builder, starlarkSemantics);
       for (String s : builder.build()) {
         fingerprint.addString(s);
       }
@@ -715,11 +715,11 @@
   }
 
   static class Builder {
-    private final SkylarkSemantics skylarkSemantics;
+    private final StarlarkSemantics starlarkSemantics;
     private final ImmutableList.Builder<Object> arguments = ImmutableList.builder();
 
-    public Builder(SkylarkSemantics skylarkSemantics) {
-      this.skylarkSemantics = skylarkSemantics;
+    public Builder(StarlarkSemantics starlarkSemantics) {
+      this.starlarkSemantics = starlarkSemantics;
     }
 
     Builder add(Object object) {
@@ -738,15 +738,15 @@
     }
 
     SkylarkCustomCommandLine build() {
-      return new SkylarkCustomCommandLine(skylarkSemantics, arguments.build());
+      return new SkylarkCustomCommandLine(starlarkSemantics, arguments.build());
     }
   }
 
   @AutoCodec.VisibleForSerialization
   @AutoCodec.Instantiator
-  SkylarkCustomCommandLine(SkylarkSemantics skylarkSemantics, ImmutableList<Object> arguments) {
+  SkylarkCustomCommandLine(StarlarkSemantics starlarkSemantics, ImmutableList<Object> arguments) {
     this.arguments = arguments;
-    this.skylarkSemantics = skylarkSemantics;
+    this.starlarkSemantics = starlarkSemantics;
   }
 
   @Override
@@ -761,9 +761,9 @@
     for (int argi = 0; argi < arguments.size(); ) {
       Object arg = arguments.get(argi++);
       if (arg instanceof VectorArg) {
-        argi = ((VectorArg) arg).eval(arguments, argi, result, artifactExpander, skylarkSemantics);
+        argi = ((VectorArg) arg).eval(arguments, argi, result, artifactExpander, starlarkSemantics);
       } else if (arg instanceof ScalarArg) {
-        argi = ((ScalarArg) arg).eval(arguments, argi, result, skylarkSemantics);
+        argi = ((ScalarArg) arg).eval(arguments, argi, result, starlarkSemantics);
       } else {
         result.add(CommandLineItem.expandToCommandLine(arg));
       }
@@ -779,9 +779,10 @@
       if (arg instanceof VectorArg) {
         argi =
             ((VectorArg) arg)
-                .addToFingerprint(arguments, argi, actionKeyContext, fingerprint, skylarkSemantics);
+                .addToFingerprint(
+                    arguments, argi, actionKeyContext, fingerprint, starlarkSemantics);
       } else if (arg instanceof ScalarArg) {
-        argi = ((ScalarArg) arg).addToFingerprint(arguments, argi, fingerprint, skylarkSemantics);
+        argi = ((ScalarArg) arg).addToFingerprint(arguments, argi, fingerprint, starlarkSemantics);
       } else {
         fingerprint.addString(CommandLineItem.expandToCommandLine(arg));
       }
@@ -791,8 +792,8 @@
   private interface Formatter {
     String format(String formatStr, String subject) throws CommandLineExpansionException;
 
-    static Formatter get(Location location, SkylarkSemantics skylarkSemantics) {
-      return skylarkSemantics.incompatibleDisallowOldStyleArgsAdd()
+    static Formatter get(Location location, StarlarkSemantics starlarkSemantics) {
+      return starlarkSemantics.incompatibleDisallowOldStyleArgsAdd()
           ? SingleStringArgFormatter::format
           : new LegacyFormatter(location);
     }
@@ -821,13 +822,13 @@
   }
 
   private static Object applyMapFn(
-      BaseFunction mapFn, Object arg, Location location, SkylarkSemantics skylarkSemantics)
+      BaseFunction mapFn, Object arg, Location location, StarlarkSemantics starlarkSemantics)
       throws CommandLineExpansionException {
     ImmutableList<Object> args = ImmutableList.of(arg);
     try (Mutability mutability = Mutability.create("map_fn")) {
       Environment env =
           Environment.builder(mutability)
-              .setSemantics(skylarkSemantics)
+              .setSemantics(starlarkSemantics)
               .setEventHandler(NullEventHandler.INSTANCE)
               .build();
       return mapFn.call(args, ImmutableMap.of(), null, env);
@@ -845,12 +846,12 @@
       List<Object> originalValues,
       Consumer<String> consumer,
       Location location,
-      SkylarkSemantics skylarkSemantics)
+      StarlarkSemantics starlarkSemantics)
       throws CommandLineExpansionException {
     try (Mutability mutability = Mutability.create("map_each")) {
       Environment env =
           Environment.builder(mutability)
-              .setSemantics(skylarkSemantics)
+              .setSemantics(starlarkSemantics)
               // TODO(b/77140311): Error if we issue print statements
               .setEventHandler(NullEventHandler.INSTANCE)
               .build();
@@ -890,19 +891,19 @@
       extends CommandLineItem.ParametrizedMapFn<Object> {
     private final BaseFunction mapFn;
     private final Location location;
-    private final SkylarkSemantics skylarkSemantics;
+    private final StarlarkSemantics starlarkSemantics;
 
     CommandLineItemMapEachAdaptor(
-        BaseFunction mapFn, Location location, SkylarkSemantics skylarkSemantics) {
+        BaseFunction mapFn, Location location, StarlarkSemantics starlarkSemantics) {
       this.mapFn = mapFn;
       this.location = location;
-      this.skylarkSemantics = skylarkSemantics;
+      this.starlarkSemantics = starlarkSemantics;
     }
 
     @Override
     public void expandToCommandLine(Object object, Consumer<String> args) {
       try {
-        applyMapEach(mapFn, ImmutableList.of(object), args, location, skylarkSemantics);
+        applyMapEach(mapFn, ImmutableList.of(object), args, location, starlarkSemantics);
       } catch (CommandLineExpansionException e) {
         // Rather than update CommandLineItem#expandToCommandLine and the numerous callers,
         // we wrap this in a runtime exception and handle it above
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 b652357..0799b50 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
@@ -57,8 +57,8 @@
 import com.google.devtools.build.lib.syntax.Runtime;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
 import com.google.devtools.build.lib.syntax.SkylarkType;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.Type;
 import java.util.Collections;
 import java.util.LinkedHashMap;
@@ -87,17 +87,17 @@
       AdvertisedProviderSet advertisedProviders,
       BaseFunction ruleImplementation,
       Location location,
-      SkylarkSemantics skylarkSemantics,
+      StarlarkSemantics starlarkSemantics,
       String toolsRepository)
       throws InterruptedException, RuleErrorException, ActionConflictException {
     String expectFailure = ruleContext.attributes().get("expect_failure", Type.STRING);
     SkylarkRuleContext skylarkRuleContext = null;
     try (Mutability mutability = Mutability.create("configured target")) {
-      skylarkRuleContext = new SkylarkRuleContext(ruleContext, null, skylarkSemantics);
+      skylarkRuleContext = new SkylarkRuleContext(ruleContext, null, starlarkSemantics);
       Environment env =
           Environment.builder(mutability)
               .setCallerLabel(ruleContext.getLabel())
-              .setSemantics(skylarkSemantics)
+              .setSemantics(starlarkSemantics)
               .setEventHandler(ruleContext.getAnalysisEnvironment().getEventHandler())
               .setStarlarkContext(
                   new BazelStarlarkContext(
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 df507ac..1887c2c 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
@@ -84,7 +84,7 @@
 import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
 import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.syntax.Type.ConversionException;
 import com.google.devtools.build.lib.syntax.Type.LabelClass;
@@ -134,7 +134,7 @@
   private FragmentCollection fragments;
   private FragmentCollection hostFragments;
   private AspectDescriptor aspectDescriptor;
-  private final SkylarkSemantics skylarkSemantics;
+  private final StarlarkSemantics starlarkSemantics;
 
   private SkylarkDict<String, String> makeVariables;
   private SkylarkAttributesCollection attributesCollection;
@@ -147,21 +147,23 @@
 
   /**
    * Creates a new SkylarkRuleContext using ruleContext.
-   * @param aspectDescriptor aspect for which the context is created, or <code>null</code>
-   *        if it is for a rule.
+   *
+   * @param aspectDescriptor aspect for which the context is created, or <code>null</code> if it is
+   *     for a rule.
    * @throws InterruptedException
    */
-  public SkylarkRuleContext(RuleContext ruleContext,
+  public SkylarkRuleContext(
+      RuleContext ruleContext,
       @Nullable AspectDescriptor aspectDescriptor,
-      SkylarkSemantics skylarkSemantics)
+      StarlarkSemantics starlarkSemantics)
       throws EvalException, InterruptedException {
-    this.actionFactory = new SkylarkActionFactory(this, skylarkSemantics, ruleContext);
+    this.actionFactory = new SkylarkActionFactory(this, starlarkSemantics, ruleContext);
     this.ruleContext = Preconditions.checkNotNull(ruleContext);
     this.ruleLabelCanonicalName = ruleContext.getLabel().getCanonicalForm();
     this.fragments = new FragmentCollection(ruleContext, NoTransition.INSTANCE);
     this.hostFragments = new FragmentCollection(ruleContext, HostTransition.INSTANCE);
     this.aspectDescriptor = aspectDescriptor;
-    this.skylarkSemantics = skylarkSemantics;
+    this.starlarkSemantics = starlarkSemantics;
 
     if (aspectDescriptor == null) {
       this.isForAspect = false;
@@ -730,7 +732,7 @@
       Object var2,
       Object fileSuffix,
       Location loc) throws EvalException {
-    checkDeprecated("ctx.actions.declare_file", "ctx.new_file", null, skylarkSemantics);
+    checkDeprecated("ctx.actions.declare_file", "ctx.new_file", null, starlarkSemantics);
     checkMutable("new_file");
 
     // Determine which of new_file's four signatures is being used. Yes, this is terrible.
@@ -785,7 +787,7 @@
   @Override
   public Artifact newDirectory(String name, Object siblingArtifactUnchecked) throws EvalException {
     checkDeprecated(
-        "ctx.actions.declare_directory", "ctx.experimental_new_directory", null, skylarkSemantics);
+        "ctx.actions.declare_directory", "ctx.experimental_new_directory", null, starlarkSemantics);
     checkMutable("experimental_new_directory");
     return actionFactory.declareDirectory(name, siblingArtifactUnchecked);
   }
@@ -1087,8 +1089,8 @@
         helper.getToolsRunfilesSuppliers());
   }
 
-  public SkylarkSemantics getSkylarkSemantics() {
-    return skylarkSemantics;
+  public StarlarkSemantics getSkylarkSemantics() {
+    return starlarkSemantics;
   }
 
   /**
@@ -1131,7 +1133,8 @@
   private static final String SCRIPT_SUFFIX = ".script.sh";
 
   private static void checkDeprecated(
-      String newApi, String oldApi, Location loc, SkylarkSemantics semantics) throws EvalException {
+      String newApi, String oldApi, Location loc, StarlarkSemantics semantics)
+      throws EvalException {
     if (semantics.incompatibleNewActionsApi()) {
       throw new EvalException(
           loc,
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java
index e05c78c..265cfa3 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenJarFunction.java
@@ -26,7 +26,7 @@
 import com.google.devtools.build.lib.rules.repository.WorkspaceAttributeMapper;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue;
 import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
@@ -108,11 +108,11 @@
       throws RepositoryFunctionException, InterruptedException {
 
     // Deprecation in favor of the Starlark rule
-    SkylarkSemantics skylarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
-    if (skylarkSemantics == null) {
+    StarlarkSemantics starlarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
+    if (starlarkSemantics == null) {
       return null;
     }
-    if (skylarkSemantics.incompatibleRemoveNativeMavenJar()) {
+    if (starlarkSemantics.incompatibleRemoveNativeMavenJar()) {
       throw new RepositoryFunctionException(
           new EvalException(
               null,
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
index 9be358b..c4b5dc5 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
@@ -33,7 +33,7 @@
 import com.google.devtools.build.lib.syntax.BaseFunction;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.skyframe.SkyFunction.Environment;
@@ -74,8 +74,8 @@
     if (declareEnvironmentDependencies(markerData, env, getEnviron(rule)) == null) {
       return null;
     }
-    SkylarkSemantics skylarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
-    if (skylarkSemantics == null) {
+    StarlarkSemantics starlarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
+    if (starlarkSemantics == null) {
       return null;
     }
 
@@ -94,7 +94,7 @@
     try (Mutability mutability = Mutability.create("Starlark repository")) {
       com.google.devtools.build.lib.syntax.Environment buildEnv =
           com.google.devtools.build.lib.syntax.Environment.builder(mutability)
-              .setSemantics(skylarkSemantics)
+              .setSemantics(starlarkSemantics)
               .setEventHandler(env.getListener())
               // The fetch phase does not need the tools repository or the fragment map because
               // it happens before analysis.
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java
index 802eab2..a6f55ec 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Package.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java
@@ -40,7 +40,7 @@
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationException;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.SpellChecker;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -768,13 +768,13 @@
        * done loading the given {@link Package}.
        *
        * @param pkg the loaded {@link Package}
-       * @param skylarkSemantics are the semantics used to load the package
+       * @param starlarkSemantics are the semantics used to load the package
        * @param loadTimeMs the wall time, in ms, that it took to load the package. More precisely,
        *     this is the wall time of the call to {@link PackageFactory#createPackageFromAst}.
        *     Notably, this does not include the time to read and parse the package's BUILD file, nor
        *     the time to read, parse, or evaluate any of the transitively loaded .bzl files.
        */
-      void onLoadingComplete(Package pkg, SkylarkSemantics skylarkSemantics, long loadTimeMs);
+      void onLoadingComplete(Package pkg, StarlarkSemantics starlarkSemantics, long loadTimeMs);
     }
 
     /** {@link Helper} that simply calls the {@link Package} constructor. */
@@ -791,8 +791,7 @@
 
       @Override
       public void onLoadingComplete(
-          Package pkg, SkylarkSemantics skylarkSemantics, long loadTimeMs) {
-      }
+          Package pkg, StarlarkSemantics starlarkSemantics, long loadTimeMs) {}
     }
 
     /**
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 945f42b..55e3c61 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
@@ -57,10 +57,10 @@
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
 import com.google.devtools.build.lib.syntax.SkylarkSignatureProcessor;
 import com.google.devtools.build.lib.syntax.SkylarkUtils;
 import com.google.devtools.build.lib.syntax.SkylarkUtils.Phase;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.Statement;
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.syntax.Type.ConversionException;
@@ -1240,7 +1240,7 @@
       Map<String, Extension> imports,
       ImmutableList<Label> skylarkFileDependencies,
       RuleVisibility defaultVisibility,
-      SkylarkSemantics skylarkSemantics,
+      StarlarkSemantics starlarkSemantics,
       Globber globber)
       throws InterruptedException {
     StoredEventHandler localReporterForParsing = new StoredEventHandler();
@@ -1264,7 +1264,7 @@
         imports,
         skylarkFileDependencies,
         defaultVisibility,
-        skylarkSemantics,
+        starlarkSemantics,
         globber);
   }
 
@@ -1291,7 +1291,7 @@
       Map<String, Extension> imports,
       ImmutableList<Label> skylarkFileDependencies,
       RuleVisibility defaultVisibility,
-      SkylarkSemantics skylarkSemantics,
+      StarlarkSemantics starlarkSemantics,
       Globber globber)
       throws InterruptedException {
     try {
@@ -1306,7 +1306,7 @@
           astParseResult.allEvents,
           astParseResult.allPosts,
           defaultVisibility,
-          skylarkSemantics,
+          starlarkSemantics,
           imports,
           skylarkFileDependencies,
           repositoryMapping);
@@ -1351,7 +1351,7 @@
         buildFile,
         locator,
         eventHandler,
-        SkylarkSemantics.DEFAULT_SEMANTICS);
+        StarlarkSemantics.DEFAULT_SEMANTICS);
   }
 
   /**
@@ -1365,7 +1365,7 @@
       RootedPath buildFile,
       CachingPackageLocator locator,
       ExtendedEventHandler eventHandler,
-      SkylarkSemantics semantics)
+      StarlarkSemantics semantics)
       throws NoSuchPackageException, InterruptedException {
     String error =
         LabelValidator.validatePackageName(packageId.getPackageFragment().getPathString());
@@ -1578,12 +1578,12 @@
   }
 
   /**
-   * Called by a caller of {@link #createPackageFromAst} after this caller has fully
-   * loaded the package.
+   * Called by a caller of {@link #createPackageFromAst} after this caller has fully loaded the
+   * package.
    */
   public void afterDoneLoadingPackage(
-      Package pkg, SkylarkSemantics skylarkSemantics, long loadTimeNanos) {
-    packageBuilderHelper.onLoadingComplete(pkg, skylarkSemantics, loadTimeNanos);
+      Package pkg, StarlarkSemantics starlarkSemantics, long loadTimeNanos) {
+    packageBuilderHelper.onLoadingComplete(pkg, starlarkSemantics, loadTimeNanos);
   }
 
   /**
@@ -1611,7 +1611,7 @@
       Iterable<Event> pastEvents,
       Iterable<Postable> pastPosts,
       RuleVisibility defaultVisibility,
-      SkylarkSemantics skylarkSemantics,
+      StarlarkSemantics starlarkSemantics,
       Map<String, Extension> imports,
       ImmutableList<Label> skylarkFileDependencies,
       ImmutableMap<RepositoryName, RepositoryName> repositoryMapping)
@@ -1629,7 +1629,7 @@
       Environment pkgEnv =
           Environment.builder(mutability)
               .setGlobals(BazelLibrary.GLOBALS)
-              .setSemantics(skylarkSemantics)
+              .setSemantics(starlarkSemantics)
               .setEventHandler(eventHandler)
               .setImportedExtensions(imports)
               .setStarlarkContext(starlarkContext)
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
index 97b8722..e4cedd4 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.Environment.Extension;
 import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import java.util.Map;
 import javax.annotation.Nullable;
 
@@ -51,7 +51,7 @@
    *
    * @param label the location of the rule.
    * @param mutability the Mutability for the current evaluation context
-   * @param skylarkSemantics the semantics options that modify the interpreter
+   * @param starlarkSemantics the semantics options that modify the interpreter
    * @param eventHandler the EventHandler for warnings, errors, etc.
    * @param astFileContentHashCode the hash code identifying this environment.
    * @param importMap map from import string to Extension
@@ -61,7 +61,7 @@
   Environment createSkylarkRuleClassEnvironment(
       Label label,
       Mutability mutability,
-      SkylarkSemantics skylarkSemantics,
+      StarlarkSemantics starlarkSemantics,
       EventHandler eventHandler,
       @Nullable String astFileContentHashCode,
       @Nullable Map<String, Extension> importMap,
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
index bb92321..1348c53e 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
@@ -14,7 +14,7 @@
 
 package com.google.devtools.build.lib.packages;
 
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.common.options.Converters.CommaSeparatedOptionListConverter;
 import com.google.devtools.common.options.Option;
 import com.google.devtools.common.options.OptionDocumentationCategory;
@@ -27,33 +27,31 @@
 /**
  * Contains options that affect Skylark's semantics.
  *
- * <p>These are injected into Skyframe (as an instance of {@link SkylarkSemantics}) when a new build
- * invocation occurs. Changing these options between builds will therefore trigger a reevaluation of
- * everything that depends on the Skylark interpreter &mdash; in particular, evaluation of all BUILD
- * and .bzl files.
+ * <p>These are injected into Skyframe (as an instance of {@link StarlarkSemantics}) when a new
+ * build invocation occurs. Changing these options between builds will therefore trigger a
+ * reevaluation of everything that depends on the Skylark interpreter &mdash; in particular,
+ * evaluation of all BUILD and .bzl files.
  *
  * <p><em>To add a new option, update the following:</em>
+ *
  * <ul>
  *   <li>Add a new abstract method (which is interpreted by {@code AutoValue} as a field) to {@link
- *       SkylarkSemantics} and {@link SkylarkSemantics.Builder}. Set its default value in {@link
- *       SkylarkSemantics#DEFAULT_SEMANTICS}.
- *
+ *       StarlarkSemantics} and {@link StarlarkSemantics.Builder}. Set its default value in {@link
+ *       StarlarkSemantics#DEFAULT_SEMANTICS}.
  *   <li>Add a new {@code @Option}-annotated field to this class. The field name and default value
- *       should be the same as in {@link SkylarkSemantics}, and the option name in the annotation
+ *       should be the same as in {@link StarlarkSemantics}, and the option name in the annotation
  *       should be that name written in snake_case. Add a line to set the new field in {@link
  *       #toSkylarkSemantics}.
- *
  *   <li>Add a line to set the new field in both {@link
  *       SkylarkSemanticsConsistencyTest#buildRandomOptions} and {@link
  *       SkylarkSemanticsConsistencyTest#buildRandomSemantics}.
- *
  *   <li>Update manual documentation in site/docs/skylark/backward-compatibility.md. Also remember
  *       to update this when flipping a flag's default value.
- *
- *   <li>Boolean semantic flags can toggle Skylark methods on or off. To do this, add a new entry
- *       to {@link SkylarkSemantics#FlagIdentifier}. Then, specify the identifier in
- *       {@code SkylarkCallable.enableOnlyWithFlag} or {@code SkylarkCallable.disableWithFlag}.
+ *   <li>Boolean semantic flags can toggle Skylark methods on or off. To do this, add a new entry to
+ *       {@link StarlarkSemantics#FlagIdentifier}. Then, specify the identifier in {@code
+ *       SkylarkCallable.enableOnlyWithFlag} or {@code SkylarkCallable.disableWithFlag}.
  * </ul>
+ *
  * For both readability and correctness, the relative order of the options in all of these locations
  * must be kept consistent; to make it easy we use alphabetic order. The parts that need updating
  * are marked with the comment "<== Add new options here in alphabetic order ==>".
@@ -541,9 +539,9 @@
               + " target.")
   public boolean incompatibleUseToolchainProvidersInJavaCommon;
 
-  /** Constructs a {@link SkylarkSemantics} object corresponding to this set of option values. */
-  public SkylarkSemantics toSkylarkSemantics() {
-    return SkylarkSemantics.builder()
+  /** Constructs a {@link StarlarkSemantics} object corresponding to this set of option values. */
+  public StarlarkSemantics toSkylarkSemantics() {
+    return StarlarkSemantics.builder()
         // <== Add new options here in alphabetic order ==>
         .checkThirdPartyTargetsHaveLicenses(checkThirdPartyTargetsHaveLicenses)
         .experimentalBuildSettingApi(experimentalBuildSettingApi)
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 1c68f45..4cf673f 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
@@ -50,10 +50,10 @@
 import com.google.devtools.build.lib.syntax.ParserInputSource;
 import com.google.devtools.build.lib.syntax.Runtime.NoneType;
 import com.google.devtools.build.lib.syntax.SkylarkList;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
 import com.google.devtools.build.lib.syntax.SkylarkSignatureProcessor;
 import com.google.devtools.build.lib.syntax.SkylarkUtils;
 import com.google.devtools.build.lib.syntax.SkylarkUtils.Phase;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.Root;
 import com.google.devtools.build.lib.vfs.RootedPath;
@@ -139,7 +139,7 @@
   @VisibleForTesting
   void parseForTesting(
       ParserInputSource source,
-      SkylarkSemantics skylarkSemantics,
+      StarlarkSemantics starlarkSemantics,
       @Nullable StoredEventHandler localReporter)
       throws BuildFileContainsErrorsException, InterruptedException {
     if (localReporter == null) {
@@ -153,7 +153,7 @@
     execute(
         buildFileAST,
         null,
-        skylarkSemantics,
+        starlarkSemantics,
         localReporter,
         WorkspaceFileValue.key(
             RootedPath.toRootedPath(Root.fromPath(workspaceDir), source.getPath())));
@@ -166,18 +166,18 @@
   public void execute(
       BuildFileAST ast,
       Map<String, Extension> importedExtensions,
-      SkylarkSemantics skylarkSemantics,
+      StarlarkSemantics starlarkSemantics,
       WorkspaceFileValue.WorkspaceFileKey workspaceFileKey)
       throws InterruptedException {
     Preconditions.checkNotNull(ast);
     Preconditions.checkNotNull(importedExtensions);
-    execute(ast, importedExtensions, skylarkSemantics, new StoredEventHandler(), workspaceFileKey);
+    execute(ast, importedExtensions, starlarkSemantics, new StoredEventHandler(), workspaceFileKey);
   }
 
   private void execute(
       BuildFileAST ast,
       @Nullable Map<String, Extension> importedExtensions,
-      SkylarkSemantics skylarkSemantics,
+      StarlarkSemantics starlarkSemantics,
       StoredEventHandler localReporter,
       WorkspaceFileValue.WorkspaceFileKey workspaceFileKey)
       throws InterruptedException {
@@ -188,7 +188,7 @@
     }
     Environment workspaceEnv =
         Environment.builder(mutability)
-            .setSemantics(skylarkSemantics)
+            .setSemantics(starlarkSemantics)
             .setGlobals(BazelLibrary.GLOBALS)
             .setEventHandler(localReporter)
             .setImportedExtensions(importMap)
diff --git a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactoryHelper.java b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactoryHelper.java
index 58545db..4810859 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactoryHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/WorkspaceFactoryHelper.java
@@ -28,7 +28,7 @@
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.FuncallExpression;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import java.util.Map;
 import java.util.stream.Collectors;
 
@@ -98,7 +98,7 @@
    * should also evaluate to the same thing.
    */
   public static void addMainRepoEntry(
-      Package.Builder builder, String externalRepoName, SkylarkSemantics semantics) {
+      Package.Builder builder, String externalRepoName, StarlarkSemantics semantics) {
     if (semantics.incompatibleRemapMainRepo()) {
       if (!Strings.isNullOrEmpty(builder.getPackageWorkspaceName())) {
         builder.addRepositoryMappingEntry(
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 3c250fc..d0a7ab0 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
@@ -25,7 +25,7 @@
 import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -48,7 +48,7 @@
       Environment env,
       StarlarkContext context)
       throws EvalException {
-    SkylarkSemantics semantics = env.getSemantics();
+    StarlarkSemantics semantics = env.getSemantics();
     if (!semantics.experimentalStarlarkConfigTransitions()) {
       throw new EvalException(
           location,
@@ -64,7 +64,7 @@
 
   @Override
   public ConfigurationTransitionApi analysisTestTransition(
-      SkylarkDict<String, String> changedSettings, Location location, SkylarkSemantics semantics)
+      SkylarkDict<String, String> changedSettings, Location location, StarlarkSemantics semantics)
       throws EvalException {
     Map<String, Object> changedSettingsMap =
         changedSettings.getContents(String.class, Object.class, "changed_settings dict");
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
index e2446cd..5291383 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
@@ -53,7 +53,7 @@
 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.EvalException;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.util.FileType;
 import com.google.devtools.build.lib.util.Pair;
@@ -211,7 +211,7 @@
   }
 
   public static void checkLocationWhitelisted(
-      SkylarkSemantics semantics, Location location, String callPath) throws EvalException {
+      StarlarkSemantics semantics, Location location, String callPath) throws EvalException {
     List<String> whitelistedPackagesList = semantics.experimentalCcSkylarkApiEnabledPackages();
     if (whitelistedPackagesList.stream().noneMatch(path -> callPath.startsWith(path))) {
       throwWhiteListError(location, callPath, whitelistedPackagesList);
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 951bed8..c1f9ce3 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
@@ -45,7 +45,7 @@
 import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkList;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import java.util.ArrayList;
 import java.util.List;
@@ -97,7 +97,7 @@
       Object javaToolchain,
       Object hostJavabase,
       @Nullable Artifact jdeps,
-      SkylarkSemantics semantics,
+      StarlarkSemantics semantics,
       Location location)
       throws EvalException {
     final Artifact sourceJar;
@@ -257,7 +257,7 @@
       SkylarkList<Artifact> sourceJars,
       Object javaToolchain,
       Object hostJavabase,
-      SkylarkSemantics semantics,
+      StarlarkSemantics semantics,
       Location location)
       throws EvalException {
     // No sources to pack, return None
@@ -334,7 +334,7 @@
       NestedSet<Artifact> transitiveCompileTimeJars,
       NestedSet<Artifact> transitiveRuntimeJars,
       NestedSet<Artifact> sourceJars,
-      SkylarkSemantics semantics,
+      StarlarkSemantics semantics,
       Location location)
       throws EvalException {
 
@@ -536,7 +536,7 @@
       Artifact inputJar,
       @Nullable Label targetLabel,
       Object javaToolchain,
-      SkylarkSemantics semantics,
+      StarlarkSemantics semantics,
       Location location)
       throws EvalException {
     String ijarBasename = FileSystemUtils.removeExtension(inputJar.getFilename()) + "-ijar.jar";
@@ -566,7 +566,7 @@
       Artifact inputJar,
       Label targetLabel,
       Object javaToolchain,
-      SkylarkSemantics semantics,
+      StarlarkSemantics semantics,
       Location location)
       throws EvalException {
     String basename = FileSystemUtils.removeExtension(inputJar.getFilename()) + "-stamped.jar";
@@ -594,14 +594,14 @@
   }
 
   private static boolean isValidJavaToolchain(
-      SkylarkSemantics skylarkSemantics, Object javaToolchain) {
-    return (!skylarkSemantics.incompatibleUseToolchainProvidersInJavaCommon()
+      StarlarkSemantics starlarkSemantics, Object javaToolchain) {
+    return (!starlarkSemantics.incompatibleUseToolchainProvidersInJavaCommon()
             && javaToolchain instanceof ConfiguredTarget)
         || javaToolchain instanceof JavaToolchainProvider;
   }
 
   JavaToolchainProvider getJavaToolchainProvider(
-      SkylarkSemantics semantics, Location location, Object javaToolchain) throws EvalException {
+      StarlarkSemantics semantics, Location location, Object javaToolchain) throws EvalException {
     if (javaToolchain instanceof ConfiguredTarget) {
       if (semantics.incompatibleUseToolchainProvidersInJavaCommon()) {
         // TODO(b/122738702): remove support for passing toolchains as configured targets
@@ -625,20 +625,21 @@
     throw new EvalException(null, javaToolchain + " is not a JavaToolchainProvider.");
   }
 
-  private static boolean isValidJavaRuntime(SkylarkSemantics skylarkSemantics, Object javaRuntime) {
-    return (!skylarkSemantics.incompatibleUseToolchainProvidersInJavaCommon()
+  private static boolean isValidJavaRuntime(
+      StarlarkSemantics starlarkSemantics, Object javaRuntime) {
+    return (!starlarkSemantics.incompatibleUseToolchainProvidersInJavaCommon()
             && javaRuntime instanceof ConfiguredTarget)
         || javaRuntime instanceof JavaRuntimeInfo;
   }
 
   private JavaRuntimeInfo getJavaRuntimeProvider(
-      SkylarkSemantics skylarkSemantics,
+      StarlarkSemantics starlarkSemantics,
       Location location,
       Object javabase,
       RuleContext ruleContext)
       throws EvalException {
     if (javabase instanceof TransitiveInfoCollection) {
-      if (skylarkSemantics.incompatibleUseToolchainProvidersInJavaCommon()) {
+      if (starlarkSemantics.incompatibleUseToolchainProvidersInJavaCommon()) {
         // TODO(b/122738702): remove support for passing toolchains as configured targets
         throw new EvalException(
             location,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java
index f6ff009..4506b0d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java
@@ -27,7 +27,7 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
 import com.google.devtools.build.lib.skylarkbuildapi.java.JavaSkylarkApiProviderApi;
 import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import javax.annotation.Nullable;
 
 /**
@@ -72,7 +72,7 @@
   }
 
   @Override
-  public NestedSet<Artifact> getSourceJars(Location location, SkylarkSemantics semantics)
+  public NestedSet<Artifact> getSourceJars(Location location, StarlarkSemantics semantics)
       throws EvalException {
     checkLegacyJavaProviderFlag(location, semantics);
     JavaSourceJarsProvider sourceJarsProvider = getProvider(JavaSourceJarsProvider.class);
@@ -83,7 +83,7 @@
   }
 
   @Override
-  public NestedSet<Artifact> getTransitiveDeps(Location location, SkylarkSemantics semantics)
+  public NestedSet<Artifact> getTransitiveDeps(Location location, StarlarkSemantics semantics)
       throws EvalException {
     checkLegacyJavaProviderFlag(location, semantics);
     JavaCompilationArgsProvider compilationArgsProvider =
@@ -95,8 +95,8 @@
   }
 
   @Override
-  public NestedSet<Artifact> getTransitiveRuntimeDeps(Location location, SkylarkSemantics semantics)
-      throws EvalException {
+  public NestedSet<Artifact> getTransitiveRuntimeDeps(
+      Location location, StarlarkSemantics semantics) throws EvalException {
     checkLegacyJavaProviderFlag(location, semantics);
     JavaCompilationArgsProvider compilationArgsProvider =
         getProvider(JavaCompilationArgsProvider.class);
@@ -107,7 +107,7 @@
   }
 
   @Override
-  public NestedSet<Artifact> getTransitiveSourceJars(Location location, SkylarkSemantics semantics)
+  public NestedSet<Artifact> getTransitiveSourceJars(Location location, StarlarkSemantics semantics)
       throws EvalException {
     checkLegacyJavaProviderFlag(location, semantics);
     JavaSourceJarsProvider sourceJarsProvider = getProvider(JavaSourceJarsProvider.class);
@@ -118,14 +118,14 @@
   }
 
   @Override
-  public JavaRuleOutputJarsProvider getOutputJars(Location location, SkylarkSemantics semantics)
+  public JavaRuleOutputJarsProvider getOutputJars(Location location, StarlarkSemantics semantics)
       throws EvalException {
     checkLegacyJavaProviderFlag(location, semantics);
     return getProvider(JavaRuleOutputJarsProvider.class);
   }
 
   @Override
-  public NestedSet<Label> getTransitiveExports(Location location, SkylarkSemantics semantics)
+  public NestedSet<Label> getTransitiveExports(Location location, StarlarkSemantics semantics)
       throws EvalException {
     checkLegacyJavaProviderFlag(location, semantics);
     JavaExportsProvider exportsProvider = getProvider(JavaExportsProvider.class);
@@ -137,7 +137,7 @@
   }
 
   @Override
-  public JavaGenJarsProvider getGenJarsProvider(Location location, SkylarkSemantics semantics)
+  public JavaGenJarsProvider getGenJarsProvider(Location location, StarlarkSemantics semantics)
       throws EvalException {
     checkLegacyJavaProviderFlag(location, semantics);
     return getProvider(JavaGenJarsProvider.class);
@@ -145,12 +145,12 @@
 
   @Override
   public JavaCompilationInfoProvider getCompilationInfoProvider(
-      Location location, SkylarkSemantics semantics) throws EvalException {
+      Location location, StarlarkSemantics semantics) throws EvalException {
     checkLegacyJavaProviderFlag(location, semantics);
     return getProvider(JavaCompilationInfoProvider.class);
   }
 
-  private void checkLegacyJavaProviderFlag(Location location, SkylarkSemantics semantics)
+  private void checkLegacyJavaProviderFlag(Location location, StarlarkSemantics semantics)
       throws EvalException {
     if (semantics.incompatibleDisallowLegacyJavaProvider()) {
       throw new EvalException(
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 a29d96e..95365bb 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
@@ -33,7 +33,7 @@
 import com.google.devtools.build.lib.syntax.Runtime;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.Type;
 import java.util.List;
 import javax.annotation.Nullable;
@@ -137,7 +137,7 @@
       Object targetLabel,
       Object javaToolchain,
       Location location,
-      SkylarkSemantics semantics)
+      StarlarkSemantics semantics)
       throws EvalException {
     return JavaInfoBuildHelper.getInstance()
         .buildIjar(
@@ -156,7 +156,7 @@
       Label targetLabel,
       Object javaToolchain,
       Location location,
-      SkylarkSemantics semantics)
+      StarlarkSemantics semantics)
       throws EvalException {
     return JavaInfoBuildHelper.getInstance()
         .stampJar(actions, jar, targetLabel, javaToolchain, semantics, location);
@@ -171,7 +171,7 @@
       Object javaToolchain,
       Object hostJavabase,
       Location location,
-      SkylarkSemantics semantics)
+      StarlarkSemantics semantics)
       throws EvalException {
     return JavaInfoBuildHelper.getInstance()
         .packSourceFiles(
@@ -194,9 +194,9 @@
       Object javaToolchainAttr,
       Object javaToolchain,
       Location location,
-      SkylarkSemantics skylarkSemantics)
+      StarlarkSemantics starlarkSemantics)
       throws EvalException {
-    if (skylarkSemantics.incompatibleUseToolchainProvidersInJavaCommon()) {
+    if (starlarkSemantics.incompatibleUseToolchainProvidersInJavaCommon()) {
       // TODO(b/122738702): remove support for passing toolchains as configured targets
       if (javaToolchain == Runtime.NONE
           || skylarkRuleContext != Runtime.NONE
@@ -221,7 +221,7 @@
                   .getValue((String) javaToolchainAttr);
       JavaToolchainProvider toolchain =
           JavaInfoBuildHelper.getInstance()
-              .getJavaToolchainProvider(skylarkSemantics, location, javaToolchainConfigTarget);
+              .getJavaToolchainProvider(starlarkSemantics, location, javaToolchainConfigTarget);
       // This can also be called from Skylark rules that may or may not have an appropriate
       // javacopts attribute.
       RuleContext ruleContext = ((SkylarkRuleContext) skylarkRuleContext).getRuleContext();
@@ -279,7 +279,7 @@
    * --experimental_java_common_create_provider_enabled_packages} flag.
    */
   private static void checkCallPathInWhitelistedPackages(
-      SkylarkSemantics semantics, Location location, String callPath) throws EvalException {
+      StarlarkSemantics semantics, Location location, String callPath) throws EvalException {
     List<String> whitelistedPackagesList =
         semantics.experimentalJavaCommonCreateProviderEnabledPackages();
     if (whitelistedPackagesList.stream().noneMatch(path -> callPath.startsWith(path))) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
index f6df9f6e..8a7be99 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
@@ -73,7 +73,7 @@
 import com.google.devtools.build.lib.rules.cpp.LibraryToLink;
 import com.google.devtools.build.lib.rules.cpp.LibraryToLink.CcLinkingContext;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.FileType;
 import com.google.devtools.build.lib.util.FileTypeSet;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -144,7 +144,7 @@
 
   static class Builder {
     private final RuleContext context;
-    private final SkylarkSemantics semantics;
+    private final StarlarkSemantics semantics;
     private final BuildConfiguration buildConfiguration;
     private Optional<CompilationAttributes> compilationAttributes = Optional.absent();
     private Optional<ResourceAttributes> resourceAttributes = Optional.absent();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
index c466bf8..c416d07 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProvider.java
@@ -40,7 +40,7 @@
 import com.google.devtools.build.lib.skylarkbuildapi.apple.ObjcProviderApi;
 import com.google.devtools.build.lib.syntax.EvalUtils;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.Collections;
 import java.util.HashMap;
@@ -346,7 +346,7 @@
     HAS_WATCH2_EXTENSION,
   }
 
-  private final SkylarkSemantics semantics;
+  private final StarlarkSemantics semantics;
   private final ImmutableMap<Key<?>, NestedSet<?>> items;
 
   // Items which should not be propagated to dependents.
@@ -664,7 +664,7 @@
   public static final BuiltinProvider<ObjcProvider> SKYLARK_CONSTRUCTOR = new Constructor();
 
   private ObjcProvider(
-      SkylarkSemantics semantics,
+      StarlarkSemantics semantics,
       ImmutableMap<Key<?>, NestedSet<?>> items,
       ImmutableMap<Key<?>, NestedSet<?>> nonPropagatedItems,
       ImmutableMap<Key<?>, NestedSet<?>> strictDependencyItems) {
@@ -930,13 +930,13 @@
    * several transitive dependencies.
    */
   public static final class Builder {
-    private final SkylarkSemantics skylarkSemantics;
+    private final StarlarkSemantics starlarkSemantics;
     private final Map<Key<?>, NestedSetBuilder<?>> items = new HashMap<>();
     private final Map<Key<?>, NestedSetBuilder<?>> nonPropagatedItems = new HashMap<>();
     private final Map<Key<?>, NestedSetBuilder<?>> strictDependencyItems = new HashMap<>();
 
-    public Builder(SkylarkSemantics semantics) {
-      this.skylarkSemantics = semantics;
+    public Builder(StarlarkSemantics semantics) {
+      this.starlarkSemantics = semantics;
     }
 
     private static void maybeAddEmptyBuilder(Map<Key<?>, NestedSetBuilder<?>> set, Key<?> key) {
@@ -1136,8 +1136,10 @@
         strictDependencyBuilder.put(typeEntry.getKey(), typeEntry.getValue().build());
       }
 
-      return new ObjcProvider(skylarkSemantics,
-          propagatedBuilder.build(), nonPropagatedBuilder.build(),
+      return new ObjcProvider(
+          starlarkSemantics,
+          propagatedBuilder.build(),
+          nonPropagatedBuilder.build(),
           strictDependencyBuilder.build());
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/ResolvedFileFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/ResolvedFileFunction.java
index 3bb1d18..79f2f57 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/ResolvedFileFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/ResolvedFileFunction.java
@@ -26,7 +26,7 @@
 import com.google.devtools.build.lib.syntax.BuildFileAST;
 import com.google.devtools.build.lib.syntax.Mutability;
 import com.google.devtools.build.lib.syntax.ParserInputSource;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.skyframe.SkyFunction;
 import com.google.devtools.build.skyframe.SkyFunctionException;
@@ -46,8 +46,8 @@
       throws InterruptedException, SkyFunctionException {
 
     ResolvedFileKey key = (ResolvedFileKey) skyKey;
-    SkylarkSemantics skylarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
-    if (skylarkSemantics == null) {
+    StarlarkSemantics starlarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
+    if (starlarkSemantics == null) {
       return null;
     }
     FileValue fileValue = (FileValue) env.getValue(FileValue.key(key.getPath()));
@@ -76,7 +76,7 @@
         try (Mutability mutability = Mutability.create("resolved file %s", key.getPath())) {
           resolvedEnvironment =
               com.google.devtools.build.lib.syntax.Environment.builder(mutability)
-                  .setSemantics(skylarkSemantics)
+                  .setSemantics(starlarkSemantics)
                   .setGlobals(BazelLibrary.GLOBALS)
                   .build();
           if (!ast.exec(resolvedEnvironment, env.getListener())) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
index 4e4a32b..30ab3ab 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java
@@ -23,7 +23,7 @@
 import com.google.devtools.build.lib.syntax.BuildFileAST;
 import com.google.devtools.build.lib.syntax.Mutability;
 import com.google.devtools.build.lib.syntax.Runtime;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -103,8 +103,8 @@
     if (!fileValue.isFile()) {
       return ASTFileLookupValue.forBadFile(fileLabel);
     }
-    SkylarkSemantics skylarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
-    if (skylarkSemantics == null) {
+    StarlarkSemantics starlarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
+    if (starlarkSemantics == null) {
       return null;
     }
 
@@ -119,7 +119,7 @@
                 .createSkylarkRuleClassEnvironment(
                     fileLabel,
                     mutability,
-                    skylarkSemantics,
+                    starlarkSemantics,
                     env.getListener(),
                     // the three below don't matter for extracting the ValidationEnvironment:
                     /*astFileContentHashCode=*/ null,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index 8aa428e..f4dbbbe 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -61,7 +61,7 @@
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.ParserInputSource;
 import com.google.devtools.build.lib.syntax.SkylarkImport;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.Statement;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
@@ -287,8 +287,8 @@
    */
   private SkyValue getExternalPackage(Environment env, Root packageLookupPath)
       throws PackageFunctionException, InterruptedException {
-    SkylarkSemantics skylarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
-    if (skylarkSemantics == null) {
+    StarlarkSemantics starlarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
+    if (starlarkSemantics == null) {
       return null;
     }
     RootedPath workspacePath =
@@ -325,9 +325,9 @@
     if (packageFactory != null) {
       packageFactory.afterDoneLoadingPackage(
           pkg,
-          skylarkSemantics,
+          starlarkSemantics,
           // This is a lie.
-          /*loadTimeNanos=*/0L);
+          /*loadTimeNanos=*/ 0L);
     }
     return new PackageValue(pkg);
   }
@@ -402,8 +402,8 @@
       return null;
     }
 
-    SkylarkSemantics skylarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
-    if (skylarkSemantics == null) {
+    StarlarkSemantics starlarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
+    if (starlarkSemantics == null) {
       return null;
     }
 
@@ -440,7 +440,7 @@
             buildFileRootedPath,
             buildFileValue,
             defaultVisibility,
-            skylarkSemantics,
+            starlarkSemantics,
             preludeStatements,
             packageLookupValue.getRoot(),
             env);
@@ -501,7 +501,7 @@
     // We know this SkyFunction will not be called again, so we can remove the cache entry.
     packageFunctionCache.invalidate(packageId);
 
-    packageFactory.afterDoneLoadingPackage(pkg, skylarkSemantics, packageCacheEntry.loadTimeNanos);
+    packageFactory.afterDoneLoadingPackage(pkg, starlarkSemantics, packageCacheEntry.loadTimeNanos);
     return new PackageValue(pkg);
   }
 
@@ -1115,7 +1115,7 @@
       RootedPath buildFilePath,
       @Nullable FileValue buildFileValue,
       RuleVisibility defaultVisibility,
-      SkylarkSemantics skylarkSemantics,
+      StarlarkSemantics starlarkSemantics,
       List<Statement> preludeStatements,
       Root packageRoot,
       Environment env)
@@ -1198,7 +1198,7 @@
                 importResult.importMap,
                 importResult.fileDependencies,
                 defaultVisibility,
-                skylarkSemantics,
+                starlarkSemantics,
                 globberWithSkyframeGlobDeps);
         long loadTimeNanos = Math.max(BlazeClock.nanoTime() - startTimeNanos, 0L);
         packageCacheEntry = new LoadedPackageCacheEntry(
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
index 19c7341..5d272bc 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
@@ -29,7 +29,7 @@
 import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ConflictException;
 import com.google.devtools.build.lib.skyframe.serialization.UnshareableValue;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.skyframe.AbstractSkyKey;
 import com.google.devtools.build.skyframe.Injectable;
 import com.google.devtools.build.skyframe.SkyFunction;
@@ -83,7 +83,7 @@
   public static final Precomputed<RuleVisibility> DEFAULT_VISIBILITY =
       new Precomputed<>(Key.create("default_visibility"));
 
-  public static final Precomputed<SkylarkSemantics> SKYLARK_SEMANTICS =
+  public static final Precomputed<StarlarkSemantics> SKYLARK_SEMANTICS =
       new Precomputed<>(Key.create("skylark_semantics"));
 
   static final Precomputed<UUID> BUILD_ID =
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index 69193b3..7fd6e4f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -138,7 +138,7 @@
 import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ActionCompletedReceiver;
 import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ProgressSupplier;
 import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternKey;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.AbruptExitException;
 import com.google.devtools.build.lib.util.ResourceUsage;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
@@ -1041,8 +1041,8 @@
     PrecomputedValue.DEFAULT_VISIBILITY.set(injectable(), defaultVisibility);
   }
 
-  protected void setSkylarkSemantics(SkylarkSemantics skylarkSemantics) {
-    PrecomputedValue.SKYLARK_SEMANTICS.set(injectable(), skylarkSemantics);
+  protected void setSkylarkSemantics(StarlarkSemantics starlarkSemantics) {
+    PrecomputedValue.SKYLARK_SEMANTICS.set(injectable(), starlarkSemantics);
   }
 
   public void injectExtraPrecomputedValues(
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
index 2644601..cb0d829 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java
@@ -51,7 +51,7 @@
 import com.google.devtools.build.lib.syntax.SkylarkImport;
 import com.google.devtools.build.lib.syntax.SkylarkImports;
 import com.google.devtools.build.lib.syntax.SkylarkImports.SkylarkImportSyntaxException;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.Statement;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.lib.vfs.RootedPath;
@@ -225,12 +225,12 @@
       throws InconsistentFilesystemException, SkylarkImportFailedException, InterruptedException {
     PathFragment filePath = fileLabel.toPathFragment();
 
-    SkylarkSemantics skylarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
-    if (skylarkSemantics == null) {
+    StarlarkSemantics starlarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
+    if (starlarkSemantics == null) {
       return null;
     }
 
-    if (skylarkSemantics.incompatibleDisallowLoadLabelsToCrossPackageBoundaries()) {
+    if (starlarkSemantics.incompatibleDisallowLoadLabelsToCrossPackageBoundaries()) {
       PathFragment dir = Label.getContainingDirectory(fileLabel);
       PackageIdentifier dirId =
           PackageIdentifier.create(fileLabel.getPackageIdentifier().getRepository(), dir);
@@ -385,7 +385,7 @@
             ast,
             fileLabel,
             extensionsForImports,
-            skylarkSemantics,
+            starlarkSemantics,
             env,
             inWorkspace,
             repositoryMapping);
@@ -503,7 +503,7 @@
       BuildFileAST ast,
       Label extensionLabel,
       Map<String, Extension> importMap,
-      SkylarkSemantics skylarkSemantics,
+      StarlarkSemantics starlarkSemantics,
       Environment env,
       boolean inWorkspace,
       ImmutableMap<RepositoryName, RepositoryName> repositoryMapping)
@@ -519,7 +519,7 @@
           ruleClassProvider.createSkylarkRuleClassEnvironment(
               extensionLabel,
               mutability,
-              skylarkSemantics,
+              starlarkSemantics,
               eventHandler,
               ast.getContentHashCode(),
               importMap,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
index 3f31dd7..0874f6c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
@@ -28,7 +28,7 @@
 import com.google.devtools.build.lib.syntax.BuildFileAST;
 import com.google.devtools.build.lib.syntax.Environment.Extension;
 import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.RootedPath;
 import com.google.devtools.build.skyframe.SkyFunction;
 import com.google.devtools.build.skyframe.SkyFunctionException;
@@ -73,8 +73,8 @@
     if (workspaceASTValue == null) {
       return null;
     }
-    SkylarkSemantics skylarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
-    if (skylarkSemantics == null) {
+    StarlarkSemantics starlarkSemantics = PrecomputedValue.SKYLARK_SEMANTICS.get(env);
+    if (starlarkSemantics == null) {
       return null;
     }
 
@@ -134,7 +134,7 @@
       if (importResult == null) {
         return null;
       }
-      parser.execute(ast, importResult.importMap, skylarkSemantics, key);
+      parser.execute(ast, importResult.importMap, starlarkSemantics, key);
     } catch (NoSuchPackageException e) {
       throw new WorkspaceFileFunctionException(e, Transience.PERSISTENT);
     } catch (NameConflictException e) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
index df9b983..d08f9f0 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
@@ -69,7 +69,7 @@
 import com.google.devtools.build.lib.skyframe.WorkspaceASTFunction;
 import com.google.devtools.build.lib.skyframe.WorkspaceFileFunction;
 import com.google.devtools.build.lib.skyframe.WorkspaceNameFunction;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -123,7 +123,7 @@
   private final Reporter reporter;
   protected final ConfiguredRuleClassProvider ruleClassProvider;
   private final PackageFactory pkgFactory;
-  protected SkylarkSemantics skylarkSemantics;
+  protected StarlarkSemantics starlarkSemantics;
   protected final ImmutableMap<SkyFunctionName, SkyFunction> extraSkyFunctions;
   private final AtomicReference<PathPackageLocator> pkgLocatorRef;
   protected final ExternalFilesHelper externalFilesHelper;
@@ -140,7 +140,7 @@
     private ExternalFileAction externalFileAction;
     protected ExternalFilesHelper externalFilesHelper;
     protected ConfiguredRuleClassProvider ruleClassProvider = getDefaultRuleClassProvider();
-    protected SkylarkSemantics skylarkSemantics;
+    protected StarlarkSemantics starlarkSemantics;
     protected Reporter reporter = new Reporter(new EventBus());
     protected Map<SkyFunctionName, SkyFunction> extraSkyFunctions = new HashMap<>();
     List<PrecomputedValue.Injected> extraPrecomputedValues = new ArrayList<>();
@@ -174,13 +174,13 @@
       return this;
     }
 
-    public Builder setSkylarkSemantics(SkylarkSemantics semantics) {
-      this.skylarkSemantics = semantics;
+    public Builder setSkylarkSemantics(StarlarkSemantics semantics) {
+      this.starlarkSemantics = semantics;
       return this;
     }
 
     public Builder useDefaultSkylarkSemantics() {
-      this.skylarkSemantics = SkylarkSemantics.DEFAULT_SEMANTICS;
+      this.starlarkSemantics = StarlarkSemantics.DEFAULT_SEMANTICS;
       return this;
     }
 
@@ -222,7 +222,7 @@
 
     /** Throws {@link IllegalArgumentException} if builder args are incomplete/inconsistent. */
     protected void validate() {
-      if (skylarkSemantics == null) {
+      if (starlarkSemantics == null) {
         throw new IllegalArgumentException(
             "must call either setSkylarkSemantics or useDefaultSkylarkSemantics");
       }
@@ -242,7 +242,7 @@
 
   AbstractPackageLoader(Builder builder) {
     this.ruleClassProvider = builder.ruleClassProvider;
-    this.skylarkSemantics = builder.skylarkSemantics;
+    this.starlarkSemantics = builder.starlarkSemantics;
     this.reporter = builder.reporter;
     this.extraSkyFunctions = ImmutableMap.copyOf(builder.extraSkyFunctions);
     this.pkgLocatorRef = builder.pkgLocatorRef;
@@ -254,7 +254,7 @@
 
     this.preinjectedDiff =
         makePreinjectedDiff(
-            skylarkSemantics,
+            starlarkSemantics,
             builder.pkgLocator,
             ImmutableList.copyOf(builder.extraPrecomputedValues));
     pkgFactory =
@@ -267,7 +267,7 @@
   }
 
   private static ImmutableDiff makePreinjectedDiff(
-      SkylarkSemantics skylarkSemantics,
+      StarlarkSemantics starlarkSemantics,
       PathPackageLocator pkgLocator,
       ImmutableList<PrecomputedValue.Injected> extraPrecomputedValues) {
     final Map<SkyKey, SkyValue> valuesToInject = new HashMap<>();
@@ -288,7 +288,7 @@
     }
     PrecomputedValue.PATH_PACKAGE_LOCATOR.set(injectable, pkgLocator);
     PrecomputedValue.DEFAULT_VISIBILITY.set(injectable, ConstantRuleVisibility.PRIVATE);
-    PrecomputedValue.SKYLARK_SEMANTICS.set(injectable, skylarkSemantics);
+    PrecomputedValue.SKYLARK_SEMANTICS.set(injectable, starlarkSemantics);
     return new ImmutableDiff(ImmutableList.of(), valuesToInject);
   }
 
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 156da34..d4b0974 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
@@ -27,7 +27,7 @@
 import com.google.devtools.build.lib.syntax.FuncallExpression;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkList;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 import com.google.devtools.build.lib.syntax.UserDefinedFunction;
 
 /**
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 e835f29..7e8bee7 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
@@ -34,7 +34,7 @@
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 import java.util.Map;
 import javax.annotation.Nullable;
 
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 74f1453..aac3675 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
@@ -31,7 +31,7 @@
 import com.google.devtools.build.lib.syntax.Runtime.UnboundMarker;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkList;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /**
  * Interface for a global Skylark library containing rule-related helper and registration functions.
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TransitiveInfoCollectionApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TransitiveInfoCollectionApi.java
index 1e5dde3..790ac7d 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TransitiveInfoCollectionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/TransitiveInfoCollectionApi.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /**
  * Interface for a build target.
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcProviderApi.java
index 83d8aba..0b9a4bc 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcProviderApi.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /**
  * An interface for an info type that provides all compiling and linking information in the
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 35edd49..12e5fa6 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
@@ -25,7 +25,7 @@
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkList;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import java.util.List;
 
 /**
@@ -125,6 +125,6 @@
       useLocation = true,
       useSkylarkSemantics = true)
   public ConfigurationTransitionApi analysisTestTransition(
-      SkylarkDict<String, String> changedSettings, Location location, SkylarkSemantics semantics)
+      SkylarkDict<String, String> changedSettings, Location location, StarlarkSemantics semantics)
       throws EvalException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainProviderApi.java
index 997a9bb..edeb44a 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcToolchainProviderApi.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 import javax.annotation.Nullable;
 
 /** Information about the C++ toolchain. */
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCcLinkParamsProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCcLinkParamsProviderApi.java
index dd45082..31b659d 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCcLinkParamsProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCcLinkParamsProviderApi.java
@@ -22,7 +22,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
 import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /** A target that provides C++ libraries to be linked into Java targets. */
 @SkylarkModule(
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 873ab5e..af1e4f7 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
@@ -31,7 +31,7 @@
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import javax.annotation.Nullable;
 
 /** Utilities for Java compilation support in Skylark. */
@@ -392,7 +392,7 @@
       Object targetLabel,
       Object javaToolchain,
       Location location,
-      SkylarkSemantics semantics)
+      StarlarkSemantics semantics)
       throws EvalException;
 
   @SkylarkCallable(
@@ -445,7 +445,7 @@
       Label targetLabel,
       Object javaToolchain,
       Location location,
-      SkylarkSemantics semantics)
+      StarlarkSemantics semantics)
       throws EvalException;
 
   @SkylarkCallable(
@@ -515,7 +515,7 @@
       Object javaToolchain,
       Object hostJavabase,
       Location location,
-      SkylarkSemantics semantics)
+      StarlarkSemantics semantics)
       throws EvalException;
 
   @SkylarkCallable(
@@ -561,7 +561,7 @@
       Object javaToolchainAttr,
       Object javaToolchain,
       Location loc,
-      SkylarkSemantics semantics)
+      StarlarkSemantics semantics)
       throws EvalException;
 
   @SkylarkCallable(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaSkylarkApiProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaSkylarkApiProviderApi.java
index b47b29c..9fb4955 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaSkylarkApiProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaSkylarkApiProviderApi.java
@@ -22,7 +22,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
 import com.google.devtools.build.lib.syntax.EvalException;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 
 /**
  * Provides access to information about Java rules. Every Java-related target provides
@@ -45,7 +45,7 @@
       useSkylarkSemantics = true,
       useLocation = true,
       structField = true)
-  public NestedSet<FileT> getSourceJars(Location location, SkylarkSemantics semantics)
+  public NestedSet<FileT> getSourceJars(Location location, StarlarkSemantics semantics)
       throws EvalException;
 
   @SkylarkCallable(
@@ -54,7 +54,7 @@
       useSkylarkSemantics = true,
       useLocation = true,
       structField = true)
-  public NestedSet<FileT> getTransitiveDeps(Location location, SkylarkSemantics semantics)
+  public NestedSet<FileT> getTransitiveDeps(Location location, StarlarkSemantics semantics)
       throws EvalException;
 
   @SkylarkCallable(
@@ -63,7 +63,7 @@
       useSkylarkSemantics = true,
       useLocation = true,
       structField = true)
-  public NestedSet<FileT> getTransitiveRuntimeDeps(Location location, SkylarkSemantics semantics)
+  public NestedSet<FileT> getTransitiveRuntimeDeps(Location location, StarlarkSemantics semantics)
       throws EvalException;
 
   @SkylarkCallable(
@@ -74,7 +74,7 @@
       useSkylarkSemantics = true,
       useLocation = true,
       structField = true)
-  public NestedSet<FileT> getTransitiveSourceJars(Location location, SkylarkSemantics semantics)
+  public NestedSet<FileT> getTransitiveSourceJars(Location location, StarlarkSemantics semantics)
       throws EvalException;
 
   @SkylarkCallable(
@@ -84,7 +84,7 @@
       useLocation = true,
       structField = true)
   public JavaRuleOutputJarsProviderApi<?> getOutputJars(
-      Location location, SkylarkSemantics semantics) throws EvalException;
+      Location location, StarlarkSemantics semantics) throws EvalException;
 
   @SkylarkCallable(
       name = "transitive_exports",
@@ -92,7 +92,7 @@
       useSkylarkSemantics = true,
       useLocation = true,
       doc = "Returns transitive set of labels that are being exported from this rule.")
-  public NestedSet<Label> getTransitiveExports(Location location, SkylarkSemantics semantics)
+  public NestedSet<Label> getTransitiveExports(Location location, StarlarkSemantics semantics)
       throws EvalException;
 
   @SkylarkCallable(
@@ -103,7 +103,7 @@
       useLocation = true,
       doc = "Returns information about annotation processing for this Java target.")
   public JavaAnnotationProcessingApi<?> getGenJarsProvider(
-      Location location, SkylarkSemantics semantics) throws EvalException;
+      Location location, StarlarkSemantics semantics) throws EvalException;
 
   @SkylarkCallable(
       name = "compilation_info",
@@ -113,5 +113,5 @@
       useLocation = true,
       doc = "Returns compilation information for this Java target.")
   public JavaCompilationInfoProviderApi<?> getCompilationInfoProvider(
-      Location location, SkylarkSemantics semantics) throws EvalException;
+      Location location, StarlarkSemantics semantics) throws EvalException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/ConstraintCollectionApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/ConstraintCollectionApi.java
index 938f53b..ef00565 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/ConstraintCollectionApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/ConstraintCollectionApi.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.syntax.SkylarkIndexable;
 import com.google.devtools.build.lib.syntax.SkylarkList;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 import javax.annotation.Nullable;
 
 /** Info object representing data about a specific platform. */
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/ConstraintSettingInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/ConstraintSettingInfoApi.java
index db77b97..a02cc66 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/ConstraintSettingInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/ConstraintSettingInfoApi.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 import javax.annotation.Nullable;
 
 /** Info object representing a specific constraint setting that may be used to define a platform. */
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/ConstraintValueInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/ConstraintValueInfoApi.java
index 88d8acc..9a7e15a 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/ConstraintValueInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/ConstraintValueInfoApi.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /**
  * Info object representing a value for a constraint setting that can be used to define a platform.
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/PlatformCommonApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/PlatformCommonApi.java
index db27f2b..5db6e46 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/PlatformCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform/PlatformCommonApi.java
@@ -17,7 +17,7 @@
 import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /** Module containing functions to interact with the platform APIs. */
 @SkylarkModule(
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 bfa34c5..cc89c85 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
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /** Info object representing data about a specific platform. */
 @SkylarkModule(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkinterface/Param.java b/src/main/java/com/google/devtools/build/lib/skylarkinterface/Param.java
index bb1ec1d..f44bcbf 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkinterface/Param.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkinterface/Param.java
@@ -13,8 +13,8 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skylarkinterface;
 
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 
@@ -139,7 +139,7 @@
    * <p>Note that at most one of {@link #enableOnlyWithFlag} and {@link #disableWithFlag} can be
    * non-NONE.
    */
-  SkylarkSemantics.FlagIdentifier enableOnlyWithFlag() default FlagIdentifier.NONE;
+  StarlarkSemantics.FlagIdentifier enableOnlyWithFlag() default FlagIdentifier.NONE;
 
   /**
    * If not NONE, the annotated parameter will only be present if the given semantic flag is false.
@@ -149,7 +149,7 @@
    * <p>Note that at most one of {@link #enableOnlyWithFlag} and {@link #disableWithFlag} can be
    * non-NONE.
    */
-  SkylarkSemantics.FlagIdentifier disableWithFlag() default FlagIdentifier.NONE;
+  StarlarkSemantics.FlagIdentifier disableWithFlag() default FlagIdentifier.NONE;
 
   /**
    * Value for the parameter when the parameter is "disabled" based on semantic flags. (When the
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 546d255..70206a6 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
@@ -13,8 +13,8 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skylarkinterface;
 
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -46,10 +46,10 @@
  *   <li>If structField=true, there must be zero user-supplied parameters.
  *   <li>The underlying java method's parameters must be supplied in the following order:
  *       <pre>method([positionals]*[named args]*(extra positionals list)(extra kwargs)
- *       (Location)(FuncallExpression)(Envrionment)(SkylarkSemantics)(StarlarkContext))</pre>
+ *       (Location)(FuncallExpression)(Envrionment)(StarlarkSemantics)(StarlarkContext))</pre>
  *       where (extra positionals list) is a SkylarkList if extraPositionals is defined, (extra
  *       kwargs) is a SkylarkDict if extraKeywords is defined, and Location, FuncallExpression,
- *       Environment, and SkylarkSemantics are supplied by the interpreter if and only if
+ *       Environment, and StarlarkSemantics are supplied by the interpreter if and only if
  *       useLocation, useAst, useEnvironment, and useSkylarkSemantics are specified, respectively.
  *   <li>The number of method parameters much match the number of annotation-declared parameters
  *       plus the number of interpreter-supplied parameters.
@@ -165,7 +165,7 @@
 
   /**
    * If true, the Skylark semantics will be passed as an argument of the annotated function. (Thus,
-   * the annotated method signature must contain SkylarkSemantics as a parameter. See the
+   * the annotated method signature must contain StarlarkSemantics as a parameter. See the
    * interface-level javadoc for details.)
    */
   boolean useSkylarkSemantics() default false;
@@ -182,12 +182,12 @@
    * Note that at most one of {@link #enableOnlyWithFlag} and {@link #disableWithFlag} can be
    * non-NONE.
    */
-  SkylarkSemantics.FlagIdentifier enableOnlyWithFlag() default FlagIdentifier.NONE;
+  StarlarkSemantics.FlagIdentifier enableOnlyWithFlag() default FlagIdentifier.NONE;
 
   /**
    * If not NONE, the annotated method will only be callable if the given semantic flag is false.
    * Note that at most one of {@link #enableOnlyWithFlag} and {@link #disableWithFlag} can be
    * non-NONE.
    */
-  SkylarkSemantics.FlagIdentifier disableWithFlag() default FlagIdentifier.NONE;
+  StarlarkSemantics.FlagIdentifier disableWithFlag() default FlagIdentifier.NONE;
 }
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 ac7aab0..3dc4a79 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
@@ -18,7 +18,7 @@
 import com.google.common.collect.SetMultimap;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -84,7 +84,7 @@
   private static final String AST = "com.google.devtools.build.lib.syntax.FuncallExpression";
   private static final String ENVIRONMENT = "com.google.devtools.build.lib.syntax.Environment";
   private static final String SKYLARK_SEMANTICS =
-      "com.google.devtools.build.lib.syntax.SkylarkSemantics";
+      "com.google.devtools.build.lib.syntax.StarlarkSemantics";
   private static final String STARLARK_CONTEXT =
       "com.google.devtools.build.lib.skylarkinterface.StarlarkContext";
 
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
index 0a31aaa..75fc285 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/DotExpression.java
@@ -54,7 +54,7 @@
 
   /** Throws the correct error message if the result is null depending on the objValue. */
   public static Object checkResult(
-      Object objValue, Object result, String name, Location loc, SkylarkSemantics semantics)
+      Object objValue, Object result, String name, Location loc, StarlarkSemantics semantics)
       throws EvalException {
     if (result != null) {
       return result;
@@ -63,7 +63,7 @@
   }
 
   static EvalException getMissingFieldException(
-      Object objValue, String name, Location loc, SkylarkSemantics semantics, String accessName) {
+      Object objValue, String name, Location loc, StarlarkSemantics semantics, String accessName) {
     String suffix = "";
     EvalException toSuppress = null;
     if (objValue instanceof ClassObject) {
@@ -101,7 +101,7 @@
   }
 
   /** Returns whether the given object has a method with the given name. */
-  static boolean hasMethod(SkylarkSemantics semantics, Object obj, String name) {
+  static boolean hasMethod(StarlarkSemantics semantics, Object obj, String name) {
     Class<?> cls = obj instanceof Class ? (Class<?>) obj : obj.getClass();
     if (Runtime.getBuiltinRegistry().getFunctionNames(cls).contains(name)) {
       return true;
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Environment.java b/src/main/java/com/google/devtools/build/lib/syntax/Environment.java
index 3b74a32..4a6d014 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Environment.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Environment.java
@@ -350,7 +350,7 @@
      * global objects.
      */
     public static GlobalFrame filterOutRestrictedBindings(
-        Mutability mutability, GlobalFrame parent, SkylarkSemantics semantics) {
+        Mutability mutability, GlobalFrame parent, StarlarkSemantics semantics) {
       if (parent == null) {
         return new GlobalFrame(mutability);
       }
@@ -745,7 +745,7 @@
   private final Frame dynamicFrame;
 
   /** The semantics options that affect how Skylark code is evaluated. */
-  private final SkylarkSemantics semantics;
+  private final StarlarkSemantics semantics;
 
   private final StarlarkContext starlarkContext;
 
@@ -876,7 +876,7 @@
   private Environment(
       GlobalFrame globalFrame,
       LexicalFrame dynamicFrame,
-      SkylarkSemantics semantics,
+      StarlarkSemantics semantics,
       StarlarkContext starlarkContext,
       EventHandler eventHandler,
       Map<String, Extension> importedExtensions,
@@ -905,7 +905,7 @@
   public static class Builder {
     private final Mutability mutability;
     @Nullable private GlobalFrame parent;
-    @Nullable private SkylarkSemantics semantics;
+    @Nullable private StarlarkSemantics semantics;
     @Nullable private StarlarkContext starlarkContext;
     @Nullable private EventHandler eventHandler;
     @Nullable private Map<String, Extension> importedExtensions;
@@ -929,13 +929,13 @@
       return this;
     }
 
-    public Builder setSemantics(SkylarkSemantics semantics) {
+    public Builder setSemantics(StarlarkSemantics semantics) {
       this.semantics = semantics;
       return this;
     }
 
     public Builder useDefaultSemantics() {
-      this.semantics = SkylarkSemantics.DEFAULT_SEMANTICS;
+      this.semantics = StarlarkSemantics.DEFAULT_SEMANTICS;
       return this;
     }
 
@@ -1184,7 +1184,7 @@
     return globalFrame.restrictedBindings;
   }
 
-  public SkylarkSemantics getSemantics() {
+  public StarlarkSemantics getSemantics() {
     return semantics;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FlagGuardedValue.java b/src/main/java/com/google/devtools/build/lib/syntax/FlagGuardedValue.java
index e21c23d..d79e901 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FlagGuardedValue.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FlagGuardedValue.java
@@ -16,7 +16,7 @@
 
 import com.google.common.base.Preconditions;
 import com.google.devtools.build.lib.events.Location;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /**
  * Wrapper on a value that controls its accessibility in Starlark based on the value of a
@@ -65,14 +65,14 @@
   }
 
   /**
-   * Returns an {@link EvalException} with error appropriate to throw when one attempts to
-   * access this guard's protected object when it should be inaccessible in the given semantics.
+   * Returns an {@link EvalException} with error appropriate to throw when one attempts to access
+   * this guard's protected object when it should be inaccessible in the given semantics.
    *
-   * @throws IllegalArgumentException if {@link #isObjectAccessibleUsingSemantics} is true
-   *     given the semantics
+   * @throws IllegalArgumentException if {@link #isObjectAccessibleUsingSemantics} is true given the
+   *     semantics
    */
   public EvalException getEvalExceptionFromAttemptingAccess(
-      Location location, SkylarkSemantics semantics, String symbolDescription) {
+      Location location, StarlarkSemantics semantics, String symbolDescription) {
     Preconditions.checkArgument(!isObjectAccessibleUsingSemantics(semantics),
         "getEvalExceptionFromAttemptingAccess should only be called if the underlying "
             + "object is inaccessible given the semantics");
@@ -93,23 +93,21 @@
   }
 
   /**
-   * Returns this guard's underlying object. This should be called when appropriate validation
-   * has occurred to ensure that the object is accessible with the given semantics.
+   * Returns this guard's underlying object. This should be called when appropriate validation has
+   * occurred to ensure that the object is accessible with the given semantics.
    *
-   * @throws IllegalArgumentException if {@link #isObjectAccessibleUsingSemantics} is false
-   *     given the semantics
+   * @throws IllegalArgumentException if {@link #isObjectAccessibleUsingSemantics} is false given
+   *     the semantics
    */
-  public Object getObject(SkylarkSemantics semantics) {
+  public Object getObject(StarlarkSemantics semantics) {
     Preconditions.checkArgument(isObjectAccessibleUsingSemantics(semantics),
         "getObject should only be called if the underlying object is accessible given the "
             + "semantics");
     return obj;
   }
 
-  /**
-   * Returns true if this guard's underlying object is accessible under the given semantics.
-   */
-  public boolean isObjectAccessibleUsingSemantics(SkylarkSemantics semantics) {
+  /** Returns true if this guard's underlying object is accessible under the given semantics. */
+  public boolean isObjectAccessibleUsingSemantics(StarlarkSemantics semantics) {
     if (flagType == FlagType.EXPERIMENTAL) {
       return semantics.isFeatureEnabledBasedOnTogglingFlags(flagIdentifier, FlagIdentifier.NONE);
     } else {
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
index 4cacee4..33104a3 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/FuncallExpression.java
@@ -30,7 +30,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.syntax.Runtime.NoneType;
 import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 import java.io.IOException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -59,9 +59,9 @@
    */
   private static final class MethodDescriptorKey {
     private final Class<?> clazz;
-    private final SkylarkSemantics semantics;
+    private final StarlarkSemantics semantics;
 
-    private MethodDescriptorKey(Class<?> clazz, SkylarkSemantics semantics) {
+    private MethodDescriptorKey(Class<?> clazz, StarlarkSemantics semantics) {
       this.clazz = clazz;
       this.semantics = semantics;
     }
@@ -70,7 +70,7 @@
       return clazz;
     }
 
-    public SkylarkSemantics getSemantics() {
+    public StarlarkSemantics getSemantics() {
       return semantics;
     }
 
@@ -99,7 +99,7 @@
                 @Override
                 public Optional<MethodDescriptor> load(MethodDescriptorKey key) throws Exception {
                   Class<?> keyClass = key.getClazz();
-                  SkylarkSemantics semantics = key.getSemantics();
+                  StarlarkSemantics semantics = key.getSemantics();
                   MethodDescriptor returnValue = null;
                   for (Method method : sortMethodArrayByMethodName(keyClass.getMethods())) {
                     // Synthetic methods lead to false multiple matches
@@ -133,7 +133,7 @@
                     public Map<String, MethodDescriptor> load(MethodDescriptorKey key)
                         throws Exception {
                       Class<?> keyClass = key.getClazz();
-                      SkylarkSemantics semantics = key.getSemantics();
+                      StarlarkSemantics semantics = key.getSemantics();
                       ImmutableMap.Builder<String, MethodDescriptor> methodMap =
                           ImmutableMap.builder();
                       for (Method method : sortMethodArrayByMethodName(keyClass.getMethods())) {
@@ -311,16 +311,16 @@
   /**
    * Returns the Skylark callable Method of objClass with structField=true and the given name.
    *
-   * @deprecated use {@link #getStructField(SkylarkSemantics, Class, String)} instead
+   * @deprecated use {@link #getStructField(StarlarkSemantics, Class, String)} instead
    */
   @Deprecated
   public static MethodDescriptor getStructField(Class<?> objClass, String methodName) {
-    return getStructField(SkylarkSemantics.DEFAULT_SEMANTICS, objClass, methodName);
+    return getStructField(StarlarkSemantics.DEFAULT_SEMANTICS, objClass, methodName);
   }
 
   /** Returns the Skylark callable Method of objClass with structField=true and the given name. */
   public static MethodDescriptor getStructField(
-      SkylarkSemantics semantics, Class<?> objClass, String methodName) {
+      StarlarkSemantics semantics, Class<?> objClass, String methodName) {
     try {
       return fieldCache
           .get(new MethodDescriptorKey(getClassOrProxyClass(objClass), semantics))
@@ -333,15 +333,15 @@
   /**
    * Returns the list of names of Skylark callable Methods of objClass with structField=true.
    *
-   * @deprecated use {@link #getStructFieldNames(SkylarkSemantics, Class)} instead
+   * @deprecated use {@link #getStructFieldNames(StarlarkSemantics, Class)} instead
    */
   @Deprecated
   public static Set<String> getStructFieldNames(Class<?> objClass) {
-    return getStructFieldNames(SkylarkSemantics.DEFAULT_SEMANTICS, objClass);
+    return getStructFieldNames(StarlarkSemantics.DEFAULT_SEMANTICS, objClass);
   }
 
   /** Returns the list of names of Skylark callable Methods of objClass with structField=true. */
-  public static Set<String> getStructFieldNames(SkylarkSemantics semantics, Class<?> objClass) {
+  public static Set<String> getStructFieldNames(StarlarkSemantics semantics, Class<?> objClass) {
     try {
       return fieldCache
           .get(new MethodDescriptorKey(getClassOrProxyClass(objClass), semantics))
@@ -354,16 +354,16 @@
   /**
    * Returns the list of Skylark callable Methods of objClass with the given name.
    *
-   * @deprecated use {@link #getMethods(SkylarkSemantics, Class, String)} instead
+   * @deprecated use {@link #getMethods(StarlarkSemantics, Class, String)} instead
    */
   @Deprecated
   public static MethodDescriptor getMethod(Class<?> objClass, String methodName) {
-    return getMethod(SkylarkSemantics.DEFAULT_SEMANTICS, objClass, methodName);
+    return getMethod(StarlarkSemantics.DEFAULT_SEMANTICS, objClass, methodName);
   }
 
   /** Returns the list of Skylark callable Methods of objClass with the given name. */
   public static MethodDescriptor getMethod(
-      SkylarkSemantics semantics, Class<?> objClass, String methodName) {
+      StarlarkSemantics semantics, Class<?> objClass, String methodName) {
     try {
       return methodCache
           .get(new MethodDescriptorKey(getClassOrProxyClass(objClass), semantics))
@@ -377,18 +377,18 @@
    * Returns a set of the Skylark name of all Skylark callable methods for object of type {@code
    * objClass}.
    *
-   * @deprecated use {@link #getMethodNames(SkylarkSemantics, Class)} instead
+   * @deprecated use {@link #getMethodNames(StarlarkSemantics, Class)} instead
    */
   @Deprecated
   public static Set<String> getMethodNames(Class<?> objClass) {
-    return getMethodNames(SkylarkSemantics.DEFAULT_SEMANTICS, objClass);
+    return getMethodNames(StarlarkSemantics.DEFAULT_SEMANTICS, objClass);
   }
 
   /**
    * Returns a set of the Skylark name of all Skylark callable methods for object of type {@code
    * objClass}.
    */
-  public static Set<String> getMethodNames(SkylarkSemantics semantics, Class<?> objClass) {
+  public static Set<String> getMethodNames(StarlarkSemantics semantics, Class<?> objClass) {
     try {
       return methodCache
           .get(new MethodDescriptorKey(getClassOrProxyClass(objClass), semantics))
@@ -402,7 +402,7 @@
    * Returns true if the given class has a method annotated with {@link SkylarkCallable} with {@link
    * SkylarkCallable#selfCall()} set to true.
    */
-  public static boolean hasSelfCallMethod(SkylarkSemantics semantics, Class<?> objClass) {
+  public static boolean hasSelfCallMethod(StarlarkSemantics semantics, Class<?> objClass) {
     try {
       return selfCallCache.get(new MethodDescriptorKey(objClass, semantics)).isPresent();
     } catch (ExecutionException e) {
@@ -418,7 +418,7 @@
    * @throws IllegalStateException if no such method exists for the object
    */
   public static MethodDescriptor getSelfCallMethodDescriptor(
-      SkylarkSemantics semantics, Object obj) {
+      StarlarkSemantics semantics, Object obj) {
     try {
       Optional<MethodDescriptor> selfCallDescriptor =
           selfCallCache.get(new MethodDescriptorKey(obj.getClass(), semantics));
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 1ca3516..b322d23 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
@@ -91,7 +91,7 @@
 
   /** @return Skylark method descriptor for provided Java method and signature annotation. */
   public static MethodDescriptor of(
-      Method method, SkylarkCallable annotation, SkylarkSemantics semantics) {
+      Method method, SkylarkCallable annotation, StarlarkSemantics semantics) {
     // This happens when the interface is public but the implementation classes
     // have reduced visibility.
     method.setAccessible(true);
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/ParamDescriptor.java b/src/main/java/com/google/devtools/build/lib/syntax/ParamDescriptor.java
index de133db..ec10c19 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/ParamDescriptor.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/ParamDescriptor.java
@@ -17,7 +17,7 @@
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.skylarkinterface.Param;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 import java.util.Arrays;
 import javax.annotation.Nullable;
 
@@ -74,7 +74,7 @@
     this.flagResponsibleForDisable = flagResponsibleForDisable;
   }
 
-  static ParamDescriptor of(Param param, SkylarkSemantics skylarkSemantics) {
+  static ParamDescriptor of(Param param, StarlarkSemantics starlarkSemantics) {
     ImmutableList<ParamTypeDescriptor> allowedTypes =
         Arrays.stream(param.allowedTypes())
             .map(ParamTypeDescriptor::of)
@@ -84,7 +84,7 @@
     boolean noneable = param.noneable();
 
     boolean isParamEnabledWithCurrentSemantics =
-        skylarkSemantics.isFeatureEnabledBasedOnTogglingFlags(
+        starlarkSemantics.isFeatureEnabledBasedOnTogglingFlags(
             param.enableOnlyWithFlag(), param.disableWithFlag());
 
     String valueOverride = null;
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java
index a76560f..ff80e99 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkCallbackFunction.java
@@ -24,17 +24,17 @@
 
   private final BaseFunction callback;
   private final FuncallExpression ast;
-  private final SkylarkSemantics skylarkSemantics;
+  private final StarlarkSemantics starlarkSemantics;
   private final StarlarkContext starlarkContext;
 
   public SkylarkCallbackFunction(
       BaseFunction callback,
       FuncallExpression ast,
-      SkylarkSemantics skylarkSemantics,
+      StarlarkSemantics starlarkSemantics,
       StarlarkContext starlarkContext) {
     this.callback = callback;
     this.ast = ast;
-    this.skylarkSemantics = skylarkSemantics;
+    this.starlarkSemantics = starlarkSemantics;
     this.starlarkContext = starlarkContext;
   }
 
@@ -47,7 +47,7 @@
     try (Mutability mutability = Mutability.create("callback %s", callback)) {
       Environment env =
           Environment.builder(mutability)
-              .setSemantics(skylarkSemantics)
+              .setSemantics(starlarkSemantics)
               .setEventHandler(eventHandler)
               .setStarlarkContext(starlarkContext)
               .build();
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
similarity index 88%
rename from src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
rename to src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
index de054dc..75e67cb 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
@@ -22,45 +22,44 @@
 import java.util.function.Function;
 
 /**
- * Options that affect Skylark semantics.
+ * Options that affect Starlark semantics.
  *
  * <p>For descriptions of what these options do, see {@link SkylarkSemanticsOptions}.
  */
 // TODO(brandjon): User error messages that reference options should maybe be substituted with the
-// option name outside of the core Skylark interpreter?
+// option name outside of the core Starlark interpreter?
 // TODO(brandjon): Eventually these should be documented in full here, and SkylarkSemanticsOptions
 // should refer to this class for documentation. But this doesn't play nice with the options
 // parser's annotation mechanism.
 @AutoValue
-public abstract class SkylarkSemantics {
+public abstract class StarlarkSemantics {
 
   /**
-   * Enum where each element represents a skylark semantics flag. The name of each value should
-   * be the exact name of the flag transformed to upper case (for error representation).
+   * Enum where each element represents a starlark semantics flag. The name of each value should be
+   * the exact name of the flag transformed to upper case (for error representation).
    */
   public enum FlagIdentifier {
     EXPERIMENTAL_ENABLE_ANDROID_MIGRATION_APIS(
-        SkylarkSemantics::experimentalEnableAndroidMigrationApis),
-    EXPERIMENTAL_BUILD_SETTING_API(SkylarkSemantics::experimentalBuildSettingApi),
-    EXPERIMENTAL_PLATFORM_API(SkylarkSemantics::experimentalPlatformsApi),
+        StarlarkSemantics::experimentalEnableAndroidMigrationApis),
+    EXPERIMENTAL_BUILD_SETTING_API(StarlarkSemantics::experimentalBuildSettingApi),
+    EXPERIMENTAL_PLATFORM_API(StarlarkSemantics::experimentalPlatformsApi),
     EXPERIMENTAL_STARLARK_CONFIG_TRANSITION(
-        SkylarkSemantics::experimentalStarlarkConfigTransitions),
+        StarlarkSemantics::experimentalStarlarkConfigTransitions),
     INCOMPATIBLE_DISABLE_OBJC_PROVIDER_RESOURCES(
-        SkylarkSemantics::incompatibleDisableObjcProviderResources),
-    INCOMPATIBLE_NO_OUTPUT_ATTR_DEFAULT(SkylarkSemantics::incompatibleNoOutputAttrDefault),
-    INCOMPATIBLE_NO_TARGET_OUTPUT_GROUP(
-        SkylarkSemantics::incompatibleNoTargetOutputGroup),
-    INCOMPATIBLE_NO_ATTR_LICENSE(SkylarkSemantics::incompatibleNoAttrLicense),
+        StarlarkSemantics::incompatibleDisableObjcProviderResources),
+    INCOMPATIBLE_NO_OUTPUT_ATTR_DEFAULT(StarlarkSemantics::incompatibleNoOutputAttrDefault),
+    INCOMPATIBLE_NO_TARGET_OUTPUT_GROUP(StarlarkSemantics::incompatibleNoTargetOutputGroup),
+    INCOMPATIBLE_NO_ATTR_LICENSE(StarlarkSemantics::incompatibleNoAttrLicense),
     INCOMPATIBLE_REQUIRE_FEATURE_CONFIGURATION_FOR_PIC(
-        SkylarkSemantics::incompatibleRequireFeatureConfigurationForPic),
+        StarlarkSemantics::incompatibleRequireFeatureConfigurationForPic),
     NONE(null);
 
     // Using a Function here makes the enum definitions far cleaner, and, since this is
     // a private field, and we can ensure no callers treat this field as mutable.
     @SuppressWarnings("ImmutableEnumChecker")
-    private final Function<SkylarkSemantics, Boolean> semanticsFunction;
+    private final Function<StarlarkSemantics, Boolean> semanticsFunction;
 
-    FlagIdentifier(Function<SkylarkSemantics, Boolean> semanticsFunction) {
+    FlagIdentifier(Function<StarlarkSemantics, Boolean> semanticsFunction) {
       this.semanticsFunction = semanticsFunction;
     }
 
@@ -112,8 +111,8 @@
    * <p>AutoValue implementation classes are usually package-private. We expose it here for the
    * benefit of code that relies on reflection.
    */
-  public static final Class<? extends SkylarkSemantics> IMPL_CLASS =
-      AutoValue_SkylarkSemantics.class;
+  public static final Class<? extends StarlarkSemantics> IMPL_CLASS =
+      AutoValue_StarlarkSemantics.class;
 
   // <== Add new options here in alphabetic order ==>
   public abstract boolean checkThirdPartyTargetsHaveLicenses();
@@ -194,7 +193,7 @@
   public abstract Builder toBuilder();
 
   public static Builder builder() {
-    return new AutoValue_SkylarkSemantics.Builder();
+    return new AutoValue_StarlarkSemantics.Builder();
   }
 
   /** Returns a {@link Builder} initialized with default values for all options. */
@@ -202,7 +201,7 @@
     return DEFAULT_SEMANTICS.toBuilder();
   }
 
-  public static final SkylarkSemantics DEFAULT_SEMANTICS =
+  public static final StarlarkSemantics DEFAULT_SEMANTICS =
       builder()
           // <== Add new options here in alphabetic order ==>
           .checkThirdPartyTargetsHaveLicenses(true)
@@ -244,7 +243,7 @@
           .internalSkylarkFlagTestCanary(false)
           .build();
 
-  /** Builder for {@link SkylarkSemantics}. All fields are mandatory. */
+  /** Builder for {@link StarlarkSemantics}. All fields are mandatory. */
   @AutoValue.Builder
   public abstract static class Builder {
 
@@ -323,6 +322,6 @@
 
     public abstract Builder internalSkylarkFlagTestCanary(boolean value);
 
-    public abstract SkylarkSemantics build();
+    public abstract StarlarkSemantics build();
   }
 }
diff --git a/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java b/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
index 20d4f52..aec67e8 100644
--- a/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
+++ b/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
@@ -63,7 +63,7 @@
 import com.google.devtools.build.lib.syntax.ParserInputSource;
 import com.google.devtools.build.lib.syntax.Runtime;
 import com.google.devtools.build.lib.syntax.SkylarkImport;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.UserDefinedFunction;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeActionsInfoProvider;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeBuildApiGlobals;
@@ -325,7 +325,7 @@
    * @throws InterruptedException if evaluation is interrupted
    */
   public Environment eval(
-      SkylarkSemantics semantics,
+      StarlarkSemantics semantics,
       Label label,
       ImmutableMap.Builder<String, RuleInfo> ruleInfoMap,
       ImmutableList.Builder<RuleInfo> unknownNamedRules,
@@ -384,7 +384,7 @@
    * @throws InterruptedException if evaluation is interrupted
    */
   private Environment recursiveEval(
-      SkylarkSemantics semantics,
+      StarlarkSemantics semantics,
       Label label,
       List<RuleInfo> ruleInfoList,
       List<ProviderInfo> providerInfoList)
@@ -450,7 +450,7 @@
 
   /** Evaluates the AST from a single skylark file, given the already-resolved imports. */
   private Environment evalSkylarkBody(
-      SkylarkSemantics semantics,
+      StarlarkSemantics semantics,
       BuildFileAST buildFileAST,
       Map<String, Extension> imports,
       List<RuleInfo> ruleInfoList,
@@ -573,7 +573,7 @@
   }
 
   private static Environment createEnvironment(
-      SkylarkSemantics semantics,
+      StarlarkSemantics semantics,
       EventHandler eventHandler,
       GlobalFrame globals,
       Map<String, Extension> imports) {
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 80dab20..6476591 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
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.syntax.BaseFunction;
 import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import java.util.List;
 
 /**
@@ -42,7 +42,7 @@
 
   @Override
   public ConfigurationTransitionApi analysisTestTransition(
-      SkylarkDict<String, String> changedSettings, Location location, SkylarkSemantics semantics) {
+      SkylarkDict<String, String> changedSettings, Location location, StarlarkSemantics semantics) {
     return new FakeConfigurationTransition();
   }
 }
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 233febc..2c80f50 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
@@ -25,7 +25,7 @@
 import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkList;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeProviderApi;
 import javax.annotation.Nullable;
 
@@ -78,7 +78,7 @@
       Object targetLabel,
       Object javaToolchain,
       Location location,
-      SkylarkSemantics semantics)
+      StarlarkSemantics semantics)
       throws EvalException {
     return null;
   }
@@ -90,7 +90,7 @@
       Label targetLabel,
       Object javaToolchain,
       Location location,
-      SkylarkSemantics semantics)
+      StarlarkSemantics semantics)
       throws EvalException {
     return null;
   }
@@ -104,7 +104,7 @@
       Object javaToolchain,
       Object hostJavabase,
       Location location,
-      SkylarkSemantics semantics)
+      StarlarkSemantics semantics)
       throws EvalException {
     return null;
   }
@@ -115,7 +115,7 @@
       Object javaToolchainAttr,
       Object javaToolchain,
       Location loc,
-      SkylarkSemantics semantics)
+      StarlarkSemantics semantics)
       throws EvalException {
     return ImmutableList.of();
   }
diff --git a/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationFailuresTest.java b/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationFailuresTest.java
index cb80731..2427d07 100644
--- a/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationFailuresTest.java
+++ b/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationFailuresTest.java
@@ -21,7 +21,7 @@
 import com.google.devtools.build.lib.skylark.util.SkylarkTestCase;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
 import java.util.Map;
 import org.junit.Before;
@@ -48,7 +48,7 @@
   }
 
   @Override
-  protected EvaluationTestCase createEvaluationTestCase(SkylarkSemantics semantics) {
+  protected EvaluationTestCase createEvaluationTestCase(StarlarkSemantics semantics) {
     return new EvaluationTestCase();
   }
 
diff --git a/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationTest.java b/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationTest.java
index 35a3929..07c684f 100644
--- a/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationTest.java
+++ b/src/test/java/com/google/devtools/build/docgen/SkylarkDocumentationTest.java
@@ -31,7 +31,7 @@
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
 import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
 import com.google.devtools.build.lib.util.Classpath;
 import java.util.ArrayList;
@@ -65,7 +65,7 @@
   }
 
   @Override
-  protected EvaluationTestCase createEvaluationTestCase(SkylarkSemantics semantics) {
+  protected EvaluationTestCase createEvaluationTestCase(StarlarkSemantics semantics) {
     return new EvaluationTestCase();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
index e34978b..de4f6de 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisTestUtil.java
@@ -48,7 +48,7 @@
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.events.ExtendedEventHandler;
 import com.google.devtools.build.lib.shell.Command;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.util.Fingerprint;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
@@ -160,7 +160,7 @@
     }
 
     @Override
-    public SkylarkSemantics getSkylarkSemantics() throws InterruptedException {
+    public StarlarkSemantics getSkylarkSemantics() throws InterruptedException {
       return original.getSkylarkSemantics();
     }
 
@@ -347,7 +347,7 @@
     }
 
     @Override
-    public SkylarkSemantics getSkylarkSemantics() throws InterruptedException {
+    public StarlarkSemantics getSkylarkSemantics() throws InterruptedException {
       return null;
     }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index d0e53e8..25dafac 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -143,7 +143,7 @@
 import com.google.devtools.build.lib.skyframe.SkyValueDirtinessChecker;
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
 import com.google.devtools.build.lib.skyframe.TargetPatternPhaseValue;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.BlazeTestUtils;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.testutil.TestConstants;
@@ -333,7 +333,7 @@
     return ImmutableList.<EnvironmentExtension>of();
   }
 
-  protected SkylarkSemantics getSkylarkSemantics() {
+  protected StarlarkSemantics getSkylarkSemantics() {
     return skylarkSemanticsOptions.toSkylarkSemantics();
   }
 
@@ -1979,7 +1979,7 @@
     }
 
     @Override
-    public SkylarkSemantics getSkylarkSemantics() {
+    public StarlarkSemantics getSkylarkSemantics() {
       throw new UnsupportedOperationException();
     }
 
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
index d2333d1..d73007d 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
@@ -22,7 +22,7 @@
 import com.google.devtools.build.lib.skyframe.serialization.DynamicCodec;
 import com.google.devtools.build.lib.skyframe.serialization.SerializationContext;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.TestUtils;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.common.options.Options;
 import com.google.devtools.common.options.OptionsParser;
 import java.util.Arrays;
@@ -32,20 +32,20 @@
 import org.junit.runners.JUnit4;
 
 /**
- * Tests for the flow of flags from {@link SkylarkSemanticsOptions} to {@link SkylarkSemantics}, and
- * to and from {@code SkylarkSemantics}' serialized representation.
+ * Tests for the flow of flags from {@link SkylarkSemanticsOptions} to {@link StarlarkSemantics},
+ * and to and from {@code StarlarkSemantics}' serialized representation.
  *
  * <p>When adding a new option, it is trivial to make a transposition error or a copy/paste error.
  * These tests guard against such errors. The following possible bugs are considered:
  *
  * <ul>
- *   <li>If a new option is added to {@code SkylarkSemantics} but not to {@code
+ *   <li>If a new option is added to {@code StarlarkSemantics} but not to {@code
  *       SkylarkSemanticsOptions}, or vice versa, then the programmer will either be unable to
  *       implement its behavior, or unable to test it from the command line and add user
  *       documentation. We hope that the programmer notices this on their own.
  *   <li>If {@link SkylarkSemanticsOptions#toSkylarkSemantics} is not updated to set all fields of
- *       {@code SkylarkSemantics}, then it will fail immediately because all fields of {@link
- *       SkylarkSemantics.Builder} are mandatory.
+ *       {@code StarlarkSemantics}, then it will fail immediately because all fields of {@link
+ *       StarlarkSemantics.Builder} are mandatory.
  *   <li>To catch a copy/paste error where the wrong field's data is threaded through {@code
  *       toSkylarkSemantics()} or {@code deserialize(...)}, we repeatedly generate matching random
  *       instances of the input and expected output objects.
@@ -62,34 +62,34 @@
 
   /**
    * Checks that a randomly generated {@link SkylarkSemanticsOptions} object can be converted to a
-   * {@link SkylarkSemantics} object with the same field values.
+   * {@link StarlarkSemantics} object with the same field values.
    */
   @Test
   public void optionsToSemantics() throws Exception {
     for (int i = 0; i < NUM_RANDOM_TRIALS; i++) {
       long seed = i;
       SkylarkSemanticsOptions options = buildRandomOptions(new Random(seed));
-      SkylarkSemantics semantics = buildRandomSemantics(new Random(seed));
-      SkylarkSemantics semanticsFromOptions = options.toSkylarkSemantics();
+      StarlarkSemantics semantics = buildRandomSemantics(new Random(seed));
+      StarlarkSemantics semanticsFromOptions = options.toSkylarkSemantics();
       assertThat(semanticsFromOptions).isEqualTo(semantics);
     }
   }
 
   /**
-   * Checks that a randomly generated {@link SkylarkSemantics} object can be serialized and
+   * Checks that a randomly generated {@link StarlarkSemantics} object can be serialized and
    * deserialized to an equivalent object.
    */
   @Test
   public void serializationRoundTrip() throws Exception {
     DynamicCodec codec = new DynamicCodec(buildRandomSemantics(new Random(2)).getClass());
     for (int i = 0; i < NUM_RANDOM_TRIALS; i++) {
-      SkylarkSemantics semantics = buildRandomSemantics(new Random(i));
-      SkylarkSemantics deserialized =
-          (SkylarkSemantics)
-          TestUtils.fromBytes(
-              new DeserializationContext(ImmutableMap.of()),
-              codec,
-              TestUtils.toBytes(new SerializationContext(ImmutableMap.of()), codec, semantics));
+      StarlarkSemantics semantics = buildRandomSemantics(new Random(i));
+      StarlarkSemantics deserialized =
+          (StarlarkSemantics)
+              TestUtils.fromBytes(
+                  new DeserializationContext(ImmutableMap.of()),
+                  codec,
+                  TestUtils.toBytes(new SerializationContext(ImmutableMap.of()), codec, semantics));
       assertThat(deserialized).isEqualTo(semantics);
     }
   }
@@ -97,16 +97,16 @@
   @Test
   public void checkDefaultsMatch() {
     SkylarkSemanticsOptions defaultOptions = Options.getDefaults(SkylarkSemanticsOptions.class);
-    SkylarkSemantics defaultSemantics = SkylarkSemantics.DEFAULT_SEMANTICS;
-    SkylarkSemantics semanticsFromOptions = defaultOptions.toSkylarkSemantics();
+    StarlarkSemantics defaultSemantics = StarlarkSemantics.DEFAULT_SEMANTICS;
+    StarlarkSemantics semanticsFromOptions = defaultOptions.toSkylarkSemantics();
     assertThat(semanticsFromOptions).isEqualTo(defaultSemantics);
   }
 
   @Test
   public void canGetBuilderFromInstance() {
-    SkylarkSemantics original = SkylarkSemantics.DEFAULT_SEMANTICS;
+    StarlarkSemantics original = StarlarkSemantics.DEFAULT_SEMANTICS;
     assertThat(original.internalSkylarkFlagTestCanary()).isFalse();
-    SkylarkSemantics modified = original.toBuilder().internalSkylarkFlagTestCanary(true).build();
+    StarlarkSemantics modified = original.toBuilder().internalSkylarkFlagTestCanary(true).build();
     assertThat(modified.internalSkylarkFlagTestCanary()).isTrue();
   }
 
@@ -164,11 +164,11 @@
   }
 
   /**
-   * Constructs a {@link SkylarkSemantics} object with random fields. Must access {@code rand} using
-   * the same sequence of operations (for the same fields) as {@link #buildRandomOptions}.
+   * Constructs a {@link StarlarkSemantics} object with random fields. Must access {@code rand}
+   * using the same sequence of operations (for the same fields) as {@link #buildRandomOptions}.
    */
-  private static SkylarkSemantics buildRandomSemantics(Random rand) {
-    return SkylarkSemantics.builder()
+  private static StarlarkSemantics buildRandomSemantics(Random rand) {
+    return StarlarkSemantics.builder()
         // <== Add new options here in alphabetic order ==>
         .checkThirdPartyTargetsHaveLicenses(rand.nextBoolean())
         .experimentalBuildSettingApi(rand.nextBoolean())
diff --git a/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java b/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java
index 79123dd..a8ecff3 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/WorkspaceFactoryTestHelper.java
@@ -22,7 +22,7 @@
 import com.google.devtools.build.lib.events.StoredEventHandler;
 import com.google.devtools.build.lib.syntax.Mutability;
 import com.google.devtools.build.lib.syntax.ParserInputSource;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
@@ -38,7 +38,7 @@
   private Package.Builder builder;
   private Exception exception;
   private ImmutableList<Event> events;
-  private SkylarkSemantics skylarkSemantics;
+  private StarlarkSemantics starlarkSemantics;
 
   private final boolean allowOverride;
 
@@ -51,7 +51,7 @@
     this.exception = null;
     this.events = null;
     this.allowOverride = allowOverride;
-    this.skylarkSemantics = SkylarkSemantics.DEFAULT_SEMANTICS;
+    this.starlarkSemantics = StarlarkSemantics.DEFAULT_SEMANTICS;
   }
 
   void parse(String... args) {
@@ -83,7 +83,7 @@
           FileSystemUtils.readWithKnownFileSize(workspaceFilePath, workspaceFilePath.getFileSize());
       factory.parseForTesting(
           ParserInputSource.create(bytes, workspaceFilePath.asFragment()),
-          skylarkSemantics,
+          starlarkSemantics,
           eventHandler);
     } catch (BuildFileContainsErrorsException e) {
       exception = e;
@@ -115,10 +115,10 @@
   }
 
   protected void setSkylarkSemantics(String... options) throws Exception {
-    skylarkSemantics = parseSkylarkSemanticsOptions(options);
+    starlarkSemantics = parseSkylarkSemanticsOptions(options);
   }
 
-  private static SkylarkSemantics parseSkylarkSemanticsOptions(String... options)
+  private static StarlarkSemantics parseSkylarkSemanticsOptions(String... options)
       throws Exception {
     OptionsParser parser = OptionsParser.newOptionsParser(SkylarkSemanticsOptions.class);
     parser.parse(options);
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
index 5223f91..f1e1f8d 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
@@ -34,7 +34,7 @@
 import com.google.devtools.build.lib.syntax.BuildFileAST;
 import com.google.devtools.build.lib.syntax.Environment.Extension;
 import com.google.devtools.build.lib.syntax.ParserInputSource;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.util.Pair;
@@ -106,7 +106,7 @@
         skylarkOption == null
             ? ImmutableList.<String>of()
             : ImmutableList.<String>of(skylarkOption));
-    SkylarkSemantics semantics =
+    StarlarkSemantics semantics =
         parser.getOptions(SkylarkSemanticsOptions.class).toSkylarkSemantics();
 
     try {
@@ -176,7 +176,7 @@
             ImmutableList.<Event>of(),
             ImmutableList.<Postable>of(),
             ConstantRuleVisibility.PUBLIC,
-            SkylarkSemantics.DEFAULT_SEMANTICS,
+            StarlarkSemantics.DEFAULT_SEMANTICS,
             ImmutableMap.<String, Extension>of(),
             ImmutableList.<Label>of(),
             /*repositoryMapping=*/ ImmutableMap.of());
diff --git a/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java b/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java
index ce79b08..8c4c89d 100644
--- a/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java
+++ b/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java
@@ -53,7 +53,7 @@
 import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
 import com.google.devtools.build.lib.skyframe.WorkspaceASTFunction;
 import com.google.devtools.build.lib.skyframe.WorkspaceFileFunction;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.Root;
 import com.google.devtools.build.lib.vfs.RootedPath;
@@ -156,7 +156,7 @@
     MemoizingEvaluator evaluator = new InMemoryMemoizingEvaluator(skyFunctions, differencer);
     driver = new SequentialBuildDriver(evaluator);
     PrecomputedValue.PATH_PACKAGE_LOCATOR.set(differencer, pkgLocator.get());
-    PrecomputedValue.SKYLARK_SEMANTICS.set(differencer, SkylarkSemantics.DEFAULT_SEMANTICS);
+    PrecomputedValue.SKYLARK_SEMANTICS.set(differencer, StarlarkSemantics.DEFAULT_SEMANTICS);
     RepositoryDelegatorFunction.RESOLVED_FILE_INSTEAD_OF_WORKSPACE.set(
         differencer, Optional.<RootedPath>absent());
   }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java
index 34a2989..b9c2ebd 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/BazelJ2ObjcLibraryTest.java
@@ -47,7 +47,7 @@
 import com.google.devtools.build.lib.rules.cpp.CppCompileActionTemplate;
 import com.google.devtools.build.lib.rules.cpp.CppModuleMapAction;
 import com.google.devtools.build.lib.rules.cpp.UmbrellaHeaderAction;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -1315,7 +1315,7 @@
     // building a transitive provider from the target-to-build's deps. We duplicate that behavior
     // here to make sure we're testing the provider set that the eventual target library would see.
     ObjcProvider newProvider =
-        new ObjcProvider.Builder(SkylarkSemantics.DEFAULT_SEMANTICS)
+        new ObjcProvider.Builder(StarlarkSemantics.DEFAULT_SEMANTICS)
             .addTransitiveAndPropagate(ImmutableList.of(provider))
             .build();
     return getFirstArtifactEndingWith(newProvider.get(ObjcProvider.MODULE_MAP), nameSuffix);
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java
index 0689b78..3f27277 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcProviderTest.java
@@ -20,7 +20,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.rules.objc.ObjcProvider.Key;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
@@ -35,7 +35,7 @@
 public class ObjcProviderTest {
 
   private static ObjcProvider.Builder objcProviderBuilder() {
-    return new ObjcProvider.Builder(SkylarkSemantics.DEFAULT_SEMANTICS);
+    return new ObjcProvider.Builder(StarlarkSemantics.DEFAULT_SEMANTICS);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java
index e1db675..790973e 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcSkylarkTest.java
@@ -30,7 +30,7 @@
 import com.google.devtools.build.lib.rules.apple.DottedVersion;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import java.util.List;
 import org.junit.Test;
@@ -43,7 +43,7 @@
 @RunWith(JUnit4.class)
 public class ObjcSkylarkTest extends ObjcRuleTestCase {
   private static ObjcProvider.Builder objcProviderBuilder() {
-    return new ObjcProvider.Builder(SkylarkSemantics.DEFAULT_SEMANTICS);
+    return new ObjcProvider.Builder(StarlarkSemantics.DEFAULT_SEMANTICS);
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
index 07bf1af..fd6d902 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
@@ -41,7 +41,7 @@
 import com.google.devtools.build.lib.skyframe.SkyFunctions;
 import com.google.devtools.build.lib.skyframe.WorkspaceASTFunction;
 import com.google.devtools.build.lib.skyframe.WorkspaceFileFunction;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
@@ -145,7 +145,7 @@
     RepositoryDelegatorFunction.DEPENDENCY_FOR_UNCONDITIONAL_FETCHING.set(
         differencer, RepositoryDelegatorFunction.DONT_FETCH_UNCONDITIONALLY);
     PrecomputedValue.PATH_PACKAGE_LOCATOR.set(differencer, pkgLocator.get());
-    PrecomputedValue.SKYLARK_SEMANTICS.set(differencer, SkylarkSemantics.DEFAULT_SEMANTICS);
+    PrecomputedValue.SKYLARK_SEMANTICS.set(differencer, StarlarkSemantics.DEFAULT_SEMANTICS);
     RepositoryDelegatorFunction.RESOLVED_FILE_INSTEAD_OF_WORKSPACE.set(
         differencer, Optional.<RootedPath>absent());
   }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
index 7ec3715..3a1e5ab 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
@@ -40,7 +40,7 @@
 import com.google.devtools.build.lib.rules.repository.RepositoryLoaderFunction;
 import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction;
 import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -157,7 +157,7 @@
     driver = new SequentialBuildDriver(evaluator);
     PrecomputedValue.BUILD_ID.set(differencer, UUID.randomUUID());
     PrecomputedValue.PATH_PACKAGE_LOCATOR.set(differencer, pkgLocator.get());
-    PrecomputedValue.SKYLARK_SEMANTICS.set(differencer, SkylarkSemantics.DEFAULT_SEMANTICS);
+    PrecomputedValue.SKYLARK_SEMANTICS.set(differencer, StarlarkSemantics.DEFAULT_SEMANTICS);
     RepositoryDelegatorFunction.REPOSITORY_OVERRIDES.set(
         differencer, ImmutableMap.<RepositoryName, PathFragment>of());
     RepositoryDelegatorFunction.DEPENDENCY_FOR_UNCONDITIONAL_FETCHING.set(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
index 22835e9..a32532f 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
@@ -47,7 +47,7 @@
 import com.google.devtools.build.lib.rules.repository.RepositoryDelegatorFunction;
 import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction;
 import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.ManualClock;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
@@ -192,7 +192,7 @@
     PrecomputedValue.PATH_PACKAGE_LOCATOR.set(differencer, pkgLocator);
     RepositoryDelegatorFunction.REPOSITORY_OVERRIDES.set(
         differencer, ImmutableMap.<RepositoryName, PathFragment>of());
-    PrecomputedValue.SKYLARK_SEMANTICS.set(differencer, SkylarkSemantics.DEFAULT_SEMANTICS);
+    PrecomputedValue.SKYLARK_SEMANTICS.set(differencer, StarlarkSemantics.DEFAULT_SEMANTICS);
     RepositoryDelegatorFunction.RESOLVED_FILE_INSTEAD_OF_WORKSPACE.set(
         differencer, Optional.<RootedPath>absent());
     return new SequentialBuildDriver(evaluator);
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
index fc9a625..037153b 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
@@ -42,7 +42,7 @@
 import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction;
 import com.google.devtools.build.lib.skyframe.GlobValue.InvalidGlobPatternException;
 import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.ManualClock;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
@@ -137,7 +137,7 @@
     driver = new SequentialBuildDriver(evaluator);
     PrecomputedValue.BUILD_ID.set(differencer, UUID.randomUUID());
     PrecomputedValue.PATH_PACKAGE_LOCATOR.set(differencer, pkgLocator.get());
-    PrecomputedValue.SKYLARK_SEMANTICS.set(differencer, SkylarkSemantics.DEFAULT_SEMANTICS);
+    PrecomputedValue.SKYLARK_SEMANTICS.set(differencer, StarlarkSemantics.DEFAULT_SEMANTICS);
     RepositoryDelegatorFunction.RESOLVED_FILE_INSTEAD_OF_WORKSPACE.set(
         differencer, Optional.<RootedPath>absent());
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java
index af487b3..7d17bbc 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java
@@ -35,7 +35,7 @@
 import com.google.devtools.build.lib.rules.repository.RepositoryDelegatorFunction;
 import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction;
 import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
@@ -129,7 +129,7 @@
     evaluator = new InMemoryMemoizingEvaluator(skyFunctions, differencer);
     driver = new SequentialBuildDriver(evaluator);
     PrecomputedValue.PATH_PACKAGE_LOCATOR.set(differencer, pkgLocator.get());
-    PrecomputedValue.SKYLARK_SEMANTICS.set(differencer, SkylarkSemantics.DEFAULT_SEMANTICS);
+    PrecomputedValue.SKYLARK_SEMANTICS.set(differencer, StarlarkSemantics.DEFAULT_SEMANTICS);
     RepositoryDelegatorFunction.RESOLVED_FILE_INSTEAD_OF_WORKSPACE.set(
         differencer, Optional.<RootedPath>absent());
   }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
index 216d6c8..2dffe43 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
@@ -46,7 +46,7 @@
 import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
 import com.google.devtools.build.lib.skyframe.PackageLookupValue.ErrorReason;
 import com.google.devtools.build.lib.skyframe.PackageLookupValue.IncorrectRepositoryReferencePackageLookupValue;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.FoundationTestCase;
 import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
@@ -170,7 +170,7 @@
     driver = new SequentialBuildDriver(evaluator);
     PrecomputedValue.BUILD_ID.set(differencer, UUID.randomUUID());
     PrecomputedValue.PATH_PACKAGE_LOCATOR.set(differencer, pkgLocator.get());
-    PrecomputedValue.SKYLARK_SEMANTICS.set(differencer, SkylarkSemantics.DEFAULT_SEMANTICS);
+    PrecomputedValue.SKYLARK_SEMANTICS.set(differencer, StarlarkSemantics.DEFAULT_SEMANTICS);
     RepositoryDelegatorFunction.REPOSITORY_OVERRIDES.set(
         differencer, ImmutableMap.<RepositoryName, PathFragment>of());
     RepositoryDelegatorFunction.DEPENDENCY_FOR_UNCONDITIONAL_FETCHING.set(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunctionTest.java
index 22a9cc2..0fa3e05 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalFunctionTest.java
@@ -24,7 +24,7 @@
 import com.google.devtools.build.lib.packages.NoSuchTargetException;
 import com.google.devtools.build.lib.packages.Package;
 import com.google.devtools.build.lib.skyframe.TransitiveBaseTraversalFunction.TargetAndErrorIfAnyImpl;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.util.GroupedList;
 import com.google.devtools.build.lib.util.GroupedList.GroupedListHelper;
 import com.google.devtools.build.lib.vfs.Path;
@@ -113,6 +113,6 @@
         RootedPath.toRootedPath(root, buildFile),
         packageIdentifier -> buildFile,
         reporter,
-        SkylarkSemantics.DEFAULT_SEMANTICS);
+        StarlarkSemantics.DEFAULT_SEMANTICS);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java
index 58cc969..c1c3c43 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java
@@ -33,7 +33,7 @@
 import com.google.devtools.build.lib.packages.WorkspaceFileValue;
 import com.google.devtools.build.lib.rules.repository.RepositoryDelegatorFunction;
 import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
 import com.google.devtools.build.lib.vfs.ModifiedFileSet;
@@ -188,7 +188,7 @@
               public SkyValue answer(InvocationOnMock invocation) throws Throwable {
                 SkyKey key = (SkyKey) invocation.getArguments()[0];
                 if (key.equals(PrecomputedValue.SKYLARK_SEMANTICS.getKeyForTesting())) {
-                  return new PrecomputedValue(SkylarkSemantics.DEFAULT_SEMANTICS);
+                  return new PrecomputedValue(StarlarkSemantics.DEFAULT_SEMANTICS);
                 } else if (key.equals(
                     RepositoryDelegatorFunction.RESOLVED_FILE_INSTEAD_OF_WORKSPACE
                         .getKeyForTesting())) {
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 9fe3d20..01b0497 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -56,7 +56,7 @@
 import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
 import com.google.devtools.build.lib.syntax.SkylarkList.Tuple;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.Type;
 import com.google.devtools.build.lib.testutil.MoreAsserts;
 import com.google.devtools.build.lib.util.FileTypeSet;
@@ -199,11 +199,12 @@
 
   @Test
   public void testDisableDeprecatedParams() throws Exception {
-    ev = createEvaluationTestCase(
-        SkylarkSemantics.DEFAULT_SEMANTICS
-            .toBuilder()
-            .incompatibleDisableDeprecatedAttrParams(true)
-            .build());
+    ev =
+        createEvaluationTestCase(
+            StarlarkSemantics.DEFAULT_SEMANTICS
+                .toBuilder()
+                .incompatibleDisableDeprecatedAttrParams(true)
+                .build());
     ev.initialize();
 
     // Verify 'single_file' deprecation.
@@ -591,11 +592,12 @@
 
   @Test
   public void incompatibleDataTransition() throws Exception {
-    ev = createEvaluationTestCase(
-        SkylarkSemantics.DEFAULT_SEMANTICS
-            .toBuilder()
-            .incompatibleDisallowDataTransition(true)
-            .build());
+    ev =
+        createEvaluationTestCase(
+            StarlarkSemantics.DEFAULT_SEMANTICS
+                .toBuilder()
+                .incompatibleDisallowDataTransition(true)
+                .build());
     ev.initialize();
     EvalException expected =
         assertThrows(EvalException.class, () -> eval("attr.label(cfg = 'data')"));
@@ -643,7 +645,10 @@
   public void testNoAttrLicense() throws Exception {
     ev =
         createEvaluationTestCase(
-            SkylarkSemantics.DEFAULT_SEMANTICS.toBuilder().incompatibleNoAttrLicense(true).build());
+            StarlarkSemantics.DEFAULT_SEMANTICS
+                .toBuilder()
+                .incompatibleNoAttrLicense(true)
+                .build());
     ev.initialize();
 
     EvalException expected = assertThrows(EvalException.class, () -> eval("attr.license()"));
@@ -853,8 +858,8 @@
 
   @Test
   public void testFileTypeIsDisabled() throws Exception {
-    SkylarkSemantics semantics =
-        SkylarkSemantics.DEFAULT_SEMANTICS.toBuilder().incompatibleDisallowFileType(true).build();
+    StarlarkSemantics semantics =
+        StarlarkSemantics.DEFAULT_SEMANTICS.toBuilder().incompatibleDisallowFileType(true).build();
     EvalException expected =
         assertThrows(EvalException.class, () -> evalRuleClassCode(semantics, "FileType(['.css'])"));
     assertThat(expected).hasMessageThat().contains("FileType function is not available.");
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java b/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
index 67b6d6b..5340aa0 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
@@ -35,9 +35,9 @@
 import com.google.devtools.build.lib.syntax.Environment.GlobalFrame;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Runtime;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
 import com.google.devtools.build.lib.syntax.SkylarkUtils;
 import com.google.devtools.build.lib.syntax.SkylarkUtils.Phase;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import org.junit.Before;
@@ -52,7 +52,7 @@
 
   @Before
   public final void setUpEvaluator() throws Exception {
-    ev = createEvaluationTestCase(SkylarkSemantics.DEFAULT_SEMANTICS);
+    ev = createEvaluationTestCase(StarlarkSemantics.DEFAULT_SEMANTICS);
     ev.initialize();
   }
 
@@ -65,7 +65,7 @@
     return GlobalFrame.createForBuiltins(envBuilder.build());
   }
 
-  protected EvaluationTestCase createEvaluationTestCase(SkylarkSemantics semantics) {
+  protected EvaluationTestCase createEvaluationTestCase(StarlarkSemantics semantics) {
     return new EvaluationTestCase() {
       @Override
       public Environment newEnvironment() throws Exception {
@@ -155,7 +155,8 @@
     return eval("def impl(ctx): return None\n" + Joiner.on("\n").join(lines));
   }
 
-  protected Object evalRuleClassCode(SkylarkSemantics semantics, String... lines) throws Exception {
+  protected Object evalRuleClassCode(StarlarkSemantics semantics, String... lines)
+      throws Exception {
     ev = createEvaluationTestCase(semantics);
     ev.initialize();
     return eval("def impl(ctx): return None\n" + Joiner.on("\n").join(lines));
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/EnablingAndDisablingFlag.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/EnablingAndDisablingFlag.java
index a11536d..f115acf 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/EnablingAndDisablingFlag.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/EnablingAndDisablingFlag.java
@@ -16,7 +16,7 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /**
  * Test case for a SkylarkCallable method which has both enablingFlag and disablingFlag specified.
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/EnablingAndDisablingFlagParam.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/EnablingAndDisablingFlagParam.java
index 83274df..43db843 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/EnablingAndDisablingFlagParam.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/EnablingAndDisablingFlagParam.java
@@ -16,7 +16,7 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /**
  * Test case for a SkylarkCallable method which has a parameter with both enableOnlyWithFlag and
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 05ce965..6f41aab 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
@@ -23,7 +23,7 @@
 import com.google.devtools.build.lib.syntax.FuncallExpression;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkList;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 
 /**
  * Test source file verifying various proper uses of SkylarkCallable.
@@ -39,12 +39,11 @@
   }
 
   @SkylarkCallable(
-    name = "struct_field_method_with_info",
-    documented = false,
-    structField = true,
-    useSkylarkSemantics = true
-  )
-  public String structFieldMethodWithInfo(SkylarkSemantics semantics) {
+      name = "struct_field_method_with_info",
+      documented = false,
+      structField = true,
+      useSkylarkSemantics = true)
+  public String structFieldMethodWithInfo(StarlarkSemantics semantics) {
     return "foo";
   }
 
@@ -62,18 +61,17 @@
   }
 
   @SkylarkCallable(
-    name = "zero_arg_method_with_skylark_info",
-    documented = false,
-    useAst = true,
-    useLocation = true,
-    useEnvironment = true,
-    useSkylarkSemantics = true
-  )
+      name = "zero_arg_method_with_skylark_info",
+      documented = false,
+      useAst = true,
+      useLocation = true,
+      useEnvironment = true,
+      useSkylarkSemantics = true)
   public Integer zeroArgMethod(
       Location location,
       FuncallExpression ast,
       Environment environment,
-      SkylarkSemantics semantics) {
+      StarlarkSemantics semantics) {
     return 0;
   }
 
@@ -108,18 +106,17 @@
   }
 
   @SkylarkCallable(
-    name = "three_arg_method_with_params_and_info",
-    documented = false,
-    parameters = {
-      @Param(name = "one", type = String.class, named = true),
-      @Param(name = "two", type = Integer.class, named = true),
-      @Param(name = "three", type = String.class, named = true),
-    },
-    useAst = true,
-    useLocation = true,
-    useEnvironment = true,
-    useSkylarkSemantics = true
-  )
+      name = "three_arg_method_with_params_and_info",
+      documented = false,
+      parameters = {
+        @Param(name = "one", type = String.class, named = true),
+        @Param(name = "two", type = Integer.class, named = true),
+        @Param(name = "three", type = String.class, named = true),
+      },
+      useAst = true,
+      useLocation = true,
+      useEnvironment = true,
+      useSkylarkSemantics = true)
   public String threeArgMethodWithParams(
       String one,
       Integer two,
@@ -127,7 +124,7 @@
       Location location,
       FuncallExpression ast,
       Environment environment,
-      SkylarkSemantics skylarkSemantics) {
+      StarlarkSemantics starlarkSemantics) {
     return "baz";
   }
 
@@ -177,7 +174,7 @@
       Location location,
       FuncallExpression ast,
       Environment environment,
-      SkylarkSemantics skylarkSemantics,
+      StarlarkSemantics starlarkSemantics,
       StarlarkContext context) {
     return "blep";
   }
@@ -221,11 +218,9 @@
       structField = true,
       useLocation = true,
       useEnvironment = true,
-      useSkylarkSemantics = true
-  )
-  public String structFieldMethodWithInfo(Location location,
-      Environment environment,
-      SkylarkSemantics skylarkSemantics) {
+      useSkylarkSemantics = true)
+  public String structFieldMethodWithInfo(
+      Location location, Environment environment, StarlarkSemantics starlarkSemantics) {
     return "dragon";
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ToggledKwargsParam.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ToggledKwargsParam.java
index 243b15a..c2f4a7e 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ToggledKwargsParam.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ToggledKwargsParam.java
@@ -19,7 +19,7 @@
 import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.SkylarkDict;
 import com.google.devtools.build.lib.syntax.SkylarkList;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /**
  * Test case for a SkylarkCallable method which has a "extraKeywords" parameter which has
diff --git a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ToggledParamNoDisabledValue.java b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ToggledParamNoDisabledValue.java
index eebbd28..ed2d8d3 100644
--- a/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ToggledParamNoDisabledValue.java
+++ b/src/test/java/com/google/devtools/build/lib/skylarkinterface/processor/testsources/ToggledParamNoDisabledValue.java
@@ -16,7 +16,7 @@
 
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /**
  * Test case for a SkylarkCallable method which has a parameter which may be disabled with semantic
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 4777550..3d89729 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
@@ -37,7 +37,7 @@
 import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;
 import com.google.devtools.build.lib.skylarkinterface.StarlarkContext;
 import com.google.devtools.build.lib.syntax.SkylarkList.MutableList;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 import com.google.devtools.build.lib.testutil.TestMode;
 import java.util.List;
 import java.util.Map;
@@ -161,11 +161,13 @@
     public String structField() {
       return "a";
     }
-    @SkylarkCallable(name = "struct_field_with_extra",
+
+    @SkylarkCallable(
+        name = "struct_field_with_extra",
         documented = false,
         structField = true,
         useSkylarkSemantics = true)
-    public String structFieldWithExtra(SkylarkSemantics sem) {
+    public String structFieldWithExtra(StarlarkSemantics sem) {
       return "struct_field_with_extra("
         + (sem != null)
         + ")";
@@ -320,7 +322,7 @@
         Location location,
         FuncallExpression func,
         Environment env,
-        SkylarkSemantics sem,
+        StarlarkSemantics sem,
         StarlarkContext context) {
       return "with_extra("
           + location.getStartLine()
@@ -336,59 +338,53 @@
     }
 
     @SkylarkCallable(
-      name = "with_params_and_extra",
-      documented = false,
-      parameters = {
-        @Param(name = "pos1"),
-        @Param(name = "pos2", defaultValue = "False", type = Boolean.class),
-        @Param(
-          name = "posOrNamed",
-          defaultValue = "False",
-          type = Boolean.class,
-          positional = true,
-          named = true
-        ),
-        @Param(name = "named", type = Boolean.class, positional = false, named = true),
-        @Param(
-          name = "optionalNamed",
-          type = Boolean.class,
-          defaultValue = "False",
-          positional = false,
-          named = true
-        ),
-        @Param(
-          name = "nonNoneable",
-          type = Object.class,
-          defaultValue = "\"a\"",
-          positional = false,
-          named = true
-        ),
-        @Param(
-          name = "noneable",
-          type = Integer.class,
-          defaultValue = "None",
-          noneable = true,
-          positional = false,
-          named = true
-        ),
-        @Param(
-          name = "multi",
-          allowedTypes = {
-            @ParamType(type = String.class),
-            @ParamType(type = Integer.class),
-            @ParamType(type = SkylarkList.class, generic1 = Integer.class),
-          },
-          defaultValue = "None",
-          noneable = true,
-          positional = false,
-          named = true
-        )
-      },
-      useAst = true,
-      useLocation = true,
-      useEnvironment = true,
-      useSkylarkSemantics = true
-    )
+        name = "with_params_and_extra",
+        documented = false,
+        parameters = {
+          @Param(name = "pos1"),
+          @Param(name = "pos2", defaultValue = "False", type = Boolean.class),
+          @Param(
+              name = "posOrNamed",
+              defaultValue = "False",
+              type = Boolean.class,
+              positional = true,
+              named = true),
+          @Param(name = "named", type = Boolean.class, positional = false, named = true),
+          @Param(
+              name = "optionalNamed",
+              type = Boolean.class,
+              defaultValue = "False",
+              positional = false,
+              named = true),
+          @Param(
+              name = "nonNoneable",
+              type = Object.class,
+              defaultValue = "\"a\"",
+              positional = false,
+              named = true),
+          @Param(
+              name = "noneable",
+              type = Integer.class,
+              defaultValue = "None",
+              noneable = true,
+              positional = false,
+              named = true),
+          @Param(
+              name = "multi",
+              allowedTypes = {
+                @ParamType(type = String.class),
+                @ParamType(type = Integer.class),
+                @ParamType(type = SkylarkList.class, generic1 = Integer.class),
+              },
+              defaultValue = "None",
+              noneable = true,
+              positional = false,
+              named = true)
+        },
+        useAst = true,
+        useLocation = true,
+        useEnvironment = true,
+        useSkylarkSemantics = true)
     public String withParamsAndExtraInterpreterParams(
         Integer pos1,
         boolean pos2,
@@ -401,7 +397,7 @@
         Location location,
         FuncallExpression func,
         Environment env,
-        SkylarkSemantics sem) {
+        StarlarkSemantics sem) {
       return "with_params_and_extra("
           + pos1
           + ", "
diff --git a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFlagGuardingTest.java b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFlagGuardingTest.java
index eb083ef..24c4cd7 100644
--- a/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFlagGuardingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/syntax/StarlarkFlagGuardingTest.java
@@ -16,7 +16,7 @@
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics.FlagIdentifier;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 import com.google.devtools.build.lib.syntax.util.EvaluationTestCase;
 import com.google.devtools.build.lib.testutil.TestMode;
 import org.junit.Before;
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageBuilderHelperForTesting.java b/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageBuilderHelperForTesting.java
index c56170a..908c713 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageBuilderHelperForTesting.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/BazelPackageBuilderHelperForTesting.java
@@ -26,7 +26,7 @@
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.skyframe.packages.BazelPackageLoader;
 import com.google.devtools.build.lib.skyframe.packages.PackageLoader;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.vfs.Root;
 
 /**
@@ -50,8 +50,8 @@
 
   @Override
   public void onLoadingComplete(
-      Package pkg, SkylarkSemantics skylarkSemantics, long loadTimeNanos) {
-    sanityCheckBazelPackageLoader(pkg, ruleClassProvider, skylarkSemantics);
+      Package pkg, StarlarkSemantics starlarkSemantics, long loadTimeNanos) {
+    sanityCheckBazelPackageLoader(pkg, ruleClassProvider, starlarkSemantics);
   }
 
   private static final Function<Target, Label> TARGET_TO_LABEL =
@@ -65,14 +65,14 @@
   private void sanityCheckBazelPackageLoader(
       Package pkg,
       ConfiguredRuleClassProvider ruleClassProvider,
-      SkylarkSemantics skylarkSemantics) {
+      StarlarkSemantics starlarkSemantics) {
     PackageIdentifier pkgId = pkg.getPackageIdentifier();
     PackageLoader packageLoader =
         BazelPackageLoader.builder(
-            Root.fromPath(directories.getWorkspace()),
-            directories.getInstallBase(),
-            directories.getOutputBase())
-            .setSkylarkSemantics(skylarkSemantics)
+                Root.fromPath(directories.getWorkspace()),
+                directories.getInstallBase(),
+                directories.getOutputBase())
+            .setSkylarkSemantics(starlarkSemantics)
             .setRuleClassProvider(ruleClassProvider)
             .build();
     Package newlyLoadedPkg;
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/TestMode.java b/src/test/java/com/google/devtools/build/lib/testutil/TestMode.java
index e850ac6..cbd33fe 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/TestMode.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/TestMode.java
@@ -20,7 +20,7 @@
 import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.Environment.GlobalFrame;
 import com.google.devtools.build.lib.syntax.Mutability;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.common.options.OptionsParser;
 import java.util.Map;
 
@@ -29,7 +29,7 @@
  * appropriate {@code Environment} has to be created
  */
 public abstract class TestMode {
-  private static SkylarkSemantics parseSkylarkSemantics(String... skylarkOptions)
+  private static StarlarkSemantics parseSkylarkSemantics(String... skylarkOptions)
       throws Exception {
     OptionsParser parser = OptionsParser.newOptionsParser(SkylarkSemanticsOptions.class);
     parser.parse(skylarkOptions);
diff --git a/src/test/java/com/google/devtools/build/skydoc/SkydocTest.java b/src/test/java/com/google/devtools/build/skydoc/SkydocTest.java
index 5ab2830..8d80485 100644
--- a/src/test/java/com/google/devtools/build/skydoc/SkydocTest.java
+++ b/src/test/java/com/google/devtools/build/skydoc/SkydocTest.java
@@ -23,7 +23,7 @@
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.skylark.util.SkylarkTestCase;
 import com.google.devtools.build.lib.syntax.ParserInputSource;
-import com.google.devtools.build.lib.syntax.SkylarkSemantics;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics;
 import com.google.devtools.build.lib.syntax.UserDefinedFunction;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import com.google.devtools.build.lib.vfs.Path;
@@ -91,7 +91,7 @@
     ImmutableList.Builder<RuleInfo> unexportedRuleInfos = ImmutableList.builder();
 
     skydocMain.eval(
-        SkylarkSemantics.DEFAULT_SEMANTICS,
+        StarlarkSemantics.DEFAULT_SEMANTICS,
         Label.parseAbsoluteUnchecked("//test:test.bzl"),
         ruleInfoMap,
         unexportedRuleInfos,
@@ -155,7 +155,7 @@
     ImmutableList.Builder<RuleInfo> unexportedRuleInfos = ImmutableList.builder();
 
     skydocMain.eval(
-        SkylarkSemantics.DEFAULT_SEMANTICS,
+        StarlarkSemantics.DEFAULT_SEMANTICS,
         Label.parseAbsoluteUnchecked("//test:test.bzl"),
         ruleInfoMap,
         unexportedRuleInfos,
@@ -207,7 +207,7 @@
     ImmutableMap.Builder<String, RuleInfo> ruleInfoMapBuilder = ImmutableMap.builder();
 
     skydocMain.eval(
-        SkylarkSemantics.DEFAULT_SEMANTICS,
+        StarlarkSemantics.DEFAULT_SEMANTICS,
         Label.parseAbsoluteUnchecked("//test:main.bzl"),
         ruleInfoMapBuilder,
         ImmutableList.builder(),
@@ -259,7 +259,7 @@
     ImmutableMap.Builder<String, RuleInfo> ruleInfoMapBuilder = ImmutableMap.builder();
 
     skydocMain.eval(
-        SkylarkSemantics.DEFAULT_SEMANTICS,
+        StarlarkSemantics.DEFAULT_SEMANTICS,
         Label.parseAbsoluteUnchecked("//test:main.bzl"),
         ruleInfoMapBuilder,
         ImmutableList.builder(),
@@ -298,7 +298,7 @@
             IllegalStateException.class,
             () ->
                 skydocMain.eval(
-                    SkylarkSemantics.DEFAULT_SEMANTICS,
+                    StarlarkSemantics.DEFAULT_SEMANTICS,
                     Label.parseAbsoluteUnchecked("//test:main.bzl"),
                     ruleInfoMapBuilder,
                     ImmutableList.builder(),
@@ -331,7 +331,7 @@
     ImmutableMap.Builder<String, UserDefinedFunction> functionInfoBuilder = ImmutableMap.builder();
 
     skydocMain.eval(
-        SkylarkSemantics.DEFAULT_SEMANTICS,
+        StarlarkSemantics.DEFAULT_SEMANTICS,
         Label.parseAbsoluteUnchecked("//test:main.bzl"),
         ImmutableMap.builder(),
         ImmutableList.builder(),
