From 00a9fc8f94da4a621b0a2a50e05f79dbe6cdf0eb Mon Sep 17 00:00:00 2001 From: BoD Date: Wed, 3 Apr 2024 12:38:44 +0200 Subject: [PATCH] Have field definitions and their arguments generated inside type classes --- .../apollo-compiler/api/apollo-compiler.api | 15 ----- .../apollo3/compiler/codegen/ClassNames.kt | 3 +- .../compiler/codegen/java/JavaClassNames.kt | 1 + .../operations/CompiledSelectionsBuilder.kt | 27 ++------- .../codegen/java/schema/InterfaceBuilder.kt | 1 + .../codegen/java/schema/ObjectBuilder.kt | 55 +++++++++++++++++ .../compiler/codegen/kotlin/KotlinSymbols.kt | 1 + .../operations/CompiledSelectionsBuilder.kt | 27 ++------- .../codegen/kotlin/schema/InterfaceBuilder.kt | 1 + .../codegen/kotlin/schema/ObjectBuilder.kt | 59 +++++++++++++++++++ .../apollo3/compiler/ir/IrOperations.kt | 12 +--- .../apollo3/compiler/ir/IrSchema.kt | 43 +++++++++++++- .../compiler/ir/SelectionSetsBuilder.kt | 15 +---- 13 files changed, 179 insertions(+), 81 deletions(-) diff --git a/libraries/apollo-compiler/api/apollo-compiler.api b/libraries/apollo-compiler/api/apollo-compiler.api index caf46322ee2..af6e438f4fb 100644 --- a/libraries/apollo-compiler/api/apollo-compiler.api +++ b/libraries/apollo-compiler/api/apollo-compiler.api @@ -640,21 +640,6 @@ public final class com/apollographql/apollo3/compiler/ir/IrArgument$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } -public final class com/apollographql/apollo3/compiler/ir/IrArgumentDefinition$$serializer : kotlinx/serialization/internal/GeneratedSerializer { - public static final field INSTANCE Lcom/apollographql/apollo3/compiler/ir/IrArgumentDefinition$$serializer; - public fun childSerializers ()[Lkotlinx/serialization/KSerializer; - public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lcom/apollographql/apollo3/compiler/ir/IrArgumentDefinition; - public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; - public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; - public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lcom/apollographql/apollo3/compiler/ir/IrArgumentDefinition;)V - public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V - public fun typeParametersSerializers ()[Lkotlinx/serialization/KSerializer; -} - -public final class com/apollographql/apollo3/compiler/ir/IrArgumentDefinition$Companion { - public final fun serializer ()Lkotlinx/serialization/KSerializer; -} - public final class com/apollographql/apollo3/compiler/ir/IrBooleanValue$$serializer : kotlinx/serialization/internal/GeneratedSerializer { public static final field INSTANCE Lcom/apollographql/apollo3/compiler/ir/IrBooleanValue$$serializer; public fun childSerializers ()[Lkotlinx/serialization/KSerializer; diff --git a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/ClassNames.kt b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/ClassNames.kt index 1d3eda7cab2..f61d43a95ba 100644 --- a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/ClassNames.kt +++ b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/ClassNames.kt @@ -43,7 +43,8 @@ internal object ClassNames { val True = ResolverClassName(apolloApiPackageName, "BooleanExpression", "True") val False = ResolverClassName(apolloApiPackageName, "BooleanExpression", "False") val CompiledArgument = ResolverClassName(apolloApiPackageName, "CompiledArgument", "Builder") - val CompiledArgumentDefinition = ResolverClassName(apolloApiPackageName, "CompiledArgumentDefinition", "Builder") + val CompiledArgumentDefinition = ResolverClassName(apolloApiPackageName, "CompiledArgumentDefinition") + val CompiledArgumentDefinitionBuilder = ResolverClassName(apolloApiPackageName, "CompiledArgumentDefinition", "Builder") val CompiledVariable = ResolverClassName(apolloApiPackageName, "CompiledVariable") val JsonNumber = ResolverClassName(apolloApiJsonPackageName, "JsonNumber") val CompiledCondition = ResolverClassName(apolloApiPackageName, "CompiledCondition") diff --git a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/java/JavaClassNames.kt b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/java/JavaClassNames.kt index a558a9b4c75..4d434de3583 100644 --- a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/java/JavaClassNames.kt +++ b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/java/JavaClassNames.kt @@ -41,6 +41,7 @@ internal object JavaClassNames { val True = ClassNames.True.toJavaPoetClassName() val False = ClassNames.False.toJavaPoetClassName() val CompiledArgumentDefinition = ClassNames.CompiledArgumentDefinition.toJavaPoetClassName() + val CompiledArgumentDefinitionBuilder = ClassNames.CompiledArgumentDefinitionBuilder.toJavaPoetClassName() val CompiledArgument = ClassNames.CompiledArgument.toJavaPoetClassName() val CompiledVariable = ClassNames.CompiledVariable.toJavaPoetClassName() val JsonNumber = ClassNames.JsonNumber.toJavaPoetClassName() diff --git a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/java/operations/CompiledSelectionsBuilder.kt b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/java/operations/CompiledSelectionsBuilder.kt index 3d700a0a82d..f77b1b46be3 100644 --- a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/java/operations/CompiledSelectionsBuilder.kt +++ b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/java/operations/CompiledSelectionsBuilder.kt @@ -8,10 +8,10 @@ import com.apollographql.apollo3.compiler.codegen.java.S import com.apollographql.apollo3.compiler.codegen.java.T import com.apollographql.apollo3.compiler.codegen.java.helpers.codeBlock import com.apollographql.apollo3.compiler.codegen.java.helpers.toListInitializerCodeblock +import com.apollographql.apollo3.compiler.internal.escapeJavaReservedWord import com.apollographql.apollo3.compiler.ir.BVariable import com.apollographql.apollo3.compiler.ir.BooleanExpression import com.apollographql.apollo3.compiler.ir.IrArgument -import com.apollographql.apollo3.compiler.ir.IrArgumentDefinition import com.apollographql.apollo3.compiler.ir.IrField import com.apollographql.apollo3.compiler.ir.IrFragment import com.apollographql.apollo3.compiler.ir.IrSelection @@ -60,7 +60,7 @@ internal class CompiledSelectionsBuilder( builder.add(".condition($L)", condition.toCompiledConditionInitializer()) } if (arguments.isNotEmpty()) { - builder.add(".arguments($L)", arguments.sortedBy { it.definition.name }.map { it.codeBlock() }.toListInitializerCodeblock()) + builder.add(".arguments($L)", arguments.sortedBy { it.name }.map { it.codeBlock() }.toListInitializerCodeblock()) } if (selectionSetName != null) { builder.add(".selections($L)", "__$selectionSetName") @@ -118,29 +118,14 @@ internal class CompiledSelectionsBuilder( return CodeBlock.of("new $T($S, $L)", JavaClassNames.CompiledCondition, expression.value.name, inverted.toString()) } - private fun IrArgumentDefinition.codeBlock(): CodeBlock { - val builder = CodeBlock.builder() - builder.add( - "new $T($S)", - JavaClassNames.CompiledArgumentDefinition, - name, - ) - if (isKey) { - builder.add(".isKey(true)") - } - if (isPagination) { - builder.add(".isPagination(true)") - } - builder.add(".build()") - return builder.build() - } - private fun IrArgument.codeBlock(): CodeBlock { val argumentBuilder = CodeBlock.builder() argumentBuilder.add( - "new $T($L)", + "new $T($T.$L.${'$'}N)", JavaClassNames.CompiledArgument, - definition.codeBlock(), + context.resolver.resolveSchemaType(parentType), + context.layout.className(parentField), + name.escapeJavaReservedWord(), ) if (this.value != null) { argumentBuilder.add(".value($L)", value.codeBlock()) diff --git a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/java/schema/InterfaceBuilder.kt b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/java/schema/InterfaceBuilder.kt index 59bc794264e..f9b5a37f5fa 100644 --- a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/java/schema/InterfaceBuilder.kt +++ b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/java/schema/InterfaceBuilder.kt @@ -36,6 +36,7 @@ internal class InterfaceBuilder( .addModifiers(Modifier.PUBLIC) .maybeAddDescription(description) .maybeAddDeprecation(deprecationReason) + .addTypes(fieldDefinitions.typeSpecs(layout)) .addField(typeFieldSpec(context.resolver)) .build() } diff --git a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/java/schema/ObjectBuilder.kt b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/java/schema/ObjectBuilder.kt index 9b2c744b662..ddb463fd44e 100644 --- a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/java/schema/ObjectBuilder.kt +++ b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/java/schema/ObjectBuilder.kt @@ -1,13 +1,22 @@ package com.apollographql.apollo3.compiler.codegen.java.schema +import com.apollographql.apollo3.compiler.codegen.SchemaLayout import com.apollographql.apollo3.compiler.codegen.java.CodegenJavaFile import com.apollographql.apollo3.compiler.codegen.java.JavaClassBuilder +import com.apollographql.apollo3.compiler.codegen.java.JavaClassNames import com.apollographql.apollo3.compiler.codegen.java.JavaSchemaContext +import com.apollographql.apollo3.compiler.codegen.java.S +import com.apollographql.apollo3.compiler.codegen.java.T import com.apollographql.apollo3.compiler.codegen.java.helpers.maybeAddDeprecation import com.apollographql.apollo3.compiler.codegen.java.helpers.maybeAddDescription import com.apollographql.apollo3.compiler.codegen.typePackageName +import com.apollographql.apollo3.compiler.internal.escapeJavaReservedWord +import com.apollographql.apollo3.compiler.ir.IrArgumentDefinition +import com.apollographql.apollo3.compiler.ir.IrFieldDefinition import com.apollographql.apollo3.compiler.ir.IrObject import com.squareup.javapoet.ClassName +import com.squareup.javapoet.CodeBlock +import com.squareup.javapoet.FieldSpec import com.squareup.javapoet.TypeSpec import javax.lang.model.element.Modifier @@ -36,7 +45,53 @@ internal class ObjectBuilder( .addModifiers(Modifier.PUBLIC) .maybeAddDescription(description) .maybeAddDeprecation(deprecationReason) + .addTypes(fieldDefinitions.typeSpecs(layout)) .addField(typeFieldSpec(context.resolver)) .build() } } + +internal fun List.typeSpecs(layout: SchemaLayout) = mapNotNull { fieldDefinition -> + if (fieldDefinition.argumentDefinitions.isEmpty()) { + null + } else { + fieldDefinition.typeSpec(layout) + } +} + +private fun IrFieldDefinition.typeSpec(layout: SchemaLayout): TypeSpec { + return TypeSpec + .interfaceBuilder(layout.className(name)) + .addModifiers(Modifier.PUBLIC) + .addFields( + argumentDefinitions.map { argumentDefinition -> + FieldSpec.builder( + JavaClassNames.CompiledArgumentDefinition, + argumentDefinition.name.escapeJavaReservedWord(), + Modifier.PUBLIC, + Modifier.STATIC, + Modifier.FINAL, + ) + .initializer(argumentDefinition.codeBlock()) + .build() + } + ) + .build() +} + +private fun IrArgumentDefinition.codeBlock(): CodeBlock { + val builder = CodeBlock.builder() + builder.add( + "new $T($S)", + JavaClassNames.CompiledArgumentDefinitionBuilder, + name, + ) + if (isKey) { + builder.add(".isKey(true)") + } + if (isPagination) { + builder.add(".isPagination(true)") + } + builder.add(".build()") + return builder.build() +} diff --git a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/kotlin/KotlinSymbols.kt b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/kotlin/KotlinSymbols.kt index 7814fee501c..adb33870e98 100644 --- a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/kotlin/KotlinSymbols.kt +++ b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/kotlin/KotlinSymbols.kt @@ -52,6 +52,7 @@ internal object KotlinSymbols { val False = ClassNames.False.toKotlinPoetClassName() val CompiledArgument = ClassNames.CompiledArgument.toKotlinPoetClassName() val CompiledArgumentDefinition = ClassNames.CompiledArgumentDefinition.toKotlinPoetClassName() + val CompiledArgumentDefinitionBuilder = ClassNames.CompiledArgumentDefinitionBuilder.toKotlinPoetClassName() val CompiledVariable = ClassNames.CompiledVariable.toKotlinPoetClassName() val JsonNumber = ClassNames.JsonNumber.toKotlinPoetClassName() val CompiledCondition = ClassNames.CompiledCondition.toKotlinPoetClassName() diff --git a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/kotlin/operations/CompiledSelectionsBuilder.kt b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/kotlin/operations/CompiledSelectionsBuilder.kt index e008da61c97..cf47ade853c 100644 --- a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/kotlin/operations/CompiledSelectionsBuilder.kt +++ b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/kotlin/operations/CompiledSelectionsBuilder.kt @@ -9,7 +9,6 @@ import com.apollographql.apollo3.compiler.internal.applyIf import com.apollographql.apollo3.compiler.ir.BVariable import com.apollographql.apollo3.compiler.ir.BooleanExpression import com.apollographql.apollo3.compiler.ir.IrArgument -import com.apollographql.apollo3.compiler.ir.IrArgumentDefinition import com.apollographql.apollo3.compiler.ir.IrField import com.apollographql.apollo3.compiler.ir.IrFragment import com.apollographql.apollo3.compiler.ir.IrSelection @@ -64,7 +63,7 @@ internal class CompiledSelectionsBuilder( builder.add(".condition(%L)\n", condition.toCompiledConditionInitializer()) } if (arguments.isNotEmpty()) { - builder.add(".arguments(%L)\n", arguments.sortedBy { it.definition.name }.map { it.codeBlock() }.toListInitializerCodeblock(true)) + builder.add(".arguments(%L)\n", arguments.sortedBy { it.name }.map { it.codeBlock() }.toListInitializerCodeblock(true)) } if (selectionSetName != null) { builder.add(".selections(%N)\n", "__$selectionSetName") @@ -123,30 +122,14 @@ internal class CompiledSelectionsBuilder( return CodeBlock.of("%T(%S,ยท%L)", KotlinSymbols.CompiledCondition, expression.value.name, inverted.toString()) } - private fun IrArgumentDefinition.codeBlock(): CodeBlock { - val argumentBuilder = CodeBlock.builder() - argumentBuilder.add( - "%T(%S)", - KotlinSymbols.CompiledArgumentDefinition, - name, - ) - - if (isKey) { - argumentBuilder.add(".isKey(true)") - } - if (isPagination) { - argumentBuilder.add(".isPagination(true)") - } - argumentBuilder.add(".build()") - return argumentBuilder.build() - } - private fun IrArgument.codeBlock(): CodeBlock { val argumentBuilder = CodeBlock.builder() argumentBuilder.add( - "%T(%L)", + "%T(%T.%N.%N)", KotlinSymbols.CompiledArgument, - definition.codeBlock(), + context.resolver.resolveSchemaType(parentType), + context.layout.className(parentField), + name, ) if (this.value != null) { diff --git a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/kotlin/schema/InterfaceBuilder.kt b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/kotlin/schema/InterfaceBuilder.kt index bda5e201c9b..9b7013d4be6 100644 --- a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/kotlin/schema/InterfaceBuilder.kt +++ b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/kotlin/schema/InterfaceBuilder.kt @@ -85,6 +85,7 @@ internal class InterfaceBuilder( .classBuilder(simpleName) .maybeAddDescription(description) .maybeAddDeprecation(deprecationReason) + .addTypes(fieldDefinitions.typeSpecs(layout)) .addType(companionTypeSpec()) .build() } diff --git a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/kotlin/schema/ObjectBuilder.kt b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/kotlin/schema/ObjectBuilder.kt index 87f5733d3e7..1cfe4fbf128 100644 --- a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/kotlin/schema/ObjectBuilder.kt +++ b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/codegen/kotlin/schema/ObjectBuilder.kt @@ -1,9 +1,12 @@ package com.apollographql.apollo3.compiler.codegen.kotlin.schema import com.apollographql.apollo3.compiler.capitalizeFirstLetter +import com.apollographql.apollo3.compiler.codegen.SchemaLayout import com.apollographql.apollo3.compiler.codegen.kotlin.CgFile import com.apollographql.apollo3.compiler.codegen.kotlin.CgFileBuilder import com.apollographql.apollo3.compiler.codegen.kotlin.KotlinSchemaContext +import com.apollographql.apollo3.compiler.codegen.kotlin.KotlinSymbols +import com.apollographql.apollo3.compiler.codegen.kotlin.KotlinSymbols.CompiledArgumentDefinitionBuilder import com.apollographql.apollo3.compiler.codegen.kotlin.helpers.concreteBuilderTypeSpec import com.apollographql.apollo3.compiler.codegen.kotlin.helpers.concreteMapTypeSpec import com.apollographql.apollo3.compiler.codegen.kotlin.helpers.maybeAddDeprecation @@ -12,10 +15,14 @@ import com.apollographql.apollo3.compiler.codegen.kotlin.helpers.maybeImplementB import com.apollographql.apollo3.compiler.codegen.kotlin.helpers.topLevelBuildFunSpec import com.apollographql.apollo3.compiler.codegen.kotlin.schema.util.typePropertySpec import com.apollographql.apollo3.compiler.codegen.typePackageName +import com.apollographql.apollo3.compiler.ir.IrArgumentDefinition +import com.apollographql.apollo3.compiler.ir.IrFieldDefinition import com.apollographql.apollo3.compiler.ir.IrObject import com.squareup.kotlinpoet.ClassName +import com.squareup.kotlinpoet.CodeBlock import com.squareup.kotlinpoet.FunSpec import com.squareup.kotlinpoet.MemberName +import com.squareup.kotlinpoet.PropertySpec import com.squareup.kotlinpoet.TypeSpec internal class ObjectBuilder( @@ -75,6 +82,7 @@ internal class ObjectBuilder( .classBuilder(simpleName) .maybeAddDescription(description) .maybeAddDeprecation(deprecationReason) + .addTypes(fieldDefinitions.typeSpecs(layout)) .addType(companionTypeSpec()) .build() } @@ -86,3 +94,54 @@ internal class ObjectBuilder( .build() } } + +internal fun List.typeSpecs(layout: SchemaLayout): List { + return mapNotNull { fieldDefinition -> + if (fieldDefinition.argumentDefinitions.isEmpty()) { + null + } else { + fieldDefinition.typeSpec(layout) + } + } +} + +private fun IrFieldDefinition.typeSpec(layout: SchemaLayout): TypeSpec { + return TypeSpec + .interfaceBuilder(layout.className(name)) + .addType(argumentDefinitions.companionTypeSpec()) + .build() +} + +private fun List.companionTypeSpec(): TypeSpec { + return TypeSpec.companionObjectBuilder() + .addProperties( + map { argumentDefinition -> + PropertySpec.builder( + name = argumentDefinition.name, + type = KotlinSymbols.CompiledArgumentDefinition, + ) + .initializer(argumentDefinition.codeBlock()) + .addAnnotation(JvmField::class) + .build() + } + ) + .build() +} + +private fun IrArgumentDefinition.codeBlock(): CodeBlock { + val argumentBuilder = CodeBlock.builder() + argumentBuilder.add( + "%T(%S)", + CompiledArgumentDefinitionBuilder, + name, + ) + + if (isKey) { + argumentBuilder.add(".isKey(true)") + } + if (isPagination) { + argumentBuilder.add(".isPagination(true)") + } + argumentBuilder.add(".build()") + return argumentBuilder.build() +} diff --git a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/ir/IrOperations.kt b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/ir/IrOperations.kt index c0ac0980805..98bb3d6c8f2 100644 --- a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/ir/IrOperations.kt +++ b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/ir/IrOperations.kt @@ -91,18 +91,12 @@ data class IrField( val selectionSetName: String?, ) : IrSelection -@Serializable -@ApolloExperimental -data class IrArgumentDefinition( - val name: String, - val isKey: Boolean, - val isPagination: Boolean, -) - @Serializable @ApolloExperimental data class IrArgument( - val definition: IrArgumentDefinition, + val parentType: String, + val parentField: String, + val name: String, /** * The value for this argument. May be null if the argument is absent */ diff --git a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/ir/IrSchema.kt b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/ir/IrSchema.kt index 22f2b516a41..0177750fa47 100644 --- a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/ir/IrSchema.kt +++ b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/ir/IrSchema.kt @@ -21,6 +21,8 @@ import com.apollographql.apollo3.ast.findOptInFeature import com.apollographql.apollo3.ast.findTargetName import com.apollographql.apollo3.ast.internal.toConnectionFields import com.apollographql.apollo3.ast.internal.toEmbeddedFields +import com.apollographql.apollo3.compiler.codegen.keyArgs +import com.apollographql.apollo3.compiler.codegen.paginationArgs import kotlinx.serialization.Serializable @Serializable @@ -62,6 +64,7 @@ internal data class IrObject( val deprecationReason: String?, val embeddedFields: List, val mapProperties: List, + val fieldDefinitions: List, ) : IrSchemaType @@ -74,6 +77,7 @@ internal data class IrInterface( val deprecationReason: String?, val embeddedFields: List, val mapProperties: List, + val fieldDefinitions: List, ) : IrSchemaType @Serializable @@ -110,12 +114,26 @@ internal class IrEnumType2(val name: String) : IrType2 @Serializable internal class IrCompositeType2(val name: String) : IrType2 +@Serializable +internal data class IrArgumentDefinition( + val name: String, + val isKey: Boolean, + val isPagination: Boolean, +) + @Serializable internal data class IrMapProperty( val name: String, val type: IrType2, ) +@Serializable +internal data class IrFieldDefinition( + val name: String, + val type: IrType2, + val argumentDefinitions: List, +) + @Serializable internal data class IrEnum( override val name: String, @@ -220,7 +238,10 @@ internal fun GQLInterfaceTypeDefinition.toIr(schema: Schema, usedFields: Map IrNonNullType2(type.toIrType2(schema)) diff --git a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/ir/SelectionSetsBuilder.kt b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/ir/SelectionSetsBuilder.kt index 07b9d9a9b57..01517dbf3de 100644 --- a/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/ir/SelectionSetsBuilder.kt +++ b/libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo3/compiler/ir/SelectionSetsBuilder.kt @@ -14,8 +14,6 @@ import com.apollographql.apollo3.ast.coerceInExecutableContextOrThrow import com.apollographql.apollo3.ast.definitionFromScope import com.apollographql.apollo3.ast.rawType import com.apollographql.apollo3.compiler.capitalizeFirstLetter -import com.apollographql.apollo3.compiler.codegen.keyArgs -import com.apollographql.apollo3.compiler.codegen.paginationArgs internal class SelectionSetsBuilder( val schema: Schema, @@ -74,24 +72,17 @@ internal class SelectionSetsBuilder( /** * Pull all arguments from the schema as we need them to compute the cache key */ - val typeDefinition = schema.typeDefinition(parentType) val actualArguments = fieldDefinition.arguments.map { schemaArgument -> val operationArgument = arguments.firstOrNull { it.name == schemaArgument.name } - val keyArgs = typeDefinition.keyArgs(name, schema) - val paginationArgs = typeDefinition.paginationArgs(name, schema) - val argumentDefinition = IrArgumentDefinition( - name = schemaArgument.name, - isKey = keyArgs.contains(schemaArgument.name), - isPagination = paginationArgs.contains(schemaArgument.name) - ) - /** * When passed explicitly, the argument values are coerced (but not their default value) */ val userValue = operationArgument?.value?.coerceInExecutableContextOrThrow(schemaArgument.type, schema) IrArgument( - definition = argumentDefinition, + parentType = parentType, + parentField = fieldDefinition.name, + name = schemaArgument.name, value = (userValue ?: schemaArgument.defaultValue)?.toIrValue(), ) }