From ab726fee3d91188c72c0ad49db2fdd81db220132 Mon Sep 17 00:00:00 2001 From: Nikita Bobko Date: Tue, 6 Feb 2024 20:12:50 +0100 Subject: [PATCH] [FIR] FirJvmNameChecker: take into account effective modality ^KT-65604 Fixed Required for: KT-61798 Review: https://jetbrains.team/p/kt/reviews/14230/timeline Related tests: - DiagnosticCompilerTestFirTestdataTestGenerated$ResolveWithStdlib.testAnnotationUseSites --- .../jvm/checkers/declaration/FirJvmNameChecker.kt | 4 +++- .../annotationApplicability/illegalPlatformName.kt | 7 ++++++- .../annotationApplicability/illegalPlatformName.txt | 9 +++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmNameChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmNameChecker.kt index 8e26c92e4e0..165f447de12 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmNameChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirJvmNameChecker.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration import org.jetbrains.kotlin.builtins.StandardNames +import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind @@ -17,6 +18,7 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.utils.isInline import org.jetbrains.kotlin.fir.declarations.utils.isOverridable import org.jetbrains.kotlin.fir.declarations.utils.isOverride +import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.expressions.FirLiteralExpression import org.jetbrains.kotlin.fir.java.findJvmNameAnnotation import org.jetbrains.kotlin.fir.resolve.getContainingClass @@ -47,7 +49,7 @@ object FirJvmNameChecker : FirBasicDeclarationChecker(MppCheckerKind.Common) { if ( declaration.isOverride || - declaration.isOverridable || + containingClass != null && containingClass.modality != Modality.FINAL && declaration.isOverridable || containingClass?.isValueClassThatRequiresMangling() == true ) { reporter.reportOn(jvmName.source, FirJvmErrors.INAPPLICABLE_JVM_NAME, context) diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/illegalPlatformName.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/illegalPlatformName.kt index 4fc6a40dab4..ef5ac0d90db 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/illegalPlatformName.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/illegalPlatformName.kt @@ -10,4 +10,9 @@ fun foo() {} fun fooSlash() {} @JvmName("<") -fun fooLT() {} \ No newline at end of file +fun fooLT() {} + +class Foo { + @JvmName("getFoo") + open fun foo() {} +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/illegalPlatformName.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/illegalPlatformName.txt index 68d3341b9d1..7244fd94113 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/illegalPlatformName.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/illegalPlatformName.txt @@ -4,3 +4,12 @@ package @kotlin.jvm.JvmName(name = "") public fun foo(/*0*/ a: kotlin.Any): kotlin.Unit @kotlin.jvm.JvmName(name = "<") public fun fooLT(): kotlin.Unit @kotlin.jvm.JvmName(name = "/") public fun fooSlash(): kotlin.Unit + +public final class Foo { + public constructor Foo() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + @kotlin.jvm.JvmName(name = "getFoo") public open fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} +