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");