diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt index 5351129c0a132..03fcdcd45b6bc 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt @@ -36,7 +36,7 @@ inline fun 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() ) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySymbolsRemapper.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySymbolsRemapper.kt index b660f77e00336..57f3dd1c5df25 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySymbolsRemapper.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopySymbolsRemapper.kt @@ -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() private val constructors = hashMapOf() private val enumEntries = hashMapOf() @@ -104,39 +104,39 @@ class DeepCopySymbolsRemapper : IrElementVisitorVoid { private fun Map.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) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolRemapper.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolRemapper.kt new file mode 100644 index 0000000000000..f3f44676cc680 --- /dev/null +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolRemapper.kt @@ -0,0 +1,41 @@ +/* + * 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