FIR: Handle visibility of public setter of protected synthetic property like in K1
K1 allows writing access to a public setter of a protected synthetic property only if the call is inside a subclass. K2 previously allowed that unconditionally. This changes brings the behavior in line with K1. ^KT-56050 Fixed
This commit is contained in:
committed by
Space Team
parent
1990883bdc
commit
f6c189be7b
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.descriptors.java.JavaVisibilities
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor
|
||||
@@ -16,8 +17,10 @@ import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||
import org.jetbrains.kotlin.fir.resolve.SupertypeSupplier
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.FirSimpleSyntheticPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.ReceiverValue
|
||||
import org.jetbrains.kotlin.fir.resolve.isSubclassOf
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.lastIsInstanceOrNull
|
||||
|
||||
@NoMutableState
|
||||
object FirJavaVisibilityChecker : FirVisibilityChecker() {
|
||||
@@ -47,7 +50,7 @@ object FirJavaVisibilityChecker : FirVisibilityChecker() {
|
||||
|
||||
// FE1.0 allows calling public setters with property assignment syntax if the getter is protected.
|
||||
if (!isCallToPropertySetter || symbol !is FirSimpleSyntheticPropertySymbol) return false
|
||||
symbol.setterSymbol?.visibility == Visibilities.Public
|
||||
symbol.setterSymbol?.visibility == Visibilities.Public && symbol.isCalledFromSubclass(containingDeclarations, session)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,6 +59,14 @@ object FirJavaVisibilityChecker : FirVisibilityChecker() {
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirSimpleSyntheticPropertySymbol.isCalledFromSubclass(
|
||||
containingDeclarations: List<FirDeclaration>,
|
||||
session: FirSession
|
||||
): Boolean {
|
||||
val containingClassLookupTag = this.containingClassLookupTag() ?: return false
|
||||
return containingDeclarations.any { it is FirClass && it.isSubclassOf(containingClassLookupTag, session, false) }
|
||||
}
|
||||
|
||||
override fun platformOverrideVisibilityCheck(
|
||||
candidateInDerivedClass: FirBasedSymbol<*>,
|
||||
symbolInBaseClass: FirBasedSymbol<*>,
|
||||
|
||||
Reference in New Issue
Block a user