[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
@@ -134,7 +134,7 @@ class JvmMappedScope(
if (jdkMemberStatus == JDKMemberStatus.DROP) return@processor
// hidden methods in final class can't be overridden or called with 'super'
if (jdkMemberStatus == JDKMemberStatus.HIDDEN && firKotlinClass.isFinal) return@processor
if ((jdkMemberStatus == JDKMemberStatus.HIDDEN || jdkMemberStatus == JDKMemberStatus.HIDDEN_IN_DECLARING_CLASS_ONLY) && firKotlinClass.isFinal) return@processor
val newSymbol = mappedSymbolCache.mappedFunctions.getValue(symbol, this to jdkMemberStatus)
processor(newSymbol)
@@ -201,12 +201,13 @@ class JvmMappedScope(
}
}
// For unknown methods, we use HIDDEN policy by default
return JDKMemberStatus.HIDDEN
// For unknown methods, we use HIDDEN_IN_DECLARING_CLASS_ONLY policy by default,
// meaning they are hidden in the declaring class but visible with deprecation in overrides.
return JDKMemberStatus.HIDDEN_IN_DECLARING_CLASS_ONLY
}
internal enum class JDKMemberStatus {
HIDDEN, VISIBLE, DROP
HIDDEN, VISIBLE, DROP, HIDDEN_IN_DECLARING_CLASS_ONLY,
}
override fun processPropertiesByName(name: Name, processor: (FirVariableSymbol<*>) -> Unit) {
@@ -228,7 +229,9 @@ class JvmMappedScope(
newSource = oldFunction.source,
).apply {
if (jdkMemberStatus == JDKMemberStatus.HIDDEN) {
isHiddenEverywhereBesideSuperCalls = true
isHiddenEverywhereBesideSuperCalls = HiddenEverywhereBesideSuperCallsStatus.HIDDEN
} else if (jdkMemberStatus == JDKMemberStatus.HIDDEN_IN_DECLARING_CLASS_ONLY) {
isHiddenEverywhereBesideSuperCalls = HiddenEverywhereBesideSuperCallsStatus.HIDDEN_IN_DECLARING_CLASS_ONLY
}
}
return newSymbol