FIR2IR KT-46578 add overridden properties generation

This commit is contained in:
Mikhail Glukhikh
2021-05-13 09:18:42 +03:00
committed by teamcityserver
parent 53c1de172f
commit a255f44d6e
29 changed files with 163 additions and 4 deletions
@@ -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,
@@ -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,
@@ -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?