@@ -37,7 +37,31 @@ let validateName ~name ~(typeLocation : typeLocation)
3737 name;
3838 }
3939
40- let validateFields ~schemaState (fields : gqlField list ) =
40+ let validateFieldNameUniqueness ~schemaState ~(parentTypeName : string )
41+ (fields : gqlField list ) =
42+ let seen = Hashtbl. create (List. length fields) in
43+ fields
44+ |> List. iter (fun (field : gqlField ) ->
45+ match Hashtbl. find_opt seen field.name with
46+ | None -> Hashtbl. add seen field.name field
47+ | Some firstField ->
48+ schemaState
49+ |> addDiagnostic
50+ ~diagnostic:
51+ {
52+ loc = field.loc;
53+ fileUri = field.fileUri;
54+ message =
55+ Printf. sprintf
56+ " Field `%s` appears more than once on GraphQL type `%s`. \
57+ Rename one of the fields or change its @as attribute. \
58+ The first field was declared in %s."
59+ field.name parentTypeName firstField.fileName;
60+ })
61+
62+ let validateFields ~schemaState ~(parentTypeName : string )
63+ (fields : gqlField list ) =
64+ validateFieldNameUniqueness ~schema State ~parent TypeName fields;
4165 fields
4266 |> List. iter (fun (f : gqlField ) ->
4367 validateName ~name: f.name
@@ -69,16 +93,11 @@ let validateSchema (schemaState : schemaState) =
6993
7094 schemaState.types
7195 |> Hashtbl. iter (fun _name (typ : gqlObjectType ) ->
72- match typ.typeLocation with
73- | Some _typeLocation -> validateFields ~schema State typ.fields
74- | None -> () );
96+ validateFields ~schema State ~parent TypeName:typ.displayName typ.fields);
7597
7698 schemaState.inputObjects
7799 |> Hashtbl. iter (fun _name (typ : gqlInputObjectType ) ->
78- (* A lot has already been validated on adding the type itself. *)
79- match typ.typeLocation with
80- | Some _typeLocation -> validateFields ~schema State typ.fields
81- | None -> () );
100+ validateFields ~schema State ~parent TypeName:typ.displayName typ.fields);
82101
83102 schemaState.enums
84103 |> Hashtbl. iter (fun _name (typ : gqlEnum ) ->
@@ -96,4 +115,4 @@ let validateSchema (schemaState : schemaState) =
96115 |> Hashtbl. iter (fun _name (typ : gqlInterface ) ->
97116 (* Subtype rules etc for interface fields are a bit complicated, so we
98117 let graphql-js do it at runtime instead. *)
99- validateFields ~schema State typ.fields)
118+ validateFields ~schema State ~parent TypeName:typ.displayName typ.fields)
0 commit comments