From 8156c91c47aaedc4fd95c7e8570dc587c9b045da Mon Sep 17 00:00:00 2001 From: "Anastasia.Nekrasova" Date: Fri, 12 Jan 2024 15:51:18 +0200 Subject: [PATCH] [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 --- ...osticCompilerTestFE10TestdataTestGenerated.java | 6 ++++++ ...iagnosticCompilerFE10TestDataTestGenerated.java | 6 ++++++ ...ghtTreeOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../FirPsiOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../fir/analysis/checkers/FirAnnotationHelpers.kt | 10 ++++++---- .../subclassOptInRequired/JavaKotlinInterop.fir.kt | 13 +++++++++++++ .../subclassOptInRequired/JavaKotlinInterop.kt | 14 ++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ 8 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/JavaKotlinInterop.fir.kt create mode 100644 compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/JavaKotlinInterop.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 39b5bd7a717..ab60cb26f57 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -42259,6 +42259,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia 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 @TestMetadata("NestedClasses.kt") public void testNestedClasses() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index a3eccfc2da3..24272e43569 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -42259,6 +42259,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated 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 @TestMetadata("NestedClasses.kt") public void testNestedClasses() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 04520c289d2..51fbd0034b1 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -39973,6 +39973,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir 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 @TestMetadata("NestedClasses.kt") public void testNestedClasses() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index c8992a2a74f..a6f1efcb682 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -40093,6 +40093,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia 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 @TestMetadata("NestedClasses.kt") public void testNestedClasses() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirAnnotationHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirAnnotationHelpers.kt index 45396d779b8..19a617c06ab 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirAnnotationHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirAnnotationHelpers.kt @@ -93,10 +93,12 @@ fun FirExpression.extractClassFromArgument(session: FirSession): FirRegularClass return when (val argument = argument) { is FirResolvedQualifier -> argument.symbol as? FirRegularClassSymbol - is FirClassReferenceExpression -> - argument.classTypeRef.coneTypeSafe()?.fullyExpandedType(session)?.toRegularClassSymbol(session) - else -> - null + is FirClassReferenceExpression -> { + val classTypeRef = argument.classTypeRef + val coneType = classTypeRef.coneType.unwrapFlexibleAndDefinitelyNotNull() + coneType.fullyExpandedType(session).toRegularClassSymbol(session) + } + else -> null } } diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/JavaKotlinInterop.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/JavaKotlinInterop.fir.kt new file mode 100644 index 00000000000..7ee33c62eb6 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/JavaKotlinInterop.fir.kt @@ -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() : Foo() + diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/JavaKotlinInterop.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/JavaKotlinInterop.kt new file mode 100644 index 00000000000..ee6b4d3ad5a --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/subclassOptInRequired/JavaKotlinInterop.kt @@ -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() + + diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 3f7f5fc0d3a..eb1f8ce0bad 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -42259,6 +42259,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { 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 @TestMetadata("NestedClasses.kt") public void testNestedClasses() throws Exception {