IR: preserve signatures when copying IrFiles in performByIrFile
This commit is contained in:
+2
-2
@@ -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)
|
||||
|
||||
+54
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user