private void completeTypeNameToExtend()

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