mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
new inference: teach strict subtyping constraint about intersection types (IDEA-129727)
This commit is contained in:
+16
-2
@@ -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);
|
||||
|
||||
+15
@@ -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>{}
|
||||
}
|
||||
+4
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user