diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensions.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensions.kt index 6e7e9b7bd2b..70ad6f10fa8 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensions.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensions.kt @@ -65,6 +65,9 @@ object JvmGeneratorExtensions : GeneratorExtensions() { descriptor.visibility else null + + override fun isPropertyWithPlatformField(descriptor: PropertyDescriptor): Boolean = + descriptor.hasJvmFieldAnnotation() } class JvmStubGeneratorExtensions : StubGeneratorExtensions() { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorExtensions.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorExtensions.kt index 35c0c263a84..c137036e6e5 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorExtensions.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/GeneratorExtensions.kt @@ -29,4 +29,6 @@ open class GeneratorExtensions { } open fun computeFieldVisibility(descriptor: PropertyDescriptor): Visibility? = null + + open fun isPropertyWithPlatformField(descriptor: PropertyDescriptor): Boolean = false } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt index 7d815ed1306..2e3c5603a71 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/PropertyGenerator.kt @@ -102,6 +102,9 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio DelegatedPropertyGenerator(declarationGenerator) .generateDelegatedProperty(ktProperty, ktDelegate, propertyDescriptor) + private fun PropertyDescriptor.actuallyHasBackingField(bindingContext: BindingContext) = + hasBackingField(bindingContext) || context.extensions.isPropertyWithPlatformField(this) + private fun generateSimpleProperty(ktProperty: KtProperty, propertyDescriptor: PropertyDescriptor): IrProperty = context.symbolTable.declareProperty( ktProperty.startOffsetSkippingComments, ktProperty.endOffset, @@ -110,7 +113,7 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio isDelegated = false ).buildWithScope { irProperty -> irProperty.backingField = - if (propertyDescriptor.hasBackingField(context.bindingContext)) + if (propertyDescriptor.actuallyHasBackingField(context.bindingContext)) generatePropertyBackingField(ktProperty, propertyDescriptor) { irField -> ktProperty.initializer?.let { ktInitializer -> val compileTimeConst = propertyDescriptor.compileTimeInitializer @@ -139,11 +142,11 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio val endOffset = ktElement.pureEndOffsetOrUndefined val backingField = - if (propertyDescriptor.hasBackingField(context.bindingContext) && propertyDescriptor.fieldVisibility.admitsFakeOverride) + if (propertyDescriptor.actuallyHasBackingField(context.bindingContext) && propertyDescriptor.fieldVisibility.admitsFakeOverride) context.symbolTable.declareFieldWithOverrides( startOffset, endOffset, IrDeclarationOrigin.FAKE_OVERRIDE, propertyDescriptor, propertyDescriptor.type.toIrType() - ) { it.hasBackingField(context.bindingContext) } + ) { it.actuallyHasBackingField(context.bindingContext) } else null diff --git a/compiler/testData/compileKotlinAgainstKotlin/jvmField.kt b/compiler/testData/compileKotlinAgainstKotlin/jvmField.kt index ef858b2058b..10fe2eff643 100644 --- a/compiler/testData/compileKotlinAgainstKotlin/jvmField.kt +++ b/compiler/testData/compileKotlinAgainstKotlin/jvmField.kt @@ -15,7 +15,7 @@ open class B : A() { open class C : B() { fun test(): String { - return super.publicField + super.internalField + super.protectedfield + return publicField + super.internalField + super.protectedfield } } diff --git a/compiler/testData/compileKotlinAgainstKotlin/jvmFieldInConstructor.kt b/compiler/testData/compileKotlinAgainstKotlin/jvmFieldInConstructor.kt index 620e47f36b0..910e2745aaa 100644 --- a/compiler/testData/compileKotlinAgainstKotlin/jvmFieldInConstructor.kt +++ b/compiler/testData/compileKotlinAgainstKotlin/jvmFieldInConstructor.kt @@ -11,7 +11,7 @@ open class B : A() open class C : B() { fun test(): String { - return super.publicField + super.internalField + super.protectedfield + return publicField + super.internalField + super.protectedfield } }