FIR: cache properties in use-site scope properly

This commit is contained in:
Mikhail Glukhikh
2021-11-02 16:09:50 +03:00
committed by teamcity
parent f2c734fc02
commit 6eaeada1e6
6 changed files with 62 additions and 8 deletions
@@ -103,16 +103,17 @@ class JavaClassUseSiteMemberScope(
return minOf(a, b)
}
override fun processPropertiesByName(name: Name, processor: (FirVariableSymbol<*>) -> Unit) {
override fun doProcessProperties(name: Name): Collection<FirVariableSymbol<*>> {
val fields = mutableSetOf<FirCallableSymbol<*>>()
val fieldNames = mutableSetOf<Name>()
val result = mutableSetOf<FirVariableSymbol<*>>()
// fields
declaredMemberScope.processPropertiesByName(name) processor@{ variableSymbol ->
if (variableSymbol.isStatic) return@processor
fields += variableSymbol
fieldNames += variableSymbol.fir.name
processor(variableSymbol)
result += variableSymbol
}
val fromSupertypes = superTypesScope.getProperties(name)
@@ -120,7 +121,7 @@ class JavaClassUseSiteMemberScope(
for (propertyFromSupertype in fromSupertypes) {
if (propertyFromSupertype is FirFieldSymbol) {
if (propertyFromSupertype.fir.name !in fieldNames) {
processor(propertyFromSupertype)
result += propertyFromSupertype
}
continue
}
@@ -132,11 +133,12 @@ class JavaClassUseSiteMemberScope(
overrideInClass != null -> {
directOverriddenProperties.getOrPut(overrideInClass) { mutableListOf() }.add(propertyFromSupertype)
overrideByBase[propertyFromSupertype] = overrideInClass
processor(overrideInClass)
result += overrideInClass
}
else -> processor(propertyFromSupertype)
else -> result += propertyFromSupertype
}
}
return result
}
private fun FirVariableSymbol<*>.createOverridePropertyIfExists(