diff --git a/src/main/kotlin/graphql/kickstart/tools/SchemaParser.kt b/src/main/kotlin/graphql/kickstart/tools/SchemaParser.kt index 6dbf549e..6cd2728a 100644 --- a/src/main/kotlin/graphql/kickstart/tools/SchemaParser.kt +++ b/src/main/kotlin/graphql/kickstart/tools/SchemaParser.kt @@ -297,14 +297,11 @@ class SchemaParser internal constructor( } private fun buildDirectives(directives: List, directiveLocation: Introspection.DirectiveLocation): Array { - val names = mutableSetOf() - val output = mutableListOf() for (directive in directives) { - if (!names.contains(directive.name)) { - names.add(directive.name) val graphQLDirective = GraphQLDirective.newDirective() .name(directive.name) + .repeatable(true) .description(getDocumentation(directive, options)) .comparatorRegistry(runtimeWiring.comparatorRegistry) .validLocation(directiveLocation) @@ -320,7 +317,6 @@ class SchemaParser internal constructor( .build() output.add(graphQLDirective) - } } return output.toTypedArray() diff --git a/src/test/kotlin/graphql/kickstart/tools/SchemaParserTest.kt b/src/test/kotlin/graphql/kickstart/tools/SchemaParserTest.kt index d382a3cb..3474e8d0 100644 --- a/src/test/kotlin/graphql/kickstart/tools/SchemaParserTest.kt +++ b/src/test/kotlin/graphql/kickstart/tools/SchemaParserTest.kt @@ -1,6 +1,9 @@ package graphql.kickstart.tools +import graphql.Scalars +import graphql.introspection.Introspection import graphql.kickstart.tools.resolver.FieldResolverError +import graphql.language.StringValue import graphql.schema.* import graphql.schema.idl.SchemaDirectiveWiring import graphql.schema.idl.SchemaDirectiveWiringEnvironment @@ -625,6 +628,33 @@ class SchemaParserTest { assertNull(schema.description) } + @Test + fun `parser should support repeatable directives`() { + val schema = SchemaParser.newParser() + .schemaString( + """ + schema { + query: SomeType + } + + type SomeType @directive(k: "1") @directive(k: "2") { + empty: String + } + """ + ) + .resolvers(object : GraphQLQueryResolver {}) + .options(SchemaParserOptions.newOptions().allowUnimplementedResolvers(true).build()) + .build() + .makeExecutableSchema() + + val someType = schema.getType("SomeType") as GraphQLObjectType + assertEquals(someType.directives.size, 2) + someType.directives.forEach { directive -> + assertEquals(directive.name, "directive") + assertEquals(directive.isRepeatable, true) + } + } + enum class EnumType { TEST }