diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt index 0d0f01646ef..e2beb4f547e 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt @@ -147,13 +147,14 @@ class JavaClassUseSiteMemberScope( if (symbol.fir !is FirJavaClass) { return super.processFunctionsByName(name, processor) } - val potentialPropertyName = session.syntheticNamesProvider.propertyNameByAccessorName(name) - ?: return super.processFunctionsByName(name, processor) + val potentialPropertyNames = session.syntheticNamesProvider.possiblePropertyNamesByAccessorName(name) val accessors = mutableListOf() - val getterName = session.syntheticNamesProvider.getterNameBySetterName(name) ?: name - processAccessorFunctionsAndPropertiesByName(potentialPropertyName, listOf(getterName)) { - if (it is FirAccessorSymbol) { - accessors += it + val getterName by lazy { session.syntheticNamesProvider.getterNameBySetterName(name) ?: name } + for (potentialPropertyName in potentialPropertyNames) { + processAccessorFunctionsAndPropertiesByName(potentialPropertyName, listOf(getterName)) { + if (it is FirAccessorSymbol) { + accessors += it + } } } if (accessors.isEmpty()) { diff --git a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/FirJavaSyntheticNamesProvider.kt b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/FirJavaSyntheticNamesProvider.kt index 04e41b09c7b..f820ac38670 100644 --- a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/FirJavaSyntheticNamesProvider.kt +++ b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/FirJavaSyntheticNamesProvider.kt @@ -51,16 +51,22 @@ object FirJavaSyntheticNamesProvider : FirSyntheticNamesProvider() { return Name.identifier(GETTER_PREFIX + identifier.removePrefix(prefix)) } - override fun propertyNameByAccessorName(name: Name): Name? { - if (name.isSpecial) return null + override fun possiblePropertyNamesByAccessorName(name: Name): List { + if (name.isSpecial) return emptyList() val identifier = name.identifier val prefix = when { identifier.startsWith(GETTER_PREFIX) -> GETTER_PREFIX identifier.startsWith(IS_PREFIX) -> "" identifier.startsWith(SETTER_PREFIX) -> SETTER_PREFIX - else -> return null + else -> return emptyList() + } + val withoutPrefix = identifier.removePrefix(prefix) + val withoutPrefixName = Name.identifier(withoutPrefix.decapitalize()) + return if (prefix == SETTER_PREFIX) { + listOf(withoutPrefixName, Name.identifier(IS_PREFIX + withoutPrefix)) + } else { + listOf(withoutPrefixName) } - return Name.identifier(identifier.removePrefix(prefix).decapitalize()) } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirSyntheticNamesProvider.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirSyntheticNamesProvider.kt index e5467ace73b..6320b301cdc 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirSyntheticNamesProvider.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirSyntheticNamesProvider.kt @@ -13,7 +13,7 @@ abstract class FirSyntheticNamesProvider : FirSessionComponent { abstract fun possibleGetterNamesByPropertyName(name: Name): List abstract fun setterNameByGetterName(name: Name): Name? abstract fun getterNameBySetterName(name: Name): Name? - abstract fun propertyNameByAccessorName(name: Name): Name? + abstract fun possiblePropertyNamesByAccessorName(name: Name): List } val FirSession.syntheticNamesProvider: FirSyntheticNamesProvider by FirSession.sessionComponentAccessor() diff --git a/compiler/testData/codegen/box/properties/commonPropertiesKJK.kt b/compiler/testData/codegen/box/properties/commonPropertiesKJK.kt index 84e89ab5b5c..10b61c5fdfc 100644 --- a/compiler/testData/codegen/box/properties/commonPropertiesKJK.kt +++ b/compiler/testData/codegen/box/properties/commonPropertiesKJK.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND_FIR: JVM_IR // TARGET_BACKEND: JVM // FILE: J.java