blob: a5300b19bb1a620fbaee5f39fa2787542a52046c [file]
// LANGUAGE: +NameBasedDestructuring +DeprecateNameMismatchInShortDestructuringWithParentheses +EnableNameBasedDestructuringShortForm
// RUN_PIPELINE_TILL: BACKEND
interface IrType
interface TypeRemapper {
fun enterScope(irTypeParametersContainer: IrTypeParametersContainer)
fun remapType(type: IrType): IrType
fun leaveScope()
}
interface IrTypeParametersContainer : IrDeclaration, IrDeclarationParent {
var typeParameters: List<IrTypeParameter>
}
interface IrDeclaration
interface IrTypeParameter : IrDeclaration {
val superTypes: MutableList<IrType>
}
interface IrDeclarationParent
class DeepCopyIrTreeWithSymbols(private val typeRemapper: TypeRemapper) {
private fun copyTypeParameter(declaration: IrTypeParameter): IrTypeParameter = declaration
fun IrTypeParametersContainer.copyTypeParametersFrom(other: IrTypeParametersContainer) {
this.typeParameters = other.typeParameters.map {
copyTypeParameter(it)
}
typeRemapper.withinScope(this) {
for ([thisTypeParameter, otherTypeParameter] in this.typeParameters.zip(other.typeParameters)) {
otherTypeParameter.superTypes.mapTo(thisTypeParameter.superTypes) {
typeRemapper.remapType(it)
}
}
}
}
}
inline fun <T> TypeRemapper.withinScope(irTypeParametersContainer: IrTypeParametersContainer, fn: () -> T): T {
enterScope(irTypeParametersContainer)
val result = fn()
leaveScope()
return result
}
/* GENERATED_FIR_TAGS: assignment, classDeclaration, forLoop, funWithExtensionReceiver, functionDeclaration,
functionalType, inline, interfaceDeclaration, lambdaLiteral, localProperty, nullableType, primaryConstructor,
propertyDeclaration, thisExpression, typeParameter */