From dc71e5b9340e22882b1a6f7f6d0cb45d2e592ccd Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Fri, 7 Sep 2018 17:15:06 +0300 Subject: [PATCH] Prevent external IR field stub from being bound twice --- .../ir/util/DeclarationStubGenerator.kt | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt index 51cde83544c..35b8857dd37 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt @@ -83,14 +83,7 @@ class DeclarationStubGenerator( IrPropertyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor).also { irProperty -> val getterDescriptor = descriptor.getter if (descriptor.hasBackingField(bindingContext)) { - irProperty.backingField = - symbolTable.declareField( - UNDEFINED_OFFSET, - UNDEFINED_OFFSET, - origin, - descriptor.original, - descriptor.type.toIrType() - ) + irProperty.backingField = generateFieldStub(descriptor) } if (getterDescriptor != null) { irProperty.getter = generateFunctionStub(getterDescriptor) @@ -99,6 +92,21 @@ class DeclarationStubGenerator( irProperty.setter = descriptor.setter?.let { generateFunctionStub(it) } } + private fun generateFieldStub(descriptor: PropertyDescriptor): IrField { + val referenced = symbolTable.referenceField(descriptor) + if (referenced.isBound) { + return referenced.owner + } + + return symbolTable.declareField( + UNDEFINED_OFFSET, + UNDEFINED_OFFSET, + origin, + descriptor.original, + descriptor.type.toIrType() + ) + } + fun generateFunctionStub(descriptor: FunctionDescriptor): IrSimpleFunction { val referenced = symbolTable.referenceSimpleFunction(descriptor) if (referenced.isBound) {