public static void extractClassMembers(PsiClass subclass,
                                         List<GrMemberInfo> result,
                                         Filter<GrMember> filter,
                                         final boolean extractInterfacesDeep) {

    if (!(subclass instanceof GrTypeDefinition)) return;


    if (extractInterfacesDeep) {
      extractSuperInterfaces(subclass, filter, result, new HashSet<>());
    }
    else {
      PsiClass[] interfaces = subclass.getInterfaces();
      GrReferenceList sourceRefList = subclass.isInterface()
                                      ? ((GrTypeDefinition)subclass).getExtendsClause()
                                      : ((GrTypeDefinition)subclass).getImplementsClause();
      for (PsiClass anInterface : interfaces) {
        if (anInterface instanceof GrTypeDefinition && filter.includeMember((GrMember)anInterface)) {
          result.add(new GrMemberInfo((GrMember)anInterface, true, sourceRefList));
        }
      }
    }


    PsiClass[] innerClasses = subclass.getInnerClasses();
    for (PsiClass innerClass : innerClasses) {
      if (innerClass instanceof GrTypeDefinition && filter.includeMember((GrMember)innerClass)) {
        result.add(new GrMemberInfo((GrMember)innerClass));
      }
    }

    GrMethod[] methods = ((GrTypeDefinition)subclass).getCodeMethods();
    for (GrMethod method : methods) {
      if (!method.isConstructor() && filter.includeMember(method)) {
        result.add(new GrMemberInfo(method));
      }
    }

    GrField[] fields = ((GrTypeDefinition)subclass).getCodeFields();
    for (final GrField field : fields) {
      if (filter.includeMember(field)) {
        result.add(new GrMemberInfo(field));
      }
    }
  }
public static void extractClassMembers(PsiClass subclass,
                                         List<GrMemberInfo> result,
                                         Filter<GrMember> filter,
                                         final boolean extractInterfacesDeep)