diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
index 3bcdd7f..efa2699 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
@@ -62,7 +62,7 @@
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
 import com.google.devtools.build.lib.packages.RuleVisibility;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.Target;
 import com.google.devtools.build.lib.profiler.memory.CurrentRuleTracker;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
@@ -460,7 +460,7 @@
         // Otherwise missingFragmentPolicy == MissingFragmentPolicy.CREATE_FAIL_ACTIONS:
         return createFailConfiguredTarget(ruleContext);
       }
-      if (rule.getRuleClassObject().isSkylark()) {
+      if (rule.getRuleClassObject().isStarlark()) {
         // TODO(bazel-team): maybe merge with RuleConfiguredTargetBuilder?
         ConfiguredTarget target =
             SkylarkRuleConfiguredTargetUtil.buildRule(
@@ -698,7 +698,7 @@
       }
     }
 
-    for (SkylarkProviderIdentifier providerId : advertisedProviders.getSkylarkProviders()) {
+    for (StarlarkProviderIdentifier providerId : advertisedProviders.getSkylarkProviders()) {
       if (configuredAspect.get(providerId) == null) {
         eventHandler.handle(Event.error(
             target.getLocation(),
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ProviderCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/ProviderCollection.java
index a1a7c32..0dbf1dc 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ProviderCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ProviderCollection.java
@@ -18,7 +18,7 @@
 import com.google.devtools.build.lib.packages.Info;
 import com.google.devtools.build.lib.packages.NativeProvider;
 import com.google.devtools.build.lib.packages.Provider;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import javax.annotation.Nullable;
 
 /**
@@ -73,10 +73,10 @@
    * transitive information has to have been added using the Starlark framework.
    *
    * <p>This method dispatches to either {@link #get(Provider.Key)} or {@link #get(String)}
-   * depending on whether {@link SkylarkProviderIdentifier} is for legacy or for declared provider.
+   * depending on whether {@link StarlarkProviderIdentifier} is for legacy or for declared provider.
    */
   @Nullable
-  default Object get(SkylarkProviderIdentifier id) {
+  default Object get(StarlarkProviderIdentifier id) {
     if (id.isLegacy()) {
       return this.get(id.getLegacyId());
     } else {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
index 9de9feb..75b607e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.analysis;
 
 import static com.google.devtools.build.lib.analysis.ExtraActionUtils.createExtraActionProvider;
-import static com.google.devtools.build.lib.packages.RuleClass.Builder.SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
+import static com.google.devtools.build.lib.packages.RuleClass.Builder.STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
@@ -213,7 +213,7 @@
       Object defaultValue =
           ruleContext
               .attributes()
-              .get(SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, buildSetting.getType());
+              .get(STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, buildSetting.getType());
       addProvider(
           BuildSettingProvider.class,
           new BuildSettingProvider(buildSetting, defaultValue, ruleContext.getLabel()));
@@ -365,7 +365,7 @@
       NestedSet<Artifact> runfilesMiddlemen, NestedSet<Artifact> filesToBuild) {
     filesToRunBuilder.addTransitive(filesToBuild);
     filesToRunBuilder.addTransitive(runfilesMiddlemen);
-    if (executable != null && ruleContext.getRule().getRuleClassObject().isSkylark()) {
+    if (executable != null && ruleContext.getRule().getRuleClassObject().isStarlark()) {
       filesToRunBuilder.add(executable);
     }
     return filesToRunBuilder.build();
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigAwareRuleClassBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigAwareRuleClassBuilder.java
index 242a18a..92e973f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigAwareRuleClassBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ConfigAwareRuleClassBuilder.java
@@ -83,8 +83,8 @@
    */
   public ConfigAwareRuleClassBuilder requiresHostConfigurationFragmentsBySkylarkModuleName(
       Collection<String> configurationFragmentNames) {
-    ruleClassBuilder.requiresConfigurationFragmentsBySkylarkModuleName(HostTransition.INSTANCE,
-        configurationFragmentNames);
+    ruleClassBuilder.requiresConfigurationFragmentsByStarlarkModuleName(
+        HostTransition.INSTANCE, configurationFragmentNames);
     return this;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java
index bae0993..5fa7eb8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkAttr.java
@@ -35,8 +35,8 @@
 import com.google.devtools.build.lib.packages.BuildType;
 import com.google.devtools.build.lib.packages.Provider;
 import com.google.devtools.build.lib.packages.SkylarkAspect;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.StarlarkCallbackHelper;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.packages.Type.ConversionException;
 import com.google.devtools.build.lib.packages.Type.LabelClass;
@@ -234,7 +234,7 @@
 
     if (containsNonNoneKey(arguments, PROVIDERS_ARG)) {
       Object obj = arguments.get(PROVIDERS_ARG);
-      ImmutableList<ImmutableSet<SkylarkProviderIdentifier>> providersList =
+      ImmutableList<ImmutableSet<StarlarkProviderIdentifier>> providersList =
           buildProviderPredicate(Sequence.cast(obj, Object.class, PROVIDERS_ARG), PROVIDERS_ARG);
 
       // If there is at least one empty set, there is no restriction.
@@ -300,7 +300,7 @@
    *
    * @param argumentName used in error messages.
    */
-  static ImmutableList<ImmutableSet<SkylarkProviderIdentifier>> buildProviderPredicate(
+  static ImmutableList<ImmutableSet<StarlarkProviderIdentifier>> buildProviderPredicate(
       Sequence<?> obj, String argumentName) throws EvalException {
     if (obj.isEmpty()) {
       return ImmutableList.of();
@@ -331,28 +331,28 @@
    * Converts Starlark identifiers of providers (either a string or a provider value) to their
    * internal representations.
    */
-  static ImmutableSet<SkylarkProviderIdentifier> getSkylarkProviderIdentifiers(Sequence<?> list)
+  static ImmutableSet<StarlarkProviderIdentifier> getSkylarkProviderIdentifiers(Sequence<?> list)
       throws EvalException {
-    ImmutableList.Builder<SkylarkProviderIdentifier> result = ImmutableList.builder();
+    ImmutableList.Builder<StarlarkProviderIdentifier> result = ImmutableList.builder();
 
     for (Object obj : list) {
       if (obj instanceof String) {
-        result.add(SkylarkProviderIdentifier.forLegacy((String) obj));
+        result.add(StarlarkProviderIdentifier.forLegacy((String) obj));
       } else if (obj instanceof Provider) {
         Provider constructor = (Provider) obj;
         if (!constructor.isExported()) {
           throw new EvalException(
               null, "Providers should be top-level values in extension files that define them.");
         }
-        result.add(SkylarkProviderIdentifier.forKey(constructor.getKey()));
+        result.add(StarlarkProviderIdentifier.forKey(constructor.getKey()));
       }
     }
     return ImmutableSet.copyOf(result.build());
   }
 
-  private static ImmutableList<ImmutableSet<SkylarkProviderIdentifier>> getProvidersList(
+  private static ImmutableList<ImmutableSet<StarlarkProviderIdentifier>> getProvidersList(
       Sequence<?> skylarkList, String argumentName) throws EvalException {
-    ImmutableList.Builder<ImmutableSet<SkylarkProviderIdentifier>> providersList =
+    ImmutableList.Builder<ImmutableSet<StarlarkProviderIdentifier>> providersList =
         ImmutableList.builder();
     String errorMsg = "Illegal argument: element in '%s' is of unexpected type. "
         + "Either all elements should be providers, "
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
index d42fce7..cfecf48 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
@@ -70,8 +70,8 @@
 import com.google.devtools.build.lib.packages.SkylarkDefinedAspect;
 import com.google.devtools.build.lib.packages.SkylarkExportable;
 import com.google.devtools.build.lib.packages.SkylarkProvider;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.StarlarkCallbackHelper;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.TargetUtils;
 import com.google.devtools.build.lib.packages.TestSize;
 import com.google.devtools.build.lib.packages.Type;
@@ -301,7 +301,7 @@
         attrObjectToAttributesList(attrs);
 
     if (skylarkTestable) {
-      builder.setSkylarkTestable();
+      builder.setStarlarkTestable();
     }
     if (Boolean.TRUE.equals(analysisTest)) {
       builder.setIsAnalysisTest();
@@ -314,7 +314,7 @@
               .value(true)
               .nonconfigurable("Called from RunCommand.isExecutable, which takes a Target")
               .build());
-      builder.setExecutableSkylark();
+      builder.setExecutableStarlark();
     }
 
     if (implicitOutputs != Starlark.NONE) {
@@ -340,7 +340,7 @@
       builder.setOutputToGenfiles();
     }
 
-    builder.requiresConfigurationFragmentsBySkylarkModuleName(
+    builder.requiresConfigurationFragmentsByStarlarkModuleName(
         Sequence.cast(fragments, String.class, "fragments"));
     ConfigAwareRuleClassBuilder.of(builder)
         .requiresHostConfigurationFragmentsBySkylarkModuleName(
@@ -382,9 +382,9 @@
             EvalUtils.getDataTypeName(o, true));
       }
     }
-    for (SkylarkProviderIdentifier skylarkProvider :
+    for (StarlarkProviderIdentifier skylarkProvider :
         SkylarkAttr.getSkylarkProviderIdentifiers(providesArg)) {
-      builder.advertiseSkylarkProvider(skylarkProvider);
+      builder.advertiseStarlarkProvider(skylarkProvider);
     }
 
     if (!execCompatibleWith.isEmpty()) {
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 0462f78..e185583 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
@@ -45,7 +45,7 @@
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
 import com.google.devtools.build.lib.packages.SkylarkInfo;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.packages.StructProvider;
 import com.google.devtools.build.lib.packages.TargetUtils;
@@ -180,7 +180,7 @@
   private static void checkDeclaredProviders(
       ConfiguredTarget configuredTarget, AdvertisedProviderSet advertisedProviders, Location loc)
       throws EvalException {
-    for (SkylarkProviderIdentifier providerId : advertisedProviders.getSkylarkProviders()) {
+    for (StarlarkProviderIdentifier providerId : advertisedProviders.getSkylarkProviders()) {
       if (configuredTarget.get(providerId) == null) {
         throw new EvalException(
             loc,
@@ -687,7 +687,7 @@
       builder.setRunfilesSupport(runfilesSupport, executable);
     }
 
-    if (ruleContext.getRule().getRuleClassObject().isSkylarkTestable()) {
+    if (ruleContext.getRule().getRuleClassObject().isStarlarkTestable()) {
       Info actions =
           ActionsProvider.create(ruleContext.getAnalysisEnvironment().getRegisteredActions());
       builder.addSkylarkDeclaredProvider(actions);
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 33e45fc..a1bff83 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
@@ -14,7 +14,7 @@
 
 package com.google.devtools.build.lib.analysis.skylark;
 
-import static com.google.devtools.build.lib.packages.RuleClass.Builder.SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
+import static com.google.devtools.build.lib.packages.RuleClass.Builder.STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
 
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
@@ -377,7 +377,7 @@
   }
 
   public boolean isExecutable() {
-    return ruleContext.getRule().getRuleClassObject().isExecutableSkylark();
+    return ruleContext.getRule().getRuleClassObject().isExecutableStarlark();
   }
 
   public boolean isDefaultExecutableCreated() {
@@ -501,7 +501,7 @@
   @Override
   public StarlarkValue createdActions() throws EvalException {
     checkMutable("created_actions");
-    if (ruleContext.getRule().getRuleClassObject().isSkylarkTestable()) {
+    if (ruleContext.getRule().getRuleClassObject().isStarlarkTestable()) {
       return ActionsProvider.create(
           ruleContext.getAnalysisEnvironment().getRegisteredActions());
     } else {
@@ -602,7 +602,7 @@
     } else {
       return ruleContext
           .attributes()
-          .get(SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, buildSettingType);
+          .get(STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, buildSettingType);
     }
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkTransition.java
index 1ee2dce..45a47ad 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/StarlarkTransition.java
@@ -14,7 +14,7 @@
 package com.google.devtools.build.lib.analysis.skylark;
 
 import static com.google.devtools.build.lib.analysis.skylark.FunctionTransitionUtil.COMMAND_LINE_OPTION_PREFIX;
-import static com.google.devtools.build.lib.packages.RuleClass.Builder.SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
+import static com.google.devtools.build.lib.packages.RuleClass.Builder.STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
@@ -310,7 +310,7 @@
           throw new TransitionException(e);
         }
         if (convertedValue.equals(
-            rule.getAttributeContainer().getAttr(SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME))) {
+            rule.getAttributeContainer().getAttr(STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME))) {
           if (cleanedOptions == null) {
             cleanedOptions = options.toBuilder();
           }
@@ -394,7 +394,7 @@
                     getActual(buildSettingPackages, setting)
                         .getAssociatedRule()
                         .getAttributeContainer()
-                        .getAttr(SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME));
+                        .getAttr(STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME));
               }
             });
     return defaultValues.build();
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java b/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
index 840a491..9899775 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/commands/SyncCommand.java
@@ -235,7 +235,7 @@
       // declare themselves as configure-like.
       return SkylarkRepositoryFunction.isConfigureRule(rule);
     }
-    if (rule.getRuleClassObject().isSkylark()) {
+    if (rule.getRuleClassObject().isStarlark()) {
       // Starlark rules are all whitelisted
       return true;
     }
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 41a2245..e33a30c 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
@@ -291,7 +291,7 @@
    * method can also be used as a universal check.
    */
   public static boolean isConfigureRule(Rule rule) {
-    return rule.getRuleClassObject().isSkylark()
+    return rule.getRuleClassObject().isStarlark()
         && ((Boolean) rule.getAttributeContainer().getAttr("$configure"));
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTestRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTestRule.java
index 050daa8..5e00233 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTestRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelAndroidLocalTestRule.java
@@ -29,7 +29,7 @@
 import com.google.devtools.build.lib.packages.ImplicitOutputsFunction;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.TriState;
 import com.google.devtools.build.lib.rules.android.AndroidFeatureFlagSetProvider;
 import com.google.devtools.build.lib.rules.android.AndroidLocalTestBaseRule;
@@ -69,7 +69,7 @@
                 .mandatoryProvidersList(
                     ImmutableList.of(
                         ImmutableList.of(
-                            SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey())))))
+                            StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey())))))
         .override(attr("$testsupport", LABEL).value(environment.getToolsLabel(JUNIT_TESTRUNNER)))
         .add(
             attr("$robolectric_implicit_classpath", LABEL_LIST)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java
index 6c5098e..6faf239 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java
@@ -50,7 +50,7 @@
 import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.TriState;
 import com.google.devtools.build.lib.rules.cpp.CcInfo;
 import com.google.devtools.build.lib.rules.cpp.CcToolchain;
@@ -286,7 +286,7 @@
                   .allowedRuleClasses(DEPS_ALLOWED_RULES)
                   .allowedFileTypes(CppFileTypes.LINKER_SCRIPT)
                   .skipAnalysisTimeFileTypeCheck()
-                  .mandatoryProviders(SkylarkProviderIdentifier.forKey(CcInfo.PROVIDER.getKey())))
+                  .mandatoryProviders(StarlarkProviderIdentifier.forKey(CcInfo.PROVIDER.getKey())))
           /*<!-- #BLAZE_RULE($cc_rule).ATTRIBUTE(win_def_file) -->
           The Windows DEF file to be passed to linker.
           <p>This attribute should only be used when Windows is the target platform.
@@ -504,7 +504,7 @@
                   .allowedRuleClasses(DEPS_ALLOWED_RULES)
                   .allowedFileTypes(CppFileTypes.LINKER_SCRIPT)
                   .skipAnalysisTimeFileTypeCheck()
-                  .mandatoryProviders(SkylarkProviderIdentifier.forKey(CcInfo.PROVIDER.getKey()))
+                  .mandatoryProviders(StarlarkProviderIdentifier.forKey(CcInfo.PROVIDER.getKey()))
                   .aspect(graphNodeAspect, GraphNodeAspect.ASPECT_PARAMETERS))
           .add(
               attr("dynamic_deps", LABEL_LIST)
@@ -512,10 +512,10 @@
                   .mandatoryProvidersList(
                       ImmutableList.of(
                           ImmutableList.of(
-                              SkylarkProviderIdentifier.forKey(
+                              StarlarkProviderIdentifier.forKey(
                                   BazelCppSemantics.CC_SHARED_INFO_PROVIDER)),
                           ImmutableList.of(
-                              SkylarkProviderIdentifier.forKey(
+                              StarlarkProviderIdentifier.forKey(
                                   BazelCppSemantics.CC_SHARED_INFO_PROVIDER_RULES_CC)))))
           /*<!-- #BLAZE_RULE($cc_binary_base).ATTRIBUTE(malloc) -->
           Override the default dependency on malloc.
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java
index cd6dab2..202ad44 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaLibraryRule.java
@@ -25,7 +25,7 @@
 import com.google.devtools.build.lib.analysis.config.HostTransition;
 import com.google.devtools.build.lib.bazel.rules.java.BazelJavaRuleClasses.JavaRule;
 import com.google.devtools.build.lib.packages.RuleClass;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CppRuleClasses;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration;
@@ -153,7 +153,7 @@
                 .cfg(HostTransition.createFactory())
                 .allowedRuleClasses("java_plugin")
                 .allowedFileTypes())
-        .advertiseSkylarkProvider(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
+        .advertiseStarlarkProvider(StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
         .addRequiredToolchains(CppRuleClasses.ccToolchainTypeAttribute(env))
         .build();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java
index 6b742ce..18bdcf7 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaRuleClasses.java
@@ -39,7 +39,7 @@
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
 import com.google.devtools.build.lib.packages.RuleClass.PackageNameConstraint;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.TriState;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.rules.cpp.CcBinary.CcLauncherInfo;
@@ -72,14 +72,14 @@
           JavaSemantics.JAVA_LIBRARY_CLASS_JAR,
           JavaSemantics.JAVA_LIBRARY_SOURCE_JAR);
 
-  public static final ImmutableList<SkylarkProviderIdentifier> CONTAINS_CC_LINK_PARAMS =
-      ImmutableList.of(SkylarkProviderIdentifier.forKey(CcInfo.PROVIDER.getKey()));
+  public static final ImmutableList<StarlarkProviderIdentifier> CONTAINS_CC_LINK_PARAMS =
+      ImmutableList.of(StarlarkProviderIdentifier.forKey(CcInfo.PROVIDER.getKey()));
 
   /**
    * Meant to be the value of {@code mandatoryProvidersLists} in order for the rule to provide only
    * a {@link JavaInfo} through an attribute.
    */
-  public static final ImmutableList<ImmutableList<SkylarkProviderIdentifier>>
+  public static final ImmutableList<ImmutableList<StarlarkProviderIdentifier>>
       MANDATORY_JAVA_PROVIDER_ONLY = ImmutableList.of(CONTAINS_JAVA_PROVIDER);
 
   /**
@@ -419,7 +419,7 @@
               attr("launcher", LABEL)
                   .allowedFileTypes(FileTypeSet.NO_FILE)
                   .mandatoryProviders(
-                      SkylarkProviderIdentifier.forKey(CcLauncherInfo.PROVIDER.getKey())))
+                      StarlarkProviderIdentifier.forKey(CcLauncherInfo.PROVIDER.getKey())))
           .add(attr(":java_launcher", LABEL).value(JavaSemantics.JAVA_LAUNCHER)) // blaze flag
           .add(
               attr("$launcher", LABEL)
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaLiteProtoLibraryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaLiteProtoLibraryRule.java
index 30cb046..603c544 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaLiteProtoLibraryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaLiteProtoLibraryRule.java
@@ -27,7 +27,7 @@
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
 import com.google.devtools.build.lib.packages.RuleClass;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration;
 import com.google.devtools.build.lib.rules.java.JavaInfo;
 import com.google.devtools.build.lib.rules.java.JavaRuleClasses.JavaHostRuntimeBaseRule;
@@ -65,7 +65,7 @@
                     ImmutableList.<Class<? extends TransitiveInfoProvider>>of(
                         ProtoLangToolchainProvider.class))
                 .value(getProtoToolchainLabel(DEFAULT_PROTO_TOOLCHAIN_LABEL)))
-        .advertiseSkylarkProvider(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
+        .advertiseStarlarkProvider(StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
         .build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaProtoLibraryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaProtoLibraryRule.java
index fc7f5a1..c05455b 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaProtoLibraryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaProtoLibraryRule.java
@@ -22,7 +22,7 @@
 import com.google.devtools.build.lib.analysis.RuleDefinition;
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
 import com.google.devtools.build.lib.packages.RuleClass;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration;
 import com.google.devtools.build.lib.rules.java.JavaInfo;
 import com.google.devtools.build.lib.rules.java.proto.JavaProtoLibrary;
@@ -51,7 +51,7 @@
                 .allowedFileTypes()
                 .aspect(javaProtoAspect))
         .add(attr("strict_deps", BOOLEAN).value(true).undocumented("for migration"))
-        .advertiseSkylarkProvider(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
+        .advertiseStarlarkProvider(StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
         .build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPyRuleClasses.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPyRuleClasses.java
index 4b9a34b..e03f858 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPyRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPyRuleClasses.java
@@ -32,7 +32,7 @@
 import com.google.devtools.build.lib.packages.Attribute.LabelLateBoundDefault;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.TriState;
 import com.google.devtools.build.lib.rules.python.PyCommon;
 import com.google.devtools.build.lib.rules.python.PyInfo;
@@ -76,7 +76,7 @@
                           // Legacy provider.
                           // TODO(b/153363654): Remove this legacy set.
                           ImmutableList.of(
-                              SkylarkProviderIdentifier.forLegacy(PyStructUtils.PROVIDER_NAME)),
+                              StarlarkProviderIdentifier.forLegacy(PyStructUtils.PROVIDER_NAME)),
                           // Modern provider.
                           ImmutableList.of(PyInfo.PROVIDER.id())))
                   .allowedFileTypes())
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AdvertisedProviderSet.java b/src/main/java/com/google/devtools/build/lib/packages/AdvertisedProviderSet.java
index 3eb97a9..cbbf93b 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AdvertisedProviderSet.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AdvertisedProviderSet.java
@@ -35,28 +35,27 @@
 public final class AdvertisedProviderSet {
   private final boolean canHaveAnyProvider;
   private final ImmutableSet<Class<?>> nativeProviders;
-  private final ImmutableSet<SkylarkProviderIdentifier> skylarkProviders;
+  private final ImmutableSet<StarlarkProviderIdentifier> skylarkProviders;
 
-  private AdvertisedProviderSet(boolean canHaveAnyProvider,
+  private AdvertisedProviderSet(
+      boolean canHaveAnyProvider,
       ImmutableSet<Class<?>> nativeProviders,
-      ImmutableSet<SkylarkProviderIdentifier> skylarkProviders) {
+      ImmutableSet<StarlarkProviderIdentifier> skylarkProviders) {
     this.canHaveAnyProvider = canHaveAnyProvider;
     this.nativeProviders = nativeProviders;
     this.skylarkProviders = skylarkProviders;
   }
 
   public static final AdvertisedProviderSet ANY =
-      new AdvertisedProviderSet(true,
-          ImmutableSet.<Class<?>>of(),
-          ImmutableSet.<SkylarkProviderIdentifier>of());
+      new AdvertisedProviderSet(
+          true, ImmutableSet.<Class<?>>of(), ImmutableSet.<StarlarkProviderIdentifier>of());
   public static final AdvertisedProviderSet EMPTY =
-      new AdvertisedProviderSet(false,
-          ImmutableSet.<Class<?>>of(),
-          ImmutableSet.<SkylarkProviderIdentifier>of());
+      new AdvertisedProviderSet(
+          false, ImmutableSet.<Class<?>>of(), ImmutableSet.<StarlarkProviderIdentifier>of());
 
   public static AdvertisedProviderSet create(
       ImmutableSet<Class<?>> nativeProviders,
-      ImmutableSet<SkylarkProviderIdentifier> skylarkProviders) {
+      ImmutableSet<StarlarkProviderIdentifier> skylarkProviders) {
     if (nativeProviders.isEmpty() && skylarkProviders.isEmpty()) {
       return EMPTY;
     }
@@ -110,7 +109,7 @@
   }
 
   /** Get all advertised Starlark providers. */
-  public ImmutableSet<SkylarkProviderIdentifier> getSkylarkProviders() {
+  public ImmutableSet<StarlarkProviderIdentifier> getSkylarkProviders() {
     return skylarkProviders;
   }
 
@@ -133,7 +132,7 @@
    * Returns {@code true} if this provider set can have any provider, or if it advertises the
    * specific Starlark provider requested.
    */
-  public boolean advertises(SkylarkProviderIdentifier skylarkProvider) {
+  public boolean advertises(StarlarkProviderIdentifier skylarkProvider) {
     if (canHaveAnyProvider()) {
       return true;
     }
@@ -144,7 +143,8 @@
   public static class Builder {
     private boolean canHaveAnyProvider;
     private final ArrayList<Class<?>> nativeProviders;
-    private final ArrayList<SkylarkProviderIdentifier> skylarkProviders;
+    private final ArrayList<StarlarkProviderIdentifier> skylarkProviders;
+
     private Builder() {
       nativeProviders = new ArrayList<>();
       skylarkProviders = new ArrayList<>();
@@ -182,17 +182,17 @@
     }
 
     public Builder addSkylark(String providerName) {
-      skylarkProviders.add(SkylarkProviderIdentifier.forLegacy(providerName));
+      skylarkProviders.add(StarlarkProviderIdentifier.forLegacy(providerName));
       return this;
     }
 
-    public Builder addSkylark(SkylarkProviderIdentifier id) {
+    public Builder addSkylark(StarlarkProviderIdentifier id) {
       skylarkProviders.add(id);
       return this;
     }
 
     public Builder addSkylark(Provider.Key id) {
-      skylarkProviders.add(SkylarkProviderIdentifier.forKey(id));
+      skylarkProviders.add(StarlarkProviderIdentifier.forKey(id));
       return this;
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java
index 6aaa10e..107bf7c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AspectDefinition.java
@@ -276,14 +276,14 @@
      * Asserts that this aspect can only be evaluated for rules that supply all of the specified
      * Starlark providers.
      */
-    public Builder requireSkylarkProviders(SkylarkProviderIdentifier... skylarkProviders) {
+    public Builder requireSkylarkProviders(StarlarkProviderIdentifier... skylarkProviders) {
       requiredProviders.addSkylarkSet(ImmutableSet.copyOf(skylarkProviders));
       return this;
     }
 
     public Builder requireAspectsWithProviders(
-        Iterable<ImmutableSet<SkylarkProviderIdentifier>> providerSets) {
-      for (ImmutableSet<SkylarkProviderIdentifier> providerSet : providerSets) {
+        Iterable<ImmutableSet<StarlarkProviderIdentifier>> providerSets) {
+      for (ImmutableSet<StarlarkProviderIdentifier> providerSet : providerSets) {
         if (!providerSet.isEmpty()) {
           requiredAspectProviders.addSkylarkSet(providerSet);
         }
@@ -307,11 +307,9 @@
       return this;
     }
 
-    /**
-     * State that the aspect being built provides given providers.
-     */
-    public Builder advertiseProvider(ImmutableList<SkylarkProviderIdentifier> providers) {
-      for (SkylarkProviderIdentifier provider : providers) {
+    /** State that the aspect being built provides given providers. */
+    public Builder advertiseProvider(ImmutableList<StarlarkProviderIdentifier> providers) {
+      for (StarlarkProviderIdentifier provider : providers) {
         advertisedProviders.addSkylark(provider);
       }
       return this;
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index c8171c5..a91d460 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -974,10 +974,10 @@
      * of {@link #allowedRuleClasses}, otherwise an error is produced during the analysis phase.
      */
     public Builder<TYPE> mandatoryProvidersList(
-        Iterable<? extends Iterable<SkylarkProviderIdentifier>> providersList) {
+        Iterable<? extends Iterable<StarlarkProviderIdentifier>> providersList) {
       Preconditions.checkState(type.getLabelClass() == LabelClass.DEPENDENCY,
           "must be a label-valued type");
-      for (Iterable<SkylarkProviderIdentifier> providers : providersList) {
+      for (Iterable<StarlarkProviderIdentifier> providers : providersList) {
         this.requiredProvidersBuilder.addSkylarkSet(ImmutableSet.copyOf(providers));
       }
       return this;
@@ -989,18 +989,18 @@
               Arrays.asList(ids),
               s -> {
                 Preconditions.checkNotNull(s);
-                return SkylarkProviderIdentifier.forLegacy(s);
+                return StarlarkProviderIdentifier.forLegacy(s);
               }));
     }
 
-    public Builder<TYPE> mandatoryProviders(Iterable<SkylarkProviderIdentifier> providers) {
+    public Builder<TYPE> mandatoryProviders(Iterable<StarlarkProviderIdentifier> providers) {
       if (providers.iterator().hasNext()) {
         mandatoryProvidersList(ImmutableList.of(providers));
       }
       return this;
     }
 
-    public Builder<TYPE> mandatoryProviders(SkylarkProviderIdentifier... providers) {
+    public Builder<TYPE> mandatoryProviders(StarlarkProviderIdentifier... providers) {
       mandatoryProviders(Arrays.asList(providers));
       return this;
     }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java b/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java
index 4a96dad..16c0892 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java
@@ -99,10 +99,8 @@
     throw Starlark.errorf("'%s' cannot be constructed from Starlark", getPrintableName());
   }
 
-  /**
-   * Returns the identifier of this provider.
-   */
-  public SkylarkProviderIdentifier id() {
-    return SkylarkProviderIdentifier.forKey(getKey());
+  /** Returns the identifier of this provider. */
+  public StarlarkProviderIdentifier id() {
+    return StarlarkProviderIdentifier.forKey(getKey());
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java b/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java
index ce5af71..057b6bc 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/NativeProvider.java
@@ -68,8 +68,8 @@
         String.format("'%s' value has no field or method '%%s'", name);
   }
 
-  public final SkylarkProviderIdentifier id() {
-    return SkylarkProviderIdentifier.forKey(getKey());
+  public final StarlarkProviderIdentifier id() {
+    return StarlarkProviderIdentifier.forKey(getKey());
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RequiredProviders.java b/src/main/java/com/google/devtools/build/lib/packages/RequiredProviders.java
index 9af7ae2..73f3023 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RequiredProviders.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RequiredProviders.java
@@ -50,10 +50,9 @@
    */
   private final ImmutableList<ImmutableSet<Class<?>>> nativeProviders;
   /**
-   * Sets of native providers.
-   * If non-empty, {@link #constraint} is {@link Constraint#RESTRICTED}
+   * Sets of native providers. If non-empty, {@link #constraint} is {@link Constraint#RESTRICTED}
    */
-  private final ImmutableList<ImmutableSet<SkylarkProviderIdentifier>> skylarkProviders;
+  private final ImmutableList<ImmutableSet<StarlarkProviderIdentifier>> skylarkProviders;
 
   public String getDescription() {
     return constraint.getDescription(this);
@@ -80,7 +79,7 @@
       @Override
       public boolean satisfies(
           Predicate<Class<?>> hasNativeProvider,
-          Predicate<SkylarkProviderIdentifier> hasSkylarkProvider,
+          Predicate<StarlarkProviderIdentifier> hasSkylarkProvider,
           RequiredProviders requiredProviders,
           Builder missingProviders) {
         return true;
@@ -109,7 +108,7 @@
       @Override
       public boolean satisfies(
           Predicate<Class<?>> hasNativeProvider,
-          Predicate<SkylarkProviderIdentifier> hasSkylarkProvider,
+          Predicate<StarlarkProviderIdentifier> hasSkylarkProvider,
           RequiredProviders requiredProviders,
           Builder missingProviders) {
         return false;
@@ -146,7 +145,7 @@
       @Override
       public boolean satisfies(
           Predicate<Class<?>> hasNativeProvider,
-          Predicate<SkylarkProviderIdentifier> hasSkylarkProvider,
+          Predicate<StarlarkProviderIdentifier> hasSkylarkProvider,
           RequiredProviders requiredProviders,
           Builder missingProviders) {
         for (ImmutableSet<Class<?>> nativeProviderSet : requiredProviders.nativeProviders) {
@@ -164,8 +163,8 @@
           }
         }
 
-        for (ImmutableSet<SkylarkProviderIdentifier> skylarkProviderSet
-            : requiredProviders.skylarkProviders) {
+        for (ImmutableSet<StarlarkProviderIdentifier> skylarkProviderSet :
+            requiredProviders.skylarkProviders) {
           if (skylarkProviderSet.stream().allMatch(hasSkylarkProvider)) {
             return true;
           }
@@ -187,7 +186,7 @@
         for (ImmutableSet<Class<?>> nativeProviderSet : providers.nativeProviders) {
           result.addNativeSet(nativeProviderSet);
         }
-        for (ImmutableSet<SkylarkProviderIdentifier> skylarkProviderSet :
+        for (ImmutableSet<StarlarkProviderIdentifier> skylarkProviderSet :
             providers.skylarkProviders) {
           result.addSkylarkSet(skylarkProviderSet);
         }
@@ -215,7 +214,7 @@
      */
     abstract boolean satisfies(
         Predicate<Class<?>> hasNativeProvider,
-        Predicate<SkylarkProviderIdentifier> hasSkylarkProvider,
+        Predicate<StarlarkProviderIdentifier> hasSkylarkProvider,
         RequiredProviders requiredProviders,
         @Nullable Builder missingProviders);
 
@@ -231,12 +230,12 @@
   }
 
   /**
-   * Checks if a set of providers encoded by predicates {@code hasNativeProviders}
-   * and {@code hasSkylarkProvider} satisfies this {@code RequiredProviders} instance.
+   * Checks if a set of providers encoded by predicates {@code hasNativeProviders} and {@code
+   * hasSkylarkProvider} satisfies this {@code RequiredProviders} instance.
    */
   public boolean isSatisfiedBy(
       Predicate<Class<?>> hasNativeProvider,
-      Predicate<SkylarkProviderIdentifier> hasSkylarkProvider) {
+      Predicate<StarlarkProviderIdentifier> hasSkylarkProvider) {
     return constraint.satisfies(hasNativeProvider, hasSkylarkProvider, this, null);
   }
 
@@ -246,7 +245,7 @@
    */
   public RequiredProviders getMissing(
       Predicate<Class<?>> hasNativeProvider,
-      Predicate<SkylarkProviderIdentifier> hasSkylarkProvider) {
+      Predicate<StarlarkProviderIdentifier> hasSkylarkProvider) {
     Builder builder = acceptAnyBuilder();
     if (constraint.satisfies(hasNativeProvider, hasSkylarkProvider, this, builder)) {
       // Ignore all collected missing providers.
@@ -277,7 +276,7 @@
   RequiredProviders(
       Constraint constraint,
       ImmutableList<ImmutableSet<Class<?>>> nativeProviders,
-      ImmutableList<ImmutableSet<SkylarkProviderIdentifier>> skylarkProviders) {
+      ImmutableList<ImmutableSet<StarlarkProviderIdentifier>> skylarkProviders) {
     this.constraint = constraint;
 
     Preconditions.checkState(constraint.equals(Constraint.RESTRICTED)
@@ -347,7 +346,7 @@
   /** A builder for {@link RequiredProviders} */
   public static class Builder {
     private final ImmutableList.Builder<ImmutableSet<Class<?>>> nativeProviders;
-    private final ImmutableList.Builder<ImmutableSet<SkylarkProviderIdentifier>> skylarkProviders;
+    private final ImmutableList.Builder<ImmutableSet<StarlarkProviderIdentifier>> skylarkProviders;
     private Constraint constraint;
 
     private Builder(boolean acceptNone) {
@@ -362,7 +361,7 @@
      * <p>If all of these providers are present in the dependency, the dependency satisfies {@link
      * RequiredProviders}.
      */
-    public Builder addSkylarkSet(ImmutableSet<SkylarkProviderIdentifier> skylarkProviderSet) {
+    public Builder addSkylarkSet(ImmutableSet<StarlarkProviderIdentifier> skylarkProviderSet) {
       constraint = Constraint.RESTRICTED;
       Preconditions.checkState(!skylarkProviderSet.isEmpty());
       this.skylarkProviders.add(skylarkProviderSet);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
index d798b89..72f5f1c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
@@ -628,7 +628,7 @@
      * Name of default attribute implicitly added to all Starlark RuleClasses that are {@code
      * build_setting}s.
      */
-    public static final String SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME = "build_setting_default";
+    public static final String STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME = "build_setting_default";
 
     public static final String BUILD_SETTING_DEFAULT_NONCONFIGURABLE =
         "Build setting defaults are referenced during analysis.";
@@ -650,13 +650,13 @@
     private String name;
     private ImmutableList<StarlarkThread.CallStackEntry> callstack = ImmutableList.of();
     private final RuleClassType type;
-    private final boolean skylark;
-    private boolean skylarkTestable = false;
+    private final boolean starlark;
+    private boolean starlarkTestable = false;
     private boolean documented;
     private boolean publicByDefault = false;
     private boolean binaryOutput = true;
     private boolean workspaceOnly = false;
-    private boolean isExecutableSkylark = false;
+    private boolean isExecutableStarlark = false;
     private boolean isAnalysisTest = false;
     private boolean hasAnalysisTestTransition = false;
     private boolean hasFunctionTransitionWhitelist = false;
@@ -720,20 +720,20 @@
     private final Map<String, ExecGroup> execGroups = new HashMap<>();
 
     /**
-     * Constructs a new {@code RuleClassBuilder} using all attributes from all
-     * parent rule classes. An attribute cannot exist in more than one parent.
+     * Constructs a new {@code RuleClassBuilder} using all attributes from all parent rule classes.
+     * An attribute cannot exist in more than one parent.
      *
-     * <p>The rule type affects the allowed names and the required
-     * attributes (see {@link RuleClassType}).
+     * <p>The rule type affects the allowed names and the required attributes (see {@link
+     * RuleClassType}).
      *
-     * @throws IllegalArgumentException if an attribute with the same name exists
-     * in more than one parent
+     * @throws IllegalArgumentException if an attribute with the same name exists in more than one
+     *     parent
      */
-    public Builder(String name, RuleClassType type, boolean skylark, RuleClass... parents) {
+    public Builder(String name, RuleClassType type, boolean starlark, RuleClass... parents) {
       this.name = name;
-      this.skylark = skylark;
+      this.starlark = starlark;
       this.type = type;
-      Preconditions.checkState(skylark || type != RuleClassType.PLACEHOLDER, name);
+      Preconditions.checkState(starlark || type != RuleClassType.PLACEHOLDER, name);
       this.documented = type != RuleClassType.ABSTRACT;
       for (RuleClass parent : parents) {
         if (parent.getValidityPredicate() != PredicatesWithMessage.<Rule>alwaysTrue()) {
@@ -812,9 +812,9 @@
           configuredTargetFactory,
           configuredTargetFunction);
       if (!workspaceOnly) {
-        if (skylark) {
-          assertSkylarkRuleClassHasImplementationFunction();
-          assertSkylarkRuleClassHasEnvironmentLabel();
+        if (starlark) {
+          assertStarlarkRuleClassHasImplementationFunction();
+          assertStarlarkRuleClassHasEnvironmentLabel();
         }
         Preconditions.checkState(externalBindingsFunction == NO_EXTERNAL_BINDINGS);
       }
@@ -825,7 +825,7 @@
       if (buildSetting != null) {
         Type<?> type = buildSetting.getType();
         Attribute.Builder<?> attrBuilder =
-            attr(SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, type)
+            attr(STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, type)
                 .nonconfigurable(BUILD_SETTING_DEFAULT_NONCONFIGURABLE)
                 .mandatory();
         if (BuildType.isLabelType(type)) {
@@ -844,13 +844,13 @@
           callstack,
           key,
           type,
-          skylark,
-          skylarkTestable,
+          starlark,
+          starlarkTestable,
           documented,
           publicByDefault,
           binaryOutput,
           workspaceOnly,
-          isExecutableSkylark,
+          isExecutableStarlark,
           isAnalysisTest,
           hasAnalysisTestTransition,
           hasFunctionTransitionWhitelist,
@@ -902,7 +902,7 @@
       ruleClassType.checkAttributes(attributes);
     }
 
-    private void assertSkylarkRuleClassHasImplementationFunction() {
+    private void assertStarlarkRuleClassHasImplementationFunction() {
       Preconditions.checkState(
           (type == RuleClassType.NORMAL || type == RuleClassType.TEST)
               == (configuredTargetFunction != null),
@@ -911,7 +911,7 @@
           configuredTargetFunction);
     }
 
-    private void assertSkylarkRuleClassHasEnvironmentLabel() {
+    private void assertStarlarkRuleClassHasEnvironmentLabel() {
       Preconditions.checkState(
           (type == RuleClassType.NORMAL
                   || type == RuleClassType.TEST
@@ -960,7 +960,7 @@
      * <p>In contrast to {@link #requiresConfigurationFragments(Class...)}, this method takes the
      * Starlark module names of fragments instead of their classes.
      */
-    public Builder requiresConfigurationFragmentsBySkylarkModuleName(
+    public Builder requiresConfigurationFragmentsByStarlarkModuleName(
         Collection<String> configurationFragmentNames) {
       configurationFragmentPolicy
           .requiresConfigurationFragmentsBySkylarkModuleName(configurationFragmentNames);
@@ -985,7 +985,7 @@
      *
      * <p>The value is inherited by subclasses.
      */
-    public Builder requiresConfigurationFragmentsBySkylarkModuleName(
+    public Builder requiresConfigurationFragmentsByStarlarkModuleName(
         ConfigurationTransition transition, Collection<String> configurationFragmentNames) {
       configurationFragmentPolicy.requiresConfigurationFragmentsBySkylarkModuleName(transition,
           configurationFragmentNames);
@@ -998,9 +998,9 @@
       return this;
     }
 
-    public Builder setSkylarkTestable() {
-      Preconditions.checkState(skylark, "Cannot set skylarkTestable on a non-Starlark rule");
-      skylarkTestable = true;
+    public Builder setStarlarkTestable() {
+      Preconditions.checkState(starlark, "Cannot set starlarkTestable on a non-Starlark rule");
+      starlarkTestable = true;
       return this;
     }
 
@@ -1145,9 +1145,9 @@
       return this;
     }
 
-    public Builder advertiseSkylarkProvider(SkylarkProviderIdentifier... skylarkProviders) {
-      for (SkylarkProviderIdentifier skylarkProviderIdentifier : skylarkProviders) {
-        advertisedProviders.addSkylark(skylarkProviderIdentifier);
+    public Builder advertiseStarlarkProvider(StarlarkProviderIdentifier... starlarkProviders) {
+      for (StarlarkProviderIdentifier starlarkProviderIdentifier : starlarkProviders) {
+        advertisedProviders.addSkylark(starlarkProviderIdentifier);
       }
       return this;
     }
@@ -1279,8 +1279,8 @@
      * This rule class outputs a default executable for every rule with the same name as the
      * rules's. Only works for Starlark.
      */
-    public <TYPE> Builder setExecutableSkylark() {
-      this.isExecutableSkylark = true;
+    public <TYPE> Builder setExecutableStarlark() {
+      this.isExecutableStarlark = true;
       return this;
     }
 
@@ -1497,13 +1497,13 @@
   private final String targetKind;
 
   private final RuleClassType type;
-  private final boolean isSkylark;
-  private final boolean skylarkTestable;
+  private final boolean isStarlark;
+  private final boolean starlarkTestable;
   private final boolean documented;
   private final boolean publicByDefault;
   private final boolean binaryOutput;
   private final boolean workspaceOnly;
-  private final boolean isExecutableSkylark;
+  private final boolean isExecutableStarlark;
   private final boolean isAnalysisTest;
   private final boolean hasAnalysisTestTransition;
   private final boolean hasFunctionTransitionWhitelist;
@@ -1631,13 +1631,13 @@
       ImmutableList<StarlarkThread.CallStackEntry> callstack,
       String key,
       RuleClassType type,
-      boolean isSkylark,
-      boolean skylarkTestable,
+      boolean isStarlark,
+      boolean starlarkTestable,
       boolean documented,
       boolean publicByDefault,
       boolean binaryOutput,
       boolean workspaceOnly,
-      boolean isExecutableSkylark,
+      boolean isExecutableStarlark,
       boolean isAnalysisTest,
       boolean hasAnalysisTestTransition,
       boolean hasFunctionTransitionWhitelist,
@@ -1667,9 +1667,9 @@
     this.callstack = callstack;
     this.key = key;
     this.type = type;
-    this.isSkylark = isSkylark;
+    this.isStarlark = isStarlark;
     this.targetKind = name + Rule.targetKindSuffix();
-    this.skylarkTestable = skylarkTestable;
+    this.starlarkTestable = starlarkTestable;
     this.documented = documented;
     this.publicByDefault = publicByDefault;
     this.binaryOutput = binaryOutput;
@@ -1688,7 +1688,7 @@
     validateNoClashInPublicNames(attributes);
     this.attributes = ImmutableList.copyOf(attributes);
     this.workspaceOnly = workspaceOnly;
-    this.isExecutableSkylark = isExecutableSkylark;
+    this.isExecutableStarlark = isExecutableStarlark;
     this.isAnalysisTest = isAnalysisTest;
     this.hasAnalysisTestTransition = hasAnalysisTestTransition;
     this.hasFunctionTransitionWhitelist = hasFunctionTransitionWhitelist;
@@ -2557,20 +2557,18 @@
   }
 
   /** Returns true if this RuleClass is a Starlark-defined RuleClass. */
-  public boolean isSkylark() {
-    return isSkylark;
+  public boolean isStarlark() {
+    return isStarlark;
   }
 
   /** Returns true if this RuleClass is Starlark-defined and is subject to analysis-time tests. */
-  public boolean isSkylarkTestable() {
-    return skylarkTestable;
+  public boolean isStarlarkTestable() {
+    return starlarkTestable;
   }
 
-  /**
-   * Returns true if this rule class outputs a default executable for every rule.
-   */
-  public boolean isExecutableSkylark() {
-    return isExecutableSkylark;
+  /** Returns true if this rule class outputs a default executable for every rule. */
+  public boolean isExecutableStarlark() {
+    return isExecutableStarlark;
   }
 
   /** Returns true if this rule class is an analysis test (set by analysis_test = true). */
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleFormatter.java b/src/main/java/com/google/devtools/build/lib/packages/RuleFormatter.java
index 5b1c23e..c894642 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleFormatter.java
@@ -39,7 +39,7 @@
     builder.setPublicByDefault(rule.getRuleClassObject().isPublicByDefault());
 
     RawAttributeMapper rawAttributeMapper = RawAttributeMapper.of(rule);
-    boolean isSkylark = rule.getRuleClassObject().isSkylark();
+    boolean isSkylark = rule.getRuleClassObject().isStarlark();
 
     if (isSkylark) {
       builder.setSkylarkEnvironmentHashCode(
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkDefinedAspect.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkDefinedAspect.java
index 2b46eca..2cc94de 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkDefinedAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkDefinedAspect.java
@@ -36,8 +36,8 @@
   private final StarlarkCallable implementation;
   private final ImmutableList<String> attributeAspects;
   private final ImmutableList<Attribute> attributes;
-  private final ImmutableList<ImmutableSet<SkylarkProviderIdentifier>> requiredAspectProviders;
-  private final ImmutableSet<SkylarkProviderIdentifier> provides;
+  private final ImmutableList<ImmutableSet<StarlarkProviderIdentifier>> requiredAspectProviders;
+  private final ImmutableSet<StarlarkProviderIdentifier> provides;
   private final ImmutableSet<String> paramAttributes;
   private final ImmutableSet<String> fragments;
   private final ConfigurationTransition hostTransition;
@@ -51,8 +51,8 @@
       StarlarkCallable implementation,
       ImmutableList<String> attributeAspects,
       ImmutableList<Attribute> attributes,
-      ImmutableList<ImmutableSet<SkylarkProviderIdentifier>> requiredAspectProviders,
-      ImmutableSet<SkylarkProviderIdentifier> provides,
+      ImmutableList<ImmutableSet<StarlarkProviderIdentifier>> requiredAspectProviders,
+      ImmutableSet<StarlarkProviderIdentifier> provides,
       ImmutableSet<String> paramAttributes,
       ImmutableSet<String> fragments,
       // The host transition is in lib.analysis, so we can't reference it directly here.
@@ -80,8 +80,8 @@
       StarlarkCallable implementation,
       ImmutableList<String> attributeAspects,
       ImmutableList<Attribute> attributes,
-      ImmutableList<ImmutableSet<SkylarkProviderIdentifier>> requiredAspectProviders,
-      ImmutableSet<SkylarkProviderIdentifier> provides,
+      ImmutableList<ImmutableSet<StarlarkProviderIdentifier>> requiredAspectProviders,
+      ImmutableSet<StarlarkProviderIdentifier> provides,
       ImmutableSet<String> paramAttributes,
       ImmutableSet<String> fragments,
       // The host transition is in lib.analysis, so we can't reference it directly here.
@@ -177,9 +177,9 @@
       builder.add(attr);
     }
     builder.requireAspectsWithProviders(requiredAspectProviders);
-    ImmutableList.Builder<SkylarkProviderIdentifier> advertisedSkylarkProviders =
+    ImmutableList.Builder<StarlarkProviderIdentifier> advertisedSkylarkProviders =
         ImmutableList.builder();
-    for (SkylarkProviderIdentifier provider : provides) {
+    for (StarlarkProviderIdentifier provider : provides) {
       advertisedSkylarkProviders.add(provider);
     }
     builder.advertiseProvider(advertisedSkylarkProviders.build());
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkProviderIdentifier.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkProviderIdentifier.java
similarity index 77%
rename from src/main/java/com/google/devtools/build/lib/packages/SkylarkProviderIdentifier.java
rename to src/main/java/com/google/devtools/build/lib/packages/StarlarkProviderIdentifier.java
index 90012b8..36775c9 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkProviderIdentifier.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkProviderIdentifier.java
@@ -24,8 +24,8 @@
  * A wrapper around Starlark provider identifier, representing either a declared provider ({@see
  * SkylarkProvider}) or a "legacy" string identifier.
  */
-public final class SkylarkProviderIdentifier {
-  private static final Interner<SkylarkProviderIdentifier> interner =
+public final class StarlarkProviderIdentifier {
+  private static final Interner<StarlarkProviderIdentifier> interner =
       BlazeInterners.newWeakInterner();
 
   @Nullable
@@ -33,27 +33,27 @@
   @Nullable private final Provider.Key key;
 
   /** Creates an id for a declared provider with a given key ({@see SkylarkProvider}). */
-  public static SkylarkProviderIdentifier forKey(Provider.Key key) {
-    return interner.intern(new SkylarkProviderIdentifier(key));
+  public static StarlarkProviderIdentifier forKey(Provider.Key key) {
+    return interner.intern(new StarlarkProviderIdentifier(key));
   }
 
   /** Creates an id for a provider with a given name. */
-  public static SkylarkProviderIdentifier forLegacy(String legacyId) {
-    return interner.intern(new SkylarkProviderIdentifier(legacyId));
+  public static StarlarkProviderIdentifier forLegacy(String legacyId) {
+    return interner.intern(new StarlarkProviderIdentifier(legacyId));
   }
 
-  private SkylarkProviderIdentifier(String legacyId) {
+  private StarlarkProviderIdentifier(String legacyId) {
     this.legacyId = legacyId;
     this.key = null;
   }
 
-  private SkylarkProviderIdentifier(Provider.Key key) {
+  private StarlarkProviderIdentifier(Provider.Key key) {
     this.legacyId = null;
     this.key = key;
   }
 
   /**
-   * Returns true if this {@link SkylarkProviderIdentifier} identifies
+   * Returns true if this {@link StarlarkProviderIdentifier} identifies
    * a legacy provider (with a string name).
    */
   public boolean isLegacy() {
@@ -92,10 +92,10 @@
     if (this == obj) {
       return true;
     }
-    if (!(obj instanceof SkylarkProviderIdentifier)) {
+    if (!(obj instanceof StarlarkProviderIdentifier)) {
       return false;
     }
-    SkylarkProviderIdentifier other = (SkylarkProviderIdentifier) obj;
+    StarlarkProviderIdentifier other = (StarlarkProviderIdentifier) obj;
     return Objects.equals(legacyId, other.legacyId)
         && Objects.equals(key, other.key);
   }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java b/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
index 7bc58b0..ebb6e77 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/TargetUtils.java
@@ -89,7 +89,7 @@
     }
 
     Rule rule = (Rule) target;
-    return !rule.getRuleClassObject().isSkylark() && rule.getRuleClass().equals("alias");
+    return !rule.getRuleClassObject().isStarlark() && rule.getRuleClass().equals("alias");
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/query2/query/output/SyntheticAttributeHashCalculator.java b/src/main/java/com/google/devtools/build/lib/query2/query/output/SyntheticAttributeHashCalculator.java
index d0a7008..3a4477e 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/query/output/SyntheticAttributeHashCalculator.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/query/output/SyntheticAttributeHashCalculator.java
@@ -63,7 +63,7 @@
     CodedOutputStream codedOut = CodedOutputStream.newInstance(hashingOutputStream);
 
     RuleClass ruleClass = rule.getRuleClassObject();
-    if (ruleClass.isSkylark()) {
+    if (ruleClass.isStarlark()) {
       try {
         codedOut.writeStringNoTag(
             Preconditions.checkNotNull(ruleClass.getRuleDefinitionEnvironmentHashCode(), rule));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/LabelBuildSettings.java b/src/main/java/com/google/devtools/build/lib/rules/LabelBuildSettings.java
index 91af18c..723346d 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/LabelBuildSettings.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/LabelBuildSettings.java
@@ -15,7 +15,7 @@
 
 import static com.google.devtools.build.lib.packages.Attribute.attr;
 import static com.google.devtools.build.lib.packages.BuildType.LABEL;
-import static com.google.devtools.build.lib.packages.RuleClass.Builder.SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
+import static com.google.devtools.build.lib.packages.RuleClass.Builder.STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
 
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -55,7 +55,7 @@
           null,
           (rule, attributes, configuration) -> {
             if (rule == null || configuration == null) {
-              return attributes.get(SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, LABEL);
+              return attributes.get(STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, LABEL);
             }
             Object commandLineValue =
                 configuration.getOptions().getStarlarkOptions().get(rule.getLabel());
@@ -63,7 +63,7 @@
             try {
               asLabel =
                   commandLineValue == null
-                      ? attributes.get(SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, LABEL)
+                      ? attributes.get(STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, LABEL)
                       : LABEL.convert(commandLineValue, "label_flag value resolution");
             } catch (ConversionException e) {
               throw new IllegalStateException(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/LateBoundAlias.java b/src/main/java/com/google/devtools/build/lib/rules/LateBoundAlias.java
index 7892656..15f8dbb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/LateBoundAlias.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/LateBoundAlias.java
@@ -15,7 +15,7 @@
 
 import static com.google.devtools.build.lib.packages.Attribute.attr;
 import static com.google.devtools.build.lib.packages.BuildType.LABEL;
-import static com.google.devtools.build.lib.packages.RuleClass.Builder.SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
+import static com.google.devtools.build.lib.packages.RuleClass.Builder.STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
@@ -68,7 +68,7 @@
       Object defaultValue =
           ruleContext
               .attributes()
-              .get(SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, buildSetting.getType());
+              .get(STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, buildSetting.getType());
       providers.put(
           BuildSettingProvider.class,
           new BuildSettingProvider(buildSetting, defaultValue, ruleContext.getLabel()));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImportBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImportBaseRule.java
index 291b293..071d364 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImportBaseRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImportBaseRule.java
@@ -23,7 +23,7 @@
 import com.google.devtools.build.lib.analysis.config.HostTransition;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.AndroidBaseRule;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration;
 import com.google.devtools.build.lib.rules.java.JavaInfo;
@@ -86,7 +86,7 @@
                 .cfg(HostTransition.createFactory())
                 .exec()
                 .value(env.getToolsLabel("//tools/zip:zipper")))
-        .advertiseSkylarkProvider(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
+        .advertiseStarlarkProvider(StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
         .requiresConfigurationFragments(AndroidConfiguration.class, JavaConfiguration.class)
         .build();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestBaseRule.java
index a9d784c..50d3dad 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestBaseRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTestBaseRule.java
@@ -22,7 +22,7 @@
 import com.google.devtools.build.lib.analysis.config.HostTransition;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.util.FileTypeSet;
 
 /** Rule definition for the {@code android_instrumentation_test} rule. */
@@ -55,7 +55,7 @@
                 .cfg(HostTransition.createFactory())
                 .allowedFileTypes(FileTypeSet.NO_FILE)
                 .mandatoryProviders(
-                    SkylarkProviderIdentifier.forKey(AndroidDeviceBrokerInfo.PROVIDER.getKey())))
+                    StarlarkProviderIdentifier.forKey(AndroidDeviceBrokerInfo.PROVIDER.getKey())))
         /* <!-- #BLAZE_RULE(android_instrumentation_test).ATTRIBUTE(support_apks) -->
         Other APKs to install on the device before the instrumentation test starts.
         <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java
index eca4708..e7bd9ad 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibraryBaseRule.java
@@ -24,7 +24,7 @@
 import com.google.devtools.build.lib.analysis.config.HostTransition;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.TriState;
 import com.google.devtools.build.lib.rules.android.AndroidRuleClasses.AndroidResourceSupportRule;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration;
@@ -191,7 +191,7 @@
             attr("idl_preprocessed", LABEL_LIST)
                 .direct_compile_time_input()
                 .allowedFileTypes(AndroidRuleClasses.ANDROID_IDL))
-        .advertiseSkylarkProvider(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
+        .advertiseStarlarkProvider(StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
         .build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java
index 59a2d43..dd8d6f0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java
@@ -26,7 +26,7 @@
 import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.BuildType;
 import com.google.devtools.build.lib.packages.NativeAspectClass;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.rules.java.JavaCommon;
 import com.google.devtools.build.lib.rules.java.JavaInfo;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
@@ -95,10 +95,10 @@
     }
 
     return builder
-        .requireSkylarkProviders(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
+        .requireSkylarkProviders(StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
         .requireSkylarkProviders(
-            SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()),
-            SkylarkProviderIdentifier.forKey(
+            StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()),
+            StarlarkProviderIdentifier.forKey(
                 AndroidLibraryResourceClassJarProvider.PROVIDER.getKey()))
         .requiresConfigurationFragments()
         .build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
index 62d31b8..728f4fd 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
@@ -48,7 +48,7 @@
 import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.TriState;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.rules.android.AndroidConfiguration.ConfigurationDistinguisher;
@@ -206,8 +206,8 @@
 
   public static final String NOCOMPRESS_EXTENSIONS_ATTR = "nocompress_extensions";
 
-  public static final ImmutableList<SkylarkProviderIdentifier> CONTAINS_CC_INFO_PARAMS =
-      ImmutableList.of(SkylarkProviderIdentifier.forKey(CcInfo.PROVIDER.getKey()));
+  public static final ImmutableList<StarlarkProviderIdentifier> CONTAINS_CC_INFO_PARAMS =
+      ImmutableList.of(StarlarkProviderIdentifier.forKey(CcInfo.PROVIDER.getKey()));
 
   /** The default label of android_sdk option */
   public static LabelLateBoundDefault<?> getAndroidSdkLabel(Label androidSdk) {
@@ -466,10 +466,10 @@
                   .cfg(HostTransition.createFactory())
                   .exec()
                   .value(env.getToolsLabel("//tools/android:databinding_exec")))
-          .advertiseSkylarkProvider(
-              SkylarkProviderIdentifier.forKey(AndroidResourcesInfo.PROVIDER.getKey()))
-          .advertiseSkylarkProvider(
-              SkylarkProviderIdentifier.forKey(AndroidNativeLibsInfo.PROVIDER.getKey()))
+          .advertiseStarlarkProvider(
+              StarlarkProviderIdentifier.forKey(AndroidResourcesInfo.PROVIDER.getKey()))
+          .advertiseStarlarkProvider(
+              StarlarkProviderIdentifier.forKey(AndroidNativeLibsInfo.PROVIDER.getKey()))
           .build();
     }
 
@@ -598,8 +598,8 @@
                   .mandatoryProviders(CONTAINS_CC_INFO_PARAMS)
                   .mandatoryProviders(JavaRuleClasses.CONTAINS_JAVA_PROVIDER)
                   .mandatoryProviders(
-                      SkylarkProviderIdentifier.forKey(AndroidResourcesInfo.PROVIDER.getKey()),
-                      SkylarkProviderIdentifier.forKey(AndroidAssetsInfo.PROVIDER.getKey()))
+                      StarlarkProviderIdentifier.forKey(AndroidResourcesInfo.PROVIDER.getKey()),
+                      StarlarkProviderIdentifier.forKey(AndroidAssetsInfo.PROVIDER.getKey()))
                   .aspect(androidNeverlinkAspect)
                   .aspect(dexArchiveAspect, DexArchiveAspect.PARAM_EXTRACTOR))
           /* <!-- #BLAZE_RULE($android_binary_base).ATTRIBUTE(debug_key) -->
@@ -923,8 +923,8 @@
                   .value(LEGACY_MAIN_DEX_LIST_GENERATOR)
                   .exec())
           .removeAttribute("data")
-          .advertiseSkylarkProvider(SkylarkProviderIdentifier.forKey(ApkInfo.PROVIDER.getKey()))
-          .advertiseSkylarkProvider(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
+          .advertiseStarlarkProvider(StarlarkProviderIdentifier.forKey(ApkInfo.PROVIDER.getKey()))
+          .advertiseStarlarkProvider(StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
           .build();
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkBaseRule.java
index 7cccfd0..e5a100a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkBaseRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdkBaseRule.java
@@ -23,7 +23,7 @@
 import com.google.devtools.build.lib.analysis.config.HostTransition;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration;
 import com.google.devtools.build.lib.rules.java.JavaRuleClasses.JavaToolchainBaseRule;
 import com.google.devtools.build.lib.rules.java.JavaSemantics;
@@ -133,8 +133,8 @@
                 .cfg(HostTransition.createFactory())
                 .allowedFileTypes(ANY_FILE)
                 .exec())
-        .advertiseSkylarkProvider(
-            SkylarkProviderIdentifier.forKey(AndroidSdkProvider.PROVIDER.getKey()))
+        .advertiseStarlarkProvider(
+            StarlarkProviderIdentifier.forKey(AndroidSdkProvider.PROVIDER.getKey()))
         .build();
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
index 84d7ec2..01e5bad 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
@@ -18,7 +18,7 @@
 import static com.google.devtools.build.lib.packages.Attribute.attr;
 import static com.google.devtools.build.lib.packages.BuildType.LABEL;
 import static com.google.devtools.build.lib.packages.BuildType.TRISTATE;
-import static com.google.devtools.build.lib.packages.SkylarkProviderIdentifier.forKey;
+import static com.google.devtools.build.lib.packages.StarlarkProviderIdentifier.forKey;
 import static com.google.devtools.build.lib.rules.android.AndroidCommon.getAndroidConfig;
 
 import com.google.common.base.Function;
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagProvider.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagProvider.java
index 560b4ba..030bcd0 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagProvider.java
@@ -22,7 +22,7 @@
 import com.google.devtools.build.lib.packages.NativeInfo;
 import com.google.devtools.build.lib.packages.NativeProvider;
 import com.google.devtools.build.lib.packages.RequiredProviders;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.skylarkbuildapi.config.ConfigFeatureFlagProviderApi;
 import com.google.devtools.build.lib.skylarkinterface.Param;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
@@ -90,7 +90,7 @@
     }
   }
 
-  public static SkylarkProviderIdentifier id() {
+  public static StarlarkProviderIdentifier id() {
     return SKYLARK_CONSTRUCTOR.id();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
index 8681613..e473615 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
@@ -166,7 +166,7 @@
 
     private void checkRestrictedUsage(RuleContext ruleContext) {
       Rule rule = ruleContext.getRule();
-      if (rule.getRuleClassObject().isSkylark()
+      if (rule.getRuleClassObject().isStarlark()
           || (!rule.getRuleClass().equals("java_binary")
               && !rule.getRuleClass().equals("java_test")
               && !rule.getRuleClass().equals("py_binary")
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java
index 23d4872..6f804ef 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImportBaseRule.java
@@ -25,7 +25,7 @@
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.rules.cpp.CppConfiguration;
 import com.google.devtools.build.lib.rules.java.JavaRuleClasses.JavaHostRuntimeBaseRule;
 
@@ -65,7 +65,7 @@
                 .nonconfigurable(
                     "used in Attribute.validityPredicate implementations (loading time)"))
         .advertiseProvider(JavaSourceInfoProvider.class)
-        .advertiseSkylarkProvider(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
+        .advertiseStarlarkProvider(StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
         .build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleClasses.java
index 9d4fdf3..c29aa51 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleClasses.java
@@ -24,7 +24,7 @@
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 
 /** Common rule class definitions for Java rules. */
 public class JavaRuleClasses {
@@ -122,6 +122,6 @@
    * {@link JavaInfo} through an attribute. Other providers can be included in {@code
    * mandatoryProvidersLists} as well.
    */
-  public static final ImmutableList<SkylarkProviderIdentifier> CONTAINS_JAVA_PROVIDER =
-      ImmutableList.of(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()));
+  public static final ImmutableList<StarlarkProviderIdentifier> CONTAINS_JAVA_PROVIDER =
+      ImmutableList.of(StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()));
 }
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 e76f093..47995a6 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
@@ -16,7 +16,7 @@
 
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.skylark.SkylarkApiProvider;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.skylarkbuildapi.java.JavaSkylarkApiProviderApi;
 
 /**
@@ -28,8 +28,8 @@
   /** The name of the field in Starlark used to access this class. */
   public static final String NAME = "java";
   /** The name of the field in Starlark proto aspects used to access this class. */
-  public static final SkylarkProviderIdentifier SKYLARK_NAME =
-      SkylarkProviderIdentifier.forLegacy(NAME);
+  public static final StarlarkProviderIdentifier SKYLARK_NAME =
+      StarlarkProviderIdentifier.forLegacy(NAME);
 
   /**
    * Creates a Starlark API provider that reads information from its associated target's providers.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
index 4fa58f2..cb6af8e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
@@ -39,7 +39,7 @@
 import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.Attribute.LabelLateBoundDefault;
 import com.google.devtools.build.lib.packages.NativeAspectClass;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration;
 import com.google.devtools.build.lib.rules.java.JavaInfo;
@@ -112,7 +112,7 @@
             .requireSkylarkProviders(ProtoInfo.PROVIDER.id())
             .advertiseProvider(JavaProtoLibraryAspectProvider.class)
             .advertiseProvider(
-                ImmutableList.of(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey())))
+                ImmutableList.of(StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey())))
             .advertiseProvider(ImmutableList.of(JavaSkylarkApiProvider.SKYLARK_NAME))
             .add(
                 attr(JavaProtoAspectCommon.LITE_PROTO_TOOLCHAIN_ATTR, LABEL)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
index bc500a9..3777d14 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
@@ -39,7 +39,7 @@
 import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.Attribute.LabelLateBoundDefault;
 import com.google.devtools.build.lib.packages.NativeAspectClass;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration;
 import com.google.devtools.build.lib.rules.java.JavaInfo;
@@ -121,7 +121,7 @@
             .requireSkylarkProviders(ProtoInfo.PROVIDER.id())
             .advertiseProvider(JavaProtoLibraryAspectProvider.class)
             .advertiseProvider(
-                ImmutableList.of(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey())))
+                ImmutableList.of(StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey())))
             .advertiseProvider(ImmutableList.of(JavaSkylarkApiProvider.SKYLARK_NAME))
             .add(
                 attr(JavaProtoAspectCommon.SPEED_PROTO_TOOLCHAIN_ATTR, LABEL)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java
index 2fef524..8561279 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java
@@ -28,7 +28,7 @@
 import com.google.devtools.build.lib.packages.Attribute.AllowedValueSet;
 import com.google.devtools.build.lib.packages.ImplicitOutputsFunction;
 import com.google.devtools.build.lib.packages.RuleClass;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
 import com.google.devtools.build.lib.rules.config.ConfigFeatureFlagProvider;
 import com.google.devtools.build.lib.rules.config.ConfigFeatureFlagTransitionFactory;
@@ -128,7 +128,7 @@
                 .direct_compile_time_input()
                 .mandatoryProviders(
                     ImmutableList.of(
-                        SkylarkProviderIdentifier.forKey(
+                        StarlarkProviderIdentifier.forKey(
                             AppleExecutableBinaryInfo.SKYLARK_CONSTRUCTOR.getKey())))
                 .allowedFileTypes()
                 .singleArtifact()
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
index d919c65..0bb0c71 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
@@ -51,7 +51,7 @@
 import com.google.devtools.build.lib.packages.BuildType;
 import com.google.devtools.build.lib.packages.NativeAspectClass;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
 import com.google.devtools.build.lib.rules.apple.AppleToolchain;
 import com.google.devtools.build.lib.rules.apple.XcodeConfigRule;
@@ -144,7 +144,7 @@
         .propagateAlongAttribute("deps")
         .propagateAlongAttribute("exports")
         .propagateAlongAttribute("runtime_deps")
-        .requireSkylarkProviders(SkylarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
+        .requireSkylarkProviders(StarlarkProviderIdentifier.forKey(JavaInfo.PROVIDER.getKey()))
         .requireSkylarkProviders(ProtoInfo.PROVIDER.id())
         .advertiseProvider(ImmutableList.of(ObjcProvider.SKYLARK_CONSTRUCTOR.id()))
         .requiresConfigurationFragments(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
index 13fd1ef..6ef1de4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
@@ -41,7 +41,7 @@
 import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
 import com.google.devtools.build.lib.rules.apple.ApplePlatform;
@@ -815,13 +815,15 @@
           not be statically linked in this target (even if they are otherwise
           transitively depended on via the <code>deps</code> attribute) to avoid duplicate symbols.
           <!-- #END_BLAZE_RULE.ATTRIBUTE -->*/
-          .add(attr(DYLIBS_ATTR_NAME, LABEL_LIST)
-              .direct_compile_time_input()
-              .mandatoryProviders(ImmutableList.of(
-                  SkylarkProviderIdentifier.forKey(
-                      AppleDynamicFrameworkInfo.SKYLARK_CONSTRUCTOR.getKey())))
-              .allowedFileTypes()
-              .aspect(objcProtoAspect))
+          .add(
+              attr(DYLIBS_ATTR_NAME, LABEL_LIST)
+                  .direct_compile_time_input()
+                  .mandatoryProviders(
+                      ImmutableList.of(
+                          StarlarkProviderIdentifier.forKey(
+                              AppleDynamicFrameworkInfo.SKYLARK_CONSTRUCTOR.getKey())))
+                  .allowedFileTypes()
+                  .aspect(objcProtoAspect))
           .build();
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryRule.java b/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryRule.java
index c11cb06..c0c8544 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryRule.java
@@ -101,7 +101,7 @@
         prefix is added.
         <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
         .add(attr("import_prefix", STRING))
-        .advertiseSkylarkProvider(ProtoInfo.PROVIDER.id())
+        .advertiseStarlarkProvider(ProtoInfo.PROVIDER.id())
         .build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
index 674bc73..8f9bee3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
@@ -317,7 +317,7 @@
 
   private RepositoryFunction getHandler(Rule rule) {
     RepositoryFunction handler;
-    if (rule.getRuleClassObject().isSkylark()) {
+    if (rule.getRuleClassObject().isStarlark()) {
       handler = skylarkHandler;
     } else {
       handler = handlers.get(rule.getRuleClass());
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/StarlarkOptionsParser.java b/src/main/java/com/google/devtools/build/lib/runtime/StarlarkOptionsParser.java
index cbaff9f..0b38ed6 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/StarlarkOptionsParser.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/StarlarkOptionsParser.java
@@ -15,7 +15,7 @@
 package com.google.devtools.build.lib.runtime;
 
 import static com.google.devtools.build.lib.analysis.config.CoreOptionConverters.BUILD_SETTING_CONVERTERS;
-import static com.google.devtools.build.lib.packages.RuleClass.Builder.SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
+import static com.google.devtools.build.lib.packages.RuleClass.Builder.STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
 import static com.google.devtools.build.lib.packages.Type.BOOLEAN;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -136,7 +136,7 @@
           buildSettingTarget
               .getAssociatedRule()
               .getAttributeContainer()
-              .getAttr(SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME))) {
+              .getAttr(STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME))) {
         parsedOptions.put(loadedFlag, value);
       }
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
index 75e562b..12908fd 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
@@ -69,7 +69,7 @@
 
   static TransitiveTraversalValue forTarget(Target target, @Nullable String errorMessage) {
     if (errorMessage == null) {
-      if (target instanceof Rule && ((Rule) target).getRuleClassObject().isSkylark()) {
+      if (target instanceof Rule && ((Rule) target).getRuleClassObject().isStarlark()) {
         Rule rule = (Rule) target;
         // Do not intern values for Starlark rules.
         return TransitiveTraversalValue.create(
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectCollectionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectCollectionTest.java
index 2dbb468..c0ab5dd 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectCollectionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectCollectionTest.java
@@ -28,7 +28,7 @@
 import com.google.devtools.build.lib.packages.AspectDescriptor;
 import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.NativeAspectClass;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.util.Pair;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -411,14 +411,14 @@
    * that requires any of providers {@code requiredAspects}.
    */
   private Aspect createAspect(final String className, String... requiredAspects) {
-    ImmutableList.Builder<ImmutableSet<SkylarkProviderIdentifier>> requiredProvidersBuilder =
+    ImmutableList.Builder<ImmutableSet<StarlarkProviderIdentifier>> requiredProvidersBuilder =
         ImmutableList.builder();
 
     for (String requiredAspect : requiredAspects) {
       requiredProvidersBuilder.add(
-          ImmutableSet.of((SkylarkProviderIdentifier.forLegacy(requiredAspect))));
+          ImmutableSet.of((StarlarkProviderIdentifier.forLegacy(requiredAspect))));
     }
-    final ImmutableList<ImmutableSet<SkylarkProviderIdentifier>> requiredProviders =
+    final ImmutableList<ImmutableSet<StarlarkProviderIdentifier>> requiredProviders =
         requiredProvidersBuilder.build();
     return Aspect.forNative(
         new NativeAspectClass() {
@@ -431,11 +431,11 @@
           public AspectDefinition getDefinition(AspectParameters aspectParameters) {
             return AspectDefinition.builder(this)
                 .requireAspectsWithProviders(requiredProviders)
-                .advertiseProvider(ImmutableList.of(SkylarkProviderIdentifier.forLegacy(className)))
+                .advertiseProvider(
+                    ImmutableList.of(StarlarkProviderIdentifier.forLegacy(className)))
                 .build();
           }
-        }
-    );
+        });
   }
 
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
index b3454f7..e4f25da 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
@@ -49,7 +49,7 @@
 import com.google.devtools.build.lib.packages.BuildType;
 import com.google.devtools.build.lib.packages.NativeAspectClass;
 import com.google.devtools.build.lib.packages.Rule;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
@@ -570,10 +570,10 @@
       = new FalseAdvertisementAspect();
   private static final AspectDefinition FALSE_ADVERTISEMENT_DEFINITION =
       new AspectDefinition.Builder(FALSE_ADVERTISEMENT_ASPECT)
-        .advertiseProvider(RequiredProvider.class)
-        .advertiseProvider(
-            ImmutableList.of(SkylarkProviderIdentifier.forLegacy("advertised_provider")))
-        .build();
+          .advertiseProvider(RequiredProvider.class)
+          .advertiseProvider(
+              ImmutableList.of(StarlarkProviderIdentifier.forLegacy("advertised_provider")))
+          .build();
 
   /**
    * A common base rule for mock rules in this class to reduce boilerplate.
diff --git a/src/test/java/com/google/devtools/build/lib/packages/PackageLoadingOptimizationsTest.java b/src/test/java/com/google/devtools/build/lib/packages/PackageLoadingOptimizationsTest.java
index 0334665..a3021b4 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/PackageLoadingOptimizationsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/PackageLoadingOptimizationsTest.java
@@ -114,15 +114,15 @@
         getPackageManager()
             .getPackage(NullEventHandler.INSTANCE, PackageIdentifier.createInMainRepo("foo"));
 
-    ImmutableList.Builder<ImmutableList<SkylarkProviderIdentifier>> allListsBuilder =
+    ImmutableList.Builder<ImmutableList<StarlarkProviderIdentifier>> allListsBuilder =
         ImmutableList.builder();
     for (Rule ruleInstance : fooPkg.getTargets(Rule.class)) {
       RuleClass ruleClass = ruleInstance.getRuleClassObject();
       allListsBuilder.add(ruleClass.getAdvertisedProviders().getSkylarkProviders().asList());
     }
-    ImmutableList<ImmutableList<SkylarkProviderIdentifier>> allLists = allListsBuilder.build();
+    ImmutableList<ImmutableList<StarlarkProviderIdentifier>> allLists = allListsBuilder.build();
     assertThat(allLists).hasSize(2);
-    ImmutableList<SkylarkProviderIdentifier> firstList = allLists.get(0);
+    ImmutableList<StarlarkProviderIdentifier> firstList = allLists.get(0);
     for (int i = 1; i < allLists.size(); i++) {
       assertThat(allLists.get(i).get(0)).isSameInstanceAs(firstList.get(0));
     }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java b/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java
index f050c54..f1f11be 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RequiredProvidersTest.java
@@ -48,12 +48,12 @@
     }
   }
 
-  private static final SkylarkProviderIdentifier ID_NATIVE =
-      SkylarkProviderIdentifier.forKey(P_NATIVE.getKey());
-  private static final SkylarkProviderIdentifier ID_SKYLARK =
-      SkylarkProviderIdentifier.forKey(P_SKYLARK.getKey());
-  private static final SkylarkProviderIdentifier ID_LEGACY =
-      SkylarkProviderIdentifier.forLegacy("p_legacy");
+  private static final StarlarkProviderIdentifier ID_NATIVE =
+      StarlarkProviderIdentifier.forKey(P_NATIVE.getKey());
+  private static final StarlarkProviderIdentifier ID_SKYLARK =
+      StarlarkProviderIdentifier.forKey(P_SKYLARK.getKey());
+  private static final StarlarkProviderIdentifier ID_LEGACY =
+      StarlarkProviderIdentifier.forLegacy("p_legacy");
 
   private static boolean satisfies(AdvertisedProviderSet providers,
       RequiredProviders requiredProviders) {
@@ -212,10 +212,10 @@
   private static boolean validateSkylark(
       AdvertisedProviderSet providerSet,
       String missing,
-      ImmutableSet<SkylarkProviderIdentifier>... sets) {
+      ImmutableSet<StarlarkProviderIdentifier>... sets) {
     RequiredProviders.Builder anyBuilder = RequiredProviders.acceptAnyBuilder();
     RequiredProviders.Builder noneBuilder = RequiredProviders.acceptNoneBuilder();
-    for (ImmutableSet<SkylarkProviderIdentifier> set : sets) {
+    for (ImmutableSet<StarlarkProviderIdentifier> set : sets) {
       anyBuilder.addSkylarkSet(set);
       noneBuilder.addSkylarkSet(set);
     }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
index 6da021a..4e4c25c 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
@@ -20,7 +20,7 @@
 import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
 import static com.google.devtools.build.lib.packages.BuildType.OUTPUT_LIST;
 import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.substitutePlaceholderIntoTemplate;
-import static com.google.devtools.build.lib.packages.RuleClass.Builder.SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
+import static com.google.devtools.build.lib.packages.RuleClass.Builder.STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME;
 import static com.google.devtools.build.lib.packages.RuleClass.NO_EXTERNAL_BINDINGS;
 import static com.google.devtools.build.lib.packages.Type.BOOLEAN;
 import static com.google.devtools.build.lib.packages.Type.INTEGER;
@@ -1190,8 +1190,8 @@
             .setBuildSetting(new BuildSetting(false, STRING))
             .build();
 
-    assertThat(labelFlag.hasAttr(SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, LABEL)).isTrue();
-    assertThat(stringSetting.hasAttr(SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, STRING)).isTrue();
+    assertThat(labelFlag.hasAttr(STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, LABEL)).isTrue();
+    assertThat(stringSetting.hasAttr(STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, STRING)).isTrue();
   }
 
   @Test
@@ -1202,7 +1202,7 @@
             .add(attr("tags", STRING_LIST))
             .build();
 
-    assertThat(stringSetting.hasAttr(SKYLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, LABEL)).isFalse();
+    assertThat(stringSetting.hasAttr(STARLARK_BUILD_SETTING_DEFAULT_ATTR_NAME, LABEL)).isFalse();
   }
 
   @Test
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
index 58464d6..e69dd60 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
@@ -36,7 +36,7 @@
 import com.google.devtools.build.lib.packages.Provider;
 import com.google.devtools.build.lib.packages.SkylarkInfo;
 import com.google.devtools.build.lib.packages.SkylarkProvider;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.packages.util.Crosstool.CcToolchainConfig;
 import com.google.devtools.build.lib.packages.util.MockCcSupport;
@@ -5832,7 +5832,7 @@
                 .getLibraries()
                 .toList());
     SkylarkInfo fooInfo =
-        (SkylarkInfo) getConfiguredTarget("//foo:foo").get(SkylarkProviderIdentifier.forKey(key));
+        (SkylarkInfo) getConfiguredTarget("//foo:foo").get(StarlarkProviderIdentifier.forKey(key));
 
     assertThat(fooLibrary.getObjectFiles()).isEqualTo(fooInfo.getValue("objects"));
     assertThat(fooLibrary.getPicObjectFiles()).isEqualTo(fooInfo.getValue("pic_objects"));
@@ -5848,7 +5848,7 @@
 
     // Default toolchain is without PIC support, so pic_objects should be None
     SkylarkInfo fooInfoForPic =
-        (SkylarkInfo) getConfiguredTarget("//foo:foo").get(SkylarkProviderIdentifier.forKey(key));
+        (SkylarkInfo) getConfiguredTarget("//foo:foo").get(StarlarkProviderIdentifier.forKey(key));
 
     Object picObjects = fooInfoForPic.getValue("pic_objects");
     assertThat(picObjects).isNotEqualTo(Starlark.NONE);
@@ -5864,7 +5864,7 @@
                 .withFeatures(CppRuleClasses.SUPPORTS_PIC, CppRuleClasses.PIC));
     invalidatePackages();
     SkylarkInfo fooInfoForNoPic =
-        (SkylarkInfo) getConfiguredTarget("//foo:foo").get(SkylarkProviderIdentifier.forKey(key));
+        (SkylarkInfo) getConfiguredTarget("//foo:foo").get(StarlarkProviderIdentifier.forKey(key));
 
     Object objects = fooInfoForNoPic.getValue("objects");
     assertThat(objects).isNotEqualTo(Starlark.NONE);
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 8a59f59..e71988c 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -44,7 +44,7 @@
 import com.google.devtools.build.lib.packages.SkylarkDefinedAspect;
 import com.google.devtools.build.lib.packages.SkylarkInfo;
 import com.google.devtools.build.lib.packages.SkylarkProvider;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.packages.StructProvider;
 import com.google.devtools.build.lib.packages.Type;
@@ -295,12 +295,12 @@
     assertThat(attr.isSingleArtifact()).isTrue();
   }
 
-  private static SkylarkProviderIdentifier legacy(String legacyId) {
-    return SkylarkProviderIdentifier.forLegacy(legacyId);
+  private static StarlarkProviderIdentifier legacy(String legacyId) {
+    return StarlarkProviderIdentifier.forLegacy(legacyId);
   }
 
-  private static SkylarkProviderIdentifier declared(String exportedName) {
-    return SkylarkProviderIdentifier.forKey(
+  private static StarlarkProviderIdentifier declared(String exportedName) {
+    return StarlarkProviderIdentifier.forKey(
         new SkylarkProvider.SkylarkKey(FAKE_LABEL, exportedName));
   }
 
@@ -335,9 +335,9 @@
     assertThat(attr.getRequiredProviders().isSatisfiedBy(set(legacy("a")))).isFalse();
   }
 
-  private static AdvertisedProviderSet set(SkylarkProviderIdentifier... ids) {
+  private static AdvertisedProviderSet set(StarlarkProviderIdentifier... ids) {
     AdvertisedProviderSet.Builder builder = AdvertisedProviderSet.builder();
-    for (SkylarkProviderIdentifier id : ids) {
+    for (StarlarkProviderIdentifier id : ids) {
       builder.addSkylark(id);
     }
     return builder.build();
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
index cd70a28..a8dad58 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleContextTest.java
@@ -44,7 +44,7 @@
 import com.google.devtools.build.lib.packages.SkylarkInfo;
 import com.google.devtools.build.lib.packages.SkylarkProvider;
 import com.google.devtools.build.lib.packages.SkylarkProvider.SkylarkKey;
-import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
+import com.google.devtools.build.lib.packages.StarlarkProviderIdentifier;
 import com.google.devtools.build.lib.packages.StructImpl;
 import com.google.devtools.build.lib.rules.java.JavaInfo;
 import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
@@ -89,10 +89,10 @@
                               .legacyAllowAnyFileType()
                               .mandatoryProvidersList(
                                   ImmutableList.of(
-                                      ImmutableList.of(SkylarkProviderIdentifier.forLegacy("a")),
+                                      ImmutableList.of(StarlarkProviderIdentifier.forLegacy("a")),
                                       ImmutableList.of(
-                                          SkylarkProviderIdentifier.forLegacy("b"),
-                                          SkylarkProviderIdentifier.forLegacy("c"))))));
+                                          StarlarkProviderIdentifier.forLegacy("b"),
+                                          StarlarkProviderIdentifier.forLegacy("c"))))));
 
   @Override
   protected ConfiguredRuleClassProvider getRuleClassProvider() {
