diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt index 2723aea984d..f333bf4c43c 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/JavaSymbolProvider.kt @@ -195,27 +195,15 @@ class JavaSymbolProvider( // 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; - // 2. bound/supertype conversion should happen here for the same reason; - // 3. type enhancement requires annotations to be already present (and supertypes can refer to type parameters). + // 2. type enhancement requires annotations to be already present (and supertypes can refer to type parameters). firJavaClass.annotations.addFromJava(session, javaClass, javaTypeParameterStack) val enhancement = FirSignatureEnhancement(firJavaClass, session) { emptyList() } enhancement.enhanceTypeParameterBounds(firJavaClass.typeParameters) - firJavaClass.convertSuperTypes(javaClass, javaTypeParameterStack) + firJavaClass.superTypeRefs.replaceAll { enhancement.enhanceSuperType(it) } firJavaClass.replaceDeprecation(firJavaClass.getDeprecationInfos(session.languageVersionSettings.apiVersion)) return firJavaClass } - private fun FirJavaClass.convertSuperTypes( - javaClass: JavaClass, - javaTypeParameterStack: JavaTypeParameterStack - ) { - replaceSuperTypeRefs( - javaClass.supertypes.map { supertype -> - supertype.toFirResolvedTypeRef(session, javaTypeParameterStack, FirJavaTypeConversionMode.SUPERTYPE) - } - ) - } - private fun createFirJavaClass( javaClass: JavaClass, classSymbol: FirRegularClassSymbol, @@ -255,6 +243,7 @@ class JavaSymbolProvider( buildOuterClassTypeParameterRef { symbol = it.symbol } } } + javaClass.supertypes.mapTo(superTypeRefs) { it.toFirJavaTypeRef(session, javaTypeParameterStack) } val dispatchReceiver = classId.defaultType(typeParameters.map { it.symbol }) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt index ea9ed6b81ba..4b3ce3a7419 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt @@ -352,6 +352,12 @@ class FirSignatureEnhancement( AnnotationQualifierApplicabilityType.TYPE_PARAMETER_BOUNDS, context.defaultTypeQualifiers ).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( diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/SelfType.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/SelfType.fir.kt index 4d1dd5526b2..edb34a9cc8f 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/SelfType.fir.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/SelfType.fir.kt @@ -39,15 +39,18 @@ public class CKN extends C<@Nullable CK> {} // FILE: main.kt fun main(ak: AK, akn: AKN, bk: BK, ck: CK, ckn: CKN): Unit { ak.foo(ak) - ak.foo(null) + // jspecify_nullness_mismatch + ak.foo(null) akn.foo(null) bk.foo(bk) - bk.foo(null) + // jspecify_nullness_mismatch + bk.foo(null) ck.foo(ck) - ck.foo(null) + // jspecify_nullness_mismatch + ck.foo(null) ckn.foo(null) } diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/SelfType.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/SelfType.fir.kt index 778782e4bcb..df115e1875d 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/SelfType.fir.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/SelfType.fir.kt @@ -40,15 +40,15 @@ public class CKN extends C<@Nullable CK> {} // FILE: main.kt fun main(ak: AK, akn: AKN, bk: BK, ck: CK, ckn: CKN): Unit { ak.foo(ak) - ak.foo(null) + ak.foo(null) akn.foo(null) // the corresponding warning/error is present on the Java side bk.foo(bk) - bk.foo(null) + bk.foo(null) ck.foo(ck) - ck.foo(null) + ck.foo(null) ckn.foo(null) // the corresponding warning/error is present on the Java side } diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/warningsBasedOnEnhancedBasedType.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/warningsBasedOnEnhancedBasedType.fir.kt index 687cca1fcb2..a7cdf0ba42f 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/warningsBasedOnEnhancedBasedType.fir.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/misc/warningsBasedOnEnhancedBasedType.fir.kt @@ -19,5 +19,5 @@ class Test extends Base<@Nullable String> {} fun takeBaseOfNotNullStrings(x: Base) {} fun main() { - val x = takeBaseOfNotNullStrings(Test()) + val x = takeBaseOfNotNullStrings(Test()) }