in src/main/com/intellij/lang/jsgraphql/types/schema/diff/SchemaDiff.java [612:684]
private void checkFieldArguments(DiffCtx ctx,
TypeDefinition oldDef,
FieldDefinition oldField,
List<InputValueDefinition> oldInputValueDefinitions,
List<InputValueDefinition> newInputValueDefinitions) {
Map<String, InputValueDefinition> oldArgsMap = sortedMap(oldInputValueDefinitions,
InputValueDefinition::getName);
Map<String, InputValueDefinition> newArgMap = sortedMap(newInputValueDefinitions,
InputValueDefinition::getName);
if (oldArgsMap.size() > newArgMap.size()) {
ctx.report(DiffEvent.apiBreakage()
.category(DiffCategory.MISSING)
.typeName(oldDef.getName())
.typeKind(getTypeKind(oldDef))
.fieldName(oldField.getName())
.reasonMsg("The new API has less arguments on field '%s' of type '%s' than the old API",
mkDotName(oldDef.getName(), oldField.getName()), oldDef.getName())
.build());
return;
}
for (Map.Entry<String, InputValueDefinition> entry : oldArgsMap.entrySet()) {
String argName = entry.getKey();
ctx.report(DiffEvent.apiInfo()
.typeName(oldDef.getName())
.typeKind(getTypeKind(oldDef))
.fieldName(oldField.getName())
.reasonMsg("\tExamining field argument '%s' ...",
mkDotName(oldDef.getName(), oldField.getName(), argName))
.build());
InputValueDefinition newArg = newArgMap.get(argName);
if (newArg == null) {
ctx.report(DiffEvent.apiBreakage()
.category(DiffCategory.MISSING)
.typeName(oldDef.getName())
.typeKind(getTypeKind(oldDef))
.fieldName(oldField.getName())
.components(argName)
.reasonMsg("The new API is missing the field argument '%s'",
mkDotName(oldDef.getName(), oldField.getName(), argName))
.build());
}
else {
checkFieldArg(ctx, oldDef, oldField, entry.getValue(), newArg);
}
}
// check new fields are not mandatory
for (Map.Entry<String, InputValueDefinition> entry : newArgMap.entrySet()) {
InputValueDefinition newArg = entry.getValue();
Optional<InputValueDefinition> oldArg = Optional.ofNullable(oldArgsMap.get(newArg.getName()));
if (oldArg.isEmpty()) {
// new args MUST not be mandatory
if (typeInfo(newArg.getType()).isNonNull()) {
ctx.report(DiffEvent.apiBreakage()
.category(DiffCategory.STRICTER)
.typeName(oldDef.getName())
.typeKind(getTypeKind(oldDef))
.fieldName(oldField.getName())
.components(newArg.getName())
.reasonMsg(
"The new API has made the new argument '%s' on field '%s' non null and hence more strict for old consumers",
newArg.getName(), mkDotName(oldDef.getName(), oldField.getName()))
.build());
}
}
}
}