[FIR] Enter loops in resolve using independent context

This commit is contained in:
Mikhail Glukhikh
2020-09-02 13:20:18 +03:00
parent a7da0d5080
commit 548adc29d0
9 changed files with 645 additions and 6 deletions
@@ -0,0 +1,45 @@
// WITH_RUNTIME
// FULL_JDK
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
}