IR: preserve signatures when copying IrFiles in performByIrFile

This commit is contained in:
Georgy Bronnikov
2021-02-15 14:07:33 +03:00
parent db18ffc764
commit 68cabba698
4 changed files with 73 additions and 19 deletions
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.util.DeepCopySymbolRemapper
import org.jetbrains.kotlin.ir.util.DeepCopySymbolRemapperPreservingSignatures
import org.jetbrains.kotlin.ir.util.copyTypeAndValueArgumentsFrom
import org.jetbrains.kotlin.ir.util.deepCopySavingMetadata
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
@@ -149,7 +149,7 @@ fun IrFile.copySavingMappings(
return newIrFile
}
private class DeepCopySymbolRemapperSavingFunctions : DeepCopySymbolRemapper() {
private class DeepCopySymbolRemapperSavingFunctions : DeepCopySymbolRemapperPreservingSignatures() {
val declaredFunctions = mutableSetOf<IrSimpleFunctionSymbol>()
val declaredClasses = mutableSetOf<IrClassSymbol>()
@@ -32,21 +32,21 @@ open class DeepCopySymbolRemapper(
private val descriptorsRemapper: DescriptorsRemapper = NullDescriptorsRemapper
) : IrElementVisitorVoid, SymbolRemapper {
private val classes = hashMapOf<IrClassSymbol, IrClassSymbol>()
private val scripts = hashMapOf<IrScriptSymbol, IrScriptSymbol>()
private val constructors = hashMapOf<IrConstructorSymbol, IrConstructorSymbol>()
private val enumEntries = hashMapOf<IrEnumEntrySymbol, IrEnumEntrySymbol>()
private val externalPackageFragments = hashMapOf<IrExternalPackageFragmentSymbol, IrExternalPackageFragmentSymbol>()
private val fields = hashMapOf<IrFieldSymbol, IrFieldSymbol>()
private val files = hashMapOf<IrFileSymbol, IrFileSymbol>()
private val functions = hashMapOf<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>()
private val properties = hashMapOf<IrPropertySymbol, IrPropertySymbol>()
private val returnableBlocks = hashMapOf<IrReturnableBlockSymbol, IrReturnableBlockSymbol>()
private val typeParameters = hashMapOf<IrTypeParameterSymbol, IrTypeParameterSymbol>()
private val valueParameters = hashMapOf<IrValueParameterSymbol, IrValueParameterSymbol>()
private val variables = hashMapOf<IrVariableSymbol, IrVariableSymbol>()
private val localDelegatedProperties = hashMapOf<IrLocalDelegatedPropertySymbol, IrLocalDelegatedPropertySymbol>()
private val typeAliases = hashMapOf<IrTypeAliasSymbol, IrTypeAliasSymbol>()
protected val classes = hashMapOf<IrClassSymbol, IrClassSymbol>()
protected val scripts = hashMapOf<IrScriptSymbol, IrScriptSymbol>()
protected val constructors = hashMapOf<IrConstructorSymbol, IrConstructorSymbol>()
protected val enumEntries = hashMapOf<IrEnumEntrySymbol, IrEnumEntrySymbol>()
protected val externalPackageFragments = hashMapOf<IrExternalPackageFragmentSymbol, IrExternalPackageFragmentSymbol>()
protected val fields = hashMapOf<IrFieldSymbol, IrFieldSymbol>()
protected val files = hashMapOf<IrFileSymbol, IrFileSymbol>()
protected val functions = hashMapOf<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>()
protected val properties = hashMapOf<IrPropertySymbol, IrPropertySymbol>()
protected val returnableBlocks = hashMapOf<IrReturnableBlockSymbol, IrReturnableBlockSymbol>()
protected val typeParameters = hashMapOf<IrTypeParameterSymbol, IrTypeParameterSymbol>()
protected val valueParameters = hashMapOf<IrValueParameterSymbol, IrValueParameterSymbol>()
protected val variables = hashMapOf<IrVariableSymbol, IrVariableSymbol>()
protected val localDelegatedProperties = hashMapOf<IrLocalDelegatedPropertySymbol, IrLocalDelegatedPropertySymbol>()
protected val typeAliases = hashMapOf<IrTypeAliasSymbol, IrTypeAliasSymbol>()
override fun visitElement(element: IrElement) {
element.acceptChildrenVoid(this)
@@ -0,0 +1,54 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.ir.util
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.symbols.impl.*
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
open class DeepCopySymbolRemapperPreservingSignatures : DeepCopySymbolRemapper() {
override fun visitClass(declaration: IrClass) {
remapSymbol(classes, declaration) { symbol ->
symbol.signature?.let { sig -> IrClassPublicSymbolImpl(sig) } ?: IrClassSymbolImpl()
}
declaration.acceptChildrenVoid(this)
}
override fun visitConstructor(declaration: IrConstructor) {
remapSymbol(constructors, declaration) { symbol ->
symbol.signature?.let { sig -> IrConstructorPublicSymbolImpl(sig) } ?: IrConstructorSymbolImpl()
}
declaration.acceptChildrenVoid(this)
}
override fun visitEnumEntry(declaration: IrEnumEntry) {
remapSymbol(enumEntries, declaration) { symbol ->
symbol.signature?.let { sig -> IrEnumEntryPublicSymbolImpl(sig) } ?: IrEnumEntrySymbolImpl()
}
declaration.acceptChildrenVoid(this)
}
override fun visitSimpleFunction(declaration: IrSimpleFunction) {
remapSymbol(functions, declaration) { symbol ->
symbol.signature?.let { sig -> IrSimpleFunctionPublicSymbolImpl(sig) } ?: IrSimpleFunctionSymbolImpl()
}
declaration.acceptChildrenVoid(this)
}
override fun visitProperty(declaration: IrProperty) {
remapSymbol(properties, declaration) { symbol ->
symbol.signature?.let { sig -> IrPropertyPublicSymbolImpl(sig) } ?: IrPropertySymbolImpl()
}
declaration.acceptChildrenVoid(this)
}
override fun visitTypeAlias(declaration: IrTypeAlias) {
remapSymbol(typeAliases, declaration) { symbol ->
symbol.signature?.let { sig -> IrTypeAliasPublicSymbolImpl(sig) } ?: IrTypeAliasSymbolImpl()
}
declaration.acceptChildrenVoid(this)
}
}
@@ -58,9 +58,9 @@ fun Collection<IrOverridableMember>.collectAndFilterRealOverrides(
val realOverrides = mutableMapOf<Any, IrOverridableMember>()
/*
Due to IR copying in performByIrFile, overrides should only be distinguished up to their fqNames.
Due to IR copying in performByIrFile, overrides should only be distinguished up to their signatures.
*/
fun IrOverridableMember.toKey(): Any = fqNameWhenAvailable ?: this
fun IrOverridableMember.toKey(): Any = symbol.signature ?: this
fun overriddenSymbols(declaration: IrOverridableMember) = when (declaration) {
is IrSimpleFunction -> declaration.overriddenSymbols