FIR2IR KT-46578 add overridden properties generation
This commit is contained in:
committed by
teamcityserver
parent
53c1de172f
commit
a255f44d6e
@@ -353,6 +353,33 @@ private fun FirClass<*>.getSuperTypesAsIrClasses(
|
||||
return irClass.superTypes.mapNotNull { it.classifierOrNull?.owner as? IrClass }.toSet()
|
||||
}
|
||||
|
||||
internal fun FirProperty.generateOverriddenPropertySymbols(
|
||||
containingClass: FirClass<*>,
|
||||
session: FirSession,
|
||||
scopeSession: ScopeSession,
|
||||
declarationStorage: Fir2IrDeclarationStorage,
|
||||
fakeOverrideGenerator: FakeOverrideGenerator,
|
||||
): List<IrPropertySymbol> {
|
||||
val superClasses = containingClass.getSuperTypesAsIrClasses(declarationStorage) ?: return emptyList()
|
||||
|
||||
val scope = containingClass.unsubstitutedScope(session, scopeSession, withForcedTypeCalculator = true)
|
||||
scope.processPropertiesByName(name) {}
|
||||
val overriddenSet = mutableSetOf<IrPropertySymbol>()
|
||||
scope.processOverriddenPropertiesFromSuperClasses(symbol, containingClass) {
|
||||
if (it.fir.visibility == Visibilities.Private) {
|
||||
return@processOverriddenPropertiesFromSuperClasses ProcessorAction.NEXT
|
||||
}
|
||||
|
||||
for (overridden in fakeOverrideGenerator.getOverriddenSymbolsInSupertypes(it, superClasses)) {
|
||||
overriddenSet += overridden
|
||||
}
|
||||
|
||||
ProcessorAction.NEXT
|
||||
}
|
||||
|
||||
return overriddenSet.toList()
|
||||
}
|
||||
|
||||
internal fun FirProperty.generateOverriddenAccessorSymbols(
|
||||
containingClass: FirClass<*>,
|
||||
isGetter: Boolean,
|
||||
|
||||
+5
@@ -156,6 +156,11 @@ internal class ClassMemberGenerator(
|
||||
val delegate = property.delegate
|
||||
val propertyType = property.returnTypeRef.toIrType()
|
||||
irProperty.initializeBackingField(property, initializerExpression = initializer ?: delegate)
|
||||
if (containingClass != null) {
|
||||
irProperty.overriddenSymbols = property.generateOverriddenPropertySymbols(
|
||||
containingClass, session, scopeSession, declarationStorage, fakeOverrideGenerator
|
||||
)
|
||||
}
|
||||
irProperty.getter?.setPropertyAccessorContent(
|
||||
property, property.getter, irProperty, propertyType,
|
||||
property.getter is FirDefaultPropertyGetter,
|
||||
|
||||
+8
@@ -161,6 +161,14 @@ internal class DelegatedMemberGenerator(
|
||||
firDelegateProperty, subClass, origin = IrDeclarationOrigin.DELEGATED_MEMBER,
|
||||
containingClass = firSubClass.symbol.toLookupTag()
|
||||
)
|
||||
delegateProperty.overriddenSymbols =
|
||||
firDelegateProperty.generateOverriddenPropertySymbols(
|
||||
firSubClass,
|
||||
session,
|
||||
scopeSession,
|
||||
declarationStorage,
|
||||
fakeOverrideGenerator
|
||||
)
|
||||
annotationGenerator.generate(delegateProperty, firDelegateProperty)
|
||||
|
||||
delegateProperty.getter!!.body = createDelegateBody(irField, delegateProperty.getter!!, superProperty.getter!!)
|
||||
|
||||
@@ -7,8 +7,6 @@ package org.jetbrains.kotlin.fir.lazy
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
|
||||
import org.jetbrains.kotlin.fir.backend.toIrConst
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
|
||||
@@ -24,10 +22,11 @@ import org.jetbrains.kotlin.ir.util.isInterface
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
||||
import org.jetbrains.kotlin.fir.backend.ConversionTypeContext
|
||||
import org.jetbrains.kotlin.fir.backend.*
|
||||
import org.jetbrains.kotlin.fir.backend.ConversionTypeOrigin
|
||||
import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
|
||||
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
|
||||
|
||||
class Fir2IrLazyProperty(
|
||||
components: Fir2IrComponents,
|
||||
@@ -185,7 +184,13 @@ class Fir2IrLazyProperty(
|
||||
}
|
||||
|
||||
override var overriddenSymbols: List<IrPropertySymbol> by lazyVar(lock) {
|
||||
emptyList() // TODO calculate overridden symbols for property
|
||||
fir.generateOverriddenPropertySymbols(
|
||||
containingClass,
|
||||
session,
|
||||
scopeSession,
|
||||
declarationStorage,
|
||||
fakeOverrideGenerator
|
||||
)
|
||||
}
|
||||
|
||||
override var metadata: MetadataSource?
|
||||
|
||||
Reference in New Issue
Block a user