[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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user