PsiMethodCallExpression (Project project, PsiType selectedType, ExtractMethodProcessor processor) { final PsiClassType.ClassResolveResult resolveResult = PsiUtil.resolveGenericsClassInType(selectedType); final PsiClass wrapperClass = resolveResult.getElement(); final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project); final PsiMethod method = LambdaUtil.getFunctionalInterfaceMethod(wrapperClass); assert method != null : "not functional class"; final String interfaceMethodName = method.getName(); processor.setMethodName(interfaceMethodName); processor.doExtract(); final PsiMethod extractedMethod = processor.getExtractedMethod(); final PsiParameter[] parameters = extractedMethod.getParameterList().getParameters(); final PsiParameter[] interfaceParameters = method.getParameterList().getParameters(); final PsiSubstitutor substitutor = resolveResult.getSubstitutor(); for (int i = 0; i < interfaceParameters.length; i++) { final PsiTypeElement typeAfterInterface = factory.createTypeElement(substitutor.substitute(interfaceParameters[i].getType())); final PsiTypeElement typeElement = parameters[i].getTypeElement(); if (typeElement != null) { typeElement.replace(typeAfterInterface); } } final PsiMethodCallExpression methodCall = processor.getMethodCall(); PsiMethodCallExpression psiExpression = (PsiMethodCallExpression)factory .createExpressionFromText("new " + selectedType.getCanonicalText() + "() {" + "}." + methodCall.getText(), methodCall); PsiExpression qualifierExpression = psiExpression.getMethodExpression().getQualifierExpression(); assert qualifierExpression != null; PsiAnonymousClass anonymousClass = ((PsiNewExpression)qualifierExpression).getAnonymousClass(); assert anonymousClass != null; ChangeContextUtil.encodeContextInfo(extractedMethod, true); PsiClass aClass = extractedMethod.getContainingClass(); ChangeContextUtil.decodeContextInfo(anonymousClass.add(extractedMethod), aClass, RefactoringChangeUtil.createThisExpression(anonymousClass.getManager(), aClass)); if (AnonymousCanBeLambdaInspection.canBeConvertedToLambda(anonymousClass, false, Collections.emptySet())) { PsiExpression castExpression = JavaPsiFacade.getElementFactory(project) .createExpressionFromText("((" + selectedType.getCanonicalText() + ")" + AnonymousCanBeLambdaInspection.replaceAnonymousWithLambda(qualifierExpression, selectedType).getText() + ")", qualifierExpression); qualifierExpression.replace(castExpression); } extractedMethod.delete(); return (PsiMethodCallExpression)JavaCodeStyleManager.getInstance(project).shortenClassReferences(methodCall.replace(psiExpression)); }