[KLIB] Fix fakeoverride builder
Set proper visibility in case of cross-module internal overrides. TODO: KT-47192
This commit is contained in:
committed by
teamcityserver
parent
0cb23a6e65
commit
5bc884ce2b
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
|
|||||||
import org.jetbrains.kotlin.ir.symbols.*
|
import org.jetbrains.kotlin.ir.symbols.*
|
||||||
import org.jetbrains.kotlin.ir.types.*
|
import org.jetbrains.kotlin.ir.types.*
|
||||||
import org.jetbrains.kotlin.ir.util.collectAndFilterRealOverrides
|
import org.jetbrains.kotlin.ir.util.collectAndFilterRealOverrides
|
||||||
|
import org.jetbrains.kotlin.ir.util.fileOrNull
|
||||||
import org.jetbrains.kotlin.ir.util.isReal
|
import org.jetbrains.kotlin.ir.util.isReal
|
||||||
import org.jetbrains.kotlin.ir.util.render
|
import org.jetbrains.kotlin.ir.util.render
|
||||||
import org.jetbrains.kotlin.resolve.OverridingUtil.OverrideCompatibilityInfo
|
import org.jetbrains.kotlin.resolve.OverridingUtil.OverrideCompatibilityInfo
|
||||||
@@ -38,6 +39,27 @@ abstract class FakeOverrideBuilderStrategy {
|
|||||||
protected abstract fun linkPropertyFakeOverride(declaration: IrFakeOverrideProperty)
|
protected abstract fun linkPropertyFakeOverride(declaration: IrFakeOverrideProperty)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun IrOverridableMember.isPrivateToThisModule(thisClass: IrClass, memberClass: IrClass): Boolean {
|
||||||
|
if (visibility != DescriptorVisibilities.INTERNAL) return false
|
||||||
|
val thisModule = thisClass.fileOrNull?.module
|
||||||
|
val memberModule = memberClass.fileOrNull?.module
|
||||||
|
if (thisModule == memberModule) return false
|
||||||
|
|
||||||
|
// Note: On WASM backend there is possible if `thisClass` is from `IrExternalPackageFragment` which module is null
|
||||||
|
|
||||||
|
if (thisModule == null || memberModule == null) return false
|
||||||
|
|
||||||
|
return !isInFriendModules(thisModule, memberModule)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("UNUSED_PARAMETER")
|
||||||
|
private fun isInFriendModules(thisModule: IrModuleFragment, friendModule: IrModuleFragment): Boolean {
|
||||||
|
// TODO: check if [friendModule] is a friend of [thisModule]
|
||||||
|
// See: KT-47192
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
fun buildFakeOverrideMember(superType: IrType, member: IrOverridableMember, clazz: IrClass): IrOverridableMember {
|
fun buildFakeOverrideMember(superType: IrType, member: IrOverridableMember, clazz: IrClass): IrOverridableMember {
|
||||||
require(superType is IrSimpleType) { "superType is $superType, expected IrSimpleType" }
|
require(superType is IrSimpleType) { "superType is $superType, expected IrSimpleType" }
|
||||||
val classifier = superType.classifier
|
val classifier = superType.classifier
|
||||||
@@ -62,6 +84,8 @@ fun buildFakeOverrideMember(superType: IrType, member: IrOverridableMember, claz
|
|||||||
val copier = DeepCopyIrTreeWithSymbolsForFakeOverrides(substitutionMap)
|
val copier = DeepCopyIrTreeWithSymbolsForFakeOverrides(substitutionMap)
|
||||||
val deepCopyFakeOverride = copier.copy(member, clazz) as IrOverridableMember
|
val deepCopyFakeOverride = copier.copy(member, clazz) as IrOverridableMember
|
||||||
deepCopyFakeOverride.parent = clazz
|
deepCopyFakeOverride.parent = clazz
|
||||||
|
if (deepCopyFakeOverride.isPrivateToThisModule(clazz, classifier.owner))
|
||||||
|
deepCopyFakeOverride.visibility = DescriptorVisibilities.INVISIBLE_FAKE
|
||||||
|
|
||||||
return deepCopyFakeOverride
|
return deepCopyFakeOverride
|
||||||
}
|
}
|
||||||
@@ -120,9 +144,9 @@ class IrOverridingUtil(
|
|||||||
superClass.declarations
|
superClass.declarations
|
||||||
.filter { it.isOverridableMemberOrAccessor() }
|
.filter { it.isOverridableMemberOrAccessor() }
|
||||||
.map {
|
.map {
|
||||||
val overridenMember = it as IrOverridableMember
|
val overriddenMember = it as IrOverridableMember
|
||||||
val fakeOverride = fakeOverrideBuilder.fakeOverrideMember(superType, overridenMember, clazz)
|
val fakeOverride = fakeOverrideBuilder.fakeOverrideMember(superType, overriddenMember, clazz)
|
||||||
originals[fakeOverride] = overridenMember
|
originals[fakeOverride] = overriddenMember
|
||||||
originalSuperTypes[fakeOverride] = superType
|
originalSuperTypes[fakeOverride] = superType
|
||||||
fakeOverride
|
fakeOverride
|
||||||
}
|
}
|
||||||
@@ -250,7 +274,7 @@ class IrOverridingUtil(
|
|||||||
|
|
||||||
private fun filterVisibleFakeOverrides(toFilter: Collection<IrOverridableMember>): Collection<IrOverridableMember> {
|
private fun filterVisibleFakeOverrides(toFilter: Collection<IrOverridableMember>): Collection<IrOverridableMember> {
|
||||||
return toFilter.filter { member: IrOverridableMember ->
|
return toFilter.filter { member: IrOverridableMember ->
|
||||||
!DescriptorVisibilities.isPrivate(member.visibility)
|
!DescriptorVisibilities.isPrivate(member.visibility) && member.visibility != DescriptorVisibilities.INVISIBLE_FAKE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user