String (PsiMethodCallExpression entrySetCall, PsiParameter entryParameter, PsiElement body, CommentTracker ct) { PsiType entryType = entryParameter.getType(); ParameterCandidate key = new ParameterCandidate(entryType, true); ParameterCandidate value = new ParameterCandidate(entryType, false); List<PsiReferenceExpression> references = VariableAccessUtils.getVariableReferences(entryParameter, body); for (PsiReferenceExpression ref : references) { PsiMethodCallExpression entryCall = ExpressionUtils.getCallForQualifier(ref); if (ENTRY_GETTER.test(entryCall)) { ParameterCandidate.select(entryCall, key, value).accept(entryCall); } } key.createName(body, ct); value.createName(body, ct); PsiElementFactory factory = JavaPsiFacade.getElementFactory(entrySetCall.getProject()); for (PsiExpression expression : references) { if (!expression.isValid()) continue; PsiMethodCallExpression entryCall = ExpressionUtils.getCallForQualifier(expression); if (ENTRY_GETTER.test(entryCall)) { ct.replace(entryCall, ParameterCandidate.select(entryCall, key, value).myName); } } String lambdaBody; if (body instanceof PsiExpression || body instanceof PsiCodeBlock || body instanceof PsiBlockStatement) { lambdaBody = ct.text(body); } else { lambdaBody = "{" + ct.text(body) + "}"; } PsiLambdaExpression newLambda = (PsiLambdaExpression)factory.createExpressionFromText("(" + key.myName + "," + value.myName + ")->" + lambdaBody, body); LambdaRefactoringUtil.simplifyToExpressionLambda(newLambda); entrySetCall.getArgumentList().add(newLambda); ExpressionUtils.bindCallTo(entrySetCall, "forEach"); return ct.text(entrySetCall); }