[FIR] By default, only hide members from mapped scope but not overrides
This affects methods like List.getFirst/getLast where it was decided to keep them hidden but to make them visible on overrides like ArrayList or LinkedList. The goal is to prevent a breaking change since some implementations like LinkedList had this method before JDK 21. #KT-65438
This commit is contained in:
committed by
Space Team
parent
fbe8db4b45
commit
fc6d25e50f
+14
-2
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.fir.caches.FirCachesFactory
|
||||
import org.jetbrains.kotlin.fir.caches.firCachesFactory
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.languageVersionSettings
|
||||
import org.jetbrains.kotlin.fir.references.FirNamedReference
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
@@ -327,12 +326,25 @@ fun FirBasedSymbol<*>.isDeprecationLevelHidden(languageVersionSettings: Language
|
||||
|
||||
private object IsHiddenEverywhereBesideSuperCalls : FirDeclarationDataKey()
|
||||
|
||||
var FirCallableDeclaration.isHiddenEverywhereBesideSuperCalls: Boolean? by FirDeclarationDataRegistry.data(
|
||||
var FirCallableDeclaration.isHiddenEverywhereBesideSuperCalls: HiddenEverywhereBesideSuperCallsStatus? by FirDeclarationDataRegistry.data(
|
||||
IsHiddenEverywhereBesideSuperCalls
|
||||
)
|
||||
|
||||
enum class HiddenEverywhereBesideSuperCallsStatus(val affectsOverrides: Boolean) {
|
||||
HIDDEN(true), HIDDEN_IN_DECLARING_CLASS_ONLY(false)
|
||||
}
|
||||
|
||||
private object IsHiddenToOvercomeSignatureClash : FirDeclarationDataKey()
|
||||
|
||||
var FirCallableDeclaration.isHiddenToOvercomeSignatureClash: Boolean? by FirDeclarationDataRegistry.data(
|
||||
IsHiddenToOvercomeSignatureClash
|
||||
)
|
||||
|
||||
fun FirCallableSymbol<*>.isHidden(isSuperCall: Boolean, isOverridden: Boolean): Boolean {
|
||||
val fir = fir
|
||||
return when {
|
||||
fir.isHiddenToOvercomeSignatureClash == true -> true
|
||||
!isSuperCall && fir.isHiddenEverywhereBesideSuperCalls?.let { it.affectsOverrides || !isOverridden } == true -> true
|
||||
else -> false
|
||||
}
|
||||
}
|
||||
@@ -264,8 +264,8 @@ class FirSyntheticPropertiesScope private constructor(
|
||||
var result = Incompatible
|
||||
|
||||
val visited = mutableSetOf<MemberWithBaseScope<FirNamedFunctionSymbol>>()
|
||||
fun checkJavaOrigin(symbol: FirNamedFunctionSymbol, scope: FirTypeScope) {
|
||||
if (symbol.fir.isHiddenEverywhereBesideSuperCalls == true) {
|
||||
fun checkJavaOrigin(symbol: FirNamedFunctionSymbol, scope: FirTypeScope, isOverridden: Boolean) {
|
||||
if (symbol.isHidden(isSuperCall = false, isOverridden = isOverridden)) {
|
||||
isHiddenEverywhereBesideSuperCalls = true
|
||||
}
|
||||
|
||||
@@ -286,11 +286,11 @@ class FirSyntheticPropertiesScope private constructor(
|
||||
|
||||
overriddenWithScope.forEach {
|
||||
if (!visited.add(it)) return@forEach
|
||||
checkJavaOrigin(it.member, it.baseScope)
|
||||
checkJavaOrigin(it.member, it.baseScope, isOverridden = true)
|
||||
}
|
||||
}
|
||||
|
||||
checkJavaOrigin(this, baseScope)
|
||||
checkJavaOrigin(this, baseScope, isOverridden = false)
|
||||
|
||||
return when {
|
||||
isHiddenEverywhereBesideSuperCalls -> Incompatible
|
||||
|
||||
Reference in New Issue
Block a user