in src/main/com/intellij/lang/jsgraphql/ide/completion/GraphQLCompletionContributor.java [673:750]
private void completeArgumentName() {
CompletionProvider<CompletionParameters> provider = new CompletionProvider<>() {
@Override
protected void addCompletions(final @NotNull CompletionParameters parameters,
@NotNull ProcessingContext context,
@NotNull CompletionResultSet result) {
final PsiElement completionElement = Optional.ofNullable(parameters.getOriginalPosition()).orElse(parameters.getPosition());
final GraphQLNamedElement element =
PsiTreeUtil.getParentOfType(completionElement, GraphQLField.class, GraphQLDirective.class);
if (element == null || element.getName() == null) {
return;
}
if (element instanceof GraphQLDirective) {
addDirectiveArguments(result, completionElement, ((GraphQLDirective)element));
}
else if (element instanceof GraphQLField) {
addFieldArguments(result, ((GraphQLField)element));
}
}
private void addDirectiveArguments(@NotNull CompletionResultSet result,
@NotNull PsiElement completionElement,
@NotNull GraphQLDirective directive) {
final GraphQLSchema schema = GraphQLSchemaProvider.getInstance(completionElement.getProject())
.getSchemaInfo(completionElement).getSchema();
com.intellij.lang.jsgraphql.types.schema.GraphQLDirective directiveDefinition =
schema.getFirstDirective(directive.getName());
if (directiveDefinition == null) {
return;
}
final Set<String> existingArgumentNames = Sets.newHashSet();
GraphQLArguments arguments = directive.getArguments();
if (arguments != null) {
for (GraphQLArgument directiveArgument : arguments.getArgumentList()) {
ContainerUtil.addIfNotNull(existingArgumentNames, directiveArgument.getName());
}
}
addArgumentResults(result, directiveDefinition.getArguments(), existingArgumentNames);
}
private void addFieldArguments(@NotNull CompletionResultSet result, @NotNull GraphQLField field) {
final GraphQLTypeScopeProvider typeScopeProvider = PsiTreeUtil.getParentOfType(field, GraphQLTypeScopeProvider.class);
if (typeScopeProvider == null) {
return;
}
GraphQLType typeScope = typeScopeProvider.getTypeScope();
if (typeScope != null) {
// we need the raw type to get the fields
typeScope = GraphQLSchemaUtil.getUnmodified(typeScope);
}
if (!(typeScope instanceof GraphQLFieldsContainer)) {
return;
}
final com.intellij.lang.jsgraphql.types.schema.GraphQLFieldDefinition fieldDefinition =
((GraphQLFieldsContainer)typeScope).getFieldDefinition(field.getName());
if (fieldDefinition == null || field.getArguments() == null) {
return;
}
final Set<String> existingArgumentNames = field.getArguments().getArgumentList().stream()
.map(PsiNamedElement::getName).filter(Objects::nonNull).collect(Collectors.toSet());
addArgumentResults(result, fieldDefinition.getArguments(), existingArgumentNames);
}
private void addArgumentResults(@NotNull CompletionResultSet result,
@NotNull List<com.intellij.lang.jsgraphql.types.schema.GraphQLArgument> arguments,
@NotNull Set<String> existingArgumentNames) {
for (com.intellij.lang.jsgraphql.types.schema.GraphQLArgument graphQLArgument : arguments) {
String name = graphQLArgument.getName();
if (name != null && !existingArgumentNames.contains(name)) {
String typeText = GraphQLSchemaUtil.formatAsTypeReference(graphQLArgument.getType());
result.addElement(GraphQLCompletionUtil.createArgumentNameLookupElement(name, typeText));
}
}
}
};
extend(CompletionType.BASIC, psiElement(GraphQLElementTypes.NAME).withSuperParent(2, GraphQLArgument.class), provider);
}