[FIR] Handle isProp/setProp synthetic pair properly in Java use-site scope

This commit is contained in:
Mikhail Glukhikh
2020-11-10 18:03:18 +03:00
parent 2725930460
commit 3c48f2eb68
4 changed files with 18 additions and 12 deletions
@@ -147,13 +147,14 @@ class JavaClassUseSiteMemberScope(
if (symbol.fir !is FirJavaClass) { if (symbol.fir !is FirJavaClass) {
return super.processFunctionsByName(name, processor) return super.processFunctionsByName(name, processor)
} }
val potentialPropertyName = session.syntheticNamesProvider.propertyNameByAccessorName(name) val potentialPropertyNames = session.syntheticNamesProvider.possiblePropertyNamesByAccessorName(name)
?: return super.processFunctionsByName(name, processor)
val accessors = mutableListOf<FirAccessorSymbol>() val accessors = mutableListOf<FirAccessorSymbol>()
val getterName = session.syntheticNamesProvider.getterNameBySetterName(name) ?: name val getterName by lazy { session.syntheticNamesProvider.getterNameBySetterName(name) ?: name }
processAccessorFunctionsAndPropertiesByName(potentialPropertyName, listOf(getterName)) { for (potentialPropertyName in potentialPropertyNames) {
if (it is FirAccessorSymbol) { processAccessorFunctionsAndPropertiesByName(potentialPropertyName, listOf(getterName)) {
accessors += it if (it is FirAccessorSymbol) {
accessors += it
}
} }
} }
if (accessors.isEmpty()) { if (accessors.isEmpty()) {
@@ -51,16 +51,22 @@ object FirJavaSyntheticNamesProvider : FirSyntheticNamesProvider() {
return Name.identifier(GETTER_PREFIX + identifier.removePrefix(prefix)) return Name.identifier(GETTER_PREFIX + identifier.removePrefix(prefix))
} }
override fun propertyNameByAccessorName(name: Name): Name? { override fun possiblePropertyNamesByAccessorName(name: Name): List<Name> {
if (name.isSpecial) return null if (name.isSpecial) return emptyList()
val identifier = name.identifier val identifier = name.identifier
val prefix = when { val prefix = when {
identifier.startsWith(GETTER_PREFIX) -> GETTER_PREFIX identifier.startsWith(GETTER_PREFIX) -> GETTER_PREFIX
identifier.startsWith(IS_PREFIX) -> "" identifier.startsWith(IS_PREFIX) -> ""
identifier.startsWith(SETTER_PREFIX) -> SETTER_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())
} }
} }
@@ -13,7 +13,7 @@ abstract class FirSyntheticNamesProvider : FirSessionComponent {
abstract fun possibleGetterNamesByPropertyName(name: Name): List<Name> abstract fun possibleGetterNamesByPropertyName(name: Name): List<Name>
abstract fun setterNameByGetterName(name: Name): Name? abstract fun setterNameByGetterName(name: Name): Name?
abstract fun getterNameBySetterName(name: Name): Name? abstract fun getterNameBySetterName(name: Name): Name?
abstract fun propertyNameByAccessorName(name: Name): Name? abstract fun possiblePropertyNamesByAccessorName(name: Name): List<Name>
} }
val FirSession.syntheticNamesProvider: FirSyntheticNamesProvider by FirSession.sessionComponentAccessor() val FirSession.syntheticNamesProvider: FirSyntheticNamesProvider by FirSession.sessionComponentAccessor()
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
// TARGET_BACKEND: JVM // TARGET_BACKEND: JVM
// FILE: J.java // FILE: J.java