private boolean includeMember(PsiMemberWrapper member) {
      if (psiClass.getPsiClass().isEnum() && staticMembers) {
        return member.isStatic();
      }

      if (member.isStatic() != staticMembers) {
        return false;
      }

      if (member.getPsiMember().getContainingClass() != psiClass.getPsiClass()) {
        return false;
      }

      if (member.isPrivate()) {
        return false;
      }

      return true;
    }
    private void processFields() {
      // Hack to load static members for enum class loaded from class file
      if (kotlin && !psiClass.getPsiClass().isEnum()) {
        return;
      }
      for (PsiField field0 : psiClass.getPsiClass().getAllFields()) {
        PsiFieldWrapper field = new PsiFieldWrapper(field0);

        // group must be created even for excluded field
        NamedMembers namedMembers = getNamedMembers(Name.identifier(field.getName()));

        if (!includeMember(field)) {
          continue;
        }

        TypeSource type = new TypeSource("", field.getType(), field0);
        namedMembers.addPropertyAccessor(new PropertyAccessorData(field, type, null));
      }
    }
    private void processMethods() {

      for (PsiMethod method : psiClass.getPsiClass().getAllMethods()) {
        getNamedMembers(Name.identifier(method.getName()));

        PropertyParseResult propertyParseResult =
            PropertyNameUtils.parseMethodToProperty(method.getName());
        if (propertyParseResult != null) {
          getNamedMembers(Name.identifier(propertyParseResult.getPropertyName()));
        }
      }

      for (PsiMethod method0 : psiClass.getPsiClass().getMethods()) {
        PsiMethodWrapper method = new PsiMethodWrapper(method0);

        if (!includeMember(method)) {
          continue;
        }

        PropertyParseResult propertyParseResult =
            PropertyNameUtils.parseMethodToProperty(method.getName());

        // TODO: remove getJavaClass
        if (propertyParseResult != null && propertyParseResult.isGetter()) {

          String propertyName = propertyParseResult.getPropertyName();
          NamedMembers members = getNamedMembers(Name.identifier(propertyName));

          // TODO: some java properties too
          if (method.getJetMethod().flags().get(JvmStdlibNames.FLAG_PROPERTY_BIT)) {

            int i = 0;

            TypeSource receiverType;
            if (i < method.getParameters().size()
                && method.getParameter(i).getJetValueParameter().receiver()) {
              PsiParameterWrapper receiverParameter = method.getParameter(i);
              receiverType =
                  new TypeSource(
                      receiverParameter.getJetValueParameter().type(),
                      receiverParameter.getPsiParameter().getType(),
                      receiverParameter.getPsiParameter());
              ++i;
            } else {
              receiverType = null;
            }

            while (i < method.getParameters().size()
                && method.getParameter(i).getJetTypeParameter().isDefined()) {
              // TODO: store is reified
              ++i;
            }

            if (i != method.getParameters().size()) {
              // TODO: report error properly
              throw new IllegalStateException("something is wrong with method " + method0);
            }

            // TODO: what if returnType == null?
            TypeSource propertyType =
                new TypeSource(
                    method.getJetMethod().propertyType(),
                    method.getReturnType(),
                    method.getPsiMethod());

            members.addPropertyAccessor(
                new PropertyAccessorData(method, true, propertyType, receiverType));
          } else if (!kotlin && false) {
            if (method.getParameters().size() == 0) {
              TypeSource propertyType =
                  new TypeSource("", method.getReturnType(), method.getPsiMethod());
              members.addPropertyAccessor(
                  new PropertyAccessorData(method, true, propertyType, null));
            }
          }

        } else if (propertyParseResult != null && !propertyParseResult.isGetter()) {

          String propertyName = propertyParseResult.getPropertyName();
          NamedMembers members = getNamedMembers(Name.identifier(propertyName));

          if (method.getJetMethod().flags().get(JvmStdlibNames.FLAG_PROPERTY_BIT)) {
            if (method.getParameters().size() == 0) {
              // TODO: report error properly
              throw new IllegalStateException();
            }

            int i = 0;

            TypeSource receiverType = null;
            PsiParameterWrapper p1 = method.getParameter(0);
            if (p1.getJetValueParameter().receiver()) {
              receiverType =
                  new TypeSource(
                      p1.getJetValueParameter().type(),
                      p1.getPsiParameter().getType(),
                      p1.getPsiParameter());
              ++i;
            }

            while (i < method.getParameters().size()
                && method.getParameter(i).getJetTypeParameter().isDefined()) {
              ++i;
            }

            if (i + 1 != method.getParameters().size()) {
              throw new IllegalStateException();
            }

            PsiParameterWrapper propertyTypeParameter = method.getParameter(i);
            TypeSource propertyType =
                new TypeSource(
                    method.getJetMethod().propertyType(),
                    propertyTypeParameter.getPsiParameter().getType(),
                    propertyTypeParameter.getPsiParameter());

            members.addPropertyAccessor(
                new PropertyAccessorData(method, false, propertyType, receiverType));
          } else if (!kotlin && false) {
            if (method.getParameters().size() == 1) {
              PsiParameter psiParameter = method.getParameters().get(0).getPsiParameter();
              TypeSource propertyType = new TypeSource("", psiParameter.getType(), psiParameter);
              members.addPropertyAccessor(
                  new PropertyAccessorData(method, false, propertyType, null));
            }
          }
        }

        if (!method.getJetMethod().flags().get(JvmStdlibNames.FLAG_PROPERTY_BIT)) {
          NamedMembers namedMembers = getNamedMembers(Name.identifier(method.getName()));
          namedMembers.addMethod(method);
        }
      }
    }