@Override
 public void visitNewExpression(PsiNewExpression expression) {
   super.visitNewExpression(expression);
   final PsiJavaCodeReferenceElement classReference = expression.getClassReference();
   if (classReference == null) {
     return;
   }
   final String name = classReference.getReferenceName();
   if (!"BigDecimal".equals(name)) {
     return;
   }
   final PsiMethod constructor = expression.resolveConstructor();
   if (constructor == null) {
     return;
   }
   final PsiParameterList parameterList = constructor.getParameterList();
   final int length = parameterList.getParametersCount();
   if (length != 1 && length != 2) {
     return;
   }
   final PsiParameter[] parameters = parameterList.getParameters();
   final PsiParameter firstParameter = parameters[0];
   final PsiType type = firstParameter.getType();
   if (type != PsiType.DOUBLE) {
     return;
   }
   registerNewExpressionError(expression);
 }
 public InspectionGadgetsFix buildFix(Object... infos) {
   final PsiNewExpression expression = (PsiNewExpression) infos[0];
   final PsiJavaCodeReferenceElement classReference = expression.getClassReference();
   assert classReference != null;
   final String className = classReference.getText();
   return new CachedNumberConstructorCallFix(className);
 }
 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);
 }
  static boolean isSideEffectFreeConstructor(PsiNewExpression newExpression) {
    PsiJavaCodeReferenceElement classReference = newExpression.getClassReference();
    PsiClass aClass = classReference == null ? null : (PsiClass) classReference.resolve();
    String qualifiedName = aClass == null ? null : aClass.getQualifiedName();
    if (qualifiedName == null) return false;
    if (ourSideEffectFreeClasses.contains(qualifiedName)) return true;

    PsiFile file = aClass.getContainingFile();
    PsiDirectory directory = file.getContainingDirectory();
    PsiPackage classPackage = JavaDirectoryService.getInstance().getPackage(directory);
    String packageName = classPackage == null ? null : classPackage.getQualifiedName();

    // all Throwable descendants from java.lang are side effects free
    if ("java.lang".equals(packageName) || "java.io".equals(packageName)) {
      PsiClass throwableClass =
          JavaPsiFacade.getInstance(aClass.getProject())
              .findClass("java.lang.Throwable", aClass.getResolveScope());
      if (throwableClass != null
          && InheritanceUtil.isInheritorOrSelf(aClass, throwableClass, true)) {
        return true;
      }
    }
    return false;
  }