void (int i, PsiTypeCastExpression arg, PsiExpression[] newArgs, PsiCall oldCall, PsiCall newCall) { final PsiTypeElement castTypeElement = arg.getCastType(); final PsiType castType = castTypeElement != null ? castTypeElement.getType() : null; PsiExpression castOperand = ((PsiTypeCastExpression)Objects.requireNonNull(deparenthesizeExpression(newArgs[i]))).getOperand(); if (castOperand == null) return; newArgs[i] = (PsiExpression)newArgs[i].replace(castOperand); JavaResolveResult oldResult = oldCall.resolveMethodGenerics(); final JavaResolveResult newResult = resolveNewResult(oldCall, newCall); PsiMethod oldMethod = (PsiMethod)oldResult.getElement(); LOG.assertTrue(oldMethod != null); PsiParameter[] parameters = oldMethod.getParameterList().getParameters(); if (i == newArgs.length - 1 && newArgs.length == parameters.length && parameters[i].isVarArgs() && (NullArgumentToVariableArgMethodInspection.isSuspiciousVararg(newCall, newArgs[i].getType(), () -> (PsiMethod)newResult.getElement()) || oldResult instanceof MethodCandidateInfo && newResult instanceof MethodCandidateInfo && ((MethodCandidateInfo)oldResult).getApplicabilityLevel() != ((MethodCandidateInfo)newResult).getApplicabilityLevel())) { newArgs[i].replace(arg); return; } if (isSameResolveResult(oldResult, newResult)) { PsiExpression newArg = PsiUtil.deparenthesizeExpression(newArgs[i]); if (newArg instanceof PsiFunctionalExpression) { PsiType newArgType = calculateNewArgType(i, newResult, parameters); if (Comparing.equal(castType, ((PsiFunctionalExpression)newArg).getGroundTargetType(newArgType))) { addToResults(arg); return; } } else if (newArg instanceof PsiCallExpression) { //if top method is not generic, all inference problems may be collected in the argument itself JavaResolveResult result = ((PsiCallExpression)newArg).resolveMethodGenerics(); if (!(result instanceof MethodCandidateInfo) || ((MethodCandidateInfo)result).getInferenceErrorMessage() == null) { addToResults(arg); return; } } else { addToResults(arg); return; } } newArgs[i].replace(arg); }