diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/AttributeValuesAdapter.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/AttributeValuesAdapter.java index 248d1060975d91..85fdd2a767eb2c 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/AttributeValuesAdapter.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/AttributeValuesAdapter.java @@ -88,9 +88,11 @@ private JsonElement serializeObject(Object obj) { jsonObject.add(serializeObjToString(entry.getKey()), serializeObject(entry.getValue())); } return jsonObject; - } else if (obj instanceof StarlarkList) { + } else if (obj instanceof Iterable) { + // ListType supports any kind of Iterable, including Tuples and StarlarkLists. All of them + // are converted to an equivalent StarlarkList during deserialization. JsonArray jsonArray = new JsonArray(); - for (Object item : (StarlarkList) obj) { + for (Object item : (Iterable) obj) { jsonArray.add(serializeObject(item)); } return jsonArray; diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/AttributeValuesAdapterTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/AttributeValuesAdapterTest.java index 45fcbd7d322ea6..b5c0cda5ae66bb 100644 --- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/AttributeValuesAdapterTest.java +++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/AttributeValuesAdapterTest.java @@ -30,6 +30,7 @@ import net.starlark.java.eval.Mutability; import net.starlark.java.eval.StarlarkInt; import net.starlark.java.eval.StarlarkList; +import net.starlark.java.eval.Tuple; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -89,4 +90,24 @@ public void testAttributeValuesAdapter() throws IOException { assertThat(jsonString).contains(":\"Hello String\""); assertThat((Map) attributeValues.attributes()).containsExactlyEntriesIn(builtDict); } + + @Test + public void testTuple() throws IOException { + Dict.Builder dict = new Dict.Builder<>(); + dict.put("Tuple", Tuple.of("bzl", "mod")); + + Dict builtDict = dict.buildImmutable(); + AttributeValuesAdapter attrAdapter = new AttributeValuesAdapter(); + String jsonString; + try (StringWriter stringWriter = new StringWriter()) { + attrAdapter.write(new JsonWriter(stringWriter), AttributeValues.create(builtDict)); + jsonString = stringWriter.toString(); + } + AttributeValues attributeValues; + try (StringReader stringReader = new StringReader(jsonString)) { + attributeValues = attrAdapter.read(new JsonReader(stringReader)); + } + assertThat((Map) attributeValues.attributes()) + .containsExactly("Tuple", StarlarkList.of(Mutability.IMMUTABLE, "bzl", "mod")); + } }