Rename SkylarkSemantics to StarlarkSemantics
RELNOTES: None.
PiperOrigin-RevId: 234478524
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
new file mode 100644
index 0000000..75e67cb
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
@@ -0,0 +1,327 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.syntax;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.base.Ascii;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import java.util.function.Function;
+
+/**
+ * Options that affect Starlark semantics.
+ *
+ * <p>For descriptions of what these options do, see {@link SkylarkSemanticsOptions}.
+ */
+// TODO(brandjon): User error messages that reference options should maybe be substituted with the
+// option name outside of the core Starlark interpreter?
+// TODO(brandjon): Eventually these should be documented in full here, and SkylarkSemanticsOptions
+// should refer to this class for documentation. But this doesn't play nice with the options
+// parser's annotation mechanism.
+@AutoValue
+public abstract class StarlarkSemantics {
+
+ /**
+ * Enum where each element represents a starlark semantics flag. The name of each value should be
+ * the exact name of the flag transformed to upper case (for error representation).
+ */
+ public enum FlagIdentifier {
+ EXPERIMENTAL_ENABLE_ANDROID_MIGRATION_APIS(
+ StarlarkSemantics::experimentalEnableAndroidMigrationApis),
+ EXPERIMENTAL_BUILD_SETTING_API(StarlarkSemantics::experimentalBuildSettingApi),
+ EXPERIMENTAL_PLATFORM_API(StarlarkSemantics::experimentalPlatformsApi),
+ EXPERIMENTAL_STARLARK_CONFIG_TRANSITION(
+ StarlarkSemantics::experimentalStarlarkConfigTransitions),
+ INCOMPATIBLE_DISABLE_OBJC_PROVIDER_RESOURCES(
+ StarlarkSemantics::incompatibleDisableObjcProviderResources),
+ INCOMPATIBLE_NO_OUTPUT_ATTR_DEFAULT(StarlarkSemantics::incompatibleNoOutputAttrDefault),
+ INCOMPATIBLE_NO_TARGET_OUTPUT_GROUP(StarlarkSemantics::incompatibleNoTargetOutputGroup),
+ INCOMPATIBLE_NO_ATTR_LICENSE(StarlarkSemantics::incompatibleNoAttrLicense),
+ INCOMPATIBLE_REQUIRE_FEATURE_CONFIGURATION_FOR_PIC(
+ StarlarkSemantics::incompatibleRequireFeatureConfigurationForPic),
+ NONE(null);
+
+ // Using a Function here makes the enum definitions far cleaner, and, since this is
+ // a private field, and we can ensure no callers treat this field as mutable.
+ @SuppressWarnings("ImmutableEnumChecker")
+ private final Function<StarlarkSemantics, Boolean> semanticsFunction;
+
+ FlagIdentifier(Function<StarlarkSemantics, Boolean> semanticsFunction) {
+ this.semanticsFunction = semanticsFunction;
+ }
+
+ /**
+ * Returns the name of the flag that this identifier controls. For example, EXPERIMENTAL_FOO
+ * would return 'experimental_foo'.
+ */
+ public String getFlagName() {
+ return Ascii.toLowerCase(this.name());
+ }
+ }
+
+ /**
+ * Returns true if a feature attached to the given toggling flags should be enabled.
+ *
+ * <ul>
+ * <li>If both parameters are {@code NONE}, this indicates the feature is not
+ * controlled by flags, and should thus be enabled.</li>
+ * <li>If the {@code enablingFlag} parameter is non-{@code NONE}, this returns
+ * true if and only if that flag is true. (This represents a feature that is only on
+ * if a given flag is *on*).</li>
+ * <li>If the {@code disablingFlag} parameter is non-{@code NONE}, this returns
+ * true if and only if that flag is false. (This represents a feature that is only on
+ * if a given flag is *off*).</li>
+ * <li>It is illegal to pass both parameters as non-{@code NONE}.</li>
+ * </ul>
+ */
+ public boolean isFeatureEnabledBasedOnTogglingFlags(
+ FlagIdentifier enablingFlag,
+ FlagIdentifier disablingFlag) {
+ Preconditions.checkArgument(enablingFlag == FlagIdentifier.NONE
+ || disablingFlag == FlagIdentifier.NONE,
+ "at least one of 'enablingFlag' or 'disablingFlag' must be NONE");
+ if (enablingFlag != FlagIdentifier.NONE) {
+ return enablingFlag.semanticsFunction.apply(this);
+ } else {
+ return disablingFlag == FlagIdentifier.NONE || !disablingFlag.semanticsFunction.apply(this);
+ }
+ }
+
+ /** Returns the value of the given flag. */
+ public boolean flagValue(FlagIdentifier flagIdentifier) {
+ return flagIdentifier.semanticsFunction.apply(this);
+ }
+
+ /**
+ * The AutoValue-generated concrete class implementing this one.
+ *
+ * <p>AutoValue implementation classes are usually package-private. We expose it here for the
+ * benefit of code that relies on reflection.
+ */
+ public static final Class<? extends StarlarkSemantics> IMPL_CLASS =
+ AutoValue_StarlarkSemantics.class;
+
+ // <== Add new options here in alphabetic order ==>
+ public abstract boolean checkThirdPartyTargetsHaveLicenses();
+
+ public abstract boolean experimentalBuildSettingApi();
+
+ public abstract ImmutableList<String> experimentalCcSkylarkApiEnabledPackages();
+
+ public abstract boolean experimentalEnableAndroidMigrationApis();
+
+ public abstract boolean experimentalEnableRepoMapping();
+
+ public abstract ImmutableList<String> experimentalJavaCommonCreateProviderEnabledPackages();
+
+ public abstract boolean experimentalPlatformsApi();
+
+ public abstract boolean experimentalStarlarkConfigTransitions();
+
+ public abstract String experimentalTransitionWhitelistLocation();
+
+ public abstract boolean incompatibleBzlDisallowLoadAfterStatement();
+
+ public abstract boolean incompatibleDepsetIsNotIterable();
+
+ public abstract boolean incompatibleDepsetUnion();
+
+ public abstract boolean incompatibleDisableDeprecatedAttrParams();
+
+ public abstract boolean incompatibleDisableObjcProviderResources();
+
+ public abstract boolean incompatibleDisallowDataTransition();
+
+ public abstract boolean incompatibleDisallowDictPlus();
+
+ public abstract boolean incompatibleDisallowFileType();
+
+ public abstract boolean incompatibleDisallowLegacyJavaProvider();
+
+ public abstract boolean incompatibleDisallowLegacyJavaInfo();
+
+ public abstract boolean incompatibleDisallowLoadLabelsToCrossPackageBoundaries();
+
+ public abstract boolean incompatibleDisallowOldStyleArgsAdd();
+
+ public abstract boolean incompatibleDisallowStructProviderSyntax();
+
+ public abstract boolean incompatibleExpandDirectories();
+
+ public abstract boolean incompatibleGenerateJavaCommonSourceJar();
+
+ public abstract boolean incompatibleNewActionsApi();
+
+ public abstract boolean incompatibleNoAttrLicense();
+
+ public abstract boolean incompatibleNoOutputAttrDefault();
+
+ public abstract boolean incompatibleNoSupportToolsInActionInputs();
+
+ public abstract boolean incompatibleNoTargetOutputGroup();
+
+ public abstract boolean incompatibleNoTransitiveLoads();
+
+ public abstract boolean incompatibleRemapMainRepo();
+
+ public abstract boolean incompatibleRemoveNativeMavenJar();
+
+ public abstract boolean incompatibleRequireFeatureConfigurationForPic();
+
+ public abstract boolean incompatibleStricArgumentOrdering();
+
+ public abstract boolean incompatibleStringIsNotIterable();
+
+ public abstract boolean internalSkylarkFlagTestCanary();
+
+ public abstract boolean incompatibleUseToolchainProvidersInJavaCommon();
+
+ /** Returns a {@link Builder} initialized with the values of this instance. */
+ public abstract Builder toBuilder();
+
+ public static Builder builder() {
+ return new AutoValue_StarlarkSemantics.Builder();
+ }
+
+ /** Returns a {@link Builder} initialized with default values for all options. */
+ public static Builder builderWithDefaults() {
+ return DEFAULT_SEMANTICS.toBuilder();
+ }
+
+ public static final StarlarkSemantics DEFAULT_SEMANTICS =
+ builder()
+ // <== Add new options here in alphabetic order ==>
+ .checkThirdPartyTargetsHaveLicenses(true)
+ .experimentalBuildSettingApi(false)
+ .experimentalCcSkylarkApiEnabledPackages(ImmutableList.of())
+ .experimentalEnableAndroidMigrationApis(false)
+ .experimentalEnableRepoMapping(false)
+ .experimentalJavaCommonCreateProviderEnabledPackages(ImmutableList.of())
+ .experimentalPlatformsApi(false)
+ .experimentalStarlarkConfigTransitions(false)
+ .experimentalTransitionWhitelistLocation("")
+ .incompatibleUseToolchainProvidersInJavaCommon(false)
+ .incompatibleBzlDisallowLoadAfterStatement(false)
+ .incompatibleDepsetIsNotIterable(false)
+ .incompatibleDepsetUnion(false)
+ .incompatibleDisableDeprecatedAttrParams(false)
+ .incompatibleDisableObjcProviderResources(false)
+ .incompatibleDisallowDataTransition(true)
+ .incompatibleDisallowDictPlus(false)
+ .incompatibleDisallowFileType(true)
+ .incompatibleDisallowLegacyJavaProvider(false)
+ .incompatibleDisallowLegacyJavaInfo(false)
+ .incompatibleDisallowLoadLabelsToCrossPackageBoundaries(false)
+ .incompatibleDisallowOldStyleArgsAdd(false)
+ .incompatibleDisallowStructProviderSyntax(false)
+ .incompatibleExpandDirectories(true)
+ .incompatibleGenerateJavaCommonSourceJar(true)
+ .incompatibleNewActionsApi(false)
+ .incompatibleNoAttrLicense(false)
+ .incompatibleNoOutputAttrDefault(false)
+ .incompatibleNoSupportToolsInActionInputs(false)
+ .incompatibleNoTargetOutputGroup(false)
+ .incompatibleNoTransitiveLoads(false)
+ .incompatibleRemapMainRepo(false)
+ .incompatibleRemoveNativeMavenJar(false)
+ .incompatibleRequireFeatureConfigurationForPic(true)
+ .incompatibleStricArgumentOrdering(true)
+ .incompatibleStringIsNotIterable(true)
+ .internalSkylarkFlagTestCanary(false)
+ .build();
+
+ /** Builder for {@link StarlarkSemantics}. All fields are mandatory. */
+ @AutoValue.Builder
+ public abstract static class Builder {
+
+ // <== Add new options here in alphabetic order ==>
+ public abstract Builder checkThirdPartyTargetsHaveLicenses(boolean value);
+
+ public abstract Builder experimentalBuildSettingApi(boolean value);
+
+ public abstract Builder experimentalCcSkylarkApiEnabledPackages(List<String> value);
+
+ public abstract Builder experimentalEnableAndroidMigrationApis(boolean value);
+
+ public abstract Builder experimentalEnableRepoMapping(boolean value);
+
+ public abstract Builder experimentalJavaCommonCreateProviderEnabledPackages(List<String> value);
+
+ public abstract Builder experimentalPlatformsApi(boolean value);
+
+ public abstract Builder experimentalStarlarkConfigTransitions(boolean value);
+
+ public abstract Builder experimentalTransitionWhitelistLocation(String value);
+
+ public abstract Builder incompatibleBzlDisallowLoadAfterStatement(boolean value);
+
+ public abstract Builder incompatibleDepsetIsNotIterable(boolean value);
+
+ public abstract Builder incompatibleDepsetUnion(boolean value);
+
+ public abstract Builder incompatibleDisableDeprecatedAttrParams(boolean value);
+
+ public abstract Builder incompatibleRequireFeatureConfigurationForPic(boolean value);
+
+ public abstract Builder incompatibleDisableObjcProviderResources(boolean value);
+
+ public abstract Builder incompatibleDisallowDataTransition(boolean value);
+
+ public abstract Builder incompatibleDisallowDictPlus(boolean value);
+
+ public abstract Builder incompatibleDisallowFileType(boolean value);
+
+ public abstract Builder incompatibleDisallowLegacyJavaProvider(boolean value);
+
+ public abstract Builder incompatibleDisallowLegacyJavaInfo(boolean value);
+
+ public abstract Builder incompatibleDisallowLoadLabelsToCrossPackageBoundaries(boolean value);
+
+ public abstract Builder incompatibleDisallowOldStyleArgsAdd(boolean value);
+
+ public abstract Builder incompatibleDisallowStructProviderSyntax(boolean value);
+
+ public abstract Builder incompatibleExpandDirectories(boolean value);
+
+ public abstract Builder incompatibleGenerateJavaCommonSourceJar(boolean value);
+
+ public abstract Builder incompatibleNewActionsApi(boolean value);
+
+ public abstract Builder incompatibleNoAttrLicense(boolean value);
+
+ public abstract Builder incompatibleNoOutputAttrDefault(boolean value);
+
+ public abstract Builder incompatibleNoSupportToolsInActionInputs(boolean value);
+
+ public abstract Builder incompatibleNoTargetOutputGroup(boolean value);
+
+ public abstract Builder incompatibleNoTransitiveLoads(boolean value);
+
+ public abstract Builder incompatibleRemapMainRepo(boolean value);
+
+ public abstract Builder incompatibleRemoveNativeMavenJar(boolean value);
+
+ public abstract Builder incompatibleStricArgumentOrdering(boolean value);
+
+ public abstract Builder incompatibleStringIsNotIterable(boolean value);
+
+ public abstract Builder incompatibleUseToolchainProvidersInJavaCommon(boolean value);
+
+ public abstract Builder internalSkylarkFlagTestCanary(boolean value);
+
+ public abstract StarlarkSemantics build();
+ }
+}