[K2]: Support java-kotlin interop for @SubclassOptInRequired

Previously, if the parent class was in Java code and the subclass in
Kotlin, the opt-in usage error would not be reported for the subclass.
The problem was that the extractClassFromArgument function couldn't get
the class type from Java code. It was looking for a ConeClassLikeType,
but found a ConeFlexibleType instead.

#KT-60258 Fixed
This commit is contained in:
Anastasia.Nekrasova
2024-01-12 15:51:18 +02:00
committed by Space Team
parent 9fafbc1b07
commit 8156c91c47
8 changed files with 63 additions and 4 deletions
@@ -42259,6 +42259,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/InnerClasses.kt"); runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/InnerClasses.kt");
} }
@Test
@TestMetadata("JavaKotlinInterop.kt")
public void testJavaKotlinInterop() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/JavaKotlinInterop.kt");
}
@Test @Test
@TestMetadata("NestedClasses.kt") @TestMetadata("NestedClasses.kt")
public void testNestedClasses() throws Exception { public void testNestedClasses() throws Exception {
@@ -42259,6 +42259,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/InnerClasses.kt"); runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/InnerClasses.kt");
} }
@Test
@TestMetadata("JavaKotlinInterop.kt")
public void testJavaKotlinInterop() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/JavaKotlinInterop.kt");
}
@Test @Test
@TestMetadata("NestedClasses.kt") @TestMetadata("NestedClasses.kt")
public void testNestedClasses() throws Exception { public void testNestedClasses() throws Exception {
@@ -39973,6 +39973,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/InnerClasses.kt"); runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/InnerClasses.kt");
} }
@Test
@TestMetadata("JavaKotlinInterop.kt")
public void testJavaKotlinInterop() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/JavaKotlinInterop.kt");
}
@Test @Test
@TestMetadata("NestedClasses.kt") @TestMetadata("NestedClasses.kt")
public void testNestedClasses() throws Exception { public void testNestedClasses() throws Exception {
@@ -40093,6 +40093,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/InnerClasses.kt"); runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/InnerClasses.kt");
} }
@Test
@TestMetadata("JavaKotlinInterop.kt")
public void testJavaKotlinInterop() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/JavaKotlinInterop.kt");
}
@Test @Test
@TestMetadata("NestedClasses.kt") @TestMetadata("NestedClasses.kt")
public void testNestedClasses() throws Exception { public void testNestedClasses() throws Exception {
@@ -93,10 +93,12 @@ fun FirExpression.extractClassFromArgument(session: FirSession): FirRegularClass
return when (val argument = argument) { return when (val argument = argument) {
is FirResolvedQualifier -> is FirResolvedQualifier ->
argument.symbol as? FirRegularClassSymbol argument.symbol as? FirRegularClassSymbol
is FirClassReferenceExpression -> is FirClassReferenceExpression -> {
argument.classTypeRef.coneTypeSafe<ConeClassLikeType>()?.fullyExpandedType(session)?.toRegularClassSymbol(session) val classTypeRef = argument.classTypeRef
else -> val coneType = classTypeRef.coneType.unwrapFlexibleAndDefinitelyNotNull()
null coneType.fullyExpandedType(session).toRegularClassSymbol(session)
}
else -> null
} }
} }
@@ -0,0 +1,13 @@
// FILE: one.java
package pcg;
import kotlin.ExperimentalMultiplatform;
import kotlin.SubclassOptInRequired;
@SubclassOptInRequired(markerClass = ExperimentalMultiplatform.class) public class Foo{}
// FILE: two.kt
import pcg.Foo
class Bar() : <!OPT_IN_USAGE_ERROR!>Foo<!>()
@@ -0,0 +1,14 @@
// FILE: one.java
package pcg;
import kotlin.ExperimentalMultiplatform;
import kotlin.SubclassOptInRequired;
@SubclassOptInRequired(markerClass = ExperimentalMultiplatform.class) public class Foo{}
// FILE: two.kt
import pcg.Foo
class Bar() : Foo()
@@ -42259,6 +42259,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/InnerClasses.kt"); runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/InnerClasses.kt");
} }
@Test
@TestMetadata("JavaKotlinInterop.kt")
public void testJavaKotlinInterop() throws Exception {
runTest("compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/JavaKotlinInterop.kt");
}
@Test @Test
@TestMetadata("NestedClasses.kt") @TestMetadata("NestedClasses.kt")
public void testNestedClasses() throws Exception { public void testNestedClasses() throws Exception {