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 3a5e87dc0d6..823feb463e8 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 @@ -13,9 +13,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirBasicDeclaratio import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors import org.jetbrains.kotlin.fir.declarations.* -import org.jetbrains.kotlin.fir.declarations.utils.isInline -import org.jetbrains.kotlin.fir.declarations.utils.isOpen -import org.jetbrains.kotlin.fir.declarations.utils.isOverride +import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.resolve.getContainingClass @@ -47,7 +45,7 @@ object FirJvmNameChecker : FirBasicDeclarationChecker() { if ( declaration.isOverride || - declaration.isOpen || + declaration.isOverridable || containingClass?.isValueClassThatRequiresMangling() == true ) { reporter.reportOn(jvmName.source, FirJvmErrors.INAPPLICABLE_JVM_NAME, context) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirStatusUtils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirStatusUtils.kt index f6e72ae3453..170f6e7fce2 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirStatusUtils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/utils/FirStatusUtils.kt @@ -30,6 +30,9 @@ inline val FirMemberDeclaration.effectiveVisibility: EffectiveVisibility inline val FirMemberDeclaration.allowsToHaveFakeOverride: Boolean get() = !Visibilities.isPrivate(visibility) && visibility != Visibilities.InvisibleFake +inline val FirMemberDeclaration.isOverridable: Boolean + get() = status.modality != Modality.FINAL && status.visibility != Visibilities.Private + inline val FirMemberDeclaration.isActual: Boolean get() = status.isActual inline val FirMemberDeclaration.isExpect: Boolean get() = status.isExpect inline val FirMemberDeclaration.isInner: Boolean get() = status.isInner diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.fir.kt deleted file mode 100644 index bba4aeafada..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.fir.kt +++ /dev/null @@ -1,95 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER - -@JvmName("a") -fun foo() {} - -@JvmName("b") -fun Any.foo() {} - -@JvmName("c") -val px = 1 - -@JvmName("d") -val Any.px : Int - get() = 1 - -val valx: Int - @JvmName("e") - get() = 1 - -var varx: Int - @JvmName("f") - get() = 1 - @JvmName("g") - set(v) {} - -var vardef: Int = 1 - @JvmName("h") - get - @JvmName("i") - set - -@JvmName("C") -class C @JvmName("primary") constructor() { - @JvmName("ctr") constructor(x: Int): this() {} - - @JvmName("a") - fun foo() {} - - @JvmName("b") - fun Any.foo() {} - - @JvmName("c") - val px = 1 - - @JvmName("d") - val Any.px : Int - get() = 1 - - val valx: Int - @JvmName("e") - get() = 1 - - var varx: Int - @JvmName("f") - get() = 1 - @JvmName("g") - set(v) {} -} - -fun foo1() { - @JvmName("a") - fun foo() {} - - @JvmName("a") - val x = 1 -} - -abstract class AB { - @JvmName("AB_absFun1") - abstract fun absFun1() - - abstract fun absFun2() - - @JvmName("AB_openFun") - open fun openFun() {} -} - -class D: AB() { - override fun absFun1() {} - - @JvmName("D_absFun2") - override fun absFun2() {} - - @JvmName("D_openFun") - final override fun openFun() {} - - @JvmName("D_finalFun") - fun finalFun() {} -} - -interface Intf { - @get:JvmName("getBar") // no error in IDE - @set:JvmName("setBar") // no error in IDE - var foo: Int -} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.kt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.kt index 43d299e6f4f..dc760404771 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.kt @@ -1,4 +1,5 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER +// FIR_IDENTICAL +// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER -INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_ERROR @JvmName("a") fun foo() {} @@ -73,6 +74,34 @@ abstract class AB { @JvmName("AB_openFun") open fun openFun() {} + + @JvmName("AB_protectedFinalFun") + protected fun protectedFinalFun() {} + + @JvmName("AB_protectedOpenFun") + protected open fun protectedOpenFun() {} + + @JvmName("AB_protectedAbstractFun") + protected abstract fun protectedAbstractFun() + + @JvmName("AB_internalFinalFun") + internal fun internalFinalFun() {} + + @JvmName("AB_internalOpenFun") + internal open fun internalOpenFun() {} + + @JvmName("AB_internalAbstractFun") + internal abstract fun internalAbstractFun() + + @JvmName("AB_privateFinalFun") + private fun privateFinalFun() {} + + // Possible via AllOpen compiler plugin + @JvmName("AB_privateOpenFun") + private open fun privateOpenFun() {} + + @JvmName("AB_privateAbstractFun") + private abstract fun privateAbstractFun() } class D: AB() { @@ -84,6 +113,10 @@ class D: AB() { @JvmName("D_openFun") final override fun openFun() {} + protected override fun protectedAbstractFun() {} + + internal override fun internalAbstractFun() {} + @JvmName("D_finalFun") fun finalFun() {} } @@ -92,4 +125,4 @@ interface Intf { @get:JvmName("getBar") // no error in IDE @set:JvmName("setBar") // no error in IDE var foo: Int -} \ No newline at end of file +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.txt b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.txt index 200188f2c0a..dbfc950c266 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.txt +++ b/compiler/testData/diagnostics/testsWithStdLib/annotations/annotationApplicability/jvmName.txt @@ -15,7 +15,16 @@ public abstract class AB { public abstract fun absFun2(): kotlin.Unit public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + @kotlin.jvm.JvmName(name = "AB_internalAbstractFun") internal abstract fun internalAbstractFun(): kotlin.Unit + @kotlin.jvm.JvmName(name = "AB_internalFinalFun") internal final fun internalFinalFun(): kotlin.Unit + @kotlin.jvm.JvmName(name = "AB_internalOpenFun") internal open fun internalOpenFun(): kotlin.Unit @kotlin.jvm.JvmName(name = "AB_openFun") public open fun openFun(): kotlin.Unit + @kotlin.jvm.JvmName(name = "AB_privateAbstractFun") private abstract fun privateAbstractFun(): kotlin.Unit + @kotlin.jvm.JvmName(name = "AB_privateFinalFun") private final fun privateFinalFun(): kotlin.Unit + @kotlin.jvm.JvmName(name = "AB_privateOpenFun") private open fun privateOpenFun(): kotlin.Unit + @kotlin.jvm.JvmName(name = "AB_protectedAbstractFun") protected abstract fun protectedAbstractFun(): kotlin.Unit + @kotlin.jvm.JvmName(name = "AB_protectedFinalFun") protected final fun protectedFinalFun(): kotlin.Unit + @kotlin.jvm.JvmName(name = "AB_protectedOpenFun") protected open fun protectedOpenFun(): kotlin.Unit public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String } @@ -40,7 +49,16 @@ public final class D : AB { public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean @kotlin.jvm.JvmName(name = "D_finalFun") public final fun finalFun(): kotlin.Unit public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + internal open override /*1*/ fun internalAbstractFun(): kotlin.Unit + @kotlin.jvm.JvmName(name = "AB_internalFinalFun") internal final override /*1*/ /*fake_override*/ fun internalFinalFun(): kotlin.Unit + @kotlin.jvm.JvmName(name = "AB_internalOpenFun") internal open override /*1*/ /*fake_override*/ fun internalOpenFun(): kotlin.Unit @kotlin.jvm.JvmName(name = "D_openFun") public final override /*1*/ fun openFun(): kotlin.Unit + @kotlin.jvm.JvmName(name = "AB_privateAbstractFun") invisible_fake abstract override /*1*/ /*fake_override*/ fun privateAbstractFun(): kotlin.Unit + @kotlin.jvm.JvmName(name = "AB_privateFinalFun") invisible_fake final override /*1*/ /*fake_override*/ fun privateFinalFun(): kotlin.Unit + @kotlin.jvm.JvmName(name = "AB_privateOpenFun") invisible_fake open override /*1*/ /*fake_override*/ fun privateOpenFun(): kotlin.Unit + protected open override /*1*/ fun protectedAbstractFun(): kotlin.Unit + @kotlin.jvm.JvmName(name = "AB_protectedFinalFun") protected final override /*1*/ /*fake_override*/ fun protectedFinalFun(): kotlin.Unit + @kotlin.jvm.JvmName(name = "AB_protectedOpenFun") protected open override /*1*/ /*fake_override*/ fun protectedOpenFun(): kotlin.Unit public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String }