[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.resolve.providers.FirProvider
import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.processDirectlyOverriddenFunctions 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.scopes.unsubstitutedScope
import org.jetbrains.kotlin.fir.symbols.AccessorSymbol import org.jetbrains.kotlin.fir.symbols.AccessorSymbol
import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol
@@ -313,6 +314,30 @@ internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(
return overriddenSet.toList() 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( internal fun IrClass.findMatchingOverriddenSymbolsFromSupertypes(
irBuiltIns: IrBuiltIns, irBuiltIns: IrBuiltIns,
target: IrDeclaration, target: IrDeclaration,
@@ -264,25 +264,9 @@ internal class ClassMemberGenerator(
} }
} }
if (containingClass != null) { if (containingClass != null) {
val scope = containingClass.unsubstitutedScope(session, scopeSession) this.overriddenSymbols = property.generateOverriddenAccessorSymbols(
scope.processPropertiesByName(property.name) {} containingClass, isGetter, session, scopeSession, declarationStorage
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()
} }
} }