FIR: enhance Java super types

This commit is contained in:
pyos
2021-08-12 20:40:32 +02:00
committed by teamcityserver
parent 03304bce96
commit 2847de10ac
5 changed files with 19 additions and 21 deletions
@@ -195,27 +195,15 @@ class JavaSymbolProvider(
// There's a bit of an ordering restriction here: // There's a bit of an ordering restriction here:
// 1. annotations should be added after the symbol is bound, as annotations can refer to the class itself; // 1. annotations should be added after the symbol is bound, as annotations can refer to the class itself;
// 2. bound/supertype conversion should happen here for the same reason; // 2. type enhancement requires annotations to be already present (and supertypes can refer to type parameters).
// 3. type enhancement requires annotations to be already present (and supertypes can refer to type parameters).
firJavaClass.annotations.addFromJava(session, javaClass, javaTypeParameterStack) firJavaClass.annotations.addFromJava(session, javaClass, javaTypeParameterStack)
val enhancement = FirSignatureEnhancement(firJavaClass, session) { emptyList() } val enhancement = FirSignatureEnhancement(firJavaClass, session) { emptyList() }
enhancement.enhanceTypeParameterBounds(firJavaClass.typeParameters) enhancement.enhanceTypeParameterBounds(firJavaClass.typeParameters)
firJavaClass.convertSuperTypes(javaClass, javaTypeParameterStack) firJavaClass.superTypeRefs.replaceAll { enhancement.enhanceSuperType(it) }
firJavaClass.replaceDeprecation(firJavaClass.getDeprecationInfos(session.languageVersionSettings.apiVersion)) firJavaClass.replaceDeprecation(firJavaClass.getDeprecationInfos(session.languageVersionSettings.apiVersion))
return firJavaClass return firJavaClass
} }
private fun FirJavaClass.convertSuperTypes(
javaClass: JavaClass,
javaTypeParameterStack: JavaTypeParameterStack
) {
replaceSuperTypeRefs(
javaClass.supertypes.map { supertype ->
supertype.toFirResolvedTypeRef(session, javaTypeParameterStack, FirJavaTypeConversionMode.SUPERTYPE)
}
)
}
private fun createFirJavaClass( private fun createFirJavaClass(
javaClass: JavaClass, javaClass: JavaClass,
classSymbol: FirRegularClassSymbol, classSymbol: FirRegularClassSymbol,
@@ -255,6 +243,7 @@ class JavaSymbolProvider(
buildOuterClassTypeParameterRef { symbol = it.symbol } buildOuterClassTypeParameterRef { symbol = it.symbol }
} }
} }
javaClass.supertypes.mapTo(superTypeRefs) { it.toFirJavaTypeRef(session, javaTypeParameterStack) }
val dispatchReceiver = classId.defaultType(typeParameters.map { it.symbol }) val dispatchReceiver = classId.defaultType(typeParameters.map { it.symbol })
@@ -352,6 +352,12 @@ class FirSignatureEnhancement(
AnnotationQualifierApplicabilityType.TYPE_PARAMETER_BOUNDS, context.defaultTypeQualifiers AnnotationQualifierApplicabilityType.TYPE_PARAMETER_BOUNDS, context.defaultTypeQualifiers
).enhance(bound, emptyList(), FirJavaTypeConversionMode.TYPE_PARAMETER_BOUND) ).enhance(bound, emptyList(), FirJavaTypeConversionMode.TYPE_PARAMETER_BOUND)
fun enhanceSuperType(type: FirTypeRef): FirTypeRef =
EnhancementSignatureParts(
session, typeQualifierResolver, null, isCovariant = false, forceOnlyHeadTypeConstructor = false,
AnnotationQualifierApplicabilityType.TYPE_USE, context.defaultTypeQualifiers
).enhance(type, emptyList(), FirJavaTypeConversionMode.SUPERTYPE)
// ================================================================================================ // ================================================================================================
private fun enhanceReceiverType( private fun enhanceReceiverType(
@@ -39,15 +39,18 @@ public class CKN extends C<@Nullable CK> {}
// FILE: main.kt // FILE: main.kt
fun main(ak: AK, akn: AKN, bk: BK, ck: CK, ckn: CKN): Unit { fun main(ak: AK, akn: AKN, bk: BK, ck: CK, ckn: CKN): Unit {
ak.foo(ak) ak.foo(ak)
ak.foo(null) // jspecify_nullness_mismatch
ak.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
akn.foo(null) akn.foo(null)
bk.foo(bk) bk.foo(bk)
bk.foo(null) // jspecify_nullness_mismatch
bk.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
ck.foo(ck) ck.foo(ck)
ck.foo(null) // jspecify_nullness_mismatch
ck.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
ckn.foo(null) ckn.foo(null)
} }
@@ -40,15 +40,15 @@ public class CKN extends C<@Nullable CK> {}
// FILE: main.kt // FILE: main.kt
fun main(ak: AK, akn: AKN, bk: BK, ck: CK, ckn: CKN): Unit { fun main(ak: AK, akn: AKN, bk: BK, ck: CK, ckn: CKN): Unit {
ak.foo(ak) ak.foo(ak)
ak.foo(null) ak.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
akn.foo(null) // the corresponding warning/error is present on the Java side akn.foo(null) // the corresponding warning/error is present on the Java side
bk.foo(bk) bk.foo(bk)
bk.foo(null) bk.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
ck.foo(ck) ck.foo(ck)
ck.foo(null) ck.foo(<!NULL_FOR_NONNULL_TYPE!>null<!>)
ckn.foo(null) // the corresponding warning/error is present on the Java side ckn.foo(null) // the corresponding warning/error is present on the Java side
} }
@@ -19,5 +19,5 @@ class Test extends Base<@Nullable String> {}
fun takeBaseOfNotNullStrings(x: Base<String>) {} fun takeBaseOfNotNullStrings(x: Base<String>) {}
fun main() { fun main() {
val x = takeBaseOfNotNullStrings(Test()) val x = takeBaseOfNotNullStrings(<!ARGUMENT_TYPE_MISMATCH!>Test()<!>)
} }