diff --git a/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt b/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt index 6d114fe943d..12d1599f1b3 100644 --- a/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt +++ b/compiler/ir/backend.jvm/entrypoint/src/org/jetbrains/kotlin/backend/jvm/JvmGeneratorExtensionsImpl.kt @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.resolve.jvm.annotations.hasJvmFieldAnnotation import org.jetbrains.kotlin.resolve.jvm.annotations.isJvmRecord import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource +import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.typeUtil.replaceAnnotations @@ -177,4 +178,11 @@ open class JvmGeneratorExtensionsImpl(private val generateFacades: Boolean = tru override val rawTypeAnnotationConstructor: IrConstructor = rawTypeAnnotationClass.constructors.single() + + override fun unwrapSyntheticJavaProperty(descriptor: PropertyDescriptor): Pair? { + if (descriptor is SyntheticJavaPropertyDescriptor) { + return descriptor.getMethod to descriptor.setMethod + } + return null + } } diff --git a/compiler/ir/ir.psi2ir/build.gradle.kts b/compiler/ir/ir.psi2ir/build.gradle.kts index bda1394c526..babccdc44a5 100644 --- a/compiler/ir/ir.psi2ir/build.gradle.kts +++ b/compiler/ir/ir.psi2ir/build.gradle.kts @@ -6,7 +6,6 @@ plugins { dependencies { compile(project(":compiler:util")) compile(project(":compiler:frontend")) - compile(project(":compiler:frontend.java")) compile(project(":compiler:backend-common")) compile(project(":compiler:ir.tree")) compileOnly(intellijCoreDep()) { includeJars("intellij-core") } 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 d45c16a5ad9..f40dc1bee30 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 @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.psi2ir.generators import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.DescriptorVisibility +import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.ir.expressions.IrDelegatingConstructorCall import org.jetbrains.kotlin.ir.symbols.IrScriptSymbol @@ -39,4 +40,6 @@ open class GeneratorExtensions : StubGeneratorExtensions() { get() = false open fun getPreviousScripts(): List? = null + + open fun unwrapSyntheticJavaProperty(descriptor: PropertyDescriptor): Pair? = null } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt index 5ddf883e675..c9effdc82d5 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt @@ -38,8 +38,6 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.ImportedFromObjectCallableDescriptor import org.jetbrains.kotlin.resolve.calls.model.* import org.jetbrains.kotlin.resolve.scopes.receivers.TransientReceiver -import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource -import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.expressions.DoubleColonLHS @@ -501,12 +499,14 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St private fun resolvePropertySymbol(descriptor: PropertyDescriptor, mutable: Boolean): DelegatedPropertySymbols { val symbol = context.symbolTable.referenceProperty(descriptor) - if (descriptor is SyntheticJavaPropertyDescriptor) { + val syntheticJavaProperty = context.extensions.unwrapSyntheticJavaProperty(descriptor) + if (syntheticJavaProperty != null) { + val (getMethod, setMethod) = syntheticJavaProperty // This is the special case of synthetic java properties when requested property doesn't even exist but IR design // requires its symbol to be bound so let do that // see `irText/declarations/provideDelegate/javaDelegate.kt` and KT-45297 - val getterSymbol = context.symbolTable.referenceSimpleFunction(descriptor.getMethod) - val setterSymbol = if (mutable) descriptor.setMethod?.let { + val getterSymbol = context.symbolTable.referenceSimpleFunction(getMethod) + val setterSymbol = if (mutable) setMethod?.let { context.symbolTable.referenceSimpleFunction(it) } else null if (!symbol.isBound) {