Prevent external IR field stub from being bound twice

This commit is contained in:
Svyatoslav Scherbina
2018-09-07 17:15:06 +03:00
parent 3d72831966
commit dc71e5b934
@@ -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) {