FIR2IR: Support initialSignatureDescriptor

It will be used for overrides of renamed special built-ins during signature mapping
to obtain initial signature
This commit is contained in:
Denis.Zharkov
2021-02-17 18:08:16 +03:00
parent 23705a269f
commit 4b0aeb7105
5 changed files with 49 additions and 5 deletions
@@ -14,13 +14,18 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyFunctionBase
import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar
import org.jetbrains.kotlin.ir.expressions.IrBody
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator
import org.jetbrains.kotlin.ir.util.TypeTranslator
import org.jetbrains.kotlin.ir.util.isObject
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME
import kotlin.properties.ReadWriteProperty
abstract class AbstractFir2IrLazyFunction<F : FirMemberDeclaration>(
components: Fir2IrComponents,
@@ -29,7 +34,7 @@ abstract class AbstractFir2IrLazyFunction<F : FirMemberDeclaration>(
override var origin: IrDeclarationOrigin,
override val symbol: Fir2IrSimpleFunctionSymbol,
override val isFakeOverride: Boolean
) : IrSimpleFunction(), AbstractFir2IrLazyDeclaration<F, IrSimpleFunction>, Fir2IrComponents by components {
) : IrSimpleFunction(), AbstractFir2IrLazyDeclaration<F, IrSimpleFunction>, IrLazyFunctionBase, Fir2IrComponents by components {
override lateinit var typeParameters: List<IrTypeParameter>
override lateinit var parent: IrDeclarationParent
@@ -94,7 +99,19 @@ abstract class AbstractFir2IrLazyFunction<F : FirMemberDeclaration>(
}
}
override val stubGenerator: DeclarationStubGenerator
get() = error("Should not be called")
override val typeTranslator: TypeTranslator
get() = error("Should not be called")
override val factory: IrFactory
get() = super<AbstractFir2IrLazyDeclaration>.factory
override fun createLazyAnnotations(): ReadWriteProperty<Any?, List<IrConstructorCall>> {
return super<AbstractFir2IrLazyDeclaration>.createLazyAnnotations()
}
companion object {
private val JVM_STATIC_CLASS_ID = ClassId.topLevel(JVM_STATIC_ANNOTATION_FQ_NAME)
}
}
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.lazy
import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor
import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar
@@ -81,7 +82,18 @@ class Fir2IrLazyPropertyAccessor(
}
override var overriddenSymbols: List<IrSimpleFunctionSymbol> by lazyVar {
firParentProperty.generateOverriddenAccessorSymbols(firParentClass, !isSetter, session, scopeSession, declarationStorage)
firParentProperty.generateOverriddenAccessorSymbols(
firParentClass,
!isSetter,
session,
scopeSession,
declarationStorage,
fakeOverrideGenerator
)
}
override val initialSignatureFunction: IrFunction? by lazy {
(fir as? FirSyntheticPropertyAccessor)?.delegate?.let { declarationStorage.getIrFunctionSymbol(it.symbol).owner }
}
override val containerSource: DeserializedContainerSource?
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.fir.lazy
import org.jetbrains.kotlin.fir.backend.*
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.initialSignatureAttr
import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar
@@ -72,7 +73,11 @@ class Fir2IrLazySimpleFunction(
parent.declarations
fakeOverrideGenerator.getOverriddenSymbols(this)?.let { return@lazyVar it }
}
fir.generateOverriddenFunctionSymbols(firParent, session, scopeSession, declarationStorage)
fir.generateOverriddenFunctionSymbols(firParent, session, scopeSession, declarationStorage, fakeOverrideGenerator)
}
override val initialSignatureFunction: IrFunction? by lazy {
(fir.initialSignatureAttr as? FirFunction<*>)?.symbol?.let { declarationStorage.getIrFunctionSymbol(it).owner }
}
override val containerSource: DeserializedContainerSource?
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
import org.jetbrains.kotlin.fir.initialSignatureAttr
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
import org.jetbrains.kotlin.fir.java.declarations.*
import org.jetbrains.kotlin.fir.render
@@ -55,7 +56,13 @@ class FirSignatureEnhancement(
function: FirFunctionSymbol<*>,
name: Name?
): FirFunctionSymbol<*> {
return enhancements.getOrPut(function) { enhance(function, name) } as FirFunctionSymbol<*>
return enhancements.getOrPut(function) {
enhance(function, name).also { enhancedVersion ->
(enhancedVersion.fir.initialSignatureAttr as? FirSimpleFunction)?.let {
enhancedVersion.fir.initialSignatureAttr = enhancedFunction(it.symbol, it.name).fir
}
}
} as FirFunctionSymbol<*>
}
fun enhancedProperty(property: FirVariableSymbol<*>, name: Name): FirVariableSymbol<*> {
@@ -70,3 +70,6 @@ var <D : FirCallableDeclaration<*>>
private object IntersectionOverrideOriginalKey : FirDeclarationDataKey()
var <D : FirCallableDeclaration<*>>
D.originalForIntersectionOverrideAttr: D? by FirDeclarationDataRegistry.data(IntersectionOverrideOriginalKey)
private object InitialSignatureKey : FirDeclarationDataKey()
var FirCallableDeclaration<*>.initialSignatureAttr: FirCallableDeclaration<*>? by FirDeclarationDataRegistry.data(InitialSignatureKey)