[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(
|
fun FirTypeScope.processOverriddenFunctionsFromSuperClasses(
|
||||||
functionSymbol: FirNamedFunctionSymbol,
|
functionSymbol: FirNamedFunctionSymbol,
|
||||||
containingClass: FirClass,
|
containingClass: FirClass,
|
||||||
@@ -471,15 +456,6 @@ fun FirTypeScope.processOverriddenPropertiesFromSuperClasses(
|
|||||||
processor(unwrapped)
|
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)
|
context(Fir2IrComponents)
|
||||||
internal fun FirProperty.processOverriddenPropertySymbols(
|
internal fun FirProperty.processOverriddenPropertySymbols(
|
||||||
containingClass: FirClass,
|
containingClass: FirClass,
|
||||||
@@ -503,51 +479,6 @@ internal fun FirProperty.processOverriddenPropertySymbols(
|
|||||||
return overriddenSet.toList()
|
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(
|
private val nameToOperationConventionOrigin = mutableMapOf(
|
||||||
OperatorNameConventions.PLUS to IrStatementOrigin.PLUS,
|
OperatorNameConventions.PLUS to IrStatementOrigin.PLUS,
|
||||||
OperatorNameConventions.MINUS to IrStatementOrigin.MINUS,
|
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.descriptors.*
|
||||||
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
|
||||||
import org.jetbrains.kotlin.fir.*
|
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.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
|
import org.jetbrains.kotlin.fir.declarations.builder.buildProperty
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
|
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.PropertyDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.isAnnotationClass
|
import org.jetbrains.kotlin.descriptors.isAnnotationClass
|
||||||
import org.jetbrains.kotlin.fir.backend.*
|
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.FirProperty
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
|
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.fir.lazy
|
package org.jetbrains.kotlin.fir.lazy
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.backend.*
|
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.FirCallableDeclaration
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
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.Fir2IrComponents
|
||||||
import org.jetbrains.kotlin.fir.backend.contextReceiversForFunctionOrContainingProperty
|
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.backend.toIrType
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
|
|||||||
Reference in New Issue
Block a user