@Override
    public void visitPrefixExpression(@NotNull PsiPrefixExpression expr) {
      IElementType i = expr.getOperationTokenType();
      final PsiType type = expr.getType();
      final PsiElement parent = expr.getParent();
      final TailType tailType = parent instanceof PsiAssignmentExpression && ((PsiAssignmentExpression)parent).getRExpression() == expr ?
                                getAssignmentRValueTailType((PsiAssignmentExpression)parent) :
                                TailTypes.noneType();
      if (i == JavaTokenType.PLUSPLUS || i == JavaTokenType.MINUSMINUS || i == JavaTokenType.TILDE) {
        ExpectedTypeInfoImpl info;
        if (myUsedAfter && type != null) {
          info = createInfoImpl(type, ExpectedTypeInfo.TYPE_STRICTLY, type, tailType);
        }
        else {
          if (type != null) {
            info = createInfoImpl(type, type instanceof PsiPrimitiveType ? ExpectedTypeInfo.TYPE_OR_SUPERTYPE : ExpectedTypeInfo.TYPE_OR_SUBTYPE,
                                  PsiTypes.intType(), tailType);
          }
          else {
            info = createInfoImpl(PsiTypes.longType(), ExpectedTypeInfo.TYPE_OR_SUBTYPE, PsiTypes.intType(), tailType);
          }
        }
        myResult.add(info);
      }
      else if (i == JavaTokenType.PLUS || i == JavaTokenType.MINUS) {
        if (parent instanceof PsiStatement) {
          myResult.add(createInfoImpl(PsiTypes.doubleType(), ExpectedTypeInfo.TYPE_OR_SUBTYPE, PsiTypes.intType(), tailType));
        }
        else {
          myExpr = (PsiExpression)myExpr.getParent();
          parent.accept(this);
        }
      }
      else if (i == JavaTokenType.EXCL) {
        myResult.add(createInfoImpl(PsiTypes.booleanType(), ExpectedTypeInfo.TYPE_STRICTLY, PsiTypes.booleanType(), tailType));
      }
    }
@Override
    public void visitPrefixExpression(@NotNull PsiPrefixExpression expr)