redundant type arguments: check all methods applicability till top level (IDEA-166696)

This commit is contained in:
Anna Kozlova
2017-01-19 17:25:30 +03:00
parent ac44e446fb
commit f28bfb5bcb
2 changed files with 27 additions and 1 deletions

View File

@@ -23,6 +23,7 @@ import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.infos.MethodCandidateInfo;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiTypesUtil;
import com.intellij.psi.util.PsiUtil;
@@ -243,7 +244,8 @@ public class PsiDiamondTypeUtil {
return false;
}
}
return true;
return checkParentApplicability(exprCopy);
}
private static boolean isInferenceEquivalent(PsiType[] typeArguments,
@@ -283,6 +285,18 @@ public class PsiDiamondTypeUtil {
return false;
}
}
return checkParentApplicability(exprCopy);
}
private static boolean checkParentApplicability(PsiCallExpression exprCopy) {
while (exprCopy != null){
final JavaResolveResult resolveResult = exprCopy.resolveMethodGenerics();
if (resolveResult instanceof MethodCandidateInfo && !((MethodCandidateInfo)resolveResult).isApplicable()) {
return false;
}
exprCopy = PsiTreeUtil.getParentOfType(exprCopy, PsiCallExpression.class, true);
}
return true;
}

View File

@@ -0,0 +1,12 @@
// "Remove explicit type arguments" "false"
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
class Test {
void foo(List<String> input, Function<String, Integer> length) {
input.stream().collect(Collectors.groupingBy(length,
Collectors.collectingAndThen(Collectors.<St<caret>ring>maxBy(Comparator.naturalOrder()), Optional::get)));
}
}