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();
   }
 }
