From 5e49b472f81ed95098eec9749aa2ad0415fac731 Mon Sep 17 00:00:00 2001 From: Roman Efremov Date: Wed, 6 Sep 2023 12:30:06 +0200 Subject: [PATCH] [FE, IR] Allow @ImplicitlyActualizedByJvmDeclaration to be set only on expect @ImplicitlyActualizedByJvmDeclaration is the only one OptionalExpectation annotation which works correctly when set only on `expect`. All other (like @JvmName, @JsName) - not, so warning for them must be reported. ^KT-61725 Fixed --- .../resolve/checkers/ExpectedActualDeclarationChecker.kt | 4 ++-- .../mpp/AbstractExpectActualAnnotationMatchChecker.kt | 1 + .../annotationMatching/skippedAnnotations.fir.kt | 8 +++++++- .../annotationMatching/skippedAnnotations.kt | 8 +++++++- .../src/org/jetbrains/kotlin/name/StandardClassIds.kt | 1 + 5 files changed, 18 insertions(+), 4 deletions(-) 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 965231202fe..05339f39f33 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/ExpectedActualDeclarationChecker.kt @@ -25,7 +25,7 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.mpp.MppJavaImplicitActualizatorMarker -import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier import org.jetbrains.kotlin.resolve.* @@ -42,7 +42,7 @@ import org.jetbrains.kotlin.resolve.source.PsiSourceFile import org.jetbrains.kotlin.types.KotlinType import java.io.File -private val implicitlyActualizedAnnotationFqn = FqName("kotlin.jvm.ImplicitlyActualizedByJvmDeclaration") +private val implicitlyActualizedAnnotationFqn = StandardClassIds.Annotations.ImplicitlyActualizedByJvmDeclaration.asSingleFqName() class ExpectedActualDeclarationChecker( val moduleStructureOracle: ModuleStructureOracle, diff --git a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualAnnotationMatchChecker.kt b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualAnnotationMatchChecker.kt index e499ab443c3..9a981acd7b1 100644 --- a/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualAnnotationMatchChecker.kt +++ b/compiler/resolution.common/src/org/jetbrains/kotlin/resolve/calls/mpp/AbstractExpectActualAnnotationMatchChecker.kt @@ -18,6 +18,7 @@ object AbstractExpectActualAnnotationMatchChecker { private val SKIPPED_CLASS_IDS = setOf( StandardClassIds.Annotations.Deprecated, StandardClassIds.Annotations.DeprecatedSinceKotlin, + StandardClassIds.Annotations.ImplicitlyActualizedByJvmDeclaration, StandardClassIds.Annotations.OptionalExpectation, StandardClassIds.Annotations.RequireKotlin, StandardClassIds.Annotations.SinceKotlin, diff --git a/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/skippedAnnotations.fir.kt b/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/skippedAnnotations.fir.kt index 7d8fd165fe9..4a6dd11f197 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/skippedAnnotations.fir.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/skippedAnnotations.fir.kt @@ -20,6 +20,10 @@ annotation class MyOptIn @OptIn(MyOptIn::class) expect fun skippedAnnotationsOnExpectOnly() +@OptIn(ExperimentalMultiplatform::class) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect class ImplicitlyActualizedByJvmDeclarationOnExpectOnly + // MODULE: m1-jvm()()(m1-common) // FILE: jvm.kt package kotlin @@ -27,4 +31,6 @@ package kotlin @OptIn(ExperimentalMultiplatform::class) actual annotation class OptionalExpectationOnExpectOnly -actual fun skippedAnnotationsOnExpectOnly() {} \ No newline at end of file +actual fun skippedAnnotationsOnExpectOnly() {} + +actual class ImplicitlyActualizedByJvmDeclarationOnExpectOnly diff --git a/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/skippedAnnotations.kt b/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/skippedAnnotations.kt index 92df23976ec..4b31bbca4bd 100644 --- a/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/skippedAnnotations.kt +++ b/compiler/testData/diagnostics/tests/multiplatform/annotationMatching/skippedAnnotations.kt @@ -20,6 +20,10 @@ annotation class MyOptIn @OptIn(MyOptIn::class) expect fun skippedAnnotationsOnExpectOnly() +@OptIn(ExperimentalMultiplatform::class) +@kotlin.jvm.ImplicitlyActualizedByJvmDeclaration +expect class ImplicitlyActualizedByJvmDeclarationOnExpectOnly + // MODULE: m1-jvm()()(m1-common) // FILE: jvm.kt package kotlin @@ -27,4 +31,6 @@ package kotlin @OptIn(ExperimentalMultiplatform::class) actual annotation class OptionalExpectationOnExpectOnly -actual fun skippedAnnotationsOnExpectOnly() {} \ No newline at end of file +actual fun skippedAnnotationsOnExpectOnly() {} + +actual class ImplicitlyActualizedByJvmDeclarationOnExpectOnly diff --git a/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt b/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt index 2e7f56d6ee2..3739b8d6e6b 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt @@ -197,6 +197,7 @@ object StandardClassIds { val AccessibleLateinitPropertyLiteral = "AccessibleLateinitPropertyLiteral".internalId() val OptionalExpectation = "OptionalExpectation".baseId() + val ImplicitlyActualizedByJvmDeclaration = "ImplicitlyActualizedByJvmDeclaration".jvmId() object Java { val Deprecated = "Deprecated".javaLangId()