Skip to content

Commit 36b62bd

Browse files
smyrickShane Myrick
andauthored
[generator] Only add directives with valid locations (#925)
* Only add directives with valid locations * Rename function for generating enum value directives Co-authored-by: Shane Myrick <[email protected]>
1 parent d5a0613 commit 36b62bd

File tree

15 files changed

+137
-58
lines changed

15 files changed

+137
-58
lines changed

graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/types/generateArgument.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.expediagroup.graphql.generator.extensions.isListType
2727
import com.expediagroup.graphql.generator.extensions.isUnion
2828
import com.expediagroup.graphql.generator.extensions.safeCast
2929
import com.expediagroup.graphql.generator.extensions.unwrapOptionalInputType
30+
import graphql.introspection.Introspection.DirectiveLocation
3031
import graphql.schema.GraphQLArgument
3132
import kotlin.reflect.KClass
3233
import kotlin.reflect.KParameter
@@ -54,7 +55,7 @@ internal fun generateArgument(generator: SchemaGenerator, parameter: KParameter)
5455
.description(parameter.getGraphQLDescription())
5556
.type(graphQLType.safeCast())
5657

57-
generateDirectives(generator, parameter).forEach {
58+
generateDirectives(generator, parameter, DirectiveLocation.ARGUMENT_DEFINITION).forEach {
5859
builder.withDirective(it)
5960
}
6061

graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/types/generateDirective.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.expediagroup.graphql.generator.extensions.getPropertyAnnotations
2121
import com.expediagroup.graphql.generator.extensions.getSimpleName
2222
import com.expediagroup.graphql.generator.extensions.getValidProperties
2323
import com.expediagroup.graphql.generator.extensions.safeCast
24+
import graphql.introspection.Introspection.DirectiveLocation
2425
import graphql.schema.GraphQLArgument
2526
import graphql.schema.GraphQLDirective
2627
import java.lang.reflect.Field
@@ -29,20 +30,27 @@ import kotlin.reflect.KClass
2930
import kotlin.reflect.KProperty
3031
import com.expediagroup.graphql.annotations.GraphQLDirective as GraphQLDirectiveAnnotation
3132

32-
internal fun generateDirectives(generator: SchemaGenerator, element: KAnnotatedElement, parentClass: KClass<*>? = null): List<GraphQLDirective> {
33+
internal fun generateDirectives(
34+
generator: SchemaGenerator,
35+
element: KAnnotatedElement,
36+
location: DirectiveLocation,
37+
parentClass: KClass<*>? = null
38+
): List<GraphQLDirective> {
3339
val annotations = when {
3440
element is KProperty<*> && parentClass != null -> element.getPropertyAnnotations(parentClass)
3541
else -> element.annotations
3642
}
3743

3844
return annotations
3945
.mapNotNull { it.getDirectiveInfo() }
46+
.filter { it.directiveAnnotation.locations.contains(location) }
4047
.map { getDirective(generator, it) }
4148
}
4249

43-
internal fun generateFieldDirectives(generator: SchemaGenerator, field: Field): List<GraphQLDirective> =
50+
internal fun generateEnumValueDirectives(generator: SchemaGenerator, field: Field): List<GraphQLDirective> =
4451
field.annotations
4552
.mapNotNull { it.getDirectiveInfo() }
53+
.filter { it.directiveAnnotation.locations.contains(DirectiveLocation.ENUM_VALUE) }
4654
.map { getDirective(generator, it) }
4755

4856
private fun getDirective(generator: SchemaGenerator, directiveInfo: DirectiveInfo): GraphQLDirective {

graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/types/generateEnum.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import com.expediagroup.graphql.generator.extensions.getGraphQLDescription
2323
import com.expediagroup.graphql.generator.extensions.getGraphQLName
2424
import com.expediagroup.graphql.generator.extensions.getSimpleName
2525
import com.expediagroup.graphql.generator.extensions.safeCast
26+
import graphql.introspection.Introspection.DirectiveLocation
2627
import graphql.schema.GraphQLEnumType
2728
import graphql.schema.GraphQLEnumValueDefinition
2829
import kotlin.reflect.KClass
@@ -33,7 +34,7 @@ internal fun generateEnum(generator: SchemaGenerator, kClass: KClass<out Enum<*>
3334
enumBuilder.name(kClass.getSimpleName())
3435
enumBuilder.description(kClass.getGraphQLDescription())
3536

36-
generateDirectives(generator, kClass).forEach {
37+
generateDirectives(generator, kClass, DirectiveLocation.ENUM).forEach {
3738
enumBuilder.withDirective(it)
3839
}
3940

@@ -51,7 +52,7 @@ private fun getEnumValueDefinition(generator: SchemaGenerator, enum: Enum<*>, kC
5152
valueBuilder.name(name)
5253
valueBuilder.value(name)
5354

54-
generateFieldDirectives(generator, valueField).forEach {
55+
generateEnumValueDirectives(generator, valueField).forEach {
5556
valueBuilder.withDirective(it)
5657
}
5758

graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/types/generateFunction.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.expediagroup.graphql.generator.extensions.getGraphQLDescription
2424
import com.expediagroup.graphql.generator.extensions.getValidArguments
2525
import com.expediagroup.graphql.generator.extensions.safeCast
2626
import com.expediagroup.graphql.generator.types.utils.getWrappedReturnType
27+
import graphql.introspection.Introspection.DirectiveLocation
2728
import graphql.schema.FieldCoordinates
2829
import graphql.schema.GraphQLFieldDefinition
2930
import graphql.schema.GraphQLOutputType
@@ -40,7 +41,7 @@ internal fun generateFunction(generator: SchemaGenerator, fn: KFunction<*>, pare
4041
builder.withDirective(deprecatedDirectiveWithReason(it))
4142
}
4243

43-
generateDirectives(generator, fn).forEach {
44+
generateDirectives(generator, fn, DirectiveLocation.FIELD_DEFINITION).forEach {
4445
builder.withDirective(it)
4546
}
4647

graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/types/generateInputObject.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.expediagroup.graphql.generator.extensions.getGraphQLDescription
2121
import com.expediagroup.graphql.generator.extensions.getSimpleName
2222
import com.expediagroup.graphql.generator.extensions.getValidProperties
2323
import com.expediagroup.graphql.generator.extensions.safeCast
24+
import graphql.introspection.Introspection.DirectiveLocation
2425
import graphql.schema.GraphQLInputObjectType
2526
import kotlin.reflect.KClass
2627

@@ -30,7 +31,7 @@ internal fun generateInputObject(generator: SchemaGenerator, kClass: KClass<*>):
3031
builder.name(kClass.getSimpleName(isInputClass = true))
3132
builder.description(kClass.getGraphQLDescription())
3233

33-
generateDirectives(generator, kClass).forEach {
34+
generateDirectives(generator, kClass, DirectiveLocation.INPUT_OBJECT).forEach {
3435
builder.withDirective(it)
3536
}
3637

graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/types/generateInputProperty.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.expediagroup.graphql.generator.extensions.getPropertyDescription
2121
import com.expediagroup.graphql.generator.extensions.getPropertyName
2222
import com.expediagroup.graphql.generator.extensions.safeCast
2323
import com.expediagroup.graphql.generator.extensions.unwrapOptionalInputType
24+
import graphql.introspection.Introspection.DirectiveLocation
2425
import graphql.schema.GraphQLInputObjectField
2526
import graphql.schema.GraphQLInputType
2627
import kotlin.reflect.KClass
@@ -38,7 +39,7 @@ internal fun generateInputProperty(generator: SchemaGenerator, prop: KProperty<*
3839
builder.name(prop.getPropertyName(parentClass))
3940
builder.type(graphQLInputType)
4041

41-
generateDirectives(generator, prop, parentClass).forEach {
42+
generateDirectives(generator, prop, DirectiveLocation.INPUT_FIELD_DEFINITION, parentClass).forEach {
4243
builder.withDirective(it)
4344
}
4445

graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/types/generateInterface.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import com.expediagroup.graphql.generator.extensions.getValidSuperclasses
2626
import com.expediagroup.graphql.generator.extensions.safeCast
2727
import com.expediagroup.graphql.generator.state.AdditionalType
2828
import graphql.TypeResolutionEnvironment
29+
import graphql.introspection.Introspection.DirectiveLocation
2930
import graphql.schema.GraphQLInterfaceType
3031
import graphql.schema.GraphQLTypeReference
3132
import kotlin.reflect.KClass
@@ -37,7 +38,7 @@ internal fun generateInterface(generator: SchemaGenerator, kClass: KClass<*>): G
3738
builder.name(kClass.getSimpleName())
3839
builder.description(kClass.getGraphQLDescription())
3940

40-
generateDirectives(generator, kClass).forEach {
41+
generateDirectives(generator, kClass, DirectiveLocation.INTERFACE).forEach {
4142
builder.withDirective(it)
4243
}
4344

graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/types/generateMutation.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.expediagroup.graphql.exceptions.InvalidMutationTypeException
2121
import com.expediagroup.graphql.generator.SchemaGenerator
2222
import com.expediagroup.graphql.generator.extensions.getValidFunctions
2323
import com.expediagroup.graphql.generator.extensions.isNotPublic
24+
import graphql.introspection.Introspection.DirectiveLocation
2425
import graphql.schema.GraphQLObjectType
2526

2627
internal fun generateMutations(generator: SchemaGenerator, mutations: List<TopLevelObject>): GraphQLObjectType? {
@@ -37,7 +38,7 @@ internal fun generateMutations(generator: SchemaGenerator, mutations: List<TopLe
3738
throw InvalidMutationTypeException(mutation.kClass)
3839
}
3940

40-
generateDirectives(generator, mutation.kClass).forEach {
41+
generateDirectives(generator, mutation.kClass, DirectiveLocation.OBJECT).forEach {
4142
mutationBuilder.withDirective(it)
4243
}
4344

graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/types/generateObject.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.expediagroup.graphql.generator.extensions.getValidFunctions
2424
import com.expediagroup.graphql.generator.extensions.getValidProperties
2525
import com.expediagroup.graphql.generator.extensions.getValidSuperclasses
2626
import com.expediagroup.graphql.generator.extensions.safeCast
27+
import graphql.introspection.Introspection.DirectiveLocation
2728
import graphql.schema.GraphQLInterfaceType
2829
import graphql.schema.GraphQLObjectType
2930
import graphql.schema.GraphQLTypeReference
@@ -37,7 +38,7 @@ internal fun generateObject(generator: SchemaGenerator, kClass: KClass<*>): Grap
3738
builder.name(name)
3839
builder.description(kClass.getGraphQLDescription())
3940

40-
generateDirectives(generator, kClass).forEach {
41+
generateDirectives(generator, kClass, DirectiveLocation.OBJECT).forEach {
4142
builder.withDirective(it)
4243
}
4344

graphql-kotlin-schema-generator/src/main/kotlin/com/expediagroup/graphql/generator/types/generateProperty.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import com.expediagroup.graphql.generator.extensions.getPropertyDescription
2323
import com.expediagroup.graphql.generator.extensions.getPropertyName
2424
import com.expediagroup.graphql.generator.extensions.getSimpleName
2525
import com.expediagroup.graphql.generator.extensions.safeCast
26+
import graphql.introspection.Introspection.DirectiveLocation
2627
import graphql.schema.FieldCoordinates
2728
import graphql.schema.GraphQLFieldDefinition
2829
import graphql.schema.GraphQLOutputType
@@ -45,7 +46,7 @@ internal fun generateProperty(generator: SchemaGenerator, prop: KProperty<*>, pa
4546
fieldBuilder.withDirective(deprecatedDirectiveWithReason(it))
4647
}
4748

48-
generateDirectives(generator, prop, parentClass).forEach {
49+
generateDirectives(generator, prop, DirectiveLocation.FIELD_DEFINITION, parentClass).forEach {
4950
fieldBuilder.withDirective(it)
5051
}
5152

0 commit comments

Comments
 (0)