[FIR2IR] Move utilities for creating fake overrides to FakeOverrideGenerator

This commit is contained in:
Dmitriy Novozhilov
2023-08-21 12:56:51 +03:00
committed by Space Team
parent ddde2b760a
commit 55a6b1ef9f
6 changed files with 72 additions and 70 deletions
@@ -424,21 +424,6 @@ internal fun FirSimpleFunction.processOverriddenFunctionSymbols(
}
}
context(Fir2IrComponents)
internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(containingClass: FirClass): List<IrSimpleFunctionSymbol> {
val superClasses = containingClass.getSuperTypesAsIrClasses() ?: return emptyList()
val overriddenSet = mutableSetOf<IrSimpleFunctionSymbol>()
processOverriddenFunctionSymbols(containingClass) {
for (overridden in fakeOverrideGenerator.getOverriddenSymbolsInSupertypes(it, superClasses)) {
assert(overridden != symbol) { "Cannot add function $overridden to its own overriddenSymbols" }
overriddenSet += overridden
}
}
return overriddenSet.toList()
}
fun FirTypeScope.processOverriddenFunctionsFromSuperClasses(
functionSymbol: FirNamedFunctionSymbol,
containingClass: FirClass,
@@ -471,15 +456,6 @@ fun FirTypeScope.processOverriddenPropertiesFromSuperClasses(
processor(unwrapped)
}
context(Fir2IrComponents)
@OptIn(IrSymbolInternals::class)
private fun FirClass.getSuperTypesAsIrClasses(): Set<IrClass>? {
val irClass =
declarationStorage.classifierStorage.getIrClassSymbol(symbol).owner as? IrClass ?: return null
return irClass.superTypes.mapNotNull { it.classifierOrNull?.owner as? IrClass }.toSet()
}
context(Fir2IrComponents)
internal fun FirProperty.processOverriddenPropertySymbols(
containingClass: FirClass,
@@ -503,51 +479,6 @@ internal fun FirProperty.processOverriddenPropertySymbols(
return overriddenSet.toList()
}
context(Fir2IrComponents)
internal fun FirProperty.generateOverriddenPropertySymbols(containingClass: FirClass): List<IrPropertySymbol> {
val superClasses = containingClass.getSuperTypesAsIrClasses() ?: return emptyList()
val overriddenSet = mutableSetOf<IrPropertySymbol>()
processOverriddenPropertySymbols(containingClass) {
for (overridden in fakeOverrideGenerator.getOverriddenSymbolsInSupertypes(it, superClasses)) {
assert(overridden != symbol) { "Cannot add property $overridden to its own overriddenSymbols" }
overriddenSet += overridden
}
}
return overriddenSet.toList()
}
context(Fir2IrComponents)
@OptIn(IrSymbolInternals::class)
internal fun FirProperty.generateOverriddenAccessorSymbols(containingClass: FirClass, isGetter: Boolean): List<IrSimpleFunctionSymbol> {
val scope = containingClass.unsubstitutedScope()
scope.processPropertiesByName(name) {}
val overriddenSet = mutableSetOf<IrSimpleFunctionSymbol>()
val superClasses = containingClass.getSuperTypesAsIrClasses() ?: return emptyList()
scope.processOverriddenPropertiesFromSuperClasses(symbol, containingClass) { overriddenSymbol ->
if (!session.visibilityChecker.isVisibleForOverriding(
candidateInDerivedClass = symbol.fir, candidateInBaseClass = overriddenSymbol.fir
)
) {
return@processOverriddenPropertiesFromSuperClasses ProcessorAction.NEXT
}
for (overriddenIrPropertySymbol in fakeOverrideGenerator.getOverriddenSymbolsInSupertypes(overriddenSymbol, superClasses)) {
val overriddenIrAccessorSymbol =
if (isGetter) overriddenIrPropertySymbol.owner.getter?.symbol
else overriddenIrPropertySymbol.owner.setter?.symbol
if (overriddenIrAccessorSymbol != null) {
assert(overriddenIrAccessorSymbol != symbol) { "Cannot add property $overriddenIrAccessorSymbol to its own overriddenSymbols" }
overriddenSet += overriddenIrAccessorSymbol
}
}
ProcessorAction.NEXT
}
return overriddenSet.toList()
}
private val nameToOperationConventionOrigin = mutableMapOf(
OperatorNameConventions.PLUS to IrStatementOrigin.PLUS,
OperatorNameConventions.MINUS to IrStatementOrigin.MINUS,
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.builtins.StandardNames.BUILT_INS_PACKAGE_FQ_NAMES
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.backend.generators.generateOverriddenAccessorSymbols
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
@@ -522,3 +522,71 @@ class FakeOverrideGenerator(
}
}
context(Fir2IrComponents)
@OptIn(IrSymbolInternals::class)
internal fun FirProperty.generateOverriddenAccessorSymbols(containingClass: FirClass, isGetter: Boolean): List<IrSimpleFunctionSymbol> {
val scope = containingClass.unsubstitutedScope()
scope.processPropertiesByName(name) {}
val overriddenSet = mutableSetOf<IrSimpleFunctionSymbol>()
val superClasses = containingClass.getSuperTypesAsIrClasses() ?: return emptyList()
scope.processOverriddenPropertiesFromSuperClasses(symbol, containingClass) { overriddenSymbol ->
if (!session.visibilityChecker.isVisibleForOverriding(
candidateInDerivedClass = symbol.fir, candidateInBaseClass = overriddenSymbol.fir
)
) {
return@processOverriddenPropertiesFromSuperClasses ProcessorAction.NEXT
}
for (overriddenIrPropertySymbol in fakeOverrideGenerator.getOverriddenSymbolsInSupertypes(overriddenSymbol, superClasses)) {
val overriddenIrAccessorSymbol =
if (isGetter) overriddenIrPropertySymbol.owner.getter?.symbol
else overriddenIrPropertySymbol.owner.setter?.symbol
if (overriddenIrAccessorSymbol != null) {
assert(overriddenIrAccessorSymbol != symbol) { "Cannot add property $overriddenIrAccessorSymbol to its own overriddenSymbols" }
overriddenSet += overriddenIrAccessorSymbol
}
}
ProcessorAction.NEXT
}
return overriddenSet.toList()
}
context(Fir2IrComponents)
internal fun FirProperty.generateOverriddenPropertySymbols(containingClass: FirClass): List<IrPropertySymbol> {
val superClasses = containingClass.getSuperTypesAsIrClasses() ?: return emptyList()
val overriddenSet = mutableSetOf<IrPropertySymbol>()
processOverriddenPropertySymbols(containingClass) {
for (overridden in fakeOverrideGenerator.getOverriddenSymbolsInSupertypes(it, superClasses)) {
assert(overridden != symbol) { "Cannot add property $overridden to its own overriddenSymbols" }
overriddenSet += overridden
}
}
return overriddenSet.toList()
}
context(Fir2IrComponents)
internal fun FirSimpleFunction.generateOverriddenFunctionSymbols(containingClass: FirClass): List<IrSimpleFunctionSymbol> {
val superClasses = containingClass.getSuperTypesAsIrClasses() ?: return emptyList()
val overriddenSet = mutableSetOf<IrSimpleFunctionSymbol>()
processOverriddenFunctionSymbols(containingClass) {
for (overridden in fakeOverrideGenerator.getOverriddenSymbolsInSupertypes(it, superClasses)) {
assert(overridden != symbol) { "Cannot add function $overridden to its own overriddenSymbols" }
overriddenSet += overridden
}
}
return overriddenSet.toList()
}
context(Fir2IrComponents)
@OptIn(IrSymbolInternals::class)
private fun FirClass.getSuperTypesAsIrClasses(): Set<IrClass>? {
val irClass =
declarationStorage.classifierStorage.getIrClassSymbol(symbol).owner as? IrClass ?: return null
return irClass.superTypes.mapNotNull { it.classifierOrNull?.owner as? IrClass }.toSet()
}
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.isAnnotationClass
import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.backend.generators.generateOverriddenPropertySymbols
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.lazy
import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.backend.generators.generateOverriddenAccessorSymbols
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.lazy
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.contextReceiversForFunctionOrContainingProperty
import org.jetbrains.kotlin.fir.backend.generateOverriddenFunctionSymbols
import org.jetbrains.kotlin.fir.backend.generators.generateOverriddenFunctionSymbols
import org.jetbrains.kotlin.fir.backend.toIrType
import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.declarations.FirRegularClass