@Override public void visitPrefixExpression(@NotNull PsiPrefixExpression expression) {
    startElement(expression);

    DfaValue dfaValue = expression.getOperationTokenType() == JavaTokenType.EXCL ? null : JavaDfaValueFactory
      .getExpressionDfaValue(myFactory, expression);
    if (dfaValue != null) {
      // Constant expression is computed: just push the result
      push(dfaValue, expression);
    }
    else {
      PsiExpression operand = PsiUtil.skipParenthesizedExprDown(expression.getOperand());

      if (operand == null) {
        pushUnknown();
      }
      else {
        if (PsiUtil.isIncrementDecrementOperation(expression)) {
          processIncrementDecrement(expression, operand, false);
        }
        else {
          operand.accept(this);
          PsiType type = expression.getType();
          PsiPrimitiveType unboxed = PsiPrimitiveType.getUnboxedType(type);
          generateBoxingUnboxingInstructionFor(operand, unboxed == null ? type : unboxed);
          if (expression.getOperationTokenType() == JavaTokenType.EXCL) {
            addInstruction(new NotInstruction(new JavaExpressionAnchor(expression)));
          }
          else if (expression.getOperationTokenType() == JavaTokenType.MINUS && (PsiTypes.intType().equals(type) || PsiTypes.longType()
            .equals(type))) {
            addInstruction(new PushValueInstruction(DfTypes.defaultValue(type)));
            addInstruction(new SwapInstruction());
            addInstruction(new NumericBinaryInstruction(LongRangeBinOp.MINUS, new JavaExpressionAnchor(expression)));
          }
          else {
            addInstruction(new PopInstruction());
            pushUnknown();
          }
        }
      }
    }

    finishElement(expression);
  }
@Override public void visitPrefixExpression(@NotNull PsiPrefixExpression expression)