From 02bfb4a8e3630d734f07b804b55cf3865a7169a5 Mon Sep 17 00:00:00 2001 From: Marc-Andre Giroux Date: Wed, 2 Jul 2025 11:38:30 -0400 Subject: [PATCH] implement a new checkForTypeExtensionFieldUniqueness --- .../idl/SchemaTypeExtensionsChecker.java | 38 +++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/src/main/java/graphql/schema/idl/SchemaTypeExtensionsChecker.java b/src/main/java/graphql/schema/idl/SchemaTypeExtensionsChecker.java index 36b4a2c3ff..1a11912811 100644 --- a/src/main/java/graphql/schema/idl/SchemaTypeExtensionsChecker.java +++ b/src/main/java/graphql/schema/idl/SchemaTypeExtensionsChecker.java @@ -24,10 +24,13 @@ import graphql.schema.idl.errors.TypeExtensionMissingBaseTypeError; import graphql.util.FpKit; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.function.Consumer; +import java.util.function.Function; import java.util.stream.Collectors; import static graphql.schema.idl.SchemaTypeChecker.checkNamedUniqueness; @@ -81,12 +84,13 @@ private void checkObjectTypeExtensions(List errors, TypeDefinition checkNamedUniqueness(errors, directive.getArguments(), Argument::getName, (argumentName, argument) -> new NonUniqueArgumentError(extension, fld, argumentName)))); - // // fields must be unique within a type extension - forEachBut(extension, extensions, - otherTypeExt -> checkForFieldRedefinition(errors, otherTypeExt, otherTypeExt.getFieldDefinitions(), fieldDefinitions)); + checkForTypeExtensionFieldUniqueness( + errors, + extensions, + ObjectTypeDefinition::getFieldDefinitions + ); - // // then check for field re-defs from the base type Optional baseTypeOpt = typeRegistry.getType(extension.getName(), ObjectTypeDefinition.class); baseTypeOpt.ifPresent(baseTypeDef -> checkForFieldRedefinition(errors, extension, fieldDefinitions, baseTypeDef.getFieldDefinitions())); @@ -125,10 +129,12 @@ private void checkInterfaceTypeExtensions(List errors, TypeDefinit checkNamedUniqueness(errors, directive.getArguments(), Argument::getName, (argumentName, argument) -> new NonUniqueArgumentError(extension, fld, argumentName)))); - // // fields must be unique within a type extension - forEachBut(extension, extensions, - otherTypeExt -> checkForFieldRedefinition(errors, otherTypeExt, otherTypeExt.getFieldDefinitions(), fieldDefinitions)); + checkForTypeExtensionFieldUniqueness( + errors, + extensions, + InterfaceTypeDefinition::getFieldDefinitions + ); // // then check for field re-defs from the base type @@ -138,6 +144,24 @@ private void checkInterfaceTypeExtensions(List errors, TypeDefinit }); } + private > void checkForTypeExtensionFieldUniqueness( + List errors, + List extensions, + Function> getFieldDefinitions + ) { + Set seenFields = new HashSet<>(); + + for (T extension : extensions) { + for (FieldDefinition field : getFieldDefinitions.apply(extension)) { + if (seenFields.contains(field.getName())) { + errors.add(new TypeExtensionFieldRedefinitionError(extension, field)); + } else { + seenFields.add(field.getName()); + } + } + } + } + /* * Union type extensions have the potential to be invalid if incorrectly defined. *