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