From 67ab8624c3131d8636da316492716eea0f33586e Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Tue, 20 Nov 2018 17:35:56 +0300 Subject: [PATCH] Add DeepCopyIrTreeWithDescriptors --- .../common/DeepCopyWithWrappedDescriptors.kt | 105 ++++++++++++++++++ .../common/lower/InitializersLowering.kt | 18 +-- 2 files changed, 115 insertions(+), 8 deletions(-) create mode 100644 compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/DeepCopyWithWrappedDescriptors.kt diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/DeepCopyWithWrappedDescriptors.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/DeepCopyWithWrappedDescriptors.kt new file mode 100644 index 00000000000..722de16e486 --- /dev/null +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/DeepCopyWithWrappedDescriptors.kt @@ -0,0 +1,105 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.backend.common + +import org.jetbrains.kotlin.backend.common.descriptors.* +import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.util.DescriptorsRemapper +import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols +import org.jetbrains.kotlin.ir.util.parentAsClass +import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid +import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid +import org.jetbrains.kotlin.ir.visitors.acceptVoid + +/* + TODO: Does not preserve getter/setter descriptors as implementations of PropertyAccessorDescriptor. + This causes problems for KotlinTypeMapper.mapFunctionName (maybe other places as well) + */ + +inline fun T.deepCopyWithWrappedDescriptors(initialParent: IrDeclarationParent? = null): T = + deepCopyWithSymbols(initialParent, DescriptorsToIrRemapper).also { + it.acceptVoid(WrappedDescriptorPatcher) + } + +object DescriptorsToIrRemapper : DescriptorsRemapper { + override fun remapDeclaredClass(descriptor: ClassDescriptor) = + WrappedClassDescriptor(descriptor.annotations, descriptor.source) + + override fun remapDeclaredConstructor(descriptor: ClassConstructorDescriptor) = + WrappedClassConstructorDescriptor(descriptor.annotations, descriptor.source) + + override fun remapDeclaredEnumEntry(descriptor: ClassDescriptor) = + WrappedClassDescriptor(descriptor.annotations, descriptor.source) + + override fun remapDeclaredField(descriptor: PropertyDescriptor) = + WrappedFieldDescriptor(descriptor.annotations, descriptor.source) + + override fun remapDeclaredSimpleFunction(descriptor: FunctionDescriptor) = + WrappedSimpleFunctionDescriptor(descriptor.annotations, descriptor.source) + + override fun remapDeclaredTypeParameter(descriptor: TypeParameterDescriptor) = + WrappedTypeParameterDescriptor(descriptor.annotations, descriptor.source) + + override fun remapDeclaredVariable(descriptor: VariableDescriptor) = + WrappedVariableDescriptor(descriptor.annotations, descriptor.source) + + override fun remapDeclaredValueParameter(descriptor: ParameterDescriptor): ParameterDescriptor = + if (descriptor is ReceiverParameterDescriptor) + WrappedReceiverParameterDescriptor(descriptor.annotations, descriptor.source) + else + WrappedValueParameterDescriptor(descriptor.annotations, descriptor.source) +} + +object WrappedDescriptorPatcher : IrElementVisitorVoid { + override fun visitElement(element: IrElement) { + element.acceptChildrenVoid(this) + } + + override fun visitClass(declaration: IrClass) { + (declaration.descriptor as WrappedClassDescriptor).bind(declaration) + declaration.acceptChildrenVoid(this) + } + + override fun visitConstructor(declaration: IrConstructor) { + (declaration.descriptor as WrappedClassConstructorDescriptor).bind(declaration) + declaration.acceptChildrenVoid(this) + } + + override fun visitEnumEntry(declaration: IrEnumEntry) { + (declaration.descriptor as WrappedClassDescriptor).bind( + declaration.correspondingClass ?: declaration.parentAsClass + ) + declaration.acceptChildrenVoid(this) + } + + override fun visitField(declaration: IrField) { + (declaration.descriptor as WrappedFieldDescriptor).bind(declaration) + declaration.acceptChildrenVoid(this) + } + + override fun visitFunction(declaration: IrFunction) { + (declaration.descriptor as WrappedSimpleFunctionDescriptor).bind(declaration as IrSimpleFunction) + declaration.acceptChildrenVoid(this) + } + + override fun visitValueParameter(declaration: IrValueParameter) { + (declaration.descriptor as? WrappedValueParameterDescriptor)?.bind(declaration) + (declaration.descriptor as? WrappedReceiverParameterDescriptor)?.bind(declaration) + declaration.acceptChildrenVoid(this) + } + + override fun visitTypeParameter(declaration: IrTypeParameter) { + (declaration.descriptor as WrappedTypeParameterDescriptor).bind(declaration) + declaration.acceptChildrenVoid(this) + } + + override fun visitVariable(declaration: IrVariable) { + (declaration.descriptor as WrappedVariableDescriptor).bind(declaration) + declaration.acceptChildrenVoid(this) + } +} diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt index 23386fb9755..bf151552c13 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt @@ -7,14 +7,13 @@ package org.jetbrains.kotlin.backend.common.lower import org.jetbrains.kotlin.backend.common.ClassLoweringPass import org.jetbrains.kotlin.backend.common.CommonBackendContext -import org.jetbrains.kotlin.backend.common.CompilerPhase +import org.jetbrains.kotlin.backend.common.deepCopyWithWrappedDescriptors +import org.jetbrains.kotlin.backend.common.descriptors.* import org.jetbrains.kotlin.backend.common.ir.SetDeclarationsParentVisitor -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor -import org.jetbrains.kotlin.descriptors.Modality -import org.jetbrains.kotlin.descriptors.SourceElement -import org.jetbrains.kotlin.descriptors.Visibilities +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl +import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.* @@ -27,6 +26,9 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl import org.jetbrains.kotlin.ir.expressions.impl.IrBlockImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl +import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol +import org.jetbrains.kotlin.ir.util.DescriptorsRemapper +import org.jetbrains.kotlin.ir.util.SymbolRenamer import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid @@ -143,7 +145,7 @@ class InitializersLowering( companion object { val clinitName = Name.special("") - fun IrStatement.copy(containingDeclaration: IrDeclarationParent) = deepCopyWithSymbols(containingDeclaration) - fun IrExpression.copy(containingDeclaration: IrDeclarationParent) = deepCopyWithSymbols(containingDeclaration) + fun IrStatement.copy(containingDeclaration: IrDeclarationParent) = deepCopyWithWrappedDescriptors(containingDeclaration) + fun IrExpression.copy(containingDeclaration: IrDeclarationParent) = deepCopyWithWrappedDescriptors(containingDeclaration) } -} \ No newline at end of file +}