[FIR2IR] Move utilities for creating fake overrides to FakeOverrideGenerator
This commit is contained in:
committed by
Space Team
parent
ddde2b760a
commit
55a6b1ef9f
@@ -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
|
||||
|
||||
+68
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user