Automated rollback of commit 2d5b9f35a859bbeec4df66fc6c2256db299dd56a.
*** Reason for rollback ***
http://b/138789815#comment19
*** Original change description ***
Add a flag that makes two Starlark functions equal if they are defined at the same location.
This flag, when set, mostly reverts https://github.com/bazelbuild/bazel/commit/af7fc3b75a62edc3b4b62de25b733b03c3ff925e (only mostly because it only applies to user-defined functions)
BUG=138789815
RELNOTES: None.
PiperOrigin-RevId: 261333026
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 061c986..2e384a7 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
@@ -243,8 +243,7 @@
};
@Override
- public Provider provider(String doc, Object fields, Location location, Environment env)
- throws EvalException {
+ public Provider provider(String doc, Object fields, Location location) throws EvalException {
Iterable<String> fieldNames = null;
if (fields instanceof SkylarkList<?>) {
@SuppressWarnings("unchecked")
@@ -261,8 +260,7 @@
"Expected list of strings or dictionary of string -> string for 'fields'");
fieldNames = dict.keySet();
}
- return SkylarkProvider.createUnexportedSchemaful(
- fieldNames, location, env.getSemantics().experimentalFunctionEqualityByLocation());
+ return SkylarkProvider.createUnexportedSchemaful(fieldNames, location);
}
// TODO(bazel-team): implement attribute copy and other rule properties
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 acc739e..e7375ec 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
@@ -78,7 +78,7 @@
Class<V> valueClass,
String name,
FunctionSignature.WithValues<Object, SkylarkType> signature) {
- super(name, signature, Location.BUILTIN, /* equalityByLocation */ false);
+ super(name, signature, Location.BUILTIN);
Class<? extends NativeProvider<?>> clazz = (Class<? extends NativeProvider<?>>) getClass();
key = new NativeKey(name, clazz);
this.valueClass = valueClass;
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ProviderFromFunction.java b/src/main/java/com/google/devtools/build/lib/packages/ProviderFromFunction.java
index 6edd60e..a293393 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ProviderFromFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ProviderFromFunction.java
@@ -42,9 +42,8 @@
protected ProviderFromFunction(
@Nullable String name,
FunctionSignature.WithValues<Object, SkylarkType> signature,
- Location location,
- boolean equalityByLocation) {
- super(name, signature, location, equalityByLocation);
+ Location location) {
+ super(name, signature, location);
}
public SkylarkProviderIdentifier id() {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkProvider.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkProvider.java
index c3d9c33..4d42b45 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkProvider.java
@@ -75,10 +75,8 @@
* @param location the location of the Skylark definition for this provider (tests may use {@link
* Location#BUILTIN})
*/
- @VisibleForTesting
public static SkylarkProvider createUnexportedSchemaless(Location location) {
- return new SkylarkProvider(
- /*key=*/ null, /*fields=*/ null, location, /* equalityByLocation */ false);
+ return new SkylarkProvider(/*key=*/ null, /*fields=*/ null, location);
}
/**
@@ -92,12 +90,9 @@
* Location#BUILTIN})
*/
public static SkylarkProvider createUnexportedSchemaful(
- Iterable<String> fields, Location location, boolean equalityByLocation) {
+ Iterable<String> fields, Location location) {
return new SkylarkProvider(
- /*key=*/ null,
- fields == null ? null : ImmutableList.copyOf(fields),
- location,
- equalityByLocation);
+ /*key=*/ null, fields == null ? null : ImmutableList.copyOf(fields), location);
}
/**
@@ -107,9 +102,8 @@
* @param location the location of the Skylark definition for this provider (tests may use {@link
* Location#BUILTIN})
*/
- @VisibleForTesting
public static SkylarkProvider createExportedSchemaless(SkylarkKey key, Location location) {
- return new SkylarkProvider(key, /*fields=*/ null, location, /* equalityByLocation */ false);
+ return new SkylarkProvider(key, /*fields=*/ null, location);
}
/**
@@ -121,14 +115,9 @@
* @param location the location of the Skylark definition for this provider (tests may use {@link
* Location#BUILTIN})
*/
- @VisibleForTesting
public static SkylarkProvider createExportedSchemaful(
SkylarkKey key, Iterable<String> fields, Location location) {
- return new SkylarkProvider(
- key,
- fields == null ? null : ImmutableList.copyOf(fields),
- location, /* equalityByLocation */
- false);
+ return new SkylarkProvider(key, fields == null ? null : ImmutableList.copyOf(fields), location);
}
/**
@@ -138,13 +127,10 @@
* is schemaless.
*/
private SkylarkProvider(
- @Nullable SkylarkKey key,
- @Nullable ImmutableList<String> fields,
- Location location,
- boolean equalityByLocation) {
+ @Nullable SkylarkKey key, @Nullable ImmutableList<String> fields, Location location) {
// We override getName() in order to use the name that is assigned when export() is called.
// Hence BaseFunction's constructor gets a null name.
- super(/*name=*/ null, buildSignature(fields), location, equalityByLocation);
+ super(/*name=*/ null, buildSignature(fields), location);
this.layout = fields == null ? null : new Layout(fields);
this.key = key; // possibly null
this.errorMessageFormatForUnknownField =
diff --git a/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java
index 0a484d1..3211834 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/StarlarkSemanticsOptions.java
@@ -704,15 +704,6 @@
help = "If set to true, unknown string escapes like `\\a` become rejected.")
public boolean incompatibleRestrictStringEscapes;
- @Option(
- name = "experimental_function_equality_by_location",
- defaultValue = "false",
- documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
- effectTags = OptionEffectTag.BUILD_FILE_SEMANTICS,
- help =
- "If set to true, two Starlark functions defined at the same place are considered equal.")
- public boolean experimentalFunctionEqualityByLocation;
-
/**
* An interner to reduce the number of StarlarkSemantics instances. A single Blaze instance should
* never accumulate a large number of these and being able to shortcut on object identity makes a
@@ -783,7 +774,6 @@
.incompatibleAssignmentIdentifiersHaveLocalScope(
incompatibleAssignmentIdentifiersHaveLocalScope)
.incompatibleDisallowHashingFrozenMutables(incompatibleDisallowHashingFrozenMutables)
- .experimentalFunctionEqualityByLocation(experimentalFunctionEqualityByLocation)
.build();
return INTERNER.intern(semantics);
}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java
index d5b5533..8d85fc7 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleFunctionsApi.java
@@ -86,10 +86,8 @@
positional = false,
defaultValue = "None")
},
- useLocation = true,
- useEnvironment = true)
- public ProviderApi provider(String doc, Object fields, Location location, Environment env)
- throws EvalException;
+ useLocation = true)
+ public ProviderApi provider(String doc, Object fields, Location location) throws EvalException;
@SkylarkCallable(
name = "rule",
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/BaseFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/BaseFunction.java
index 575458c..0d3c49a 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/BaseFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/BaseFunction.java
@@ -26,7 +26,6 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import javax.annotation.Nullable;
/**
@@ -56,7 +55,6 @@
// (that FuncallExpression must supply), optimizing for the all-positional and all-keyword cases.
// Also, use better pure maps to minimize map O(n) re-creation events when processing keyword maps.
public abstract class BaseFunction implements StarlarkFunction {
- private final boolean equalityByLocation;
/**
* The name of the function.
@@ -132,7 +130,7 @@
* {@link #getName}; otherwise it must be non-null.
*/
public BaseFunction(@Nullable String name) {
- this(name, null, null, false);
+ this.name = name;
}
/**
@@ -145,12 +143,10 @@
public BaseFunction(
@Nullable String name,
@Nullable FunctionSignature.WithValues<Object, SkylarkType> signature,
- @Nullable Location location,
- boolean equalityByLocation) {
- this.name = name;
+ @Nullable Location location) {
+ this(name);
this.signature = signature;
this.location = location;
- this.equalityByLocation = equalityByLocation;
}
/**
@@ -162,7 +158,7 @@
public BaseFunction(
@Nullable String name,
@Nullable FunctionSignature.WithValues<Object, SkylarkType> signature) {
- this(name, signature, null, false);
+ this(name, signature, null);
}
/**
@@ -172,7 +168,7 @@
* @param signature the signature, without default values or types
*/
public BaseFunction(@Nullable String name, FunctionSignature signature) {
- this(name, FunctionSignature.WithValues.create(signature), null, false);
+ this(name, FunctionSignature.WithValues.create(signature), null);
}
/**
@@ -182,9 +178,8 @@
* @param defaultValues a list of default values for the optional arguments to be configured.
*/
public BaseFunction(@Nullable String name, @Nullable Iterable<Object> defaultValues) {
- this.name = name;
+ this(name);
this.unconfiguredDefaultValues = defaultValues;
- this.equalityByLocation = false;
}
/** Get parameter documentation as a list corresponding to each parameter */
@@ -579,32 +574,6 @@
return builder.toString();
}
- @Override
- public boolean equals(@Nullable Object other) {
- if (equalityByLocation) {
- if (other instanceof BaseFunction) {
- BaseFunction that = (BaseFunction) other;
- // In theory, the location alone unambiguously identifies a given function. However, in
- // some test cases the location might not have a valid value, thus we also check the name.
- return Objects.equals(this.getName(), that.getName())
- && Objects.equals(this.location, that.location);
- } else {
- return false;
- }
- } else {
- return super.equals(other);
- }
- }
-
- @Override
- public int hashCode() {
- if (equalityByLocation) {
- return Objects.hash(getName(), location);
- } else {
- return super.hashCode();
- }
- }
-
@Nullable
public Location getLocation() {
return location;
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/Eval.java b/src/main/java/com/google/devtools/build/lib/syntax/Eval.java
index 35d3350..3199952 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/Eval.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/Eval.java
@@ -126,7 +126,6 @@
new UserDefinedFunction(
node.getIdentifier().getName(),
node.getIdentifier().getLocation(),
- env.getSemantics().experimentalFunctionEqualityByLocation(),
FunctionSignature.WithValues.create(sig, defaultValues, /*types=*/ null),
node.getStatements(),
env.getGlobals()));
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
index 7454580..9860f6f 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/StarlarkSemantics.java
@@ -222,8 +222,6 @@
public abstract boolean incompatibleDisallowHashingFrozenMutables();
- public abstract boolean experimentalFunctionEqualityByLocation();
-
@Memoized
@Override
public abstract int hashCode();
@@ -306,7 +304,6 @@
.incompatibleAllowTagsPropagation(false)
.incompatibleAssignmentIdentifiersHaveLocalScope(false)
.incompatibleDisallowHashingFrozenMutables(false)
- .experimentalFunctionEqualityByLocation(false)
.build();
/** Builder for {@link StarlarkSemantics}. All fields are mandatory. */
@@ -413,8 +410,6 @@
public abstract Builder incompatibleDisallowHashingFrozenMutables(boolean value);
- public abstract Builder experimentalFunctionEqualityByLocation(boolean value);
-
public abstract StarlarkSemantics build();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java b/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java
index c39bdd2..460bc35 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/UserDefinedFunction.java
@@ -36,11 +36,10 @@
public UserDefinedFunction(
String name,
Location location,
- boolean equalityByLocation,
FunctionSignature.WithValues<Object, SkylarkType> signature,
ImmutableList<Statement> statements,
Environment.GlobalFrame definitionGlobals) {
- super(name, signature, location, equalityByLocation);
+ super(name, signature, location);
this.statements = statements;
this.definitionGlobals = definitionGlobals;
}
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java
index 121d233..32a5b56 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/FakeSkylarkRuleFunctionsApi.java
@@ -84,8 +84,7 @@
}
@Override
- public ProviderApi provider(String doc, Object fields, Location location, Environment env)
- throws EvalException {
+ public ProviderApi provider(String doc, Object fields, Location location) throws EvalException {
FakeProviderApi fakeProvider = new FakeProviderApi();
// Field documentation will be output preserving the order in which the fields are listed.
ImmutableList.Builder<ProviderFieldInfo> providerFieldInfos = ImmutableList.builder();
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkInfoTest.java b/src/test/java/com/google/devtools/build/lib/packages/SkylarkInfoTest.java
index 826b89c..37e28b4 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkInfoTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/SkylarkInfoTest.java
@@ -81,8 +81,7 @@
@Test
public void givenLayoutTakesPrecedenceOverProviderLayout() throws Exception {
SkylarkProvider provider =
- SkylarkProvider.createUnexportedSchemaful(
- ImmutableList.of("f1", "f2"), Location.BUILTIN, /* equalityByLocation */ false);
+ SkylarkProvider.createUnexportedSchemaful(ImmutableList.of("f1", "f2"), Location.BUILTIN);
SkylarkInfo info =
SkylarkInfo.createSchemaful(
provider, invertedLayoutF2F1, new Object[]{5, 4}, Location.BUILTIN);
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkProviderTest.java b/src/test/java/com/google/devtools/build/lib/packages/SkylarkProviderTest.java
index cde858d..0c81e9b 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/SkylarkProviderTest.java
@@ -71,9 +71,8 @@
@Test
public void schemafulProvider_Instantiation() throws Exception {
- SkylarkProvider provider =
- SkylarkProvider.createUnexportedSchemaful(
- ImmutableList.of("a", "b", "c"), /*location=*/ null, false);
+ SkylarkProvider provider = SkylarkProvider.createUnexportedSchemaful(
+ ImmutableList.of("a", "b", "c"), /*location=*/ null);
SkylarkInfo info = instantiateWithA1B2C3(provider);
assertThat(info.isCompact()).isTrue();
assertHasExactlyValuesA1B2C3(info);
@@ -87,9 +86,8 @@
@Test
public void schemafulProvider_GetFields() throws Exception {
- SkylarkProvider provider =
- SkylarkProvider.createUnexportedSchemaful(
- ImmutableList.of("a", "b", "c"), /*location=*/ null, false);
+ SkylarkProvider provider = SkylarkProvider.createUnexportedSchemaful(
+ ImmutableList.of("a", "b", "c"), /*location=*/ null);
assertThat(provider.getFields()).containsExactly("a", "b", "c").inOrder();
}
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
index a61b471..ce01c46 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
@@ -172,8 +172,7 @@
"--incompatible_disable_partition_default_parameter=" + rand.nextBoolean(),
"--incompatible_assignment_identifiers_have_local_scope=" + rand.nextBoolean(),
"--incompatible_disallow_hashing_frozen_mutables=" + rand.nextBoolean(),
- "--internal_skylark_flag_test_canary=" + rand.nextBoolean(),
- "--experimental_function_equality_by_location=" + rand.nextBoolean());
+ "--internal_skylark_flag_test_canary=" + rand.nextBoolean());
}
/**
@@ -234,7 +233,6 @@
.incompatibleAssignmentIdentifiersHaveLocalScope(rand.nextBoolean())
.incompatibleDisallowHashingFrozenMutables(rand.nextBoolean())
.internalSkylarkFlagTestCanary(rand.nextBoolean())
- .experimentalFunctionEqualityByLocation(rand.nextBoolean())
.build();
}