private void checkFieldArgumentEquivalence()

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()
              ));
          }
        }
      });
    }
  }