void (@NotNull PsiElement element, @NotNull PsiClass generatedClass, @NotNull PsiClass extractedClass) { generatedClass.putUserData(LightMethodObjectExtractedData.REFERENCED_TYPE, PsiTypesUtil.getClassType(extractedClass)); element.accept(new JavaRecursiveElementVisitor() { @Override public void visitNewExpression(@NotNull PsiNewExpression expression) { super.visitNewExpression(expression); PsiMethod constructor = expression.resolveConstructor(); if (constructor != null && generatedClass.equals(constructor.getContainingClass())) { List<PsiMethod> methods = ContainerUtil.filter(extractedClass.getConstructors(), x -> isSameMethod(x, constructor)); if (methods.size() == 1) { LOG.info("Replace constructor: " + constructor.getName()); constructor.putUserData(LightMethodObjectExtractedData.REFERENCE_METHOD, methods.get(0)); } } } @Override public void visitMethodCallExpression(@NotNull PsiMethodCallExpression expression) { super.visitMethodCallExpression(expression); PsiMethod method = expression.resolveMethod(); if (method != null && generatedClass.equals(method.getContainingClass())) { List<PsiMethod> methods = ContainerUtil.filter(extractedClass.getMethods(), x -> isSameMethod(x, method)); if (methods.size() == 1) { LOG.info("Replace method: " + method.getName()); method.putUserData(LightMethodObjectExtractedData.REFERENCE_METHOD, methods.get(0)); } } } private static boolean isSameMethod(@NotNull PsiMethod first, @NotNull PsiMethod second) { if (first.getName().equals(second.getName())) { return first.getParameterList().getParametersCount() == second.getParameterList().getParametersCount(); } return false; } }); }