in src/main/com/intellij/lang/jsgraphql/ide/completion/GraphQLCompletionContributor.java [970:1028]
private void completeTypeNameToExtend() {
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 GraphQLTypeExtension typeExtension = PsiTreeUtil.getParentOfType(completionElement, GraphQLTypeExtension.class);
if (typeExtension == null) {
return;
}
final TypeDefinitionRegistry typeDefinitionRegistry = GraphQLRegistryProvider.getInstance(completionElement.getProject())
.getRegistryInfo(parameters.getOriginalFile()).getTypeDefinitionRegistry();
final List<TypeDefinition<?>> types = Lists.newArrayList();
if (typeExtension instanceof GraphQLScalarTypeExtensionDefinition) {
// scalars aren't fully fledged types in the registry
types.addAll(typeDefinitionRegistry.scalars().values());
}
else {
// "real" types
Class<? extends TypeDefinition<?>> applicableTypes = null;
if (typeExtension instanceof GraphQLObjectTypeExtensionDefinition) {
applicableTypes = ObjectTypeDefinition.class;
}
else if (typeExtension instanceof GraphQLInterfaceTypeExtensionDefinition) {
applicableTypes = InterfaceTypeDefinition.class;
}
else if (typeExtension instanceof GraphQLUnionTypeExtensionDefinition) {
applicableTypes = UnionTypeDefinition.class;
}
else if (typeExtension instanceof GraphQLEnumTypeExtensionDefinition) {
applicableTypes = EnumTypeDefinition.class;
}
else if (typeExtension instanceof GraphQLInputObjectTypeExtensionDefinition) {
applicableTypes = InputObjectTypeDefinition.class;
}
if (applicableTypes != null) {
types.addAll(typeDefinitionRegistry.getTypes(applicableTypes));
}
}
types.forEach(type -> {
if (isIgnoredType(type)) return;
result.addElement(GraphQLCompletionUtil
.createTypeNameLookupElement(type.getName(), null, AddSpaceInsertHandler.INSTANCE));
});
}
};
final ElementPattern<PsiElement> extendKeywords = PlatformPatterns.or(
psiElement(GraphQLElementTypes.TYPE_KEYWORD),
psiElement(GraphQLElementTypes.INTERFACE_KEYWORD),
psiElement(GraphQLElementTypes.SCALAR_KEYWORD),
psiElement(GraphQLElementTypes.UNION_KEYWORD),
psiElement(GraphQLElementTypes.ENUM_KEYWORD),
psiElement(GraphQLElementTypes.INPUT_KEYWORD)
);
extend(CompletionType.BASIC,
psiElement(GraphQLElementTypes.NAME).inside(GraphQLTypeExtension.class).afterLeaf(extendKeywords),
provider);
}