[FIR] Only overridable members should report JvmName inapplicable
Instead of checking for only open declarations, check for overridable declarations, since private declarations cannot be overridden even if they are marked as open. While normally these modifiers are exclusive, a declaration can be made open via a compiler plugin like AllOpen. #KT-60183 Fixed #KT-57223 Fixed
This commit is contained in:
+2
-4
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Vendored
-95
@@ -1,95 +0,0 @@
|
||||
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
|
||||
|
||||
@JvmName("a")
|
||||
fun foo() {}
|
||||
|
||||
@JvmName("b")
|
||||
fun Any.foo() {}
|
||||
|
||||
<!WRONG_ANNOTATION_TARGET!>@JvmName("c")<!>
|
||||
val px = 1
|
||||
|
||||
<!WRONG_ANNOTATION_TARGET!>@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
|
||||
|
||||
<!WRONG_ANNOTATION_TARGET!>@JvmName("C")<!>
|
||||
class C <!WRONG_ANNOTATION_TARGET!>@JvmName("primary")<!> constructor() {
|
||||
<!WRONG_ANNOTATION_TARGET!>@JvmName("ctr")<!> constructor(x: Int): this() {}
|
||||
|
||||
@JvmName("a")
|
||||
fun foo() {}
|
||||
|
||||
@JvmName("b")
|
||||
fun Any.foo() {}
|
||||
|
||||
<!WRONG_ANNOTATION_TARGET!>@JvmName("c")<!>
|
||||
val px = 1
|
||||
|
||||
<!WRONG_ANNOTATION_TARGET!>@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() {
|
||||
<!INAPPLICABLE_JVM_NAME!>@JvmName("a")<!>
|
||||
fun foo() {}
|
||||
|
||||
<!WRONG_ANNOTATION_TARGET!>@JvmName("a")<!>
|
||||
val x = 1
|
||||
}
|
||||
|
||||
abstract class AB {
|
||||
@JvmName("AB_absFun1")
|
||||
abstract fun absFun1()
|
||||
|
||||
abstract fun absFun2()
|
||||
|
||||
<!INAPPLICABLE_JVM_NAME!>@JvmName("AB_openFun")<!>
|
||||
open fun openFun() {}
|
||||
}
|
||||
|
||||
class D: AB() {
|
||||
override fun absFun1() {}
|
||||
|
||||
<!INAPPLICABLE_JVM_NAME!>@JvmName("D_absFun2")<!>
|
||||
override fun absFun2() {}
|
||||
|
||||
<!INAPPLICABLE_JVM_NAME!>@JvmName("D_openFun")<!>
|
||||
final override fun openFun() {}
|
||||
|
||||
@JvmName("D_finalFun")
|
||||
fun finalFun() {}
|
||||
}
|
||||
|
||||
interface Intf {
|
||||
<!INAPPLICABLE_JVM_NAME!>@get:JvmName("getBar")<!> // no error in IDE
|
||||
<!INAPPLICABLE_JVM_NAME!>@set:JvmName("setBar")<!> // no error in IDE
|
||||
var foo: Int
|
||||
}
|
||||
Vendored
+35
-2
@@ -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 {
|
||||
|
||||
<!INAPPLICABLE_JVM_NAME!>@JvmName("AB_openFun")<!>
|
||||
open fun openFun() {}
|
||||
|
||||
@JvmName("AB_protectedFinalFun")
|
||||
protected fun protectedFinalFun() {}
|
||||
|
||||
<!INAPPLICABLE_JVM_NAME!>@JvmName("AB_protectedOpenFun")<!>
|
||||
protected open fun protectedOpenFun() {}
|
||||
|
||||
<!INAPPLICABLE_JVM_NAME!>@JvmName("AB_protectedAbstractFun")<!>
|
||||
protected abstract fun protectedAbstractFun()
|
||||
|
||||
@JvmName("AB_internalFinalFun")
|
||||
internal fun internalFinalFun() {}
|
||||
|
||||
<!INAPPLICABLE_JVM_NAME!>@JvmName("AB_internalOpenFun")<!>
|
||||
internal open fun internalOpenFun() {}
|
||||
|
||||
<!INAPPLICABLE_JVM_NAME!>@JvmName("AB_internalAbstractFun")<!>
|
||||
internal abstract fun internalAbstractFun()
|
||||
|
||||
@JvmName("AB_privateFinalFun")
|
||||
private fun privateFinalFun() {}
|
||||
|
||||
// Possible via AllOpen compiler plugin
|
||||
@JvmName("AB_privateOpenFun")
|
||||
<!INCOMPATIBLE_MODIFIERS!>private<!> <!INCOMPATIBLE_MODIFIERS!>open<!> fun privateOpenFun() {}
|
||||
|
||||
@JvmName("AB_privateAbstractFun")
|
||||
<!INCOMPATIBLE_MODIFIERS!>private<!> <!INCOMPATIBLE_MODIFIERS!>abstract<!> fun privateAbstractFun()
|
||||
}
|
||||
|
||||
class D: AB() {
|
||||
@@ -84,6 +113,10 @@ class D: AB() {
|
||||
<!INAPPLICABLE_JVM_NAME!>@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 {
|
||||
<!INAPPLICABLE_JVM_NAME!>@get:JvmName("getBar")<!> // no error in IDE
|
||||
<!INAPPLICABLE_JVM_NAME!>@set:JvmName("setBar")<!> // no error in IDE
|
||||
var foo: Int
|
||||
}
|
||||
}
|
||||
|
||||
Vendored
+18
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user