diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiDiamondTypeUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiDiamondTypeUtil.java index 589b902fbab2..5bb044c3ffab 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiDiamondTypeUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiDiamondTypeUtil.java @@ -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; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantTypeArgs/beforeNestedCallWithMethodRef.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantTypeArgs/beforeNestedCallWithMethodRef.java new file mode 100644 index 000000000000..35e8c7666fb4 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantTypeArgs/beforeNestedCallWithMethodRef.java @@ -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 input, Function length) { + input.stream().collect(Collectors.groupingBy(length, + Collectors.collectingAndThen(Collectors.ring>maxBy(Comparator.naturalOrder()), Optional::get))); + } +} \ No newline at end of file