diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/StrictSubtypingConstraint.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/StrictSubtypingConstraint.java index 412b09eadec3..6b3c104aab35 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/StrictSubtypingConstraint.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/resolve/graphInference/constraints/StrictSubtypingConstraint.java @@ -92,8 +92,22 @@ public class StrictSubtypingConstraint implements ConstraintFormula { return false; } - if (!(myS instanceof PsiClassType)) return false; - PsiClassType.ClassResolveResult SResult = ((PsiClassType)myS).resolveGenerics(); + PsiClassType.ClassResolveResult SResult = null; + if (myS instanceof PsiIntersectionType) { + for (PsiType conjunct : ((PsiIntersectionType)myS).getConjuncts()) { + if (conjunct instanceof PsiClassType) { + final PsiClassType.ClassResolveResult conjunctResult = ((PsiClassType)conjunct).resolveGenerics(); + if (InheritanceUtil.isInheritorOrSelf(conjunctResult.getElement(), CClass, true)) { + SResult = conjunctResult; + break; + } + } + } + } else if (myS instanceof PsiClassType) { + SResult = ((PsiClassType)myS).resolveGenerics(); + } + + if (SResult == null) return false; PsiClass SClass = SResult.getElement(); if (((PsiClassType)myT).isRaw()) { return SClass != null && InheritanceUtil.isInheritorOrSelf(SClass, CClass, true); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/constraints/IntersectionTypeStrictSubtypingConstraint.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/constraints/IntersectionTypeStrictSubtypingConstraint.java new file mode 100644 index 000000000000..df18646a0009 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/constraints/IntersectionTypeStrictSubtypingConstraint.java @@ -0,0 +1,15 @@ +import java.io.Serializable; +import java.util.function.Supplier; + +class Test { + static class Loader { + + static Loader from(Supplier supplier) { + return new Loader<>(); + } + } + + Loader loader = Loader.from((I & Serializable) () -> ""); + + interface I extends Supplier{} +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/ConstraintsInferenceMiscTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/ConstraintsInferenceMiscTest.java index 9ab0ba5fae37..08857080b060 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/ConstraintsInferenceMiscTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/ConstraintsInferenceMiscTest.java @@ -54,6 +54,10 @@ public class ConstraintsInferenceMiscTest extends LightDaemonAnalyzerTestCase { doTest(false); } + public void testIntersectionTypeStrictSubtypingConstraint() throws Exception { + doTest(false); + } + private void doTest(final boolean checkWarnings) { doTest(BASE_PATH + "/" + getTestName(false) + ".java", checkWarnings, false); }