in src/main/com/intellij/lang/jsgraphql/types/schema/validation/TypesImplementInterfaces.java [145:208]
private void checkFieldArgumentEquivalence(GraphQLImplementingType implementingType,
GraphQLInterfaceType interfaceType,
SchemaValidationErrorCollector validationErrorCollector,
GraphQLFieldDefinition interfaceFieldDef,
GraphQLFieldDefinition objectFieldDef) {
List<GraphQLArgument> interfaceArgs = interfaceFieldDef.getArguments();
List<GraphQLArgument> objectArgs = objectFieldDef.getArguments();
Map<String, GraphQLArgument> interfaceArgsByName = FpKit.getByName(interfaceArgs, GraphQLArgument::getName);
List<String> objectArgsNames = map(objectArgs, GraphQLArgument::getName);
if (!objectArgsNames.containsAll(interfaceArgsByName.keySet())) {
final String missingArgsNames = interfaceArgsByName.keySet().stream()
.filter(name -> !objectArgsNames.contains(name))
.collect(Collectors.joining(", "));
validationErrorCollector.addError(
error(
format("%s type '%s' does not implement interface '%s' because field '%s' is missing argument(s): '%s'",
TYPE_OF_MAP.get(implementingType.getClass()), implementingType.getName(), interfaceType.getName(),
interfaceFieldDef.getName(), missingArgsNames),
implementingType.getDefinition()
));
}
else {
objectArgs.forEach(objectArg -> {
GraphQLArgument interfaceArg = interfaceArgsByName.get(objectArg.getName());
if (interfaceArg == null) {
if (objectArg.getType() instanceof GraphQLNonNull) {
validationErrorCollector.addError(
error(
format(
"%s type '%s' field '%s' defines an additional non-optional argument '%s' which is not allowed because field is also defined in interface '%s'",
TYPE_OF_MAP.get(implementingType.getClass()), implementingType.getName(), objectFieldDef.getName(), objectArg.getName(),
interfaceType.getName()),
objectFieldDef.getDefinition()
));
}
}
else {
String interfaceArgStr = makeArgStr(objectArg);
String objectArgStr = makeArgStr(interfaceArg);
boolean same = true;
if (!interfaceArgStr.equals(objectArgStr)) {
same = false;
}
if (!Objects.equals(objectArg.getDefaultValue(), interfaceArg.getDefaultValue())) {
same = false;
}
if (!same) {
validationErrorCollector.addError(
error(
format("%s type '%s' does not implement interface '%s' because field '%s' argument '%s' is defined differently",
TYPE_OF_MAP.get(implementingType.getClass()), implementingType.getName(), interfaceType.getName(),
interfaceFieldDef.getName(), objectArg.getName()),
objectArg.getDefinition()
));
}
}
});
}
}