FIR: enhance Java super types
This commit is contained in:
@@ -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 })
|
||||||
|
|
||||||
|
|||||||
+6
@@ -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(
|
||||||
|
|||||||
compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/SelfType.fir.kt
Vendored
+6
-3
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
+3
-3
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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()<!>)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user