Skip to content

Commit 2cda5aa

Browse files
committed
Additional customization for DeepCopyIrTreeWithSymbols
1. Allow overriding 'getNonTransformedLoop' 2. Allow descriptor remapping on deep copy
1 parent b9dee7f commit 2cda5aa

File tree

3 files changed

+69
-13
lines changed

3 files changed

+69
-13
lines changed

compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ inline fun <reified T : IrElement> T.deepCopyWithSymbols(): T {
3636
}
3737

3838

39-
class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper) : IrElementTransformerVoid() {
39+
open class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper) : IrElementTransformerVoid() {
4040
private fun mapDeclarationOrigin(origin: IrDeclarationOrigin) = origin
4141
private fun mapStatementOrigin(origin: IrStatementOrigin?) = origin
4242

@@ -455,7 +455,7 @@ class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper) : Ir
455455
private fun getTransformedLoop(irLoop: IrLoop): IrLoop =
456456
transformedLoops.getOrElse(irLoop) { getNonTransformedLoop(irLoop) }
457457

458-
private fun getNonTransformedLoop(irLoop: IrLoop): IrLoop =
458+
protected open fun getNonTransformedLoop(irLoop: IrLoop): IrLoop =
459459
throw AssertionError("Outer loop was not transformed: ${irLoop.render()}")
460460

461461
override fun visitWhileLoop(loop: IrWhileLoop): IrWhileLoop =

compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySymbolsRemapper.kt

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ import org.jetbrains.kotlin.ir.symbols.impl.*
2424
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
2525
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
2626

