[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:
Kirill Rakhman
2024-02-02 18:20:47 +01:00
committed by Space Team
parent fbe8db4b45
commit fc6d25e50f
8 changed files with 45 additions and 50 deletions
@@ -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