[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
This commit is contained in:
Nikita Bobko
2024-02-06 20:12:50 +01:00
committed by Space Team
parent cabf7e4fae
commit ab726fee3d
3 changed files with 18 additions and 2 deletions
@@ -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)
@@ -10,4 +10,9 @@ fun foo() {}
fun fooSlash() {}
<!ILLEGAL_JVM_NAME!>@JvmName("<")<!>
fun fooLT() {}
fun fooLT() {}
class Foo {
@JvmName("getFoo")
<!NON_FINAL_MEMBER_IN_FINAL_CLASS!>open<!> fun foo() {}
}
@@ -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
}