Add `.items()` support to `ImmutableKeyTrackingDict`. This lets `build`'s `--include_config_fragments_provider` and `cquery`'s `--show_config_fragments` support Starlark code with `ctx.var.items()`. PiperOrigin-RevId: 948585578 Change-Id: I811ae447bcfdfffae45f241b96ccb6169eaa7e4b
diff --git a/src/main/java/net/starlark/java/eval/Dict.java b/src/main/java/net/starlark/java/eval/Dict.java index e51019d..bf11d95 100644 --- a/src/main/java/net/starlark/java/eval/Dict.java +++ b/src/main/java/net/starlark/java/eval/Dict.java
@@ -869,6 +869,13 @@ return false; } + @Override + public StarlarkList<?> items(StarlarkThread thread) { + Set<K> keySet = super.keySet(); + accessedKeys.addAll(keySet); + return super.items(thread); + } + @Nullable @Override @SuppressWarnings("unchecked") // Present keys must be of type K.
diff --git a/src/test/java/net/starlark/java/eval/ImmutableKeyTrackingDictTest.java b/src/test/java/net/starlark/java/eval/ImmutableKeyTrackingDictTest.java index 756ead7..3bdd73a 100644 --- a/src/test/java/net/starlark/java/eval/ImmutableKeyTrackingDictTest.java +++ b/src/test/java/net/starlark/java/eval/ImmutableKeyTrackingDictTest.java
@@ -84,6 +84,21 @@ } @Test + public void items_reportsAllKeys() throws Exception { + Mutability mu = Mutability.create("test"); + StarlarkThread thread = StarlarkThread.createTransient(mu, StarlarkSemantics.DEFAULT); + StarlarkList<?> items = dict.items(thread); + assertThat((Iterable<?>) items) + .containsExactly( + Tuple.pair("a", StarlarkInt.of(1)), + Tuple.pair("b", StarlarkInt.of(2)), + Tuple.pair("c", StarlarkInt.of(3)), + Tuple.pair("d", StarlarkInt.of(4))) + .inOrder(); + assertThat(dict.getAccessedKeys()).isEqualTo(dict.keySet()); + } + + @Test public void iteration_reportsAllKeys() { for (String key : dict) { assertThat(key).isAnyOf("a", "b", "c", "d");