From 6868c95263708a046fe1dec12c3ef3d9a2abb3ea Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Thu, 7 Sep 2023 14:04:22 +0200 Subject: [PATCH] KMP: Put "prohbit expect/actual different annotations" under the flag ^KT-61668 Fixed Review: https://jetbrains.team/p/kt/reviews/12062/timeline --- ...DiagnosticsWithLightTreeTestGenerated.java | 6 +++++ ...endMPPDiagnosticsWithPsiTestGenerated.java | 6 +++++ .../FirExpectActualDeclarationChecker.kt | 1 + .../ExpectedActualDeclarationChecker.kt | 16 ++++++++------ .../backend/common/actualizer/IrActualizer.kt | 5 ++++- .../annotationMatching_oldLanguageVersion.kt | 22 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 +++++ 7 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/multiplatform/annotationMatching/annotationMatching_oldLanguageVersion.kt diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java index 75ac8cc053a..5ef2fa555d7 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java @@ -746,6 +746,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/annotationMatching/annotationArgumentsDefaults.kt"); } + @Test + @TestMetadata("annotationMatching_oldLanguageVersion.kt") + public void testAnnotationMatching_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/annotationMatching/annotationMatching_oldLanguageVersion.kt"); + } + @Test @TestMetadata("annotationTarget.kt") public void testAnnotationTarget() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java index ee216cb8021..1c3c26b0bf9 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java @@ -746,6 +746,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/annotationMatching/annotationArgumentsDefaults.kt"); } + @Test + @TestMetadata("annotationMatching_oldLanguageVersion.kt") + public void testAnnotationMatching_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/annotationMatching/annotationMatching_oldLanguageVersion.kt"); + } + @Test @TestMetadata("annotationTarget.kt") public void testAnnotationTarget() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt index b655f2659e5..b400b0814c6 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirExpectActualDeclarationChecker.kt @@ -258,6 +258,7 @@ object FirExpectActualDeclarationChecker : FirBasicDeclarationChecker() { context: CheckerContext, reporter: DiagnosticReporter ) { + if (!context.languageVersionSettings.supportsFeature(LanguageFeature.MultiplatformRestrictions)) return val matchingContext = context.session.expectActualMatchingContextFactory.create(context.session, context.scopeSession) val incompatibility = AbstractExpectActualAnnotationMatchChecker.areAnnotationsCompatible(expectSymbol, actualSymbol, matchingContext) ?: return diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt index 1d04342b0e5..48f7abb0ecd 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt @@ -78,7 +78,7 @@ class ExpectedActualDeclarationChecker( declaration, descriptor, checkActualModifier, - context.trace, + context, moduleVisibilityFilter = { it in allDependsOnModules } ) } @@ -294,9 +294,10 @@ class ExpectedActualDeclarationChecker( reportOn: KtNamedDeclaration, descriptor: MemberDescriptor, checkActualModifier: Boolean, - trace: BindingTrace, + context: DeclarationCheckerContext, moduleVisibilityFilter: ModuleFilter ) { + val trace = context.trace val compatibility = ExpectedActualResolver .findExpectedForActual(descriptor, moduleVisibilityFilter, shouldCheckAbsenceOfDefaultParamsInActual = true) ?: return @@ -381,7 +382,7 @@ class ExpectedActualDeclarationChecker( val expectSingleCandidate = (compatibility[Compatible] ?: compatibility.values.singleOrNull())?.singleOrNull() if (expectSingleCandidate != null) { checkIfExpectHasDefaultArgumentsAndActualizedWithTypealias(expectSingleCandidate, reportOn, trace) - checkAnnotationsMatch(expectSingleCandidate, descriptor, reportOn, trace) + checkAnnotationsMatch(expectSingleCandidate, descriptor, reportOn, context) } } @@ -488,12 +489,13 @@ class ExpectedActualDeclarationChecker( expectDescriptor: MemberDescriptor, actualDescriptor: MemberDescriptor, reportOn: KtNamedDeclaration, - trace: BindingTrace + context: DeclarationCheckerContext ) { - val context = ClassicExpectActualMatchingContext(actualDescriptor.module) + if (!context.languageVersionSettings.supportsFeature(LanguageFeature.MultiplatformRestrictions)) return + val matchingContext = ClassicExpectActualMatchingContext(actualDescriptor.module) val incompatibility = - AbstractExpectActualAnnotationMatchChecker.areAnnotationsCompatible(expectDescriptor, actualDescriptor, context) ?: return - trace.report( + AbstractExpectActualAnnotationMatchChecker.areAnnotationsCompatible(expectDescriptor, actualDescriptor, matchingContext) ?: return + context.trace.report( Errors.ACTUAL_ANNOTATIONS_NOT_MATCH_EXPECT.on( reportOn, incompatibility.expectSymbol as DeclarationDescriptor, diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrActualizer.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrActualizer.kt index 1d68b341d67..ad5f1a91707 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrActualizer.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrActualizer.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.backend.common.actualizer import org.jetbrains.kotlin.KtDiagnosticReporterWithImplicitIrBasedContext +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.ir.declarations.* @@ -38,7 +39,9 @@ object IrActualizer { typeSystemContext, ktDiagnosticReporter ).collect() - IrExpectActualAnnotationMatchingChecker(expectActualMap, actualDeclarations, typeSystemContext, ktDiagnosticReporter).check() + if (languageVersionSettings.supportsFeature(LanguageFeature.MultiplatformRestrictions)) { + IrExpectActualAnnotationMatchingChecker(expectActualMap, actualDeclarations, typeSystemContext, ktDiagnosticReporter).check() + } // 2. Remove top-only expect declarations since they are not needed anymore and should not be presented in the final IrFragment // Expect fake-overrides from non-expect classes remain untouched since they will be actualized in the next phase. diff --git a/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/annotationMatching_oldLanguageVersion.kt b/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/annotationMatching_oldLanguageVersion.kt new file mode 100644 index 00000000000..470e2408349 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/annotationMatching_oldLanguageVersion.kt @@ -0,0 +1,22 @@ +// FIR_IDENTICAL +// LANGUAGE: -MultiplatformRestrictions +// MODULE: m1-common +// FILE: common.kt +annotation class Ann + +@Ann +expect class AnnotationOnExpectOnly + +expect class AnnotationInside { + @Ann + fun onlyOnExpect() +} + +// MODULE: m1-jvm()()(m1-common) +// FILE: jvm.kt + +actual class AnnotationOnExpectOnly + +actual class AnnotationInside { + actual fun onlyOnExpect() {} +} 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 125d4be28c6..0be7ca8e931 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 @@ -23741,6 +23741,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/annotationMatching/annotationArgumentsDefaults.kt"); } + @Test + @TestMetadata("annotationMatching_oldLanguageVersion.kt") + public void testAnnotationMatching_oldLanguageVersion() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/annotationMatching/annotationMatching_oldLanguageVersion.kt"); + } + @Test @TestMetadata("annotationTarget.kt") public void testAnnotationTarget() throws Exception {