27-
class DeepCopySymbolsRemapper : IrElementVisitorVoid, SymbolRemapper {
27+
class DeepCopySymbolsRemapper(
28+
val descriptorsRemapper: DescriptorsRemapper = DescriptorsRemapper.DEFAULT
29+
) : IrElementVisitorVoid, SymbolRemapper {
2830
private val classes = hashMapOf<IrClassSymbol, IrClassSymbol>()
2931
private val constructors = hashMapOf<IrConstructorSymbol, IrConstructorSymbol>()
3032
private val enumEntries = hashMapOf<IrEnumEntrySymbol, IrEnumEntrySymbol>()
@@ -47,52 +49,72 @@ class DeepCopySymbolsRemapper : IrElementVisitorVoid, SymbolRemapper {
4749
}
4850

4951
override fun visitClass(declaration: IrClass) {
50-
remapSymbol(classes, declaration) { IrClassSymbolImpl(it.descriptor) }
52+
remapSymbol(classes, declaration) {
53+
IrClassSymbolImpl(descriptorsRemapper.remapDeclaredClass(it.descriptor))
54+
}
5155
declaration.acceptChildrenVoid(this)
5256
}
5357

5458
override fun visitConstructor(declaration: IrConstructor) {
55-
remapSymbol(constructors, declaration) { IrConstructorSymbolImpl(it.descriptor) }
59+
remapSymbol(constructors, declaration) {
60+
IrConstructorSymbolImpl(descriptorsRemapper.remapDeclaredConstructor(it.descriptor))
61+
}
5662
declaration.acceptChildrenVoid(this)
5763
}
5864

5965
override fun visitEnumEntry(declaration: IrEnumEntry) {
60-
remapSymbol(enumEntries, declaration) { IrEnumEntrySymbolImpl(it.descriptor) }
66+
remapSymbol(enumEntries, declaration) {
67+
IrEnumEntrySymbolImpl(descriptorsRemapper.remapDeclaredEnumEntry(it.descriptor))
68+
}
6169
declaration.acceptChildrenVoid(this)
6270
}
6371

6472
override fun visitExternalPackageFragment(declaration: IrExternalPackageFragment) {
65-
remapSymbol(externalPackageFragments, declaration) { IrExternalPackageFragmentSymbolImpl(it.descriptor) }
73+
remapSymbol(externalPackageFragments, declaration) {
74+
IrExternalPackageFragmentSymbolImpl(descriptorsRemapper.remapDeclaredExternalPackageFragment(it.descriptor))
75+
}
6676
declaration.acceptChildrenVoid(this)
6777
}
6878

6979
override fun visitField(declaration: IrField) {
70-
remapSymbol(fields, declaration) { IrFieldSymbolImpl(it.descriptor) }
80+
remapSymbol(fields, declaration) {
81+
IrFieldSymbolImpl(descriptorsRemapper.remapDeclaredField(it.descriptor))
82+
}
7183
declaration.acceptChildrenVoid(this)
7284
}
7385

7486
override fun visitFile(declaration: IrFile) {
75-
remapSymbol(files, declaration) { IrFileSymbolImpl(it.descriptor) }
87+
remapSymbol(files, declaration) {
88+
IrFileSymbolImpl(descriptorsRemapper.remapDeclaredFilePackageFragment(it.descriptor))
89+
}
7690
declaration.acceptChildrenVoid(this)
7791
}
7892

7993
override fun visitSimpleFunction(declaration: IrSimpleFunction) {
80-
remapSymbol(functions, declaration) { IrSimpleFunctionSymbolImpl(it.descriptor) }
94+
remapSymbol(functions, declaration) {
95+
IrSimpleFunctionSymbolImpl(descriptorsRemapper.remapDeclaredSimpleFunction(it.descriptor))
96+
}
8197
declaration.acceptChildrenVoid(this)
8298
}
8399

84100
override fun visitTypeParameter(declaration: IrTypeParameter) {
85-
remapSymbol(typeParameters, declaration) { IrTypeParameterSymbolImpl(it.descriptor) }
101+
remapSymbol(typeParameters, declaration) {
102+
IrTypeParameterSymbolImpl(descriptorsRemapper.remapDeclaredTypeParameter(it.descriptor))
103+
}
86104
declaration.acceptChildrenVoid(this)
87105
}
88106

89107
override fun visitValueParameter(declaration: IrValueParameter) {
90-
remapSymbol(valueParameters, declaration) { IrValueParameterSymbolImpl(it.descriptor) }
108+
remapSymbol(valueParameters, declaration) {
109+
IrValueParameterSymbolImpl(descriptorsRemapper.remapDeclaredValueParameter(it.descriptor))
110+
}
91111
declaration.acceptChildrenVoid(this)
92112
}
93113

94114
override fun visitVariable(declaration: IrVariable) {
95-
remapSymbol(variables, declaration) { IrVariableSymbolImpl(it.descriptor) }
115+
remapSymbol(variables, declaration) {
116+
IrVariableSymbolImpl(descriptorsRemapper.remapDeclaredVariable(it.descriptor))
117+
}
96118
declaration.acceptChildrenVoid(this)
97119
}
98120

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright 2010-2017 JetBrains s.r.o.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.jetbrains.kotlin.ir.util
18+
19+
import org.jetbrains.kotlin.descriptors.*
20+
21+
interface DescriptorsRemapper {
22+
fun remapDeclaredClass(descriptor: ClassDescriptor): ClassDescriptor = descriptor
23+
fun remapDeclaredConstructor(descriptor: ClassConstructorDescriptor): ClassConstructorDescriptor = descriptor
24+
fun remapDeclaredEnumEntry(descriptor: ClassDescriptor): ClassDescriptor = descriptor
25+
fun remapDeclaredExternalPackageFragment(descriptor: PackageFragmentDescriptor): PackageFragmentDescriptor = descriptor
26+
fun remapDeclaredField(descriptor: PropertyDescriptor): PropertyDescriptor = descriptor
27+
fun remapDeclaredFilePackageFragment(descriptor: PackageFragmentDescriptor): PackageFragmentDescriptor = descriptor
28+
fun remapDeclaredSimpleFunction(descriptor: FunctionDescriptor): FunctionDescriptor = descriptor
29+
fun remapDeclaredTypeParameter(descriptor: TypeParameterDescriptor): TypeParameterDescriptor = descriptor
30+
fun remapDeclaredValueParameter(descriptor: ParameterDescriptor): ParameterDescriptor = descriptor
31+
fun remapDeclaredVariable(descriptor: VariableDescriptor): VariableDescriptor = descriptor
32+
33+
object DEFAULT : DescriptorsRemapper
34+
}

0 commit comments

Comments
 (0)