IR: remove FakeOverrideCopier.makeExternal

Make the declaration external at the call site instead of creating two
instances of FakeOverrideCopier. It's possible because IR elements are
mutable, in particular isExternal is a var.

Maybe the same should be done to IrUnimplementedOverridesStrategy, but
that is postponed for another time.
This commit is contained in:
Alexander Udalov
2023-09-13 17:26:07 +02:00
committed by Space Team
parent 019836e9c7
commit 216d2b50f7
3 changed files with 28 additions and 37 deletions
@@ -28,16 +28,20 @@ class CopyIrTreeWithSymbolsForFakeOverrides(
private val parent: IrClass,
unimplementedOverridesStrategy: IrUnimplementedOverridesStrategy
) {
private val symbolRemapper = FakeOverrideSymbolRemapperImpl(typeArguments, NullDescriptorsRemapper)
private val copier = FakeOverrideCopier(
symbolRemapper,
FakeOverrideTypeRemapper(symbolRemapper, typeArguments),
SymbolRenamer.DEFAULT,
parent,
unimplementedOverridesStrategy
)
fun copy(): IrOverridableMember {
// Create new symbols.
overridableMember.acceptVoid(symbolRemapper)
// Make symbol remapper aware of the callsite's type arguments.
// Copy IR.
val result = overridableMember.transform(
if (parent.isEffectivelyExternal()) copierMakingExternal else copier,
data = null
) as IrOverridableMember
val result = overridableMember.transform(copier, null) as IrOverridableMember
result.patchDeclarationParents(parent)
@@ -93,9 +97,7 @@ class CopyIrTreeWithSymbolsForFakeOverrides(
private class FakeOverrideSymbolRemapperImpl(
private val typeArguments: Map<IrTypeParameterSymbol, IrType>,
descriptorsRemapper: DescriptorsRemapper
) :
DeepCopySymbolRemapper(descriptorsRemapper) {
) : DeepCopySymbolRemapper(descriptorsRemapper) {
override fun getReferencedClassifier(symbol: IrClassifierSymbol): IrClassifierSymbol {
val result = super.getReferencedClassifier(symbol)
if (result !is IrTypeParameterSymbol)
@@ -104,30 +106,6 @@ class CopyIrTreeWithSymbolsForFakeOverrides(
}
}
private val symbolRemapper =
FakeOverrideSymbolRemapperImpl(
typeArguments,
NullDescriptorsRemapper
)
private val copier = FakeOverrideCopier(
symbolRemapper,
FakeOverrideTypeRemapper(symbolRemapper, typeArguments),
SymbolRenamer.DEFAULT,
makeExternal = false,
parent,
unimplementedOverridesStrategy
)
private val copierMakingExternal = FakeOverrideCopier(
symbolRemapper,
FakeOverrideTypeRemapper(symbolRemapper, typeArguments),
SymbolRenamer.DEFAULT,
makeExternal = true,
parent,
unimplementedOverridesStrategy
)
private companion object {
// TODO: RawTypeAnnotation, FlexibleMutability, EnhancedNullability?
val TYPE_ANNOTATIONS_TO_MERGE = listOf(
@@ -103,8 +103,22 @@ fun buildFakeOverrideMember(
return CopyIrTreeWithSymbolsForFakeOverrides(member, substitutionMap, clazz, unimplementedOverridesStrategy)
.copy()
.apply {
makeExternal(clazz.isExternal)
val isInvisible = isPrivateToThisModule(clazz, classifier.owner, friendModules)
if (isInvisible && !member.annotations.hasAnnotation(StandardNames.FqNames.publishedApi))
visibility = DescriptorVisibilities.INVISIBLE_FAKE
}
}
// TODO: this is JS-specific functionality which should be moved out of the common ir.tree.
private fun IrOverridableMember.makeExternal(value: Boolean) {
when (this) {
is IrSimpleFunction -> isExternal = value
is IrProperty -> {
isExternal = value
getter?.isExternal = value
setter?.isExternal = value
}
}
}
@@ -13,7 +13,6 @@ class FakeOverrideCopier(
private val symbolRemapper: SymbolRemapper,
private val typeRemapper: TypeRemapper,
private val symbolRenamer: SymbolRenamer,
private val makeExternal: Boolean,
private val parent: IrClass,
private val unimplementedOverridesStrategy: IrUnimplementedOverridesStrategy
) : DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper, symbolRenamer) {
@@ -35,7 +34,7 @@ class FakeOverrideCopier(
isSuspend = declaration.isSuspend,
isOperator = declaration.isOperator,
isInfix = declaration.isInfix,
isExternal = makeExternal,
isExternal = declaration.isExternal,
).apply {
transformAnnotations(declaration)
copyTypeParametersFrom(declaration)
@@ -82,7 +81,7 @@ class FakeOverrideCopier(
isLateinit = declaration.isLateinit,
isDelegated = declaration.isDelegated,
isExpect = declaration.isExpect,
isExternal = makeExternal
isExternal = declaration.isExternal,
).apply {
transformAnnotations(declaration)
this.getter = declaration.getter?.transform()