new inference: teach strict subtyping constraint about intersection types (IDEA-129727)

This commit is contained in:
Anna Kozlova
2014-09-11 09:49:51 +04:00
parent e2714de6ad
commit 16838a8c11
3 changed files with 35 additions and 2 deletions
@@ -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);
@@ -0,0 +1,15 @@
import java.io.Serializable;
import java.util.function.Supplier;
class Test {
static class Loader<K> {
static <K> Loader<K> from(Supplier<K> supplier) {
return new Loader<>();
}
}
Loader loader = Loader.from((I<String> & Serializable) () -> "");
interface I<H> extends Supplier<H>{}
}
@@ -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);
}