@@ -246,7 +246,7 @@ def reduce_spread_fragments(spreads):
246246 )
247247 for fragment_definition in self .fragment_definitions
248248 if fragment_definition .name .value not in fragment_names_used
249- ]
249+ ]
250250
251251 if errors :
252252 return errors
@@ -315,7 +315,7 @@ def __init__(self, context):
315315 node .name .value : self .gather_spreads (node )
316316 for node in context .get_ast ().definitions
317317 if isinstance (node , ast .FragmentDefinition )
318- }
318+ }
319319 self .known_to_lead_to_cycle = set ()
320320
321321 def enter_FragmentDefinition (self , node , * args ):
@@ -450,7 +450,7 @@ def leave_OperationDefinition(self, *args):
450450 )
451451 for variable_definition in self .variable_definitions
452452 if variable_definition .variable .name .value not in self .variable_name_used
453- ]
453+ ]
454454
455455 if errors :
456456 return errors
@@ -851,7 +851,7 @@ def leave_SelectionSet(self, node, *args):
851851 return [
852852 GraphQLError (self .fields_conflict_message (reason_name , reason ), list (fields )) for
853853 (reason_name , reason ), fields in conflicts
854- ]
854+ ]
855855
856856 @staticmethod
857857 def same_type (type1 , type2 ):
@@ -967,3 +967,26 @@ def reason_message(cls, reason):
967967 for reason_name , sub_reason in reason )
968968
969969 return reason
970+
971+
972+ class UniqueInputFieldNames (ValidationRule ):
973+ def __init__ (self , context ):
974+ super (UniqueInputFieldNames , self ).__init__ (context )
975+ self .known_names = {}
976+
977+ def enter_ObjectValue (self , * args ):
978+ self .known_names = {}
979+
980+ def enter_ObjectField (self , node , * args ):
981+ field_name = node .name .value
982+ if field_name in self .known_names :
983+ return GraphQLError (
984+ self .duplicate_input_field_message (field_name ),
985+ [self .known_names [field_name ], node .name ]
986+ )
987+
988+ self .known_names [field_name ] = node .name
989+
990+ @staticmethod
991+ def duplicate_input_field_message (field_name ):
992+ return 'There can only be one input field named "{}"' .format (field_name )
0 commit comments