private boolean doReduce(List<? super ConstraintFormula> constraints) {
    if (myT instanceof PsiWildcardType) {
      PsiType tBound = ((PsiWildcardType)myT).getBound();
      if (tBound == null) {
        return true;
      }

      if (((PsiWildcardType)myT).isExtends()) {
        if (myS instanceof PsiWildcardType) {
          final PsiType sBound = ((PsiWildcardType)myS).getBound();
          if (sBound == null) {
            constraints.add(new StrictSubtypingConstraint(tBound, ((PsiWildcardType)myS).getExtendsBound(), false));
            return true;
          }

          if (((PsiWildcardType)myS).isExtends()) {
            constraints.add(new StrictSubtypingConstraint(tBound, sBound, false));
            return true;
          }
          
          if (((PsiWildcardType)myS).isSuper()) {
            constraints.add(new TypeEqualityConstraint(tBound, PsiType.getJavaLangObject(((PsiWildcardType)myT).getManager(), myT.getResolveScope())));
            return true;
          }

          assert false;
        } 
        else {
          constraints.add(new StrictSubtypingConstraint(tBound, myS, false));
          return true;
        }
      } 
      else {
        LOG.assertTrue(((PsiWildcardType)myT).isSuper());

        if (myS instanceof PsiWildcardType) {
          final PsiType sBound = ((PsiWildcardType)myS).getBound();
          if (sBound != null && ((PsiWildcardType)myS).isSuper()) {
            constraints.add(new StrictSubtypingConstraint(sBound, tBound, false));
            return true;
          }
        } else {
          constraints.add(new StrictSubtypingConstraint(myS, tBound, false));
          return true;
        }
      }
      return false;
    } else {
      if (myS instanceof PsiWildcardType) {
        return false;
      } else {
        constraints.add(new TypeEqualityConstraint(myT, myS));
        return true;
      }
    }
  }
private boolean doReduce(List<? super ConstraintFormula> constraints)