in src/main/com/intellij/lang/jsgraphql/ide/completion/GraphQLCompletionContributor.java [533:590]
private void completeDirectiveLocation() {
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 GraphQLDirectiveLocations directiveLocations =
PsiTreeUtil.getParentOfType(completionElement, GraphQLDirectiveLocations.class);
if (directiveLocations == null) {
return;
}
PsiElement prevSibling = PsiTreeUtil.skipWhitespacesAndCommentsBackward(directiveLocations);
if (prevSibling instanceof PsiErrorElement) {
List<GraphQLCompletionKeyword> keywords = new SmartList<>(ON);
if (PsiUtilCore.getElementType(prevSibling.getPrevSibling()) != GraphQLElementTypes.REPEATABLE_KEYWORD) {
keywords.add(REPEATABLE);
}
for (GraphQLCompletionKeyword keyword : keywords) {
result.addElement(GraphQLCompletionUtil.createKeywordLookupElement(keyword));
}
return; // no need to complete locations
}
final Set<String> currentLocations = Sets.newHashSet();
directiveLocations.getDirectiveLocationList().forEach(location -> currentLocations.add(location.getText()));
GraphQLFile builtInSchema = ContainerUtil.getFirstItem(
GraphQLResolveUtil.getLibraryFiles(GraphQLBundledLibraryTypes.SPECIFICATION, completionElement));
if (builtInSchema == null) {
return;
}
List<GraphQLTypeSystemDefinition> definitions = ContainerUtil.filter(
builtInSchema.getTypeDefinitions(),
t -> t instanceof GraphQLEnumTypeDefinition);
for (GraphQLDefinition definition : definitions) {
GraphQLEnumTypeDefinition enumTypeDefinition = (GraphQLEnumTypeDefinition)definition;
final GraphQLTypeNameDefinition enumTypeName = enumTypeDefinition.getTypeNameDefinition();
if (enumTypeName == null || !GraphQLKnownTypes.INTROSPECTION_DIRECTIVE_LOCATION.equals(enumTypeName.getName())) {
continue;
}
final GraphQLEnumValueDefinitions enumValueDefinitions = enumTypeDefinition.getEnumValueDefinitions();
if (enumValueDefinitions != null) {
enumValueDefinitions.getEnumValueDefinitionList().forEach(value -> {
final String locationName = value.getEnumValue().getName();
if (locationName != null && currentLocations.add(locationName)) {
result.addElement(GraphQLCompletionUtil.createDirectiveLocationLookupElement(locationName));
}
});
}
}
}
};
extend(CompletionType.BASIC, psiElement(GraphQLElementTypes.NAME).withParent(GraphQLDirectiveLocation.class), provider);
}