private static void findFragmentsInsideOperation()

in src/main/com/intellij/lang/jsgraphql/ide/highlighting/query/GraphQLQueryContextHighlightVisitor.java [362:401]


  private static void findFragmentsInsideOperation(PsiElement operationOrFragment, Map<String, GraphQLFragmentDefinition> foundFragments,
                                                   Function<GraphQLFragmentDefinition, Boolean> findMore) {

    operationOrFragment.accept(new PsiRecursiveElementVisitor() {

      private boolean done = false;

      @Override
      public void visitElement(@NotNull PsiElement element) {
        if (done) {
          return;
        }
        if (element instanceof GraphQLFragmentSpread) {
          PsiReference reference = ((GraphQLFragmentSpread)element).getNameIdentifier().getReference();
          if (reference != null) {
            PsiElement fragmentDefinitionRef = reference.resolve();
            if (fragmentDefinitionRef instanceof GraphQLIdentifier) {
              if (fragmentDefinitionRef.getOriginalElement() instanceof GraphQLIdentifier) {
                fragmentDefinitionRef = fragmentDefinitionRef.getOriginalElement();
              }
              GraphQLFragmentDefinition fragment =
                PsiTreeUtil.getParentOfType(fragmentDefinitionRef, GraphQLFragmentDefinition.class);
              String fragmentKey = getFragmentKey(fragment);
              if (fragment != null && !foundFragments.containsKey(fragmentKey)) {
                foundFragments.put(fragmentKey, fragment);
                if (findMore != null && !findMore.apply(fragment)) {
                  // we're done
                  done = true;
                  return;
                }
                // also look for fragments inside this fragment
                findFragmentsInsideOperation(fragment, foundFragments, findMore);
              }
            }
          }
        }
        super.visitElement(element);
      }
    });
  }