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:
committed by
Space Team
parent
019836e9c7
commit
216d2b50f7
+12
-34
@@ -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(
|
||||
|
||||
+14
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user