private void completeDirectiveLocation()

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