[FIR] fix subtyping for definitely notnull types.

The current implementation doesn't consider Foo a subtype of Captured<in
Foo>!!, since AbstractTypeCheckerContext::checkSubtypeForSpecialCases
does not handle DefinitelyNotNullType cases. This PR adds handling of
DefinitelyNotNullType by looking at its original type.

^KT-42824 Fixed
This commit is contained in:
Juan Chen
2020-10-27 04:18:31 +03:00
committed by Mikhail Glukhikh
parent eb804709da
commit 9486f58fb1
11 changed files with 79 additions and 14 deletions
@@ -16041,6 +16041,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/javaInterop/generics/javaNestedSamInterface.kt");
}
@TestMetadata("kt42824.kt")
public void testKt42824() throws Exception {
runTest("compiler/testData/codegen/box/javaInterop/generics/kt42824.kt");
}
@TestMetadata("kt42825.kt")
public void testKt42825() throws Exception {
runTest("compiler/testData/codegen/box/javaInterop/generics/kt42825.kt");
@@ -8,9 +8,7 @@ package org.jetbrains.kotlin.ir.types
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.types.AbstractTypeCheckerContext
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
import org.jetbrains.kotlin.types.model.SimpleTypeMarker
import org.jetbrains.kotlin.types.model.TypeConstructorMarker
import org.jetbrains.kotlin.types.model.*
open class IrTypeCheckerContext(override val irBuiltIns: IrBuiltIns) : IrTypeSystemContext, AbstractTypeCheckerContext() {
@@ -49,4 +47,15 @@ open class IrTypeCheckerContext(override val irBuiltIns: IrBuiltIns) : IrTypeSys
override fun captureFromExpression(type: KotlinTypeMarker): KotlinTypeMarker? =
error("Captured type is unsupported in IR")
override fun DefinitelyNotNullTypeMarker.original(): SimpleTypeMarker =
error("DefinitelyNotNull type is unsupported in IR")
override fun KotlinTypeMarker.makeDefinitelyNotNullOrNotNull(): KotlinTypeMarker {
error("makeDefinitelyNotNullOrNotNull is not supported in IR")
}
override fun SimpleTypeMarker.makeSimpleTypeDefinitelyNotNullOrNotNull(): SimpleTypeMarker {
error("makeSimpleTypeDefinitelyNotNullOrNotNull is not yet supported in IR")
}
}
@@ -0,0 +1,21 @@
// FILE: DiagnosticFactory0.java
import org.jetbrains.annotations.NotNull;
public class DiagnosticFactory0<E> {
@NotNull
public SimpleDiagnostic<E> on(@NotNull E element) {
return new SimpleDiagnostic<>(element);
}
}
// FILE: test.kt
class SimpleDiagnostic<E>(val element: E)
interface KtAnnotationEntry
fun foo(error: DiagnosticFactory0<in KtAnnotationEntry>, entry: KtAnnotationEntry) {
error.on(entry) // used to be INAPPLICABLE_CANDIDATE
}
fun box() = "OK"
@@ -17441,6 +17441,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/javaInterop/generics/javaNestedSamInterface.kt");
}
@TestMetadata("kt42824.kt")
public void testKt42824() throws Exception {
runTest("compiler/testData/codegen/box/javaInterop/generics/kt42824.kt");
}
@TestMetadata("kt42825.kt")
public void testKt42825() throws Exception {
runTest("compiler/testData/codegen/box/javaInterop/generics/kt42825.kt");
@@ -17441,6 +17441,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/javaInterop/generics/javaNestedSamInterface.kt");
}
@TestMetadata("kt42824.kt")
public void testKt42824() throws Exception {
runTest("compiler/testData/codegen/box/javaInterop/generics/kt42824.kt");
}
@TestMetadata("kt42825.kt")
public void testKt42825() throws Exception {
runTest("compiler/testData/codegen/box/javaInterop/generics/kt42825.kt");
@@ -16041,6 +16041,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/javaInterop/generics/javaNestedSamInterface.kt");
}
@TestMetadata("kt42824.kt")
public void testKt42824() throws Exception {
runTest("compiler/testData/codegen/box/javaInterop/generics/kt42824.kt");
}
@TestMetadata("kt42825.kt")
public void testKt42825() throws Exception {
runTest("compiler/testData/codegen/box/javaInterop/generics/kt42825.kt");