[FIR2IR] Extract generateOverriddenAccessorSymbols

This commit is contained in:
Mikhail Glukhikh
2020-08-05 11:35:38 +03:00
parent 539d2bc01f
commit 25efad2fd7
2 changed files with 28 additions and 19 deletions
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.fir.resolve.calls.SyntheticPropertySymbol
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.processDirectlyOverriddenFunctions
import org.jetbrains.kotlin.fir.scopes.processDirectlyOverriddenProperties
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.AccessorSymbol
import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol
@@ -313,6 +314,30 @@ internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(
return overriddenSet.toList()
}
internal fun FirProperty.generateOverriddenAccessorSymbols(
containingClass: FirClass<*>,
isGetter: Boolean,
session: FirSession,
scopeSession: ScopeSession,
declarationStorage: Fir2IrDeclarationStorage
): List<IrSimpleFunctionSymbol> {
val scope = containingClass.unsubstitutedScope(session, scopeSession)
scope.processPropertiesByName(name) {}
val overriddenSet = mutableSetOf<IrSimpleFunctionSymbol>()
scope.processDirectlyOverriddenProperties(symbol) {
if (it.fir.visibility == Visibilities.PRIVATE) {
return@processDirectlyOverriddenProperties ProcessorAction.NEXT
}
val overriddenProperty = declarationStorage.getIrPropertyOrFieldSymbol(it.unwrapSubstitutionOverrides()) as IrPropertySymbol
val overriddenAccessor = if (isGetter) overriddenProperty.owner.getter?.symbol else overriddenProperty.owner.setter?.symbol
if (overriddenAccessor != null) {
overriddenSet += overriddenAccessor
}
ProcessorAction.NEXT
}
return overriddenSet.toList()
}
internal fun IrClass.findMatchingOverriddenSymbolsFromSupertypes(
irBuiltIns: IrBuiltIns,
target: IrDeclaration,
@@ -264,25 +264,9 @@ internal class ClassMemberGenerator(
}
}
if (containingClass != null) {
val scope = containingClass.unsubstitutedScope(session, scopeSession)
scope.processPropertiesByName(property.name) {}
val overriddenSet = mutableSetOf<IrSimpleFunctionSymbol>()
scope.processDirectlyOverriddenProperties(property.symbol) {
if (it.fir.visibility == Visibilities.PRIVATE) {
return@processDirectlyOverriddenProperties ProcessorAction.NEXT
}
val overridden = declarationStorage.getIrPropertyOrFieldSymbol(it.unwrapSubstitutionOverrides())
if (overridden is IrPropertySymbol) {
val accessorSymbol =
if (isGetter) overridden.owner.getter?.symbol
else overridden.owner.setter?.symbol
if (accessorSymbol != null) {
overriddenSet += accessorSymbol
}
}
ProcessorAction.NEXT
}
this.overriddenSymbols = overriddenSet.toList()
this.overriddenSymbols = property.generateOverriddenAccessorSymbols(
containingClass, isGetter, session, scopeSession, declarationStorage
)
}
}