fun generate()

in graphql-dgs-codegen-core/src/main/kotlin/com/netflix/graphql/dgs/codegen/generators/java/ConstantsGenerator.kt [42:190]


    fun generate(): CodeGenResult {
        val javaType =
            TypeSpec
                .classBuilder("DgsConstants")
                .addOptionalGeneratedAnnotation(config)
                .addModifiers(Modifier.PUBLIC)

        val types = mutableMapOf<String, TypeSpec.Builder>()

        document.definitions
            .filterIsInstance<ObjectTypeDefinition>()
            .asSequence()
            .excludeSchemaTypeExtension()
            .forEach {
                val constantsType =
                    if (types.contains(it.name)) {
                        types[it.name]!!
                    } else {
                        createConstantTypeBuilder(config, it.name)
                    }

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

                if (!types.contains(it.name)) {
                    constantsType.addField(
                        FieldSpec
                            .builder(ClassName.get(String::class.java), "TYPE_NAME")
                            .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
                            .initializer("\$S", it.name)
                            .build(),
                    )
                }

                fields.forEach { field ->
                    addFieldNameConstant(constantsType, field.name)
                    addQueryInputArgument(constantsType, field)
                }

                types[it.name] = constantsType
            }

        types.values.forEach {
            javaType.addType(it.build())
        }

        document.definitions
            .filterIsInstance<InputObjectTypeDefinition>()
            .asSequence()
            .excludeSchemaTypeExtension()
            .forEach {
                val constantsType = createConstantTypeBuilder(config, it.name)
                constantsType.addField(
                    FieldSpec
                        .builder(ClassName.get(String::class.java), "TYPE_NAME")
                        .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
                        .initializer("\$S", it.name)
                        .build(),
                )

                for (definition in it.inputValueDefinitions) {
                    addFieldNameConstant(constantsType, definition.name)
                }

                val extensions = findInputExtensions(it.name, document.definitions)
                for (extension in extensions) {
                    for (definition in extension.inputValueDefinitions) {
                        addFieldNameConstant(constantsType, definition.name)
                    }
                }

                javaType.addType(constantsType.build())
            }

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

                constantsType.addField(
                    FieldSpec
                        .builder(ClassName.get(String::class.java), "TYPE_NAME")
                        .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
                        .initializer("\$S", it.name)
                        .build(),
                )

                for (definition in it.fieldDefinitions) {
                    addFieldNameConstant(constantsType, definition.name)
                }

                val extensions = findInterfaceExtensions(it.name, document.definitions)
                for (extension in extensions) {
                    for (definition in extension.fieldDefinitions) {
                        addFieldNameConstant(constantsType, definition.name)
                    }
                }

                javaType.addType(constantsType.build())
            }

        document.definitions
            .filterIsInstance<UnionTypeDefinition>()
            .asSequence()
            .excludeSchemaTypeExtension()
            .forEach {
                val constantsType = createConstantTypeBuilder(config, it.name)
                constantsType.addField(
                    FieldSpec
                        .builder(ClassName.get(String::class.java), "TYPE_NAME")
                        .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
                        .initializer("\$S", it.name)
                        .build(),
                )
            }

        if (document.definitions.any { it is ObjectTypeDefinition && it.name == "Query" }) {
            javaType.addField(
                FieldSpec
                    .builder(ClassName.get(String::class.java), "QUERY_TYPE")
                    .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
                    .initializer(""""Query"""")
                    .build(),
            )
        }
        if (document.definitions.any { it is ObjectTypeDefinition && it.name == "Mutation" }) {
            javaType.addField(
                FieldSpec
                    .builder(ClassName.get(String::class.java), "MUTATION_TYPE")
                    .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
                    .initializer(""""Mutation"""")
                    .build(),
            )
        }
        if (document.definitions.any { it is ObjectTypeDefinition && it.name == "Subscription" }) {
            javaType.addField(
                FieldSpec
                    .builder(ClassName.get(String::class.java), "SUBSCRIPTION_TYPE")
                    .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
                    .initializer(""""Subscription"""")
                    .build(),
            )
        }

        val javaFile = JavaFile.builder(config.packageName, javaType.build()).build()
        return CodeGenResult(javaConstants = listOf(javaFile))
    }