提交 b9dee7fc 编写于 作者: D Dmitry Petrov

Extract SymbolRemapper interface for DeepCopy customization

上级 5f57368b
......@@ -36,7 +36,7 @@ inline fun <reified T : IrElement> T.deepCopyWithSymbols(): T {
}
class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRemapper) : IrElementTransformerVoid() {
class DeepCopyIrTreeWithSymbols(private val symbolRemapper: SymbolRemapper) : IrElementTransformerVoid() {
private fun mapDeclarationOrigin(origin: IrDeclarationOrigin) = origin
private fun mapStatementOrigin(origin: IrStatementOrigin?) = origin
......@@ -64,7 +64,7 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
override fun visitExternalPackageFragment(declaration: IrExternalPackageFragment, data: Nothing?): IrExternalPackageFragment =
IrExternalPackageFragmentImpl(
symbolsRemapper.getDeclaredExternalPackageFragment(declaration.symbol)
symbolRemapper.getDeclaredExternalPackageFragment(declaration.symbol)
).apply {
declaration.transformDeclarationsTo(this)
}
......@@ -72,7 +72,7 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
override fun visitFile(declaration: IrFile): IrFile =
IrFileImpl(
declaration.fileEntry,
symbolsRemapper.getDeclaredFile(declaration.symbol)
symbolRemapper.getDeclaredFile(declaration.symbol)
).apply {
fileAnnotations.addAll(declaration.fileAnnotations)
declaration.transformDeclarationsTo(this)
......@@ -85,7 +85,7 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
IrClassImpl(
declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin),
symbolsRemapper.getDeclaredClass(declaration.symbol)
symbolRemapper.getDeclaredClass(declaration.symbol)
).apply {
thisReceiver = declaration.thisReceiver?.transform()
declaration.typeParameters.transformTo(typeParameters)
......@@ -103,7 +103,7 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
IrFunctionImpl(
declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin),
symbolsRemapper.getDeclaredFunction(declaration.symbol)
symbolRemapper.getDeclaredFunction(declaration.symbol)
).apply {
transformFunctionChildren(declaration)
}
......@@ -112,7 +112,7 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
IrConstructorImpl(
declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin),
symbolsRemapper.getDeclaredConstructor(declaration.symbol)
symbolRemapper.getDeclaredConstructor(declaration.symbol)
).apply {
transformFunctionChildren(declaration)
}
......@@ -141,7 +141,7 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
IrFieldImpl(
declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin),
symbolsRemapper.getDeclaredField(declaration.symbol)
symbolRemapper.getDeclaredField(declaration.symbol)
).apply {
initializer = declaration.initializer?.transform()
}
......@@ -160,7 +160,7 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
IrEnumEntryImpl(
declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin),
symbolsRemapper.getDeclaredEnumEntry(declaration.symbol)
symbolRemapper.getDeclaredEnumEntry(declaration.symbol)
).apply {
correspondingClass = declaration.correspondingClass?.transform()
initializerExpression = declaration.initializerExpression?.transform()
......@@ -179,7 +179,7 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
IrVariableImpl(
declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin),
symbolsRemapper.getDeclaredVariable(declaration.symbol)
symbolRemapper.getDeclaredVariable(declaration.symbol)
).apply {
initializer = declaration.initializer?.transform()
}
......@@ -188,14 +188,14 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
IrTypeParameterImpl(
declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin),
symbolsRemapper.getDeclaredTypeParameter(declaration.symbol)
symbolRemapper.getDeclaredTypeParameter(declaration.symbol)
)
override fun visitValueParameter(declaration: IrValueParameter): IrValueParameter =
IrValueParameterImpl(
declaration.startOffset, declaration.endOffset,
mapDeclarationOrigin(declaration.origin),
symbolsRemapper.getDeclaredValueParameter(declaration.symbol)
symbolRemapper.getDeclaredValueParameter(declaration.symbol)
).apply {
defaultValue = declaration.defaultValue?.transform()
}
......@@ -261,27 +261,27 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
IrGetObjectValueImpl(
expression.startOffset, expression.endOffset,
expression.type,
symbolsRemapper.getReferencedClass(expression.symbol)
symbolRemapper.getReferencedClass(expression.symbol)
)
override fun visitGetEnumValue(expression: IrGetEnumValue): IrGetEnumValue =
IrGetEnumValueImpl(
expression.startOffset, expression.endOffset,
expression.type,
symbolsRemapper.getReferencedEnumEntry(expression.symbol)
symbolRemapper.getReferencedEnumEntry(expression.symbol)
)
override fun visitGetValue(expression: IrGetValue): IrGetValue =
IrGetValueImpl(
expression.startOffset, expression.endOffset,
symbolsRemapper.getReferencedValue(expression.symbol),
symbolRemapper.getReferencedValue(expression.symbol),
mapStatementOrigin(expression.origin)
)
override fun visitSetVariable(expression: IrSetVariable): IrSetVariable =
IrSetVariableImpl(
expression.startOffset, expression.endOffset,
symbolsRemapper.getReferencedVariable(expression.symbol),
symbolRemapper.getReferencedVariable(expression.symbol),
expression.value.transform(),
mapStatementOrigin(expression.origin)
)
......@@ -289,20 +289,20 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
override fun visitGetField(expression: IrGetField): IrGetField =
IrGetFieldImpl(
expression.startOffset, expression.endOffset,
symbolsRemapper.getReferencedField(expression.symbol),
symbolRemapper.getReferencedField(expression.symbol),
expression.receiver?.transform(),
mapStatementOrigin(expression.origin),
symbolsRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
)
override fun visitSetField(expression: IrSetField): IrSetField =
IrSetFieldImpl(
expression.startOffset, expression.endOffset,
symbolsRemapper.getReferencedField(expression.symbol),
symbolRemapper.getReferencedField(expression.symbol),
expression.receiver?.transform(),
expression.value.transform(),
mapStatementOrigin(expression.origin),
symbolsRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
)
override fun visitCall(expression: IrCall): IrCall =
......@@ -313,18 +313,18 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
is IrCallWithShallowCopy ->
expression.shallowCopy(
mapStatementOrigin(expression.origin),
symbolsRemapper.getReferencedFunction(expression.symbol),
symbolsRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
symbolRemapper.getReferencedFunction(expression.symbol),
symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
)
else ->
IrCallImpl(
expression.startOffset, expression.endOffset,
expression.type,
symbolsRemapper.getReferencedFunction(expression.symbol),
symbolRemapper.getReferencedFunction(expression.symbol),
expression.descriptor, // TODO substitute referenced descriptor
expression.getTypeArgumentsMap(),
mapStatementOrigin(expression.origin),
symbolsRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
symbolRemapper.getReferencedClassOrNull(expression.superQualifierSymbol)
)
}
......@@ -355,7 +355,7 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall): IrDelegatingConstructorCall =
IrDelegatingConstructorCallImpl(
expression.startOffset, expression.endOffset,
symbolsRemapper.getReferencedConstructor(expression.symbol),
symbolRemapper.getReferencedConstructor(expression.symbol),
expression.descriptor,
expression.getTypeArgumentsMap()
).transformValueArguments(expression)
......@@ -363,7 +363,7 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
override fun visitEnumConstructorCall(expression: IrEnumConstructorCall): IrEnumConstructorCall =
IrEnumConstructorCallImpl(
expression.startOffset, expression.endOffset,
symbolsRemapper.getReferencedConstructor(expression.symbol)
symbolRemapper.getReferencedConstructor(expression.symbol)
).transformValueArguments(expression)
override fun visitGetClass(expression: IrGetClass): IrGetClass =
......@@ -377,7 +377,7 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
IrFunctionReferenceImpl(
expression.startOffset, expression.endOffset,
expression.type,
symbolsRemapper.getReferencedFunction(expression.symbol),
symbolRemapper.getReferencedFunction(expression.symbol),
expression.descriptor, // TODO substitute referenced descriptor
expression.getTypeArgumentsMap(),
mapStatementOrigin(expression.origin)
......@@ -388,9 +388,9 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
expression.startOffset, expression.endOffset,
expression.type,
expression.descriptor,
expression.field?.let { symbolsRemapper.getReferencedField(it) },
expression.getter?.let { symbolsRemapper.getReferencedFunction(it) },
expression.setter?.let { symbolsRemapper.getReferencedFunction(it) },
expression.field?.let { symbolRemapper.getReferencedField(it) },
expression.getter?.let { symbolRemapper.getReferencedFunction(it) },
expression.setter?.let { symbolRemapper.getReferencedFunction(it) },
expression.getTypeArgumentsMap(),
mapStatementOrigin(expression.origin)
).transformReceiverArguments(expression)
......@@ -400,9 +400,9 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
expression.startOffset, expression.endOffset,
expression.type,
expression.descriptor,
symbolsRemapper.getReferencedVariable(expression.delegate),
symbolsRemapper.getReferencedFunction(expression.getter),
expression.setter?.let { symbolsRemapper.getReferencedFunction(it) },
symbolRemapper.getReferencedVariable(expression.delegate),
symbolRemapper.getReferencedFunction(expression.getter),
expression.setter?.let { symbolRemapper.getReferencedFunction(it) },
mapStatementOrigin(expression.origin)
)
......@@ -410,13 +410,13 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
IrClassReferenceImpl(
expression.startOffset, expression.endOffset,
expression.type,
symbolsRemapper.getReferencedClassifier(expression.symbol)
symbolRemapper.getReferencedClassifier(expression.symbol)
)
override fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall): IrInstanceInitializerCall =
IrInstanceInitializerCallImpl(
expression.startOffset, expression.endOffset,
symbolsRemapper.getReferencedClass(expression.classSymbol)
symbolRemapper.getReferencedClass(expression.classSymbol)
)
override fun visitTypeOperator(expression: IrTypeOperatorCall): IrTypeOperatorCall =
......@@ -508,7 +508,7 @@ class DeepCopyIrTreeWithSymbols(private val symbolsRemapper: DeepCopySymbolsRema
IrReturnImpl(
expression.startOffset, expression.endOffset,
expression.type,
symbolsRemapper.getReferencedFunction(expression.returnTargetSymbol),
symbolRemapper.getReferencedFunction(expression.returnTargetSymbol),
expression.value.transform()
)
......
......@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.ir.symbols.impl.*
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
class DeepCopySymbolsRemapper : IrElementVisitorVoid {
class DeepCopySymbolsRemapper : IrElementVisitorVoid, SymbolRemapper {
private val classes = hashMapOf<IrClassSymbol, IrClassSymbol>()
private val constructors = hashMapOf<IrConstructorSymbol, IrConstructorSymbol>()
private val enumEntries = hashMapOf<IrEnumEntrySymbol, IrEnumEntrySymbol>()
......@@ -104,39 +104,39 @@ class DeepCopySymbolsRemapper : IrElementVisitorVoid {
private fun <T : IrSymbol> Map<T, T>.getReferenced(symbol: T) =
getOrElse(symbol) { symbol }
fun getDeclaredClass(symbol: IrClassSymbol): IrClassSymbol = classes.getDeclared(symbol)
fun getDeclaredFunction(symbol: IrSimpleFunctionSymbol): IrSimpleFunctionSymbol = functions.getDeclared(symbol)
fun getDeclaredField(symbol: IrFieldSymbol): IrFieldSymbol = fields.getDeclared(symbol)
fun getDeclaredFile(symbol: IrFileSymbol): IrFileSymbol = files.getDeclared(symbol)
fun getDeclaredConstructor(symbol: IrConstructorSymbol): IrConstructorSymbol = constructors.getDeclared(symbol)
fun getDeclaredEnumEntry(symbol: IrEnumEntrySymbol): IrEnumEntrySymbol = enumEntries.getDeclared(symbol)
fun getDeclaredExternalPackageFragment(symbol: IrExternalPackageFragmentSymbol): IrExternalPackageFragmentSymbol = externalPackageFragments.getDeclared(symbol)
fun getDeclaredVariable(symbol: IrVariableSymbol): IrVariableSymbol = variables.getDeclared(symbol)
fun getDeclaredTypeParameter(symbol: IrTypeParameterSymbol): IrTypeParameterSymbol = typeParameters.getDeclared(symbol)
fun getDeclaredValueParameter(symbol: IrValueParameterSymbol): IrValueParameterSymbol = valueParameters.getDeclared(symbol)
fun getReferencedClass(symbol: IrClassSymbol): IrClassSymbol = classes.getReferenced(symbol)
fun getReferencedClassOrNull(symbol: IrClassSymbol?): IrClassSymbol? = symbol?.let { classes.getReferenced(it) }
fun getReferencedEnumEntry(symbol: IrEnumEntrySymbol): IrEnumEntrySymbol = enumEntries.getReferenced(symbol)
fun getReferencedVariable(symbol: IrVariableSymbol): IrVariableSymbol = variables.getReferenced(symbol)
fun getReferencedField(symbol: IrFieldSymbol): IrFieldSymbol = fields.getReferenced(symbol)
fun getReferencedConstructor(symbol: IrConstructorSymbol): IrConstructorSymbol = constructors.getReferenced(symbol)
fun getReferencedValue(symbol: IrValueSymbol): IrValueSymbol =
override fun getDeclaredClass(symbol: IrClassSymbol): IrClassSymbol = classes.getDeclared(symbol)
override fun getDeclaredFunction(symbol: IrSimpleFunctionSymbol): IrSimpleFunctionSymbol = functions.getDeclared(symbol)
override fun getDeclaredField(symbol: IrFieldSymbol): IrFieldSymbol = fields.getDeclared(symbol)
override fun getDeclaredFile(symbol: IrFileSymbol): IrFileSymbol = files.getDeclared(symbol)
override fun getDeclaredConstructor(symbol: IrConstructorSymbol): IrConstructorSymbol = constructors.getDeclared(symbol)
override fun getDeclaredEnumEntry(symbol: IrEnumEntrySymbol): IrEnumEntrySymbol = enumEntries.getDeclared(symbol)
override fun getDeclaredExternalPackageFragment(symbol: IrExternalPackageFragmentSymbol): IrExternalPackageFragmentSymbol = externalPackageFragments.getDeclared(symbol)
override fun getDeclaredVariable(symbol: IrVariableSymbol): IrVariableSymbol = variables.getDeclared(symbol)
override fun getDeclaredTypeParameter(symbol: IrTypeParameterSymbol): IrTypeParameterSymbol = typeParameters.getDeclared(symbol)
override fun getDeclaredValueParameter(symbol: IrValueParameterSymbol): IrValueParameterSymbol = valueParameters.getDeclared(symbol)
override fun getReferencedClass(symbol: IrClassSymbol): IrClassSymbol = classes.getReferenced(symbol)
override fun getReferencedClassOrNull(symbol: IrClassSymbol?): IrClassSymbol? = symbol?.let { classes.getReferenced(it) }
override fun getReferencedEnumEntry(symbol: IrEnumEntrySymbol): IrEnumEntrySymbol = enumEntries.getReferenced(symbol)
override fun getReferencedVariable(symbol: IrVariableSymbol): IrVariableSymbol = variables.getReferenced(symbol)
override fun getReferencedField(symbol: IrFieldSymbol): IrFieldSymbol = fields.getReferenced(symbol)
override fun getReferencedConstructor(symbol: IrConstructorSymbol): IrConstructorSymbol = constructors.getReferenced(symbol)
override fun getReferencedValue(symbol: IrValueSymbol): IrValueSymbol =
when (symbol) {
is IrValueParameterSymbol -> valueParameters.getReferenced(symbol)
is IrVariableSymbol -> variables.getReferenced(symbol)
else -> throw IllegalArgumentException("Unexpected symbol $symbol ${symbol.descriptor}")
}
fun getReferencedFunction(symbol: IrFunctionSymbol): IrFunctionSymbol =
override fun getReferencedFunction(symbol: IrFunctionSymbol): IrFunctionSymbol =
when (symbol) {
is IrSimpleFunctionSymbol -> functions.getReferenced(symbol)
is IrConstructorSymbol -> constructors.getReferenced(symbol)
else -> throw IllegalArgumentException("Unexpected symbol $symbol ${symbol.descriptor}")
}
fun getReferencedClassifier(symbol: IrClassifierSymbol): IrClassifierSymbol =
override fun getReferencedClassifier(symbol: IrClassifierSymbol): IrClassifierSymbol =
when (symbol) {
is IrClassSymbol -> classes.getReferenced(symbol)
is IrTypeParameterSymbol -> typeParameters.getReferenced(symbol)
......
/*
* Copyright 2010-2017 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.ir.util
import org.jetbrains.kotlin.ir.symbols.*
interface SymbolRemapper {
fun getDeclaredClass(symbol: IrClassSymbol): IrClassSymbol
fun getDeclaredFunction(symbol: IrSimpleFunctionSymbol): IrSimpleFunctionSymbol
fun getDeclaredField(symbol: IrFieldSymbol): IrFieldSymbol
fun getDeclaredFile(symbol: IrFileSymbol): IrFileSymbol
fun getDeclaredConstructor(symbol: IrConstructorSymbol): IrConstructorSymbol
fun getDeclaredEnumEntry(symbol: IrEnumEntrySymbol): IrEnumEntrySymbol
fun getDeclaredExternalPackageFragment(symbol: IrExternalPackageFragmentSymbol): IrExternalPackageFragmentSymbol
fun getDeclaredVariable(symbol: IrVariableSymbol): IrVariableSymbol
fun getDeclaredTypeParameter(symbol: IrTypeParameterSymbol): IrTypeParameterSymbol
fun getDeclaredValueParameter(symbol: IrValueParameterSymbol): IrValueParameterSymbol
fun getReferencedClass(symbol: IrClassSymbol): IrClassSymbol
fun getReferencedClassOrNull(symbol: IrClassSymbol?): IrClassSymbol?
fun getReferencedEnumEntry(symbol: IrEnumEntrySymbol): IrEnumEntrySymbol
fun getReferencedVariable(symbol: IrVariableSymbol): IrVariableSymbol
fun getReferencedField(symbol: IrFieldSymbol): IrFieldSymbol
fun getReferencedConstructor(symbol: IrConstructorSymbol): IrConstructorSymbol
fun getReferencedValue(symbol: IrValueSymbol): IrValueSymbol
fun getReferencedFunction(symbol: IrFunctionSymbol): IrFunctionSymbol
fun getReferencedClassifier(symbol: IrClassifierSymbol): IrClassifierSymbol
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册