[FIR] Handle isProp/setProp synthetic pair properly in Java use-site scope
This commit is contained in:
+7
-6
@@ -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()) {
|
||||||
|
|||||||
+10
-4
@@ -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())
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user