PsiMethod (PsiExpression initializer, PsiExpression expr, PsiType varType) { final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(initializer.getProject()); if (expr instanceof PsiCallExpression && ((PsiCallExpression)expr).getTypeArguments().length == 0) { final JavaResolveResult resolveResult = ((PsiCallExpression)initializer).resolveMethodGenerics(); final PsiElement resolved = resolveResult.getElement(); if (resolved instanceof PsiMethod) { final PsiTypeParameter[] typeParameters = ((PsiMethod)resolved).getTypeParameters(); if (typeParameters.length > 0) { final PsiCallExpression copy = (PsiCallExpression)expr.copy(); for (final PsiTypeParameter typeParameter : typeParameters) { final PsiType substituted = resolveResult.getSubstitutor().substitute(typeParameter); if (substituted == null) break; copy.getTypeArgumentList().add(elementFactory.createTypeElement(substituted)); } if (varType.equals(copy.getType()) && copy.resolveMethodGenerics().isValidResult()) { ((PsiCallExpression)expr).getTypeArgumentList().replace(copy.getTypeArgumentList()); return (PsiMethod)resolved; } } } } return null; }