private void completeFieldDefinitionFromImplementedInterface()

in src/main/com/intellij/lang/jsgraphql/ide/completion/GraphQLCompletionContributor.java [313:355]


  private void completeFieldDefinitionFromImplementedInterface() {
    CompletionProvider<CompletionParameters> provider = new CompletionProvider<>() {
      @Override
      protected void addCompletions(final @NotNull CompletionParameters parameters,
                                    @NotNull ProcessingContext context,
                                    @NotNull CompletionResultSet result) {
        final PsiElement completionElement = parameters.getPosition();
        final GraphQLDefinition definition = GraphQLResolveUtil.findContainingDefinition(completionElement);
        if (definition == null) {
          return;
        }
        final GraphQLImplementsInterfaces implementsInterfaces =
          PsiTreeUtil.getChildOfType(definition, GraphQLImplementsInterfaces.class);
        if (implementsInterfaces == null) {
          return;
        }
        final Set<String> currentFields = PsiTreeUtil.findChildrenOfType(definition, GraphQLFieldDefinition.class).stream()
          .map(PsiNamedElement::getName).filter(Objects::nonNull).collect(Collectors.toSet());
        implementsInterfaces.getTypeNameList().forEach(interfaceTypeName -> {
          final PsiElement typeDefinitionName = GraphQLResolveUtil.resolve(interfaceTypeName);
          if (typeDefinitionName == null) {
            return;
          }
          final Collection<GraphQLFieldDefinition> fieldDefinitions = PsiTreeUtil.findChildrenOfType(
            GraphQLResolveUtil.findContainingDefinition(typeDefinitionName),
            GraphQLFieldDefinition.class
          );
          for (GraphQLFieldDefinition fieldDefinition : fieldDefinitions) {
            if (currentFields.contains(fieldDefinition.getName())) {
              continue;
            }

            final String implementedField = interfaceTypeName.getName() + "." + fieldDefinition.getName();
            result.addElement(
              GraphQLCompletionUtil.createImplementFieldLookupElement(fieldDefinition.getText(), implementedField));
          }
        });
      }
    };
    extend(CompletionType.BASIC,
           psiElement(GraphQLElementTypes.NAME).withParent(psiElement(GraphQLIdentifier.class).withParent(GraphQLFieldDefinition.class)),
           provider);
  }