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.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrFileSymbol import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol 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.copyTypeAndValueArgumentsFrom
import org.jetbrains.kotlin.ir.util.deepCopySavingMetadata import org.jetbrains.kotlin.ir.util.deepCopySavingMetadata
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
@@ -149,7 +149,7 @@ fun IrFile.copySavingMappings(
return newIrFile return newIrFile
} }
private class DeepCopySymbolRemapperSavingFunctions : DeepCopySymbolRemapper() { private class DeepCopySymbolRemapperSavingFunctions : DeepCopySymbolRemapperPreservingSignatures() {
val declaredFunctions = mutableSetOf<IrSimpleFunctionSymbol>() val declaredFunctions = mutableSetOf<IrSimpleFunctionSymbol>()
val declaredClasses = mutableSetOf<IrClassSymbol>() val declaredClasses = mutableSetOf<IrClassSymbol>()
@@ -32,21 +32,21 @@ open class DeepCopySymbolRemapper(
private val descriptorsRemapper: DescriptorsRemapper = NullDescriptorsRemapper private val descriptorsRemapper: DescriptorsRemapper = NullDescriptorsRemapper
) : IrElementVisitorVoid, SymbolRemapper { ) : IrElementVisitorVoid, SymbolRemapper {
private val classes = hashMapOf<IrClassSymbol, IrClassSymbol>() protected val classes = hashMapOf<IrClassSymbol, IrClassSymbol>()
private val scripts = hashMapOf<IrScriptSymbol, IrScriptSymbol>() protected val scripts = hashMapOf<IrScriptSymbol, IrScriptSymbol>()
private val constructors = hashMapOf<IrConstructorSymbol, IrConstructorSymbol>() protected val constructors = hashMapOf<IrConstructorSymbol, IrConstructorSymbol>()
private val enumEntries = hashMapOf<IrEnumEntrySymbol, IrEnumEntrySymbol>() protected val enumEntries = hashMapOf<IrEnumEntrySymbol, IrEnumEntrySymbol>()
private val externalPackageFragments = hashMapOf<IrExternalPackageFragmentSymbol, IrExternalPackageFragmentSymbol>() protected val externalPackageFragments = hashMapOf<IrExternalPackageFragmentSymbol, IrExternalPackageFragmentSymbol>()
private val fields = hashMapOf<IrFieldSymbol, IrFieldSymbol>() protected val fields = hashMapOf<IrFieldSymbol, IrFieldSymbol>()
private val files = hashMapOf<IrFileSymbol, IrFileSymbol>() protected val files = hashMapOf<IrFileSymbol, IrFileSymbol>()
private val functions = hashMapOf<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>() protected val functions = hashMapOf<IrSimpleFunctionSymbol, IrSimpleFunctionSymbol>()
private val properties = hashMapOf<IrPropertySymbol, IrPropertySymbol>() protected val properties = hashMapOf<IrPropertySymbol, IrPropertySymbol>()
private val returnableBlocks = hashMapOf<IrReturnableBlockSymbol, IrReturnableBlockSymbol>() protected val returnableBlocks = hashMapOf<IrReturnableBlockSymbol, IrReturnableBlockSymbol>()
private val typeParameters = hashMapOf<IrTypeParameterSymbol, IrTypeParameterSymbol>() protected val typeParameters = hashMapOf<IrTypeParameterSymbol, IrTypeParameterSymbol>()
private val valueParameters = hashMapOf<IrValueParameterSymbol, IrValueParameterSymbol>() protected val valueParameters = hashMapOf<IrValueParameterSymbol, IrValueParameterSymbol>()
private val variables = hashMapOf<IrVariableSymbol, IrVariableSymbol>() protected val variables = hashMapOf<IrVariableSymbol, IrVariableSymbol>()
private val localDelegatedProperties = hashMapOf<IrLocalDelegatedPropertySymbol, IrLocalDelegatedPropertySymbol>() protected val localDelegatedProperties = hashMapOf<IrLocalDelegatedPropertySymbol, IrLocalDelegatedPropertySymbol>()
private val typeAliases = hashMapOf<IrTypeAliasSymbol, IrTypeAliasSymbol>() protected val typeAliases = hashMapOf<IrTypeAliasSymbol, IrTypeAliasSymbol>()
override fun visitElement(element: IrElement) { override fun visitElement(element: IrElement) {
element.acceptChildrenVoid(this) 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>() 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) { fun overriddenSymbols(declaration: IrOverridableMember) = when (declaration) {
is IrSimpleFunction -> declaration.overriddenSymbols is IrSimpleFunction -> declaration.overriddenSymbols