fun generate()

in graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/generators/kotlin/KotlinConstantsGenerator.kt [39:168]


    fun generate(): CodeGenResult {
        val baseConstantsType =
            TypeSpec
                .objectBuilder("DgsConstants")
                .addOptionalGeneratedAnnotation(config)

        document.definitions
            .filterIsInstance<ObjectTypeDefinition>()
            .excludeSchemaTypeExtension()
            .forEach {
                val constantsType = createConstantTypeBuilder(config, it.name)

                val extensions = findTypeExtensions(it.name, document.definitions)
                val fields =
                    (it.fieldDefinitions + extensions.flatMap { ext -> ext.fieldDefinitions })
                        .distinctBy { def -> def.name }

                constantsType.addProperty(
                    PropertySpec
                        .builder("TYPE_NAME", String::class)
                        .addModifiers(KModifier.CONST)
                        .initializer(""""${it.name}"""")
                        .build(),
                )

                fields.filter(ReservedKeywordFilter.filterInvalidNames).forEach { field ->
                    addFieldName(constantsType, field.name)
                    addQueryInputArgument(constantsType, field)
                }

                baseConstantsType.addType(constantsType.build())
            }

        document.definitions
            .filterIsInstance<InputObjectTypeDefinition>()
            .excludeSchemaTypeExtension()
            .forEach {
                val constantsType = createConstantTypeBuilder(config, it.name)

                val extensions = findInputExtensions(it.name, document.definitions)
                val fields = it.inputValueDefinitions + extensions.flatMap { ext -> ext.inputValueDefinitions }
                constantsType.addProperty(
                    PropertySpec
                        .builder("TYPE_NAME", String::class)
                        .addModifiers(KModifier.CONST)
                        .initializer(""""${it.name}"""")
                        .build(),
                )
                fields.filter(ReservedKeywordFilter.filterInvalidNames).forEach { field ->
                    addFieldName(constantsType, field.name)
                }

                baseConstantsType.addType(constantsType.build())
            }

        document.definitions
            .filterIsInstance<InterfaceTypeDefinition>()
            .excludeSchemaTypeExtension()
            .forEach {
                val constantsType = createConstantTypeBuilder(config, it.name)

                constantsType.addProperty(
                    PropertySpec
                        .builder("TYPE_NAME", String::class)
                        .addModifiers(KModifier.CONST)
                        .initializer(""""${it.name}"""")
                        .build(),
                )

                val extensions = SchemaExtensionsUtils.findInterfaceExtensions(it.name, document.definitions)
                val fields = it.fieldDefinitions + extensions.flatMap { ext -> ext.fieldDefinitions }

                fields.filter(ReservedKeywordFilter.filterInvalidNames).forEach { field ->
                    addFieldName(constantsType, field.name)
                }

                baseConstantsType.addType(constantsType.build())
            }

        document.definitions
            .filterIsInstance<UnionTypeDefinition>()
            .excludeSchemaTypeExtension()
            .forEach {
                val constantsType = createConstantTypeBuilder(config, it.name)

                constantsType.addProperty(
                    PropertySpec
                        .builder("TYPE_NAME", String::class)
                        .addModifiers(KModifier.CONST)
                        .initializer(""""${it.name}"""")
                        .build(),
                )
                baseConstantsType.addType(constantsType.build())
            }

        if (document.definitions.any { it is ObjectTypeDefinition && it.name == "Query" }) {
            baseConstantsType.addProperty(
                PropertySpec
                    .builder("QUERY_TYPE", String::class)
                    .addModifiers(KModifier.CONST)
                    .initializer(""""Query"""")
                    .build(),
            )
        }

        if (document.definitions.any { it is ObjectTypeDefinition && it.name == "Mutation" }) {
            baseConstantsType.addProperty(
                PropertySpec
                    .builder("Mutation_TYPE", String::class)
                    .addModifiers(KModifier.CONST)
                    .initializer(""""Mutation"""")
                    .build(),
            )
        }

        if (document.definitions.any { it is ObjectTypeDefinition && it.name == "Subscription" }) {
            baseConstantsType.addProperty(
                PropertySpec
                    .builder(
                        "Subscription_TYPE",
                        String::class,
                    ).addModifiers(KModifier.CONST)
                    .initializer(""""Subscription"""")
                    .build(),
            )
        }

        val fileSpec = FileSpec.builder(config.packageName, "DgsConstants").addType(baseConstantsType.build()).build()
        return CodeGenResult(kotlinConstants = listOf(fileSpec))
    }