diff --git a/apollo-api/src/main/java/com/apollographql/apollo/api/ResponseWriter.java b/apollo-api/src/main/java/com/apollographql/apollo/api/ResponseWriter.java index 3eca3be5cef..3a158922335 100644 --- a/apollo-api/src/main/java/com/apollographql/apollo/api/ResponseWriter.java +++ b/apollo-api/src/main/java/com/apollographql/apollo/api/ResponseWriter.java @@ -23,22 +23,24 @@ public interface ResponseWriter { void writeList(@NotNull ResponseField field, @Nullable List values, @NotNull ListWriter listWriter); interface ListWriter { - void write(@Nullable Object value, @NotNull ListItemWriter listItemWriter); + void write(@Nullable List items, @NotNull ListItemWriter listItemWriter); } interface ListItemWriter { - void writeString(@Nullable Object value); + void writeString(@Nullable String value); - void writeInt(@Nullable Object value); + void writeInt(@Nullable Integer value); - void writeLong(@Nullable Object value); + void writeLong(@Nullable Long value); - void writeDouble(@Nullable Object value); + void writeDouble(@Nullable Double value); - void writeBoolean(@Nullable Object value); + void writeBoolean(@Nullable Boolean value); void writeCustom(@NotNull ScalarType scalarType, @Nullable Object value); void writeObject(@Nullable ResponseFieldMarshaller marshaller); + + void writeList(@Nullable List items, @NotNull ListWriter listWriter); } } diff --git a/apollo-compiler/src/main/kotlin/com/apollographql/apollo/compiler/ResponseFieldSpec.kt b/apollo-compiler/src/main/kotlin/com/apollographql/apollo/compiler/ResponseFieldSpec.kt index 2e80da89fce..0a4af1f32a2 100644 --- a/apollo-compiler/src/main/kotlin/com/apollographql/apollo/compiler/ResponseFieldSpec.kt +++ b/apollo-compiler/src/main/kotlin/com/apollographql/apollo/compiler/ResponseFieldSpec.kt @@ -278,16 +278,17 @@ class ResponseFieldSpec( private fun writeListItemStatement(listItemType: TypeName, marshaller: CodeBlock): CodeBlock { fun writeScalar(): CodeBlock { val writeMethod = SCALAR_LIST_ITEM_WRITE_METHODS[listItemType] ?: "writeString" - return CodeBlock.builder() - .add( - if (listItemType.isEnum(context)) { - CodeBlock.of("\$L.\$L(((\$L) \$L).rawValue());\n", RESPONSE_LIST_ITEM_WRITER_PARAM.name, writeMethod, - listItemType, OBJECT_VALUE_PARAM.name) - } else { - CodeBlock.of("\$L.\$L(\$L);\n", RESPONSE_LIST_ITEM_WRITER_PARAM.name, writeMethod, - OBJECT_VALUE_PARAM.name) - }) - .build() + return CodeBlock.builder().let { + if (listItemType.isEnum(context)) { + it.addStatement("\$L.\$L(((\$T) \$L).rawValue())", RESPONSE_LIST_ITEM_WRITER_PARAM.name, writeMethod, + listItemType, ITEM_VALUE_PARAM.name) + } else { + it.addStatement( + "\$L.\$L((\$T) \$L)", RESPONSE_LIST_ITEM_WRITER_PARAM.name, writeMethod, listItemType, + ITEM_VALUE_PARAM.name + ) + } + }.build() } fun writeCustom(): CodeBlock { @@ -295,35 +296,59 @@ class ResponseFieldSpec( val customScalarEnumConst = normalizeGraphQlType(irField.type, recursive = true).toUpperCase(Locale.ENGLISH) return CodeBlock.builder() .addStatement("\$L.writeCustom(\$T.\$L, \$L)", RESPONSE_LIST_ITEM_WRITER_PARAM.name, - customScalarEnum, customScalarEnumConst, OBJECT_VALUE_PARAM.name) + customScalarEnum, customScalarEnumConst, ITEM_VALUE_PARAM.name) .build() } fun writeObject(): CodeBlock { return CodeBlock.builder() - .addStatement("\$L.writeObject(((\$L) \$L).\$L)", RESPONSE_LIST_ITEM_WRITER_PARAM.name, listItemType, - OBJECT_VALUE_PARAM.name, marshaller) + .addStatement("\$L.writeObject(((\$T) \$L).\$L)", RESPONSE_LIST_ITEM_WRITER_PARAM.name, listItemType, + ITEM_VALUE_PARAM.name, marshaller) + .build() + } + + fun writeList(): CodeBlock { + val rawFieldType = listItemType.listParamType() + val readItemCode = writeListItemStatement(rawFieldType, marshaller) + val listWriterType = TypeSpec.anonymousClassBuilder("") + .addSuperinterface(ResponseWriter.ListWriter::class.java) + .addMethod(MethodSpec + .methodBuilder("write") + .addModifiers(Modifier.PUBLIC) + .addAnnotation(Override::class.java) + .addParameter(ITEMS_VALUE_PARAM) + .addParameter(RESPONSE_LIST_ITEM_WRITER_PARAM) + .addCode(readItemCode) + .build()) + .build() + return CodeBlock.builder() + .addStatement("\$L.writeList((\$T) \$L, \$L)", RESPONSE_LIST_ITEM_WRITER_PARAM.name, ClassNames.LIST, + ITEM_VALUE_PARAM.name, listWriterType) .build() } return when { + listItemType.isList() -> writeList() irField.type.isCustomScalarType(context) -> writeCustom() listItemType.isScalar(context) -> writeScalar() else -> writeObject() + }.let { + CodeBlock.builder() + .beginControlFlow("for (Object \$L : \$L)", ITEM_VALUE_PARAM.name, ITEMS_VALUE_PARAM.name) + .add(it) + .endControlFlow() + .build() } } private fun writeListCode(writerParam: CodeBlock, fieldParam: CodeBlock, marshaller: CodeBlock): CodeBlock { - var listItemType = normalizedFieldSpec.type.listParamType() - while (listItemType.isList()) { - listItemType = listItemType.listParamType() - } + val listItemType = normalizedFieldSpec.type.listParamType() val listWriterType = TypeSpec.anonymousClassBuilder("") .addSuperinterface(ResponseWriter.ListWriter::class.java) .addMethod(MethodSpec.methodBuilder("write") .addModifiers(Modifier.PUBLIC) .addAnnotation(Override::class.java) - .addParameter(OBJECT_VALUE_PARAM) + .addParameter(ITEMS_VALUE_PARAM) .addParameter(RESPONSE_LIST_ITEM_WRITER_PARAM) .addCode(writeListItemStatement(listItemType, marshaller)) .build() @@ -442,7 +467,8 @@ class ResponseFieldSpec( ParameterSpec.builder(ResponseReader::class.java, "reader").build() private val RESPONSE_LIST_ITEM_READER_PARAM = ParameterSpec.builder(ResponseReader.ListItemReader::class.java, "listItemReader").build() - private val OBJECT_VALUE_PARAM = ParameterSpec.builder(Object::class.java, "value").build() + private val ITEMS_VALUE_PARAM = ParameterSpec.builder(List::class.java, "items").build() + private val ITEM_VALUE_PARAM = ParameterSpec.builder(TypeName.OBJECT, "item").build() private val RESPONSE_LIST_ITEM_WRITER_PARAM = ParameterSpec.builder(ResponseWriter.ListItemWriter::class.java, "listItemWriter").build() diff --git a/apollo-compiler/src/main/kotlin/com/apollographql/apollo/compiler/ir/Field.kt b/apollo-compiler/src/main/kotlin/com/apollographql/apollo/compiler/ir/Field.kt index ecba67f138a..8765f0d22df 100644 --- a/apollo-compiler/src/main/kotlin/com/apollographql/apollo/compiler/ir/Field.kt +++ b/apollo-compiler/src/main/kotlin/com/apollographql/apollo/compiler/ir/Field.kt @@ -133,15 +133,20 @@ data class Field( // However, we need to also encode any extra information from the `type` field // eg, [lists], nonNulls!, [[nestedLists]], [nonNullLists]!, etc val normalizedName = formatClassName() - if (type.startsWith("[")) { - // array type - return if (type.endsWith("!")) "[$normalizedName]!" else "[$normalizedName]" - } else if (type.endsWith("!")) { - // non-null type - return "$normalizedName!" - } else { - // nullable type - return normalizedName + return when { + type.startsWith("[") -> {// array type + type.count { it == '[' }.let { + "[".repeat(it) + normalizedName + "]".repeat(it) + }.let { + if (type.endsWith("!")) "$it!" else it + } + } + type.endsWith("!") -> {// non-null type + "$normalizedName!" + } + else -> {// nullable type + normalizedName + } } } else { return type diff --git a/apollo-compiler/src/test/graphql/com/example/arguments_hardcoded/TestQuery.java b/apollo-compiler/src/test/graphql/com/example/arguments_hardcoded/TestQuery.java index a6c4ce58083..bb85ba240e1 100644 --- a/apollo-compiler/src/test/graphql/com/example/arguments_hardcoded/TestQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/arguments_hardcoded/TestQuery.java @@ -121,8 +121,10 @@ public ResponseFieldMarshaller marshaller() { public void marshal(ResponseWriter writer) { writer.writeList($responseFields[0], reviews.isPresent() ? reviews.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Review) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Review) item).marshaller()); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/custom_scalar_type/TestQuery.java b/apollo-compiler/src/test/graphql/com/example/custom_scalar_type/TestQuery.java index 7fb1792a451..f36efaf081d 100644 --- a/apollo-compiler/src/test/graphql/com/example/custom_scalar_type/TestQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/custom_scalar_type/TestQuery.java @@ -273,16 +273,20 @@ public void marshal(ResponseWriter writer) { writer.writeCustom((ResponseField.CustomTypeField) $responseFields[2], birthDate); writer.writeList($responseFields[3], appearanceDates, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeCustom(CustomType.DATE, value); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeCustom(CustomType.DATE, item); + } } }); writer.writeCustom((ResponseField.CustomTypeField) $responseFields[4], fieldWithUnsupportedType); writer.writeCustom((ResponseField.CustomTypeField) $responseFields[5], profileLink); writer.writeList($responseFields[6], links, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeCustom(CustomType.URL, value); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeCustom(CustomType.URL, item); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/custom_scalar_type_warnings/TestQuery.java b/apollo-compiler/src/test/graphql/com/example/custom_scalar_type_warnings/TestQuery.java index 6ec6a143370..9b4e6e52efa 100644 --- a/apollo-compiler/src/test/graphql/com/example/custom_scalar_type_warnings/TestQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/custom_scalar_type_warnings/TestQuery.java @@ -208,8 +208,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[0], __typename); writer.writeList($responseFields[1], links, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeCustom(CustomType.URL, value); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeCustom(CustomType.URL, item); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/enum_type/TestQuery.java b/apollo-compiler/src/test/graphql/com/example/enum_type/TestQuery.java index bcb37303273..5e0690c44b6 100644 --- a/apollo-compiler/src/test/graphql/com/example/enum_type/TestQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/enum_type/TestQuery.java @@ -234,8 +234,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[1], name); writer.writeList($responseFields[2], appearsIn, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeString(((com.example.enum_type.type.Episode) value).rawValue()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeString(((Episode) item).rawValue()); + } } }); writer.writeString($responseFields[3], firstAppearsIn.rawValue()); diff --git a/apollo-compiler/src/test/graphql/com/example/fragment_friends_connection/fragment/HeroDetails.java b/apollo-compiler/src/test/graphql/com/example/fragment_friends_connection/fragment/HeroDetails.java index 29b66ce30b9..da3504bea9f 100644 --- a/apollo-compiler/src/test/graphql/com/example/fragment_friends_connection/fragment/HeroDetails.java +++ b/apollo-compiler/src/test/graphql/com/example/fragment_friends_connection/fragment/HeroDetails.java @@ -204,8 +204,10 @@ public void marshal(ResponseWriter writer) { writer.writeInt($responseFields[1], totalCount.isPresent() ? totalCount.get() : null); writer.writeList($responseFields[2], edges.isPresent() ? edges.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Edge) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Edge) item).marshaller()); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/fragment_in_fragment/AllStarships.java b/apollo-compiler/src/test/graphql/com/example/fragment_in_fragment/AllStarships.java index 392cdea6c2a..a8f477a2c09 100644 --- a/apollo-compiler/src/test/graphql/com/example/fragment_in_fragment/AllStarships.java +++ b/apollo-compiler/src/test/graphql/com/example/fragment_in_fragment/AllStarships.java @@ -222,8 +222,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[0], __typename); writer.writeList($responseFields[1], edges.isPresent() ? edges.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Edge) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Edge) item).marshaller()); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/fragment_in_fragment/fragment/StarshipFragment.java b/apollo-compiler/src/test/graphql/com/example/fragment_in_fragment/fragment/StarshipFragment.java index 75d9b5ba1b5..1270002a2f8 100644 --- a/apollo-compiler/src/test/graphql/com/example/fragment_in_fragment/fragment/StarshipFragment.java +++ b/apollo-compiler/src/test/graphql/com/example/fragment_in_fragment/fragment/StarshipFragment.java @@ -206,8 +206,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[0], __typename); writer.writeList($responseFields[1], edges.isPresent() ? edges.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Edge) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Edge) item).marshaller()); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/fragment_with_inline_fragment/TestQuery.java b/apollo-compiler/src/test/graphql/com/example/fragment_with_inline_fragment/TestQuery.java index 347ac2c45ce..767e312bdae 100644 --- a/apollo-compiler/src/test/graphql/com/example/fragment_with_inline_fragment/TestQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/fragment_with_inline_fragment/TestQuery.java @@ -271,8 +271,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[1], name); writer.writeList($responseFields[2], appearsIn, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeString(((com.example.fragment_with_inline_fragment.type.Episode) value).rawValue()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeString(((Episode) item).rawValue()); + } } }); fragments.marshaller().marshal(writer); diff --git a/apollo-compiler/src/test/graphql/com/example/fragment_with_inline_fragment/fragment/HeroDetails.java b/apollo-compiler/src/test/graphql/com/example/fragment_with_inline_fragment/fragment/HeroDetails.java index b80e5acfe53..a0ae732f4b2 100644 --- a/apollo-compiler/src/test/graphql/com/example/fragment_with_inline_fragment/fragment/HeroDetails.java +++ b/apollo-compiler/src/test/graphql/com/example/fragment_with_inline_fragment/fragment/HeroDetails.java @@ -362,8 +362,10 @@ public void marshal(ResponseWriter writer) { writer.writeInt($responseFields[1], totalCount.isPresent() ? totalCount.get() : null); writer.writeList($responseFields[2], edges.isPresent() ? edges.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Edge1) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Edge1) item).marshaller()); + } } }); } @@ -981,8 +983,10 @@ public void marshal(ResponseWriter writer) { writer.writeInt($responseFields[1], totalCount.isPresent() ? totalCount.get() : null); writer.writeList($responseFields[2], edges.isPresent() ? edges.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Edge2) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Edge2) item).marshaller()); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/hero_details/HeroDetails.java b/apollo-compiler/src/test/graphql/com/example/hero_details/HeroDetails.java index 236395e72f1..b757dad5bf6 100644 --- a/apollo-compiler/src/test/graphql/com/example/hero_details/HeroDetails.java +++ b/apollo-compiler/src/test/graphql/com/example/hero_details/HeroDetails.java @@ -347,8 +347,10 @@ public void marshal(ResponseWriter writer) { writer.writeInt($responseFields[1], totalCount.isPresent() ? totalCount.get() : null); writer.writeList($responseFields[2], edges.isPresent() ? edges.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Edge) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Edge) item).marshaller()); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/hero_details_guava/TestQuery.java b/apollo-compiler/src/test/graphql/com/example/hero_details_guava/TestQuery.java index fae72d03578..d7b8ca69b5c 100644 --- a/apollo-compiler/src/test/graphql/com/example/hero_details_guava/TestQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/hero_details_guava/TestQuery.java @@ -347,8 +347,10 @@ public void marshal(ResponseWriter writer) { writer.writeInt($responseFields[1], totalCount.isPresent() ? totalCount.get() : null); writer.writeList($responseFields[2], edges.isPresent() ? edges.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Edge) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Edge) item).marshaller()); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/hero_details_java_optional/TestQuery.java b/apollo-compiler/src/test/graphql/com/example/hero_details_java_optional/TestQuery.java index 068960d9830..d5aafc76f14 100644 --- a/apollo-compiler/src/test/graphql/com/example/hero_details_java_optional/TestQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/hero_details_java_optional/TestQuery.java @@ -347,8 +347,10 @@ public void marshal(ResponseWriter writer) { writer.writeInt($responseFields[1], totalCount.isPresent() ? totalCount.get() : null); writer.writeList($responseFields[2], edges.isPresent() ? edges.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Edge) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Edge) item).marshaller()); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/hero_details_nullable/TestQuery.java b/apollo-compiler/src/test/graphql/com/example/hero_details_nullable/TestQuery.java index f28a57b201d..342d19b6a47 100644 --- a/apollo-compiler/src/test/graphql/com/example/hero_details_nullable/TestQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/hero_details_nullable/TestQuery.java @@ -346,8 +346,10 @@ public void marshal(ResponseWriter writer) { writer.writeInt($responseFields[1], totalCount); writer.writeList($responseFields[2], edges, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Edge) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Edge) item).marshaller()); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/hero_details_semantic_naming/HeroDetailsQuery.java b/apollo-compiler/src/test/graphql/com/example/hero_details_semantic_naming/HeroDetailsQuery.java index 78c87d389f0..e689c08ddbb 100644 --- a/apollo-compiler/src/test/graphql/com/example/hero_details_semantic_naming/HeroDetailsQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/hero_details_semantic_naming/HeroDetailsQuery.java @@ -347,8 +347,10 @@ public void marshal(ResponseWriter writer) { writer.writeInt($responseFields[1], totalCount.isPresent() ? totalCount.get() : null); writer.writeList($responseFields[2], edges.isPresent() ? edges.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Edge) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Edge) item).marshaller()); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/inline_fragments_with_friends/TestQuery.java b/apollo-compiler/src/test/graphql/com/example/inline_fragments_with_friends/TestQuery.java index 7992b74d9cf..d921edbc73b 100644 --- a/apollo-compiler/src/test/graphql/com/example/inline_fragments_with_friends/TestQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/inline_fragments_with_friends/TestQuery.java @@ -292,8 +292,10 @@ public void marshal(ResponseWriter writer) { writer.writeDouble($responseFields[2], height.isPresent() ? height.get() : null); writer.writeList($responseFields[3], friends.isPresent() ? friends.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Friend) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Friend) item).marshaller()); + } } }); } @@ -409,8 +411,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[0], __typename); writer.writeList($responseFields[1], appearsIn, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeString(((com.example.inline_fragments_with_friends.type.Episode) value).rawValue()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeString(((Episode) item).rawValue()); + } } }); } @@ -534,8 +538,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[2], primaryFunction.isPresent() ? primaryFunction.get() : null); writer.writeList($responseFields[3], friends.isPresent() ? friends.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Friend1) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Friend1) item).marshaller()); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/java_beans_semantic_naming/TestQuery.java b/apollo-compiler/src/test/graphql/com/example/java_beans_semantic_naming/TestQuery.java index 7244d044087..9836c28cfd5 100644 --- a/apollo-compiler/src/test/graphql/com/example/java_beans_semantic_naming/TestQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/java_beans_semantic_naming/TestQuery.java @@ -236,8 +236,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[1], name); writer.writeList($responseFields[2], appearsIn, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeString(((com.example.java_beans_semantic_naming.type.Episode) value).rawValue()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeString(((Episode) item).rawValue()); + } } }); fragments.marshaller().marshal(writer); diff --git a/apollo-compiler/src/test/graphql/com/example/java_beans_semantic_naming/fragment/HeroDetails.java b/apollo-compiler/src/test/graphql/com/example/java_beans_semantic_naming/fragment/HeroDetails.java index 202225fde42..3aca2dd0836 100644 --- a/apollo-compiler/src/test/graphql/com/example/java_beans_semantic_naming/fragment/HeroDetails.java +++ b/apollo-compiler/src/test/graphql/com/example/java_beans_semantic_naming/fragment/HeroDetails.java @@ -344,8 +344,10 @@ public void marshal(ResponseWriter writer) { writer.writeInt($responseFields[1], totalCount.isPresent() ? totalCount.get() : null); writer.writeList($responseFields[2], edges.isPresent() ? edges.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Edge1) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Edge1) item).marshaller()); + } } }); writer.writeObject($responseFields[3], pageInfo.marshaller()); @@ -899,8 +901,10 @@ public void marshal(ResponseWriter writer) { writer.writeInt($responseFields[1], totalCount.isPresent() ? totalCount.get() : null); writer.writeList($responseFields[2], edges.isPresent() ? edges.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Edge2) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Edge2) item).marshaller()); + } } }); writer.writeObject($responseFields[3], pageInfo.marshaller()); diff --git a/apollo-compiler/src/test/graphql/com/example/mutation_create_review/CreateReviewForEpisode.java b/apollo-compiler/src/test/graphql/com/example/mutation_create_review/CreateReviewForEpisode.java index 063c29ed861..01c16164d7a 100644 --- a/apollo-compiler/src/test/graphql/com/example/mutation_create_review/CreateReviewForEpisode.java +++ b/apollo-compiler/src/test/graphql/com/example/mutation_create_review/CreateReviewForEpisode.java @@ -275,7 +275,7 @@ public static class CreateReview { final Optional>> listOfListOfCustom; - final Optional> listOfListOfObject; + final Optional>> listOfListOfObject; private transient volatile String $toString; @@ -287,7 +287,7 @@ public CreateReview(@NotNull String __typename, int stars, @Nullable String comm @Nullable List> listOfListOfString, @Nullable List> listOfListOfEnum, @Nullable List> listOfListOfCustom, - @Nullable List listOfListOfObject) { + @Nullable List> listOfListOfObject) { this.__typename = Utils.checkNotNull(__typename, "__typename == null"); this.stars = stars; this.commentary = Optional.fromNullable(commentary); @@ -339,7 +339,7 @@ public Optional>> listOfListOfCustom() { /** * for test purpose only */ - public Optional> listOfListOfObject() { + public Optional>> listOfListOfObject() { return this.listOfListOfObject; } @@ -352,26 +352,62 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[2], commentary.isPresent() ? commentary.get() : null); writer.writeList($responseFields[3], listOfListOfString.isPresent() ? listOfListOfString.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeString(value); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeList((List) item, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeString((String) item); + } + } + }); + } } }); writer.writeList($responseFields[4], listOfListOfEnum.isPresent() ? listOfListOfEnum.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeString(((com.example.mutation_create_review.type.Episode) value).rawValue()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeList((List) item, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeString(((Episode) item).rawValue()); + } + } + }); + } } }); writer.writeList($responseFields[5], listOfListOfCustom.isPresent() ? listOfListOfCustom.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeCustom(CustomType.DATE, value); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeList((List) item, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeCustom(CustomType.DATE, item); + } + } + }); + } } }); writer.writeList($responseFields[6], listOfListOfObject.isPresent() ? listOfListOfObject.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((ListOfListOfObject) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeList((List) item, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((ListOfListOfObject) item).marshaller()); + } + } + }); + } } }); } @@ -477,13 +513,18 @@ public Date read(ResponseReader.ListItemReader listItemReader) { }); } }); - final List listOfListOfObject = reader.readList($responseFields[6], new ResponseReader.ListReader() { + final List> listOfListOfObject = reader.readList($responseFields[6], new ResponseReader.ListReader>() { @Override - public ListOfListOfObject read(ResponseReader.ListItemReader listItemReader) { - return listItemReader.readObject(new ResponseReader.ObjectReader() { + public List read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readList(new ResponseReader.ListReader() { @Override - public ListOfListOfObject read(ResponseReader reader) { - return listOfListOfObjectFieldMapper.map(reader); + public ListOfListOfObject read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readObject(new ResponseReader.ObjectReader() { + @Override + public ListOfListOfObject read(ResponseReader reader) { + return listOfListOfObjectFieldMapper.map(reader); + } + }); } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/nested_conditional_inline/TestQuery.java b/apollo-compiler/src/test/graphql/com/example/nested_conditional_inline/TestQuery.java index 7509ed0b088..5216b4dab88 100644 --- a/apollo-compiler/src/test/graphql/com/example/nested_conditional_inline/TestQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/nested_conditional_inline/TestQuery.java @@ -342,8 +342,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[1], name); writer.writeList($responseFields[2], friends.isPresent() ? friends.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Friend) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Friend) item).marshaller()); + } } }); } @@ -697,8 +699,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[1], name); writer.writeList($responseFields[2], friends.isPresent() ? friends.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Friend1) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Friend1) item).marshaller()); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/nested_inline_fragment/fragment/TestSetting.java b/apollo-compiler/src/test/graphql/com/example/nested_inline_fragment/fragment/TestSetting.java index acdd417b973..907e3d9409a 100644 --- a/apollo-compiler/src/test/graphql/com/example/nested_inline_fragment/fragment/TestSetting.java +++ b/apollo-compiler/src/test/graphql/com/example/nested_inline_fragment/fragment/TestSetting.java @@ -128,8 +128,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[0], __typename); writer.writeList($responseFields[1], list.isPresent() ? list.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeString(value); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeString((String) item); + } } }); } @@ -308,8 +310,10 @@ public void marshal(ResponseWriter writer) { writer.writeObject($responseFields[1], value.isPresent() ? value.get().marshaller() : null); writer.writeList($responseFields[2], options.isPresent() ? options.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Option) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Option) item).marshaller()); + } } }); } @@ -450,8 +454,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[0], __typename); writer.writeList($responseFields[1], list.isPresent() ? list.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeString(value); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeString((String) item); + } } }); } @@ -856,8 +862,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[0], __typename); writer.writeList($responseFields[1], list.isPresent() ? list.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeString(value); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeString((String) item); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/scalar_types/TestOperation.json b/apollo-compiler/src/test/graphql/com/example/scalar_types/TestOperation.json index 59b8475c178..5092e0a6b3e 100644 --- a/apollo-compiler/src/test/graphql/com/example/scalar_types/TestOperation.json +++ b/apollo-compiler/src/test/graphql/com/example/scalar_types/TestOperation.json @@ -70,25 +70,100 @@ "inlineFragments": [] }, { - "responseName": "graphQlListOfInt", - "fieldName": "graphQlListOfInt", - "type": "[Int]", + "responseName": "graphQlListOfStringNullable", + "fieldName": "graphQlListOfStringNullable", + "type": "[String]!", "fragmentSpreads": [], "inlineFragments": [] }, { - "responseName": "graphQlListOfObjects", - "fieldName": "graphQlListOfObjects", - "type": "[SomeObject]", - "fields": [ - { - "responseName": "someField", - "fieldName": "someField", - "type": "Int!", - "fragmentSpreads": [], - "inlineFragments": [] - } - ], + "responseName": "graphQlListOfStringNonNullable", + "fieldName": "graphQlListOfStringNonNullable", + "type": "[String!]!", + "fragmentSpreads": [], + "inlineFragments": [] + }, + { + "responseName": "graphQlListOfIdNullable", + "fieldName": "graphQlListOfIdNullable", + "type": "[ID!]", + "fragmentSpreads": [], + "inlineFragments": [] + }, + { + "responseName": "graphQlListOfIdNonNullable", + "fieldName": "graphQlListOfIdNonNullable", + "type": "[ID!]!", + "fragmentSpreads": [], + "inlineFragments": [] + }, + { + "responseName": "graphQlListOfIntNullable", + "fieldName": "graphQlListOfIntNullable", + "type": "[Int!]", + "fragmentSpreads": [], + "inlineFragments": [] + }, + { + "responseName": "graphQlListOfIntNonNullable", + "fieldName": "graphQlListOfIntNonNullable", + "type": "[Int!]!", + "fragmentSpreads": [], + "inlineFragments": [] + }, + { + "responseName": "graphQlListOfFloatNullable", + "fieldName": "graphQlListOfFloatNullable", + "type": "[Float!]", + "fragmentSpreads": [], + "inlineFragments": [] + }, + { + "responseName": "graphQlListOfFloatNonNullable", + "fieldName": "graphQlListOfFloatNonNullable", + "type": "[Float]!", + "fragmentSpreads": [], + "inlineFragments": [] + }, + { + "responseName": "graphQlListOfBooleanNullable", + "fieldName": "graphQlListOfBooleanNullable", + "type": "[Boolean!]", + "fragmentSpreads": [], + "inlineFragments": [] + }, + { + "responseName": "graphQlListOfListOfString", + "fieldName": "graphQlListOfListOfString", + "type": "[[String!]!]!", + "fragmentSpreads": [], + "inlineFragments": [] + }, + { + "responseName": "graphQlListOfListOfId", + "fieldName": "graphQlListOfListOfId", + "type": "[[ID!]!]!", + "fragmentSpreads": [], + "inlineFragments": [] + }, + { + "responseName": "graphQlListOfListOfInt", + "fieldName": "graphQlListOfListOfInt", + "type": "[[Int!]!]!", + "fragmentSpreads": [], + "inlineFragments": [] + }, + { + "responseName": "graphQlListOfListOfFloat", + "fieldName": "graphQlListOfListOfFloat", + "type": "[[Float!]!]!", + "fragmentSpreads": [], + "inlineFragments": [] + }, + { + "responseName": "graphQlListOfListOfBoolean", + "fieldName": "graphQlListOfListOfBoolean", + "type": "[[Boolean!]!]!", "fragmentSpreads": [], "inlineFragments": [] } diff --git a/apollo-compiler/src/test/graphql/com/example/scalar_types/TestQuery.java b/apollo-compiler/src/test/graphql/com/example/scalar_types/TestQuery.java index 343bd74bca7..00cca6a966d 100644 --- a/apollo-compiler/src/test/graphql/com/example/scalar_types/TestQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/scalar_types/TestQuery.java @@ -98,8 +98,20 @@ public static class Data implements Operation.Data { ResponseField.forDouble("graphQlFloatNonNullable", "graphQlFloatNonNullable", null, false, Collections.emptyList()), ResponseField.forBoolean("graphQlBooleanNullable", "graphQlBooleanNullable", null, true, Collections.emptyList()), ResponseField.forBoolean("graphQlBooleanNonNullable", "graphQlBooleanNonNullable", null, false, Collections.emptyList()), - ResponseField.forList("graphQlListOfInt", "graphQlListOfInt", null, true, Collections.emptyList()), - ResponseField.forList("graphQlListOfObjects", "graphQlListOfObjects", null, true, Collections.emptyList()) + ResponseField.forList("graphQlListOfStringNullable", "graphQlListOfStringNullable", null, false, Collections.emptyList()), + ResponseField.forList("graphQlListOfStringNonNullable", "graphQlListOfStringNonNullable", null, false, Collections.emptyList()), + ResponseField.forList("graphQlListOfIdNullable", "graphQlListOfIdNullable", null, true, Collections.emptyList()), + ResponseField.forList("graphQlListOfIdNonNullable", "graphQlListOfIdNonNullable", null, false, Collections.emptyList()), + ResponseField.forList("graphQlListOfIntNullable", "graphQlListOfIntNullable", null, true, Collections.emptyList()), + ResponseField.forList("graphQlListOfIntNonNullable", "graphQlListOfIntNonNullable", null, false, Collections.emptyList()), + ResponseField.forList("graphQlListOfFloatNullable", "graphQlListOfFloatNullable", null, true, Collections.emptyList()), + ResponseField.forList("graphQlListOfFloatNonNullable", "graphQlListOfFloatNonNullable", null, false, Collections.emptyList()), + ResponseField.forList("graphQlListOfBooleanNullable", "graphQlListOfBooleanNullable", null, true, Collections.emptyList()), + ResponseField.forList("graphQlListOfListOfString", "graphQlListOfListOfString", null, false, Collections.emptyList()), + ResponseField.forList("graphQlListOfListOfId", "graphQlListOfListOfId", null, false, Collections.emptyList()), + ResponseField.forList("graphQlListOfListOfInt", "graphQlListOfListOfInt", null, false, Collections.emptyList()), + ResponseField.forList("graphQlListOfListOfFloat", "graphQlListOfListOfFloat", null, false, Collections.emptyList()), + ResponseField.forList("graphQlListOfListOfBoolean", "graphQlListOfListOfBoolean", null, false, Collections.emptyList()) }; final Optional graphQlString; @@ -120,9 +132,33 @@ public static class Data implements Operation.Data { final boolean graphQlBooleanNonNullable; - final Optional> graphQlListOfInt; + final @NotNull List graphQlListOfStringNullable; - final Optional> graphQlListOfObjects; + final @NotNull List graphQlListOfStringNonNullable; + + final Optional> graphQlListOfIdNullable; + + final @NotNull List graphQlListOfIdNonNullable; + + final Optional> graphQlListOfIntNullable; + + final @NotNull List graphQlListOfIntNonNullable; + + final Optional> graphQlListOfFloatNullable; + + final @NotNull List graphQlListOfFloatNonNullable; + + final Optional> graphQlListOfBooleanNullable; + + final @NotNull List> graphQlListOfListOfString; + + final @NotNull List> graphQlListOfListOfId; + + final @NotNull List> graphQlListOfListOfInt; + + final @NotNull List> graphQlListOfListOfFloat; + + final @NotNull List> graphQlListOfListOfBoolean; private transient volatile String $toString; @@ -134,8 +170,20 @@ public Data(@Nullable String graphQlString, @Nullable String graphQlIdNullable, @NotNull String graphQlIdNonNullable, @Nullable Integer graphQlIntNullable, int graphQlIntNonNullable, @Nullable Double graphQlFloatNullable, double graphQlFloatNonNullable, @Nullable Boolean graphQlBooleanNullable, - boolean graphQlBooleanNonNullable, @Nullable List graphQlListOfInt, - @Nullable List graphQlListOfObjects) { + boolean graphQlBooleanNonNullable, @NotNull List graphQlListOfStringNullable, + @NotNull List graphQlListOfStringNonNullable, + @Nullable List graphQlListOfIdNullable, + @NotNull List graphQlListOfIdNonNullable, + @Nullable List graphQlListOfIntNullable, + @NotNull List graphQlListOfIntNonNullable, + @Nullable List graphQlListOfFloatNullable, + @NotNull List graphQlListOfFloatNonNullable, + @Nullable List graphQlListOfBooleanNullable, + @NotNull List> graphQlListOfListOfString, + @NotNull List> graphQlListOfListOfId, + @NotNull List> graphQlListOfListOfInt, + @NotNull List> graphQlListOfListOfFloat, + @NotNull List> graphQlListOfListOfBoolean) { this.graphQlString = Optional.fromNullable(graphQlString); this.graphQlIdNullable = Optional.fromNullable(graphQlIdNullable); this.graphQlIdNonNullable = Utils.checkNotNull(graphQlIdNonNullable, "graphQlIdNonNullable == null"); @@ -145,8 +193,20 @@ public Data(@Nullable String graphQlString, @Nullable String graphQlIdNullable, this.graphQlFloatNonNullable = graphQlFloatNonNullable; this.graphQlBooleanNullable = Optional.fromNullable(graphQlBooleanNullable); this.graphQlBooleanNonNullable = graphQlBooleanNonNullable; - this.graphQlListOfInt = Optional.fromNullable(graphQlListOfInt); - this.graphQlListOfObjects = Optional.fromNullable(graphQlListOfObjects); + this.graphQlListOfStringNullable = Utils.checkNotNull(graphQlListOfStringNullable, "graphQlListOfStringNullable == null"); + this.graphQlListOfStringNonNullable = Utils.checkNotNull(graphQlListOfStringNonNullable, "graphQlListOfStringNonNullable == null"); + this.graphQlListOfIdNullable = Optional.fromNullable(graphQlListOfIdNullable); + this.graphQlListOfIdNonNullable = Utils.checkNotNull(graphQlListOfIdNonNullable, "graphQlListOfIdNonNullable == null"); + this.graphQlListOfIntNullable = Optional.fromNullable(graphQlListOfIntNullable); + this.graphQlListOfIntNonNullable = Utils.checkNotNull(graphQlListOfIntNonNullable, "graphQlListOfIntNonNullable == null"); + this.graphQlListOfFloatNullable = Optional.fromNullable(graphQlListOfFloatNullable); + this.graphQlListOfFloatNonNullable = Utils.checkNotNull(graphQlListOfFloatNonNullable, "graphQlListOfFloatNonNullable == null"); + this.graphQlListOfBooleanNullable = Optional.fromNullable(graphQlListOfBooleanNullable); + this.graphQlListOfListOfString = Utils.checkNotNull(graphQlListOfListOfString, "graphQlListOfListOfString == null"); + this.graphQlListOfListOfId = Utils.checkNotNull(graphQlListOfListOfId, "graphQlListOfListOfId == null"); + this.graphQlListOfListOfInt = Utils.checkNotNull(graphQlListOfListOfInt, "graphQlListOfListOfInt == null"); + this.graphQlListOfListOfFloat = Utils.checkNotNull(graphQlListOfListOfFloat, "graphQlListOfListOfFloat == null"); + this.graphQlListOfListOfBoolean = Utils.checkNotNull(graphQlListOfListOfBoolean, "graphQlListOfListOfBoolean == null"); } public Optional graphQlString() { @@ -185,12 +245,60 @@ public boolean graphQlBooleanNonNullable() { return this.graphQlBooleanNonNullable; } - public Optional> graphQlListOfInt() { - return this.graphQlListOfInt; + public @NotNull List graphQlListOfStringNullable() { + return this.graphQlListOfStringNullable; + } + + public @NotNull List graphQlListOfStringNonNullable() { + return this.graphQlListOfStringNonNullable; + } + + public Optional> graphQlListOfIdNullable() { + return this.graphQlListOfIdNullable; + } + + public @NotNull List graphQlListOfIdNonNullable() { + return this.graphQlListOfIdNonNullable; + } + + public Optional> graphQlListOfIntNullable() { + return this.graphQlListOfIntNullable; + } + + public @NotNull List graphQlListOfIntNonNullable() { + return this.graphQlListOfIntNonNullable; + } + + public Optional> graphQlListOfFloatNullable() { + return this.graphQlListOfFloatNullable; + } + + public @NotNull List graphQlListOfFloatNonNullable() { + return this.graphQlListOfFloatNonNullable; } - public Optional> graphQlListOfObjects() { - return this.graphQlListOfObjects; + public Optional> graphQlListOfBooleanNullable() { + return this.graphQlListOfBooleanNullable; + } + + public @NotNull List> graphQlListOfListOfString() { + return this.graphQlListOfListOfString; + } + + public @NotNull List> graphQlListOfListOfId() { + return this.graphQlListOfListOfId; + } + + public @NotNull List> graphQlListOfListOfInt() { + return this.graphQlListOfListOfInt; + } + + public @NotNull List> graphQlListOfListOfFloat() { + return this.graphQlListOfListOfFloat; + } + + public @NotNull List> graphQlListOfListOfBoolean() { + return this.graphQlListOfListOfBoolean; } public ResponseFieldMarshaller marshaller() { @@ -206,16 +314,151 @@ public void marshal(ResponseWriter writer) { writer.writeDouble($responseFields[6], graphQlFloatNonNullable); writer.writeBoolean($responseFields[7], graphQlBooleanNullable.isPresent() ? graphQlBooleanNullable.get() : null); writer.writeBoolean($responseFields[8], graphQlBooleanNonNullable); - writer.writeList($responseFields[9], graphQlListOfInt.isPresent() ? graphQlListOfInt.get() : null, new ResponseWriter.ListWriter() { + writer.writeList($responseFields[9], graphQlListOfStringNullable, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeString((String) item); + } + } + }); + writer.writeList($responseFields[10], graphQlListOfStringNonNullable, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeString((String) item); + } + } + }); + writer.writeList($responseFields[11], graphQlListOfIdNullable.isPresent() ? graphQlListOfIdNullable.get() : null, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeCustom(CustomType.ID, item); + } + } + }); + writer.writeList($responseFields[12], graphQlListOfIdNonNullable, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeCustom(CustomType.ID, item); + } + } + }); + writer.writeList($responseFields[13], graphQlListOfIntNullable.isPresent() ? graphQlListOfIntNullable.get() : null, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeInt((Integer) item); + } + } + }); + writer.writeList($responseFields[14], graphQlListOfIntNonNullable, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeInt((Integer) item); + } + } + }); + writer.writeList($responseFields[15], graphQlListOfFloatNullable.isPresent() ? graphQlListOfFloatNullable.get() : null, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeDouble((Double) item); + } + } + }); + writer.writeList($responseFields[16], graphQlListOfFloatNonNullable, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeInt(value); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeDouble((Double) item); + } } }); - writer.writeList($responseFields[10], graphQlListOfObjects.isPresent() ? graphQlListOfObjects.get() : null, new ResponseWriter.ListWriter() { + writer.writeList($responseFields[17], graphQlListOfBooleanNullable.isPresent() ? graphQlListOfBooleanNullable.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((GraphQlListOfObject) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeBoolean((Boolean) item); + } + } + }); + writer.writeList($responseFields[18], graphQlListOfListOfString, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeList((List) item, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeString((String) item); + } + } + }); + } + } + }); + writer.writeList($responseFields[19], graphQlListOfListOfId, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeList((List) item, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeCustom(CustomType.ID, item); + } + } + }); + } + } + }); + writer.writeList($responseFields[20], graphQlListOfListOfInt, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeList((List) item, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeInt((Integer) item); + } + } + }); + } + } + }); + writer.writeList($responseFields[21], graphQlListOfListOfFloat, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeList((List) item, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeDouble((Double) item); + } + } + }); + } + } + }); + writer.writeList($responseFields[22], graphQlListOfListOfBoolean, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeList((List) item, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeBoolean((Boolean) item); + } + } + }); + } } }); } @@ -235,8 +478,20 @@ public String toString() { + "graphQlFloatNonNullable=" + graphQlFloatNonNullable + ", " + "graphQlBooleanNullable=" + graphQlBooleanNullable + ", " + "graphQlBooleanNonNullable=" + graphQlBooleanNonNullable + ", " - + "graphQlListOfInt=" + graphQlListOfInt + ", " - + "graphQlListOfObjects=" + graphQlListOfObjects + + "graphQlListOfStringNullable=" + graphQlListOfStringNullable + ", " + + "graphQlListOfStringNonNullable=" + graphQlListOfStringNonNullable + ", " + + "graphQlListOfIdNullable=" + graphQlListOfIdNullable + ", " + + "graphQlListOfIdNonNullable=" + graphQlListOfIdNonNullable + ", " + + "graphQlListOfIntNullable=" + graphQlListOfIntNullable + ", " + + "graphQlListOfIntNonNullable=" + graphQlListOfIntNonNullable + ", " + + "graphQlListOfFloatNullable=" + graphQlListOfFloatNullable + ", " + + "graphQlListOfFloatNonNullable=" + graphQlListOfFloatNonNullable + ", " + + "graphQlListOfBooleanNullable=" + graphQlListOfBooleanNullable + ", " + + "graphQlListOfListOfString=" + graphQlListOfListOfString + ", " + + "graphQlListOfListOfId=" + graphQlListOfListOfId + ", " + + "graphQlListOfListOfInt=" + graphQlListOfListOfInt + ", " + + "graphQlListOfListOfFloat=" + graphQlListOfListOfFloat + ", " + + "graphQlListOfListOfBoolean=" + graphQlListOfListOfBoolean + "}"; } return $toString; @@ -258,8 +513,20 @@ public boolean equals(Object o) { && Double.doubleToLongBits(this.graphQlFloatNonNullable) == Double.doubleToLongBits(that.graphQlFloatNonNullable) && this.graphQlBooleanNullable.equals(that.graphQlBooleanNullable) && this.graphQlBooleanNonNullable == that.graphQlBooleanNonNullable - && this.graphQlListOfInt.equals(that.graphQlListOfInt) - && this.graphQlListOfObjects.equals(that.graphQlListOfObjects); + && this.graphQlListOfStringNullable.equals(that.graphQlListOfStringNullable) + && this.graphQlListOfStringNonNullable.equals(that.graphQlListOfStringNonNullable) + && this.graphQlListOfIdNullable.equals(that.graphQlListOfIdNullable) + && this.graphQlListOfIdNonNullable.equals(that.graphQlListOfIdNonNullable) + && this.graphQlListOfIntNullable.equals(that.graphQlListOfIntNullable) + && this.graphQlListOfIntNonNullable.equals(that.graphQlListOfIntNonNullable) + && this.graphQlListOfFloatNullable.equals(that.graphQlListOfFloatNullable) + && this.graphQlListOfFloatNonNullable.equals(that.graphQlListOfFloatNonNullable) + && this.graphQlListOfBooleanNullable.equals(that.graphQlListOfBooleanNullable) + && this.graphQlListOfListOfString.equals(that.graphQlListOfListOfString) + && this.graphQlListOfListOfId.equals(that.graphQlListOfListOfId) + && this.graphQlListOfListOfInt.equals(that.graphQlListOfListOfInt) + && this.graphQlListOfListOfFloat.equals(that.graphQlListOfListOfFloat) + && this.graphQlListOfListOfBoolean.equals(that.graphQlListOfListOfBoolean); } return false; } @@ -287,9 +554,33 @@ public int hashCode() { h *= 1000003; h ^= Boolean.valueOf(graphQlBooleanNonNullable).hashCode(); h *= 1000003; - h ^= graphQlListOfInt.hashCode(); + h ^= graphQlListOfStringNullable.hashCode(); + h *= 1000003; + h ^= graphQlListOfStringNonNullable.hashCode(); + h *= 1000003; + h ^= graphQlListOfIdNullable.hashCode(); + h *= 1000003; + h ^= graphQlListOfIdNonNullable.hashCode(); + h *= 1000003; + h ^= graphQlListOfIntNullable.hashCode(); h *= 1000003; - h ^= graphQlListOfObjects.hashCode(); + h ^= graphQlListOfIntNonNullable.hashCode(); + h *= 1000003; + h ^= graphQlListOfFloatNullable.hashCode(); + h *= 1000003; + h ^= graphQlListOfFloatNonNullable.hashCode(); + h *= 1000003; + h ^= graphQlListOfBooleanNullable.hashCode(); + h *= 1000003; + h ^= graphQlListOfListOfString.hashCode(); + h *= 1000003; + h ^= graphQlListOfListOfId.hashCode(); + h *= 1000003; + h ^= graphQlListOfListOfInt.hashCode(); + h *= 1000003; + h ^= graphQlListOfListOfFloat.hashCode(); + h *= 1000003; + h ^= graphQlListOfListOfBoolean.hashCode(); $hashCode = h; $hashCodeMemoized = true; } @@ -297,8 +588,6 @@ public int hashCode() { } public static final class Mapper implements ResponseFieldMapper { - final GraphQlListOfObject.Mapper graphQlListOfObjectFieldMapper = new GraphQlListOfObject.Mapper(); - @Override public Data map(ResponseReader reader) { final String graphQlString = reader.readString($responseFields[0]); @@ -310,97 +599,116 @@ public Data map(ResponseReader reader) { final double graphQlFloatNonNullable = reader.readDouble($responseFields[6]); final Boolean graphQlBooleanNullable = reader.readBoolean($responseFields[7]); final boolean graphQlBooleanNonNullable = reader.readBoolean($responseFields[8]); - final List graphQlListOfInt = reader.readList($responseFields[9], new ResponseReader.ListReader() { + final List graphQlListOfStringNullable = reader.readList($responseFields[9], new ResponseReader.ListReader() { + @Override + public String read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readString(); + } + }); + final List graphQlListOfStringNonNullable = reader.readList($responseFields[10], new ResponseReader.ListReader() { + @Override + public String read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readString(); + } + }); + final List graphQlListOfIdNullable = reader.readList($responseFields[11], new ResponseReader.ListReader() { + @Override + public String read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readCustomType(CustomType.ID); + } + }); + final List graphQlListOfIdNonNullable = reader.readList($responseFields[12], new ResponseReader.ListReader() { + @Override + public String read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readCustomType(CustomType.ID); + } + }); + final List graphQlListOfIntNullable = reader.readList($responseFields[13], new ResponseReader.ListReader() { + @Override + public Integer read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readInt(); + } + }); + final List graphQlListOfIntNonNullable = reader.readList($responseFields[14], new ResponseReader.ListReader() { @Override public Integer read(ResponseReader.ListItemReader listItemReader) { return listItemReader.readInt(); } }); - final List graphQlListOfObjects = reader.readList($responseFields[10], new ResponseReader.ListReader() { + final List graphQlListOfFloatNullable = reader.readList($responseFields[15], new ResponseReader.ListReader() { + @Override + public Double read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readDouble(); + } + }); + final List graphQlListOfFloatNonNullable = reader.readList($responseFields[16], new ResponseReader.ListReader() { + @Override + public Double read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readDouble(); + } + }); + final List graphQlListOfBooleanNullable = reader.readList($responseFields[17], new ResponseReader.ListReader() { @Override - public GraphQlListOfObject read(ResponseReader.ListItemReader listItemReader) { - return listItemReader.readObject(new ResponseReader.ObjectReader() { + public Boolean read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readBoolean(); + } + }); + final List> graphQlListOfListOfString = reader.readList($responseFields[18], new ResponseReader.ListReader>() { + @Override + public List read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readList(new ResponseReader.ListReader() { @Override - public GraphQlListOfObject read(ResponseReader reader) { - return graphQlListOfObjectFieldMapper.map(reader); + public String read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readString(); } }); } }); - return new Data(graphQlString, graphQlIdNullable, graphQlIdNonNullable, graphQlIntNullable, graphQlIntNonNullable, graphQlFloatNullable, graphQlFloatNonNullable, graphQlBooleanNullable, graphQlBooleanNonNullable, graphQlListOfInt, graphQlListOfObjects); - } - } - } - - public static class GraphQlListOfObject { - static final ResponseField[] $responseFields = { - ResponseField.forInt("someField", "someField", null, false, Collections.emptyList()) - }; - - final int someField; - - private transient volatile String $toString; - - private transient volatile int $hashCode; - - private transient volatile boolean $hashCodeMemoized; - - public GraphQlListOfObject(int someField) { - this.someField = someField; - } - - public int someField() { - return this.someField; - } - - public ResponseFieldMarshaller marshaller() { - return new ResponseFieldMarshaller() { - @Override - public void marshal(ResponseWriter writer) { - writer.writeInt($responseFields[0], someField); - } - }; - } - - @Override - public String toString() { - if ($toString == null) { - $toString = "GraphQlListOfObject{" - + "someField=" + someField - + "}"; - } - return $toString; - } - - @Override - public boolean equals(Object o) { - if (o == this) { - return true; - } - if (o instanceof GraphQlListOfObject) { - GraphQlListOfObject that = (GraphQlListOfObject) o; - return this.someField == that.someField; - } - return false; - } - - @Override - public int hashCode() { - if (!$hashCodeMemoized) { - int h = 1; - h *= 1000003; - h ^= someField; - $hashCode = h; - $hashCodeMemoized = true; - } - return $hashCode; - } - - public static final class Mapper implements ResponseFieldMapper { - @Override - public GraphQlListOfObject map(ResponseReader reader) { - final int someField = reader.readInt($responseFields[0]); - return new GraphQlListOfObject(someField); + final List> graphQlListOfListOfId = reader.readList($responseFields[19], new ResponseReader.ListReader>() { + @Override + public List read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readList(new ResponseReader.ListReader() { + @Override + public String read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readCustomType(CustomType.ID); + } + }); + } + }); + final List> graphQlListOfListOfInt = reader.readList($responseFields[20], new ResponseReader.ListReader>() { + @Override + public List read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readList(new ResponseReader.ListReader() { + @Override + public Integer read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readInt(); + } + }); + } + }); + final List> graphQlListOfListOfFloat = reader.readList($responseFields[21], new ResponseReader.ListReader>() { + @Override + public List read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readList(new ResponseReader.ListReader() { + @Override + public Double read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readDouble(); + } + }); + } + }); + final List> graphQlListOfListOfBoolean = reader.readList($responseFields[22], new ResponseReader.ListReader>() { + @Override + public List read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readList(new ResponseReader.ListReader() { + @Override + public Boolean read(ResponseReader.ListItemReader listItemReader) { + return listItemReader.readBoolean(); + } + }); + } + }); + return new Data(graphQlString, graphQlIdNullable, graphQlIdNonNullable, graphQlIntNullable, graphQlIntNonNullable, graphQlFloatNullable, graphQlFloatNonNullable, graphQlBooleanNullable, graphQlBooleanNonNullable, graphQlListOfStringNullable, graphQlListOfStringNonNullable, graphQlListOfIdNullable, graphQlListOfIdNonNullable, graphQlListOfIntNullable, graphQlListOfIntNonNullable, graphQlListOfFloatNullable, graphQlListOfFloatNonNullable, graphQlListOfBooleanNullable, graphQlListOfListOfString, graphQlListOfListOfId, graphQlListOfListOfInt, graphQlListOfListOfFloat, graphQlListOfListOfBoolean); } } } diff --git a/apollo-compiler/src/test/graphql/com/example/starships/TestQuery.java b/apollo-compiler/src/test/graphql/com/example/starships/TestQuery.java index 104a47cc3be..a3d3cb04f3f 100644 --- a/apollo-compiler/src/test/graphql/com/example/starships/TestQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/starships/TestQuery.java @@ -283,8 +283,17 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[2], name); writer.writeList($responseFields[3], coordinates.isPresent() ? coordinates.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeDouble(value); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeList((List) item, new ResponseWriter.ListWriter() { + @Override + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeDouble((Double) item); + } + } + }); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/two_heroes_with_friends/TestQuery.java b/apollo-compiler/src/test/graphql/com/example/two_heroes_with_friends/TestQuery.java index c8f12ca84de..6e9b7069623 100644 --- a/apollo-compiler/src/test/graphql/com/example/two_heroes_with_friends/TestQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/two_heroes_with_friends/TestQuery.java @@ -388,8 +388,10 @@ public void marshal(ResponseWriter writer) { writer.writeInt($responseFields[1], totalCount.isPresent() ? totalCount.get() : null); writer.writeList($responseFields[2], edges.isPresent() ? edges.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Edge) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Edge) item).marshaller()); + } } }); } @@ -832,8 +834,10 @@ public void marshal(ResponseWriter writer) { writer.writeInt($responseFields[1], totalCount.isPresent() ? totalCount.get() : null); writer.writeList($responseFields[2], edges.isPresent() ? edges.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Edge1) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Edge1) item).marshaller()); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/union_inline_fragments/TestQuery.java b/apollo-compiler/src/test/graphql/com/example/union_inline_fragments/TestQuery.java index 693cf18d72e..2745524d539 100644 --- a/apollo-compiler/src/test/graphql/com/example/union_inline_fragments/TestQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/union_inline_fragments/TestQuery.java @@ -151,8 +151,10 @@ public ResponseFieldMarshaller marshaller() { public void marshal(ResponseWriter writer) { writer.writeList($responseFields[0], search.isPresent() ? search.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Search) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Search) item).marshaller()); + } } }); } @@ -326,8 +328,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[2], name); writer.writeList($responseFields[3], friends.isPresent() ? friends.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Friend) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Friend) item).marshaller()); + } } }); } @@ -510,8 +514,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[2], homePlanet.isPresent() ? homePlanet.get() : null); writer.writeList($responseFields[3], friends.isPresent() ? friends.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Friend1) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Friend1) item).marshaller()); + } } }); } @@ -748,8 +754,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[2], primaryFunction.isPresent() ? primaryFunction.get() : null); writer.writeList($responseFields[3], friends.isPresent() ? friends.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Friend2) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Friend2) item).marshaller()); + } } }); } @@ -1089,8 +1097,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[2], name); writer.writeList($responseFields[3], friends.isPresent() ? friends.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Friend3) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Friend3) item).marshaller()); + } } }); } @@ -1273,8 +1283,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[2], homePlanet.isPresent() ? homePlanet.get() : null); writer.writeList($responseFields[3], friends.isPresent() ? friends.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Friend4) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Friend4) item).marshaller()); + } } }); } @@ -1511,8 +1523,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[2], primaryFunction.isPresent() ? primaryFunction.get() : null); writer.writeList($responseFields[3], friends.isPresent() ? friends.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Friend5) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Friend5) item).marshaller()); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/unique_type_name/HeroDetailQuery.java b/apollo-compiler/src/test/graphql/com/example/unique_type_name/HeroDetailQuery.java index 7618ae245b3..71bb9f71192 100644 --- a/apollo-compiler/src/test/graphql/com/example/unique_type_name/HeroDetailQuery.java +++ b/apollo-compiler/src/test/graphql/com/example/unique_type_name/HeroDetailQuery.java @@ -299,8 +299,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[1], name); writer.writeList($responseFields[2], friends.isPresent() ? friends.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Friend1) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Friend1) item).marshaller()); + } } }); writer.writeDouble($responseFields[3], height.isPresent() ? height.get() : null); @@ -441,14 +443,18 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[1], name); writer.writeList($responseFields[2], appearsIn, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeString(((com.example.unique_type_name.type.Episode) value).rawValue()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeString(((Episode) item).rawValue()); + } } }); writer.writeList($responseFields[3], friends.isPresent() ? friends.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Friend2) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Friend2) item).marshaller()); + } } }); } @@ -754,8 +760,10 @@ public void marshal(ResponseWriter writer) { writer.writeString($responseFields[1], name); writer.writeList($responseFields[2], friends.isPresent() ? friends.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Friend3) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Friend3) item).marshaller()); + } } }); } diff --git a/apollo-compiler/src/test/graphql/com/example/unique_type_name/fragment/HeroDetails.java b/apollo-compiler/src/test/graphql/com/example/unique_type_name/fragment/HeroDetails.java index f8d45970622..f3b331902ee 100644 --- a/apollo-compiler/src/test/graphql/com/example/unique_type_name/fragment/HeroDetails.java +++ b/apollo-compiler/src/test/graphql/com/example/unique_type_name/fragment/HeroDetails.java @@ -204,8 +204,10 @@ public void marshal(ResponseWriter writer) { writer.writeInt($responseFields[1], totalCount.isPresent() ? totalCount.get() : null); writer.writeList($responseFields[2], edges.isPresent() ? edges.get() : null, new ResponseWriter.ListWriter() { @Override - public void write(Object value, ResponseWriter.ListItemWriter listItemWriter) { - listItemWriter.writeObject(((Edge) value).marshaller()); + public void write(List items, ResponseWriter.ListItemWriter listItemWriter) { + for (Object item : items) { + listItemWriter.writeObject(((Edge) item).marshaller()); + } } }); } diff --git a/apollo-runtime/src/main/java/com/apollographql/apollo/internal/response/RealResponseWriter.java b/apollo-runtime/src/main/java/com/apollographql/apollo/internal/response/RealResponseWriter.java index f2646e07e47..13840cbabe5 100644 --- a/apollo-runtime/src/main/java/com/apollographql/apollo/internal/response/RealResponseWriter.java +++ b/apollo-runtime/src/main/java/com/apollographql/apollo/internal/response/RealResponseWriter.java @@ -77,29 +77,15 @@ public void writeList(@NotNull ResponseField field, @Nullable List values, @NotN return; } - List items = writeListItemValues(values, listWriter); - buffer.put(field.responseName(), new FieldDescriptor(field, items)); + List accumulated = new ArrayList(); + listWriter.write(values, new ListItemWriter(operationVariables, scalarTypeAdapters, accumulated)); + buffer.put(field.responseName(), new FieldDescriptor(field, accumulated)); } public void resolveFields(ResolveDelegate> delegate) { resolveFields(operationVariables, delegate, buffer); } - @SuppressWarnings("unchecked") private List writeListItemValues(List values, ListWriter listWriter) { - ListItemWriter listItemWriter = new ListItemWriter(operationVariables, scalarTypeAdapters); - List items = new ArrayList(); - for (Object value : values) { - if (value instanceof List) { - List nestedItems = writeListItemValues((List) value, listWriter); - items.add(nestedItems); - } else { - listWriter.write(value, listItemWriter); - items.add(listItemWriter.value); - } - } - return items; - } - private void writeScalarFieldValue(ResponseField field, Object value) { checkFieldValue(field, value); buffer.put(field.responseName(), new FieldDescriptor(field, value)); @@ -220,42 +206,53 @@ private static void checkFieldValue(ResponseField field, Object value) { @SuppressWarnings("unchecked") private static final class ListItemWriter implements ResponseWriter.ListItemWriter { final Operation.Variables operationVariables; final com.apollographql.apollo.response.ScalarTypeAdapters scalarTypeAdapters; - Object value; + final List accumulator; - ListItemWriter(Operation.Variables operationVariables, ScalarTypeAdapters scalarTypeAdapters) { + ListItemWriter(Operation.Variables operationVariables, ScalarTypeAdapters scalarTypeAdapters, List accumulator) { this.operationVariables = operationVariables; this.scalarTypeAdapters = scalarTypeAdapters; + this.accumulator = accumulator; } - @Override public void writeString(@Nullable Object value) { - this.value = value; + @Override public void writeString(@Nullable String value) { + accumulator.add(value); } - @Override public void writeInt(@Nullable Object value) { - this.value = value != null ? BigDecimal.valueOf((Integer) value) : null; + @Override public void writeInt(@Nullable Integer value) { + accumulator.add(value != null ? BigDecimal.valueOf(value) : null); } - @Override public void writeLong(@Nullable Object value) { - this.value = value != null ? BigDecimal.valueOf((Long) value) : null; + @Override public void writeLong(@Nullable Long value) { + accumulator.add(value != null ? BigDecimal.valueOf(value) : null); } - @Override public void writeDouble(@Nullable Object value) { - this.value = value != null ? BigDecimal.valueOf((Double) value) : null; + @Override public void writeDouble(@Nullable Double value) { + accumulator.add(value != null ? BigDecimal.valueOf(value) : null); } - @Override public void writeBoolean(@Nullable Object value) { - this.value = value; + @Override public void writeBoolean(@Nullable Boolean value) { + accumulator.add(value); } @Override public void writeCustom(@NotNull ScalarType scalarType, @Nullable Object value) { CustomTypeAdapter typeAdapter = scalarTypeAdapters.adapterFor(scalarType); - this.value = value != null ? typeAdapter.encode(value).value : null; + accumulator.add(value != null ? typeAdapter.encode(value).value : null); } @Override public void writeObject(ResponseFieldMarshaller marshaller) { RealResponseWriter nestedResponseWriter = new RealResponseWriter(operationVariables, scalarTypeAdapters); marshaller.marshal(nestedResponseWriter); - value = nestedResponseWriter.buffer; + accumulator.add(nestedResponseWriter.buffer); + } + + @Override public void writeList(@Nullable List items, @NotNull ResponseWriter.ListWriter listWriter) { + if (items == null) { + accumulator.add(null); + } else { + List nestedAccumulated = new ArrayList(); + listWriter.write(items, new ListItemWriter(operationVariables, scalarTypeAdapters, nestedAccumulated)); + accumulator.add(nestedAccumulated); + } } }