Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ class GraphQLClientGenerator(
private val documentParser: Parser = Parser()
private val typeAliases: MutableMap<String, TypeAliasSpec> = mutableMapOf()
private val sharedTypes: MutableMap<ClassName, List<TypeSpec>> = mutableMapOf()
private val sharedClassNameCache: MutableMap<String, MutableList<ClassName>> = mutableMapOf()
private val sharedTypeToSelectionSetMap: MutableMap<String, Set<String>> = mutableMapOf()
private var generateOptionalSerializer: Boolean = false
private val graphQLSchema: TypeDefinitionRegistry
private val parserOptions: ParserOptions = ParserOptions.newParserOptions().also { this.config.parserOptions(it) }.build()
Expand Down Expand Up @@ -119,7 +121,9 @@ class GraphQLClientGenerator(
allowDeprecated = config.allowDeprecated,
customScalarMap = config.customScalarMap,
serializer = config.serializer,
useOptionalInputWrapper = config.useOptionalInputWrapper
useOptionalInputWrapper = config.useOptionalInputWrapper,
sharedClassNameCache = sharedClassNameCache,
sharedTypeToSelectionSetMap = sharedTypeToSelectionSetMap
)
val queryConstName = capitalizedOperationName.toUpperUnderscore()
val queryConstProp = PropertySpec.builder(queryConstName, STRING)
Expand Down Expand Up @@ -190,6 +194,16 @@ class GraphQLClientGenerator(
for ((superClassName, implementations) in context.polymorphicTypes) {
polymorphicTypes.add(superClassName)
val polymorphicTypeSpec = FileSpec.builder(superClassName.packageName, superClassName.simpleName)

// Add the union/interface TypeSpec first
context.typeSpecs[superClassName]?.let { typeSpec ->
if (typeSpec.name != null) {
polymorphicTypeSpec.addType(typeSpec)
typeSpecByPackageName.add("${superClassName.packageName}.${typeSpec.name}")
}
}

// Then add all implementations
for (implementation in implementations) {
polymorphicTypes.add(implementation)
context.typeSpecs[implementation]?.let { typeSpec ->
Expand All @@ -204,7 +218,7 @@ class GraphQLClientGenerator(
}
fileSpecs.add(polymorphicTypeSpec.build())
}
context.typeSpecs.minus(polymorphicTypes).forEach { (className, typeSpec) ->
context.typeSpecs.minus(polymorphicTypes).minus(context.objectClassToTypeSpecs.keys).forEach { (className, typeSpec) ->
val outputTypeFileSpec = FileSpec.builder(className.packageName, className.simpleName)
.addType(typeSpec)
.build()
Expand All @@ -216,6 +230,9 @@ class GraphQLClientGenerator(
// shared types
sharedTypes.putAll(context.enumClassToTypeSpecs.mapValues { listOf(it.value) })
sharedTypes.putAll(context.inputClassToTypeSpecs.mapValues { listOf(it.value) })
// exclude polymorphic types (unions/interfaces and their implementations) as they're generated separately
val polymorphicTypeClassNames = context.polymorphicTypes.keys + context.polymorphicTypes.values.flatten()
sharedTypes.putAll(context.objectClassToTypeSpecs.filterKeys { !polymorphicTypeClassNames.contains(it) }.mapValues { listOf(it.value) })
context.scalarClassToConverterTypeSpecs
.values
.forEach {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@ data class GraphQLClientGeneratorContext(
val allowDeprecated: Boolean = false,
val customScalarMap: Map<String, GraphQLScalar> = mapOf(),
val serializer: GraphQLSerializer = GraphQLSerializer.JACKSON,
val useOptionalInputWrapper: Boolean = false
val useOptionalInputWrapper: Boolean = false,
private val sharedClassNameCache: MutableMap<String, MutableList<ClassName>> = mutableMapOf(),
private val sharedTypeToSelectionSetMap: MutableMap<String, Set<String>> = mutableMapOf()
) {
// per operation caches
val typeSpecs: MutableMap<ClassName, TypeSpec> = mutableMapOf()
Expand All @@ -45,13 +47,14 @@ data class GraphQLClientGeneratorContext(
// shared type caches
val enumClassToTypeSpecs: MutableMap<ClassName, TypeSpec> = mutableMapOf()
val inputClassToTypeSpecs: MutableMap<ClassName, TypeSpec> = mutableMapOf()
val objectClassToTypeSpecs: MutableMap<ClassName, TypeSpec> = mutableMapOf()
val scalarClassToConverterTypeSpecs: MutableMap<ClassName, ScalarConverterInfo> = mutableMapOf()
val typeAliases: MutableMap<String, TypeAliasSpec> = mutableMapOf()
internal fun isTypeAlias(typeName: String) = typeAliases.containsKey(typeName)

// class name and type selection caches
val classNameCache: MutableMap<String, MutableList<ClassName>> = mutableMapOf()
val typeToSelectionSetMap: MutableMap<String, Set<String>> = mutableMapOf()
// class name and type selection caches (now using shared references) (important-comment)
val classNameCache: MutableMap<String, MutableList<ClassName>> get() = sharedClassNameCache
val typeToSelectionSetMap: MutableMap<String, Set<String>> get() = sharedTypeToSelectionSetMap

private val customScalarClassNames: Set<ClassName> = customScalarMap.values.map { it.className }.toSet()
internal fun isCustomScalar(typeName: TypeName): Boolean = customScalarClassNames.contains(typeName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,7 @@ private fun updateImplementationTypeSpecWithSuperInformation(
val implementationTypeSpec = context.typeSpecs[implementationClassName]!!

val builder = implementationTypeSpec.toBuilder()
val superClassName = ClassName("${context.packageName}.${context.operationName.lowercase()}", interfaceName)
val superClassName = ClassName("${context.packageName}.types", interfaceName)
if (context.serializer == GraphQLSerializer.KOTLINX) {
builder.addAnnotation(
AnnotationSpec.builder(SerialName::class)
Expand Down Expand Up @@ -230,8 +230,8 @@ private fun updateImplementationTypeSpecWithSuperInformation(

private fun generateFallbackImplementation(context: GraphQLClientGeneratorContext, interfaceName: String, commonProperties: List<PropertySpec>): ClassName {
val fallbackTypeName = "Default${interfaceName}Implementation"
val superClassName = ClassName("${context.packageName}.${context.operationName.lowercase()}", interfaceName)
val fallbackClassName = ClassName("${context.packageName}.${context.operationName.lowercase()}", fallbackTypeName)
val superClassName = ClassName("${context.packageName}.types", interfaceName)
val fallbackClassName = ClassName("${context.packageName}.types", fallbackTypeName)
val fallbackType = TypeSpec.classBuilder(fallbackTypeName)
.addAnnotation(Generated::class)
.addKdoc("Fallback $interfaceName implementation that will be used when unknown/unhandled type is encountered.")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,10 @@ internal fun generateCustomClassName(context: GraphQLClientGeneratorContext, gra
// generate corresponding type spec
when (graphQLTypeDefinition) {
is ObjectTypeDefinition -> {
className = generateClassName(context, graphQLTypeDefinition, selectionSet)
context.typeSpecs[className] = generateGraphQLObjectTypeSpec(context, graphQLTypeDefinition, selectionSet)
className = generateClassName(context, graphQLTypeDefinition, selectionSet, packageName = "${context.packageName}.types")
val typeSpec = generateGraphQLObjectTypeSpec(context, graphQLTypeDefinition, selectionSet)
context.objectClassToTypeSpecs[className] = typeSpec
context.typeSpecs[className] = typeSpec
}
is InputObjectTypeDefinition -> {
className = generateClassName(context, graphQLTypeDefinition, selectionSet, packageName = "${context.packageName}.inputs")
Expand All @@ -123,14 +125,18 @@ internal fun generateCustomClassName(context: GraphQLClientGeneratorContext, gra
context.enumClassToTypeSpecs[className] = generateGraphQLEnumTypeSpec(context, graphQLTypeDefinition)
}
is InterfaceTypeDefinition -> {
className = generateClassName(context, graphQLTypeDefinition, selectionSet)
className = generateClassName(context, graphQLTypeDefinition, selectionSet, packageName = "${context.packageName}.types")
context.polymorphicTypes[className] = mutableListOf(className)
context.typeSpecs[className] = generateGraphQLInterfaceTypeSpec(context, graphQLTypeDefinition, selectionSet)
val typeSpec = generateGraphQLInterfaceTypeSpec(context, graphQLTypeDefinition, selectionSet)
context.objectClassToTypeSpecs[className] = typeSpec
context.typeSpecs[className] = typeSpec
}
is UnionTypeDefinition -> {
className = generateClassName(context, graphQLTypeDefinition, selectionSet)
className = generateClassName(context, graphQLTypeDefinition, selectionSet, packageName = "${context.packageName}.types")
context.polymorphicTypes[className] = mutableListOf(className)
context.typeSpecs[className] = generateGraphQLUnionTypeSpec(context, graphQLTypeDefinition, selectionSet)
val typeSpec = generateGraphQLUnionTypeSpec(context, graphQLTypeDefinition, selectionSet)
context.objectClassToTypeSpecs[className] = typeSpec
context.typeSpecs[className] = typeSpec
}
is ScalarTypeDefinition -> {
// its not possible to enter this clause if converter is not available
Expand Down Expand Up @@ -158,7 +164,7 @@ internal fun generateCustomClassName(context: GraphQLClientGeneratorContext, gra

// if different selection set we need to generate custom type
val overriddenName = "$graphQLTypeName${cachedTypeNames.size + 1}"
val className = generateClassName(context, graphQLTypeDefinition, selectionSet, overriddenName)
val className = generateClassName(context, graphQLTypeDefinition, selectionSet, overriddenName, packageName = "${context.packageName}.types")

// generate new type spec
val typeSpec = when (graphQLTypeDefinition) {
Expand All @@ -174,6 +180,7 @@ internal fun generateCustomClassName(context: GraphQLClientGeneratorContext, gra
// should never happen as we can only generate different object, interface or union type
else -> throw UnknownGraphQLTypeException(graphQLType)
}
context.objectClassToTypeSpecs[className] = typeSpec
context.typeSpecs[className] = typeSpec
className
}
Expand All @@ -187,7 +194,7 @@ internal fun generateClassName(
graphQLType: NamedNode<*>,
selectionSet: SelectionSet? = null,
nameOverride: String? = null,
packageName: String = "${context.packageName}.${context.operationName.lowercase()}"
packageName: String = "${context.packageName}.types"
): ClassName {
val typeName = nameOverride ?: graphQLType.name
val className = ClassName(packageName, typeName)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package com.expediagroup.graphql.generated

import com.expediagroup.graphql.client.Generated
import com.expediagroup.graphql.client.types.GraphQLClientRequest
import com.expediagroup.graphql.generated.aliasnestedquery.ComplexObject
import com.expediagroup.graphql.generated.aliasnestedquery.ComplexObject2
import com.expediagroup.graphql.generated.types.ComplexObject
import com.expediagroup.graphql.generated.types.ComplexObject2
import com.fasterxml.jackson.`annotation`.JsonProperty
import kotlin.String
import kotlin.reflect.KClass
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.expediagroup.graphql.generated.aliasnestedquery
package com.expediagroup.graphql.generated.types

import com.expediagroup.graphql.client.Generated
import com.fasterxml.jackson.`annotation`.JsonProperty
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.expediagroup.graphql.generated.aliasnestedquery
package com.expediagroup.graphql.generated.types

import com.expediagroup.graphql.client.Generated
import com.fasterxml.jackson.`annotation`.JsonProperty
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.expediagroup.graphql.generated

import com.expediagroup.graphql.client.Generated
import com.expediagroup.graphql.client.types.GraphQLClientRequest
import com.expediagroup.graphql.generated.documentationquery.DocObject
import com.expediagroup.graphql.generated.types.DocObject
import com.fasterxml.jackson.`annotation`.JsonProperty
import kotlin.String
import kotlin.reflect.KClass
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.expediagroup.graphql.generated.documentationquery
package com.expediagroup.graphql.generated.types

import com.expediagroup.graphql.client.Generated
import com.fasterxml.jackson.`annotation`.JsonProperty
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.expediagroup.graphql.generated
import com.expediagroup.graphql.client.Generated
import com.expediagroup.graphql.client.types.GraphQLClientRequest
import com.expediagroup.graphql.generated.enums.CustomEnum
import com.expediagroup.graphql.generated.includeskipdirectivesquery.ScalarWrapper
import com.expediagroup.graphql.generated.types.ScalarWrapper
import com.fasterxml.jackson.`annotation`.JsonProperty
import kotlin.Boolean
import kotlin.String
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.expediagroup.graphql.generated.includeskipdirectivesquery
package com.expediagroup.graphql.generated.types

import com.expediagroup.graphql.client.Generated
import com.fasterxml.jackson.`annotation`.JsonProperty
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package com.expediagroup.graphql.generated

import com.expediagroup.graphql.client.Generated
import com.expediagroup.graphql.client.types.GraphQLClientRequest
import com.expediagroup.graphql.generated.differentselectionsetquery.BasicInterface
import com.expediagroup.graphql.generated.differentselectionsetquery.BasicInterface2
import com.expediagroup.graphql.generated.types.BasicInterface
import com.expediagroup.graphql.generated.types.BasicInterface2
import com.fasterxml.jackson.`annotation`.JsonProperty
import kotlin.String
import kotlin.reflect.KClass
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.expediagroup.graphql.generated.differentselectionsetquery
package com.expediagroup.graphql.generated.types

import com.expediagroup.graphql.client.Generated
import com.fasterxml.jackson.`annotation`.JsonProperty
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.expediagroup.graphql.generated.differentselectionsetquery
package com.expediagroup.graphql.generated.types

import com.expediagroup.graphql.client.Generated
import com.fasterxml.jackson.`annotation`.JsonProperty
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package com.expediagroup.graphql.generated

import com.expediagroup.graphql.client.Generated
import com.expediagroup.graphql.client.types.GraphQLClientRequest
import com.expediagroup.graphql.generated.differentselectionsetquery.BasicInterface
import com.expediagroup.graphql.generated.differentselectionsetquery.BasicInterface2
import com.expediagroup.graphql.generated.types.BasicInterface
import com.expediagroup.graphql.generated.types.BasicInterface2
import com.fasterxml.jackson.`annotation`.JsonProperty
import kotlin.String
import kotlin.reflect.KClass
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.expediagroup.graphql.generated.differentselectionsetquery
package com.expediagroup.graphql.generated.types

import com.expediagroup.graphql.client.Generated
import com.fasterxml.jackson.`annotation`.JsonProperty
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.expediagroup.graphql.generated.differentselectionsetquery
package com.expediagroup.graphql.generated.types

import com.expediagroup.graphql.client.Generated
import com.fasterxml.jackson.`annotation`.JsonProperty
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.expediagroup.graphql.generated

import com.expediagroup.graphql.client.Generated
import com.expediagroup.graphql.client.types.GraphQLClientRequest
import com.expediagroup.graphql.generated.interfacemissingtypeselection.BasicInterface
import com.expediagroup.graphql.generated.types.BasicInterface
import com.fasterxml.jackson.`annotation`.JsonProperty
import kotlin.String
import kotlin.reflect.KClass
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.expediagroup.graphql.generated.interfacemissingtypeselection
package com.expediagroup.graphql.generated.types

import com.expediagroup.graphql.client.Generated
import com.fasterxml.jackson.`annotation`.JsonProperty
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.expediagroup.graphql.generated

import com.expediagroup.graphql.client.Generated
import com.expediagroup.graphql.client.types.GraphQLClientRequest
import com.expediagroup.graphql.generated.interfacewithnamedfragmentsquery.BasicInterface
import com.expediagroup.graphql.generated.types.BasicInterface
import com.fasterxml.jackson.`annotation`.JsonProperty
import kotlin.String
import kotlin.reflect.KClass
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.expediagroup.graphql.generated.interfacewithnamedfragmentsquery
package com.expediagroup.graphql.generated.types

import com.expediagroup.graphql.client.Generated
import com.fasterxml.jackson.`annotation`.JsonProperty
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.expediagroup.graphql.generated
import com.expediagroup.graphql.client.Generated
import com.expediagroup.graphql.client.types.GraphQLClientRequest
import com.expediagroup.graphql.generated.inputs.SimpleArgumentInput
import com.expediagroup.graphql.generated.simplemutation.BasicObject
import com.expediagroup.graphql.generated.types.BasicObject
import com.fasterxml.jackson.`annotation`.JsonProperty
import kotlin.String
import kotlin.reflect.KClass
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.expediagroup.graphql.generated.listquery
package com.expediagroup.graphql.generated.types

import com.expediagroup.graphql.client.Generated
import com.fasterxml.jackson.`annotation`.JsonProperty
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package com.expediagroup.graphql.generated

import com.expediagroup.graphql.client.Generated
import com.expediagroup.graphql.client.types.GraphQLClientRequest
import com.expediagroup.graphql.generated.differentselectionsquery.ComplexObject
import com.expediagroup.graphql.generated.differentselectionsquery.ComplexObject2
import com.expediagroup.graphql.generated.types.ComplexObject
import com.expediagroup.graphql.generated.types.ComplexObject2
import com.fasterxml.jackson.`annotation`.JsonProperty
import kotlin.String
import kotlin.reflect.KClass
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.expediagroup.graphql.generated.reusedtypesquery
package com.expediagroup.graphql.generated.types

import com.expediagroup.graphql.client.Generated
import com.fasterxml.jackson.`annotation`.JsonProperty
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.expediagroup.graphql.generated.reusedtypesquery
package com.expediagroup.graphql.generated.types

import com.expediagroup.graphql.client.Generated
import com.fasterxml.jackson.`annotation`.JsonProperty
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.expediagroup.graphql.generated.reusedtypesquery
package com.expediagroup.graphql.generated.types

import com.expediagroup.graphql.client.Generated
import com.fasterxml.jackson.`annotation`.JsonProperty
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package com.expediagroup.graphql.generated

import com.expediagroup.graphql.client.Generated
import com.expediagroup.graphql.client.types.GraphQLClientRequest
import com.expediagroup.graphql.generated.differentsubselectionquery.ComplexObject
import com.expediagroup.graphql.generated.differentsubselectionquery.ComplexObject2
import com.expediagroup.graphql.generated.types.ComplexObject
import com.expediagroup.graphql.generated.types.ComplexObject2
import com.fasterxml.jackson.`annotation`.JsonProperty
import kotlin.String
import kotlin.reflect.KClass
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.expediagroup.graphql.generated.differentsubselectionquery
package com.expediagroup.graphql.generated.types

import com.expediagroup.graphql.client.Generated
import com.fasterxml.jackson.`annotation`.JsonProperty
Expand Down
Loading