IrTypes: deep copy with symbols

Preliminary implementation of type remapper (does nothing).
This commit is contained in:
Dmitry Petrov
2018-05-17 15:03:05 +03:00
parent 062c4bf41d
commit 4eb2fc66d0
5 changed files with 99 additions and 38 deletions
@@ -20,7 +20,7 @@ import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.expressions.IrLoop import org.jetbrains.kotlin.ir.expressions.IrLoop
import org.jetbrains.kotlin.ir.util.DeepCopySymbolsRemapper import org.jetbrains.kotlin.ir.util.DeepCopySymbolRemapper
import org.jetbrains.kotlin.ir.util.DescriptorsRemapper import org.jetbrains.kotlin.ir.util.DescriptorsRemapper
import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid
@@ -38,7 +38,7 @@ fun <T : IrElement> T.deepCopyWithVariables(): T {
) )
} }
val symbolsRemapper = DeepCopySymbolsRemapper(descriptorsRemapper) val symbolsRemapper = DeepCopySymbolRemapper(descriptorsRemapper)
acceptVoid(symbolsRemapper) acceptVoid(symbolsRemapper)
return this.transform( return this.transform(
@@ -27,18 +27,24 @@ import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol
import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid
import java.util.* import java.util.*
inline fun <reified T : IrElement> T.deepCopyWithSymbols(initialParent: IrDeclarationParent? = null): T { inline fun <reified T : IrElement> T.deepCopyWithSymbols(initialParent: IrDeclarationParent? = null): T {
val remapper = DeepCopySymbolsRemapper() val symbolRemapper = DeepCopySymbolRemapper()
acceptVoid(remapper) acceptVoid(symbolRemapper)
return transform(DeepCopyIrTreeWithSymbols(remapper), null).patchDeclarationParents(initialParent) as T val typeRemapper = DeepCopyTypeRemapper(symbolRemapper)
return transform(DeepCopyIrTreeWithSymbols(symbolRemapper, typeRemapper), null).patchDeclarationParents(initialParent) as T
} }
open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper) : IrElementTransformerVoid() { open class DeepCopyIrTreeWithSymbols(
private val symbolRemapper: SymbolRemapper,
private val typeRemapper: TypeRemapper
) : IrElementTransformerVoid() {
private fun mapDeclarationOrigin(origin: IrDeclarationOrigin) = origin private fun mapDeclarationOrigin(origin: IrDeclarationOrigin) = origin
private fun mapStatementOrigin(origin: IrStatementOrigin?) = origin private fun mapStatementOrigin(origin: IrStatementOrigin?) = origin
@@ -54,6 +60,8 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
private fun <T : IrDeclarationContainer> T.transformDeclarationsTo(destination: T) = private fun <T : IrDeclarationContainer> T.transformDeclarationsTo(destination: T) =
declarations.transformTo(destination.declarations) declarations.transformTo(destination.declarations)
private fun IrType.remapType() = typeRemapper.remapType(this)
override fun visitElement(element: IrElement): IrElement = override fun visitElement(element: IrElement): IrElement =
throw IllegalArgumentException("Unsupported element type: $element") throw IllegalArgumentException("Unsupported element type: $element")
@@ -112,7 +120,8 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
IrFunctionImpl( IrFunctionImpl(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredFunction(declaration.symbol) symbolRemapper.getDeclaredFunction(declaration.symbol),
declaration.returnType.remapType()
).apply { ).apply {
declaration.overriddenSymbols.mapTo(overriddenSymbols) { declaration.overriddenSymbols.mapTo(overriddenSymbols) {
symbolRemapper.getReferencedFunction(it) as IrSimpleFunctionSymbol symbolRemapper.getReferencedFunction(it) as IrSimpleFunctionSymbol
@@ -124,7 +133,8 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
IrConstructorImpl( IrConstructorImpl(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredConstructor(declaration.symbol) symbolRemapper.getDeclaredConstructor(declaration.symbol),
declaration.returnType.remapType()
).apply { ).apply {
transformFunctionChildren(declaration) transformFunctionChildren(declaration)
} }
@@ -149,6 +159,7 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
declaration.isDelegated, declaration.isDelegated,
declaration.descriptor, declaration.descriptor,
declaration.type.remapType(),
declaration.backingField?.transform(), declaration.backingField?.transform(),
declaration.getter?.transform(), declaration.getter?.transform(),
declaration.setter?.transform() declaration.setter?.transform()
@@ -160,7 +171,8 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
IrFieldImpl( IrFieldImpl(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredField(declaration.symbol) symbolRemapper.getDeclaredField(declaration.symbol),
declaration.type.remapType()
).apply { ).apply {
transformAnnotations(declaration) transformAnnotations(declaration)
initializer = declaration.initializer?.transform() initializer = declaration.initializer?.transform()
@@ -171,6 +183,7 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
declaration.descriptor, declaration.descriptor,
declaration.type.remapType(),
declaration.delegate.transform(), declaration.delegate.transform(),
declaration.getter.transform(), declaration.getter.transform(),
declaration.setter?.transform() declaration.setter?.transform()
@@ -202,7 +215,8 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
IrVariableImpl( IrVariableImpl(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredVariable(declaration.symbol) symbolRemapper.getDeclaredVariable(declaration.symbol),
declaration.type.remapType()
).apply { ).apply {
transformAnnotations(declaration) transformAnnotations(declaration)
initializer = declaration.initializer?.transform() initializer = declaration.initializer?.transform()
@@ -212,7 +226,8 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
IrTypeParameterImpl( IrTypeParameterImpl(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredTypeParameter(declaration.symbol) symbolRemapper.getDeclaredTypeParameter(declaration.symbol),
declaration.upperBounds.map { it.remapType() }
).apply { ).apply {
transformAnnotations(declaration) transformAnnotations(declaration)
declaration.superClassifiers.mapTo(superClassifiers) { declaration.superClassifiers.mapTo(superClassifiers) {
@@ -224,7 +239,9 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
IrValueParameterImpl( IrValueParameterImpl(
declaration.startOffset, declaration.endOffset, declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin), mapDeclarationOrigin(declaration.origin),
symbolRemapper.getDeclaredValueParameter(declaration.symbol) symbolRemapper.getDeclaredValueParameter(declaration.symbol),
declaration.type.remapType(),
declaration.varargElementType?.remapType()
).apply { ).apply {
transformAnnotations(declaration) transformAnnotations(declaration)
defaultValue = declaration.defaultValue?.transform() defaultValue = declaration.defaultValue?.transform()
@@ -254,7 +271,7 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
override fun visitVararg(expression: IrVararg): IrVararg = override fun visitVararg(expression: IrVararg): IrVararg =
IrVarargImpl( IrVarargImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.varargElementType, expression.type.remapType(), expression.varargElementType.remapType(),
expression.elements.transform() expression.elements.transform()
) )
@@ -267,7 +284,7 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
override fun visitBlock(expression: IrBlock): IrBlock = override fun visitBlock(expression: IrBlock): IrBlock =
IrBlockImpl( IrBlockImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
mapStatementOrigin(expression.origin), mapStatementOrigin(expression.origin),
expression.statements.map { it.transform() } expression.statements.map { it.transform() }
) )
@@ -275,7 +292,7 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
override fun visitComposite(expression: IrComposite): IrComposite = override fun visitComposite(expression: IrComposite): IrComposite =
IrCompositeImpl( IrCompositeImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
mapStatementOrigin(expression.origin), mapStatementOrigin(expression.origin),
expression.statements.map { it.transform() } expression.statements.map { it.transform() }
) )
@@ -283,27 +300,28 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
override fun visitStringConcatenation(expression: IrStringConcatenation): IrStringConcatenation = override fun visitStringConcatenation(expression: IrStringConcatenation): IrStringConcatenation =
IrStringConcatenationImpl( IrStringConcatenationImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
expression.arguments.map { it.transform() } expression.arguments.map { it.transform() }
) )
override fun visitGetObjectValue(expression: IrGetObjectValue): IrGetObjectValue = override fun visitGetObjectValue(expression: IrGetObjectValue): IrGetObjectValue =
IrGetObjectValueImpl( IrGetObjectValueImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
symbolRemapper.getReferencedClass(expression.symbol) symbolRemapper.getReferencedClass(expression.symbol)
) )
override fun visitGetEnumValue(expression: IrGetEnumValue): IrGetEnumValue = override fun visitGetEnumValue(expression: IrGetEnumValue): IrGetEnumValue =
IrGetEnumValueImpl( IrGetEnumValueImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
symbolRemapper.getReferencedEnumEntry(expression.symbol) symbolRemapper.getReferencedEnumEntry(expression.symbol)
) )
override fun visitGetValue(expression: IrGetValue): IrGetValue = override fun visitGetValue(expression: IrGetValue): IrGetValue =
IrGetValueImpl( IrGetValueImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type.remapType(),
symbolRemapper.getReferencedValue(expression.symbol), symbolRemapper.getReferencedValue(expression.symbol),
mapStatementOrigin(expression.origin) mapStatementOrigin(expression.origin)
) )
@@ -311,6 +329,7 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
override fun visitSetVariable(expression: IrSetVariable): IrSetVariable = override fun visitSetVariable(expression: IrSetVariable): IrSetVariable =
IrSetVariableImpl( IrSetVariableImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type.remapType(),
symbolRemapper.getReferencedVariable(expression.symbol), symbolRemapper.getReferencedVariable(expression.symbol),
expression.value.transform(), expression.value.transform(),
mapStatementOrigin(expression.origin) mapStatementOrigin(expression.origin)
@@ -320,6 +339,7 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
IrGetFieldImpl( IrGetFieldImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
symbolRemapper.getReferencedField(expression.symbol), symbolRemapper.getReferencedField(expression.symbol),
expression.type.remapType(),
expression.receiver?.transform(), expression.receiver?.transform(),
mapStatementOrigin(expression.origin), mapStatementOrigin(expression.origin),
symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol) symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
@@ -331,16 +351,26 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
symbolRemapper.getReferencedField(expression.symbol), symbolRemapper.getReferencedField(expression.symbol),
expression.receiver?.transform(), expression.receiver?.transform(),
expression.value.transform(), expression.value.transform(),
expression.type.remapType(),
mapStatementOrigin(expression.origin), mapStatementOrigin(expression.origin),
symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol) symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
) )
override fun visitCall(expression: IrCall): IrCall = override fun visitCall(expression: IrCall): IrCall =
shallowCopyCall(expression).apply { shallowCopyCall(expression).apply {
copyTypeArgumentsFrom(expression) copyRemappedTypeArgumentsFrom(expression)
transformValueArguments(expression) transformValueArguments(expression)
} }
private fun IrMemberAccessExpression.copyRemappedTypeArgumentsFrom(other: IrMemberAccessExpression) {
assert(typeArgumentsCount == other.typeArgumentsCount) {
"Mismatching type arguments: $typeArgumentsCount vs ${other.typeArgumentsCount} "
}
for (i in 0 until typeArgumentsCount) {
putTypeArgument(i, other.getTypeArgument(i)?.remapType())
}
}
private fun shallowCopyCall(expression: IrCall) = private fun shallowCopyCall(expression: IrCall) =
when (expression) { when (expression) {
is IrCallWithShallowCopy -> is IrCallWithShallowCopy ->
@@ -353,14 +383,14 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
val newCallee = symbolRemapper.getReferencedFunction(expression.symbol) val newCallee = symbolRemapper.getReferencedFunction(expression.symbol)
IrCallImpl( IrCallImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
newCallee, newCallee,
expression.descriptor, // TODO substitute referenced descriptor expression.descriptor, // TODO substitute referenced descriptor
expression.typeArgumentsCount, expression.typeArgumentsCount,
mapStatementOrigin(expression.origin), mapStatementOrigin(expression.origin),
symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol) symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
).apply { ).apply {
copyTypeArgumentsFrom(expression) copyRemappedTypeArgumentsFrom(expression)
} }
} }
} }
@@ -382,11 +412,12 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
val newConstructor = symbolRemapper.getReferencedConstructor(expression.symbol) val newConstructor = symbolRemapper.getReferencedConstructor(expression.symbol)
return IrDelegatingConstructorCallImpl( return IrDelegatingConstructorCallImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type.remapType(),
newConstructor, newConstructor,
expression.descriptor, expression.descriptor,
expression.typeArgumentsCount expression.typeArgumentsCount
).apply { ).apply {
copyTypeArgumentsFrom(expression) copyRemappedTypeArgumentsFrom(expression)
transformValueArguments(expression) transformValueArguments(expression)
} }
} }
@@ -395,10 +426,11 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
val newConstructor = symbolRemapper.getReferencedConstructor(expression.symbol) val newConstructor = symbolRemapper.getReferencedConstructor(expression.symbol)
return IrEnumConstructorCallImpl( return IrEnumConstructorCallImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type.remapType(),
newConstructor, newConstructor,
expression.typeArgumentsCount expression.typeArgumentsCount
).apply { ).apply {
copyTypeArgumentsFrom(expression) copyRemappedTypeArgumentsFrom(expression)
transformValueArguments(expression) transformValueArguments(expression)
} }
} }
@@ -406,27 +438,27 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
override fun visitGetClass(expression: IrGetClass): IrGetClass = override fun visitGetClass(expression: IrGetClass): IrGetClass =
IrGetClassImpl( IrGetClassImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
expression.argument.transform() expression.argument.transform()
) )
override fun visitFunctionReference(expression: IrFunctionReference): IrFunctionReference = override fun visitFunctionReference(expression: IrFunctionReference): IrFunctionReference =
IrFunctionReferenceImpl( IrFunctionReferenceImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
symbolRemapper.getReferencedFunction(expression.symbol), symbolRemapper.getReferencedFunction(expression.symbol),
expression.descriptor, // TODO substitute referenced descriptor expression.descriptor, // TODO substitute referenced descriptor
expression.typeArgumentsCount, expression.typeArgumentsCount,
mapStatementOrigin(expression.origin) mapStatementOrigin(expression.origin)
).apply { ).apply {
copyTypeArgumentsFrom(expression) copyRemappedTypeArgumentsFrom(expression)
transformValueArguments(expression) transformValueArguments(expression)
} }
override fun visitPropertyReference(expression: IrPropertyReference): IrPropertyReference = override fun visitPropertyReference(expression: IrPropertyReference): IrPropertyReference =
IrPropertyReferenceImpl( IrPropertyReferenceImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
expression.descriptor, expression.descriptor,
expression.typeArgumentsCount, expression.typeArgumentsCount,
expression.field?.let { symbolRemapper.getReferencedField(it) }, expression.field?.let { symbolRemapper.getReferencedField(it) },
@@ -434,14 +466,14 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
expression.setter?.let { symbolRemapper.getReferencedFunction(it) }, expression.setter?.let { symbolRemapper.getReferencedFunction(it) },
mapStatementOrigin(expression.origin) mapStatementOrigin(expression.origin)
).apply { ).apply {
copyTypeArgumentsFrom(expression) copyRemappedTypeArgumentsFrom(expression)
transformReceiverArguments(expression) transformReceiverArguments(expression)
} }
override fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference): IrLocalDelegatedPropertyReference = override fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference): IrLocalDelegatedPropertyReference =
IrLocalDelegatedPropertyReferenceImpl( IrLocalDelegatedPropertyReferenceImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
expression.descriptor, expression.descriptor,
symbolRemapper.getReferencedVariable(expression.delegate), symbolRemapper.getReferencedVariable(expression.delegate),
symbolRemapper.getReferencedFunction(expression.getter), symbolRemapper.getReferencedFunction(expression.getter),
@@ -452,7 +484,7 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
override fun visitClassReference(expression: IrClassReference): IrClassReference = override fun visitClassReference(expression: IrClassReference): IrClassReference =
IrClassReferenceImpl( IrClassReferenceImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
symbolRemapper.getReferencedClassifier(expression.symbol), symbolRemapper.getReferencedClassifier(expression.symbol),
expression.classType expression.classType
) )
@@ -460,13 +492,14 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
override fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall): IrInstanceInitializerCall = override fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall): IrInstanceInitializerCall =
IrInstanceInitializerCallImpl( IrInstanceInitializerCallImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
symbolRemapper.getReferencedClass(expression.classSymbol) symbolRemapper.getReferencedClass(expression.classSymbol),
expression.type.remapType()
) )
override fun visitTypeOperator(expression: IrTypeOperatorCall): IrTypeOperatorCall = override fun visitTypeOperator(expression: IrTypeOperatorCall): IrTypeOperatorCall =
IrTypeOperatorCallImpl( IrTypeOperatorCallImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
expression.operator, expression.operator,
expression.typeOperand, expression.typeOperand,
symbolRemapper.getReferencedClassifier(expression.typeOperandClassifier), symbolRemapper.getReferencedClassifier(expression.typeOperandClassifier),
@@ -476,7 +509,7 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
override fun visitWhen(expression: IrWhen): IrWhen = override fun visitWhen(expression: IrWhen): IrWhen =
IrWhenImpl( IrWhenImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
mapStatementOrigin(expression.origin), mapStatementOrigin(expression.origin),
expression.branches.map { it.transform() } expression.branches.map { it.transform() }
) )
@@ -552,7 +585,7 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
override fun visitReturn(expression: IrReturn): IrReturn = override fun visitReturn(expression: IrReturn): IrReturn =
IrReturnImpl( IrReturnImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
symbolRemapper.getReferencedReturnTarget(expression.returnTargetSymbol), symbolRemapper.getReferencedReturnTarget(expression.returnTargetSymbol),
expression.value.transform() expression.value.transform()
) )
@@ -567,7 +600,7 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
override fun visitThrow(expression: IrThrow): IrThrow = override fun visitThrow(expression: IrThrow): IrThrow =
IrThrowImpl( IrThrowImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
expression.value.transform() expression.value.transform()
) )
@@ -577,14 +610,14 @@ open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper)
override fun visitErrorExpression(expression: IrErrorExpression): IrErrorExpression = override fun visitErrorExpression(expression: IrErrorExpression): IrErrorExpression =
IrErrorExpressionImpl( IrErrorExpressionImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
expression.description expression.description
) )
override fun visitErrorCallExpression(expression: IrErrorCallExpression): IrErrorCallExpression = override fun visitErrorCallExpression(expression: IrErrorCallExpression): IrErrorCallExpression =
IrErrorCallExpressionImpl( IrErrorCallExpressionImpl(
expression.startOffset, expression.endOffset, expression.startOffset, expression.endOffset,
expression.type, expression.type.remapType(),
expression.description expression.description
).apply { ).apply {
explicitReceiver = expression.explicitReceiver?.transform() explicitReceiver = expression.explicitReceiver?.transform()
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.ir.symbols.impl.*
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
open class DeepCopySymbolsRemapper( open class DeepCopySymbolRemapper(
private val descriptorsRemapper: DescriptorsRemapper = DescriptorsRemapper.DEFAULT private val descriptorsRemapper: DescriptorsRemapper = DescriptorsRemapper.DEFAULT
) : IrElementVisitorVoid, SymbolRemapper { ) : IrElementVisitorVoid, SymbolRemapper {
private val classes = hashMapOf<IrClassSymbol, IrClassSymbol>() private val classes = hashMapOf<IrClassSymbol, IrClassSymbol>()
@@ -0,0 +1,16 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. 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.types.IrType
class DeepCopyTypeRemapper(
private val symbolRemapper: SymbolRemapper
) : TypeRemapper {
override fun remapType(type: IrType): IrType = type // TODO
}
@@ -0,0 +1,12 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. 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.types.IrType
interface TypeRemapper {
fun remapType(type: IrType): IrType
}