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