Skip to content

Commit 3b0d75a

Browse files
bazel-iofmeum
andauthored
[8.1.0] Mark built-in providers as hashable (#25230)
Built-in providers always have an immutable `hashCode`. Making them hashable makes it easier to deduplicate a list of providers, which is sometimes required as the list of provider instances returned by a rule must not contain two instances for a given provider. Starlark-defined providers are already hashable, so this brings the behavior of built-in providers in line with them. Closes #24848. PiperOrigin-RevId: 724370319 Change-Id: I68147b1f707249a8b09ad170c5fc5b3da4776ccf Commit c94a9bd Co-authored-by: Fabian Meumertzheim <[email protected]>
1 parent 9209fd5 commit 3b0d75a

File tree

2 files changed

+13
-0
lines changed

2 files changed

+13
-0
lines changed

src/main/java/com/google/devtools/build/lib/packages/BuiltinProvider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ public final int hashCode() {
6565
return getClass().hashCode();
6666
}
6767

68+
@Override
69+
public void checkHashable() {
70+
// The hash code is based on the class, so it is hashable.
71+
}
72+
6873
@Override
6974
public boolean isExported() {
7075
return true;

src/test/java/com/google/devtools/build/lib/starlark/StarlarkRuleImplementationFunctionsTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
import java.util.regex.Pattern;
8282
import net.starlark.java.annot.Param;
8383
import net.starlark.java.annot.StarlarkMethod;
84+
import net.starlark.java.eval.Dict;
8485
import net.starlark.java.eval.EvalException;
8586
import net.starlark.java.eval.Mutability;
8687
import net.starlark.java.eval.Printer;
@@ -4154,4 +4155,11 @@ def _impl(ctx):
41544155
assertThat(a2.getRoot().getExecPathString())
41554156
.matches(getRelativeOutputPath() + "/[\\w\\-]+\\-exec/bin");
41564157
}
4158+
4159+
@Test
4160+
public void testHashableProviders() throws Exception {
4161+
ev.execAndExport("p = provider()");
4162+
Dict<?, ?> dict = (Dict<?, ?>) ev.eval("{k: None for k in [DefaultInfo, p, DefaultInfo, p]}");
4163+
assertThat(dict.size()).isEqualTo(2);
4164+
}
41574165
}

0 commit comments

Comments
 (0)