diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java index 42daf4dc4723..ddbf7714d982 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java @@ -1539,7 +1539,10 @@ public class HighlightMethodUtil { boolean applicable = true; try { - applicable = constructor != null && result.isApplicable(); + final PsiDiamondType diamondType = constructorCall instanceof PsiNewExpression ? PsiDiamondType.getDiamondType((PsiNewExpression)constructorCall) : null; + final JavaResolveResult staticFactory = diamondType != null ? diamondType.getStaticFactory() : null; + applicable = staticFactory instanceof MethodCandidateInfo ? ((MethodCandidateInfo)staticFactory).isApplicable() + : result != null && result.isApplicable(); } catch (IndexNotReadyException e) { // ignore diff --git a/java/java-psi-api/src/com/intellij/psi/PsiDiamondType.java b/java/java-psi-api/src/com/intellij/psi/PsiDiamondType.java index 4789f5c2ecf7..08f0b90111c5 100644 --- a/java/java-psi-api/src/com/intellij/psi/PsiDiamondType.java +++ b/java/java-psi-api/src/com/intellij/psi/PsiDiamondType.java @@ -19,6 +19,7 @@ import com.intellij.openapi.util.RecursionGuard; import com.intellij.openapi.util.RecursionManager; import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -180,5 +181,6 @@ public abstract class PsiDiamondType extends PsiType { return null; } + @Nullable public abstract JavaResolveResult getStaticFactory(); } diff --git a/java/java-psi-impl/src/com/intellij/psi/PsiDiamondTypeImpl.java b/java/java-psi-impl/src/com/intellij/psi/PsiDiamondTypeImpl.java index 551677ec794b..2503c530b495 100644 --- a/java/java-psi-impl/src/com/intellij/psi/PsiDiamondTypeImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/PsiDiamondTypeImpl.java @@ -116,6 +116,7 @@ public class PsiDiamondTypeImpl extends PsiDiamondType { return PsiTreeUtil.getParentOfType(typeElementWithDiamondTypeArgument, PsiNewExpression.class, true, PsiTypeElement.class); } + @Nullable @Override public JavaResolveResult getStaticFactory() { final PsiNewExpression newExpression = getNewExpression(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/diamond/EnsureApplicabilityForDiamondCallIsCheckedBasedOnStaticFactoryApplicability.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/diamond/EnsureApplicabilityForDiamondCallIsCheckedBasedOnStaticFactoryApplicability.java new file mode 100644 index 000000000000..41600818cd1e --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/diamond/EnsureApplicabilityForDiamondCallIsCheckedBasedOnStaticFactoryApplicability.java @@ -0,0 +1,20 @@ +import java.util.Comparator; +import java.util.Optional; +import java.util.stream.Collector; +import java.util.stream.Collectors; + +class Collectinator { + Collectinator(Collector collector) { + } + + static Collectinator create(Collector c) { + return new Collectinator(c); + } + + public static void foo(Comparator compareTo) { + Collectinator> foo = new Collectinator< >(Collectors.maxBy(compareTo)); + Collectinator> foo1 = Collectinator.create(Collectors.maxBy(compareTo)); + } +} + +class Foo {} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/diamond/EraseTypeForNewExpressionWithDiamondsIfUncheckedConversionWasPerformedDuringApplicabilityCheck.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/diamond/EraseTypeForNewExpressionWithDiamondsIfUncheckedConversionWasPerformedDuringApplicabilityCheck.java index 0ce05d8d8ed3..be8587fc9bc6 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/diamond/EraseTypeForNewExpressionWithDiamondsIfUncheckedConversionWasPerformedDuringApplicabilityCheck.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/diamond/EraseTypeForNewExpressionWithDiamondsIfUncheckedConversionWasPerformedDuringApplicabilityCheck.java @@ -6,7 +6,7 @@ class Test { Holder dataHolder = null; Result r3 = new Result<>(new Holder<>(dataHolder)); - Result r4 = Result.create(new Holder<>(dataHolder)); + Result r4 = Result.create(new Holder<>(dataHolder)); Result r5 = new Result<>(Holder.create(dataHolder)); Result r6 = Result.create(Holder.create(dataHolder)); diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Diamond8HighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Diamond8HighlightingTest.java index 7a7898d76757..aa1efd90c51c 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Diamond8HighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Diamond8HighlightingTest.java @@ -65,6 +65,10 @@ public class Diamond8HighlightingTest extends LightDaemonAnalyzerTestCase { doTest(); } + public void testEnsureApplicabilityForDiamondCallIsCheckedBasedOnStaticFactoryApplicability() throws Exception { + doTest(); + } + private void doTest() throws Exception { doTest(BASE_PATH + "/" + getTestName(false) + ".java", false, false); }