public static boolean checkSideEffects(
      PsiElement element, PsiVariable variable, List<PsiElement> sideEffects) {
    if (sideEffects == null || element == null) return false;
    if (element instanceof PsiMethodCallExpression) {
      final PsiMethod psiMethod = ((PsiMethodCallExpression) element).resolveMethod();
      if (psiMethod == null
          || !PropertyUtil.isSimpleGetter(psiMethod) && !PropertyUtil.isSimpleSetter(psiMethod)) {
        sideEffects.add(element);
        return true;
      }
    }
    if (element instanceof PsiNewExpression) {
      PsiNewExpression newExpression = (PsiNewExpression) element;
      if (newExpression.getArrayDimensions().length == 0
          && newExpression.getArrayInitializer() == null
          && !isSideEffectFreeConstructor(newExpression)) {
        sideEffects.add(element);
        return true;
      }
    }
    if (element instanceof PsiAssignmentExpression
        && !(((PsiAssignmentExpression) element).getLExpression() instanceof PsiReferenceExpression
            && ((PsiReferenceExpression) ((PsiAssignmentExpression) element).getLExpression())
                    .resolve()
                == variable)) {
      sideEffects.add(element);
      return true;
    }
    PsiElement[] children = element.getChildren();

    for (PsiElement child : children) {
      checkSideEffects(child, variable, sideEffects);
    }
    return !sideEffects.isEmpty();
  }
 private static boolean newExpressionsAreEquivalent(
     @NotNull PsiNewExpression newExpression1, @NotNull PsiNewExpression newExpression2) {
   final PsiJavaCodeReferenceElement classReference1 = newExpression1.getClassReference();
   final PsiJavaCodeReferenceElement classReference2 = newExpression2.getClassReference();
   if (classReference1 == null || classReference2 == null) {
     return false;
   }
   final String text = classReference1.getText();
   if (!text.equals(classReference2.getText())) {
     return false;
   }
   final PsiExpression[] arrayDimensions1 = newExpression1.getArrayDimensions();
   final PsiExpression[] arrayDimensions2 = newExpression2.getArrayDimensions();
   if (!expressionListsAreEquivalent(arrayDimensions1, arrayDimensions2)) {
     return false;
   }
   final PsiArrayInitializerExpression arrayInitializer1 = newExpression1.getArrayInitializer();
   final PsiArrayInitializerExpression arrayInitializer2 = newExpression2.getArrayInitializer();
   if (!expressionsAreEquivalent(arrayInitializer1, arrayInitializer2)) {
     return false;
   }
   final PsiExpression qualifier1 = newExpression1.getQualifier();
   final PsiExpression qualifier2 = newExpression2.getQualifier();
   if (!expressionsAreEquivalent(qualifier1, qualifier2)) {
     return false;
   }
   final PsiExpressionList argumentList1 = newExpression1.getArgumentList();
   final PsiExpression[] args1;
   if (argumentList1 == null) {
     args1 = null;
   } else {
     args1 = argumentList1.getExpressions();
   }
   final PsiExpressionList argumentList2 = newExpression2.getArgumentList();
   final PsiExpression[] args2;
   if (argumentList2 == null) {
     args2 = null;
   } else {
     args2 = argumentList2.getExpressions();
   }
   return expressionListsAreEquivalent(args1, args2);
 }
 private static void removeParensFromNewExpression(
     @NotNull PsiNewExpression newExpression, boolean ignoreClarifyingParentheses) {
   final PsiExpression[] dimensions = newExpression.getArrayDimensions();
   for (PsiExpression dimension : dimensions) {
     removeParentheses(dimension, ignoreClarifyingParentheses);
   }
   final PsiExpression qualifier = newExpression.getQualifier();
   if (qualifier != null) {
     removeParentheses(qualifier, ignoreClarifyingParentheses);
   }
   final PsiExpression arrayInitializer = newExpression.getArrayInitializer();
   if (arrayInitializer != null) {
     removeParentheses(arrayInitializer, ignoreClarifyingParentheses);
   }
   final PsiExpressionList argumentList = newExpression.getArgumentList();
   if (argumentList != null) {
     final PsiExpression[] arguments = argumentList.getExpressions();
     for (PsiExpression argument : arguments) {
       removeParentheses(argument, ignoreClarifyingParentheses);
     }
   }
 }
  private static void changeNewOperatorType(
      PsiNewExpression originalExpression, PsiType toType, final Editor editor)
      throws IncorrectOperationException {
    PsiNewExpression newExpression;
    PsiElementFactory factory =
        JavaPsiFacade.getInstance(originalExpression.getProject()).getElementFactory();
    int caretOffset;
    TextRange selection;
    if (toType instanceof PsiArrayType) {
      final PsiExpression[] originalExpressionArrayDimensions =
          originalExpression.getArrayDimensions();
      caretOffset = 0;
      @NonNls String text = "new " + toType.getDeepComponentType().getCanonicalText() + "[";
      if (originalExpressionArrayDimensions.length > 0) {
        text += originalExpressionArrayDimensions[0].getText();
      } else {
        text += "0";
        caretOffset = -2;
      }
      text += "]";
      for (int i = 1; i < toType.getArrayDimensions(); i++) {
        text += "[";
        String arrayDimension = "";
        if (originalExpressionArrayDimensions.length > i) {
          arrayDimension = originalExpressionArrayDimensions[i].getText();
          text += arrayDimension;
        }
        text += "]";
        if (caretOffset < 0) {
          caretOffset -= arrayDimension.length() + 2;
        }
      }

      newExpression = (PsiNewExpression) factory.createExpressionFromText(text, originalExpression);
      if (caretOffset < 0) {
        selection = new TextRange(caretOffset, caretOffset + 1);
      } else {
        selection = null;
      }
    } else {
      final PsiAnonymousClass anonymousClass = originalExpression.getAnonymousClass();
      newExpression =
          (PsiNewExpression)
              factory.createExpressionFromText(
                  "new " + toType.getCanonicalText() + "()" + (anonymousClass != null ? "{}" : ""),
                  originalExpression);
      PsiExpressionList argumentList = originalExpression.getArgumentList();
      if (argumentList == null) return;
      newExpression.getArgumentList().replace(argumentList);
      if (anonymousClass == null) { // just to prevent useless inference
        if (PsiDiamondTypeUtil.canCollapseToDiamond(newExpression, originalExpression, toType)) {
          final PsiElement paramList =
              PsiDiamondTypeUtil.replaceExplicitWithDiamond(
                  newExpression.getClassOrAnonymousClassReference().getParameterList());
          newExpression = PsiTreeUtil.getParentOfType(paramList, PsiNewExpression.class);
        }
      }

      if (anonymousClass != null) {
        final PsiAnonymousClass newAnonymousClass =
            (PsiAnonymousClass) newExpression.getAnonymousClass().replace(anonymousClass);
        final PsiClass aClass = PsiUtil.resolveClassInType(toType);
        assert aClass != null;
        newAnonymousClass
            .getBaseClassReference()
            .replace(factory.createClassReferenceElement(aClass));
      }
      selection = null;
      caretOffset = -1;
    }
    PsiElement element = originalExpression.replace(newExpression);
    editor.getCaretModel().moveToOffset(element.getTextRange().getEndOffset() + caretOffset);
    editor.getScrollingModel().scrollToCaret(ScrollType.RELATIVE);
    if (selection != null) {
      selection = selection.shiftRight(element.getTextRange().getEndOffset());
      editor.getSelectionModel().setSelection(selection.getStartOffset(), selection.getEndOffset());
    }
  }