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.fir.symbols.Fir2IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.* 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.declarations.lazy.lazyVar
import org.jetbrains.kotlin.ir.expressions.IrBody 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.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.types.IrType 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.ir.util.isObject
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME
import kotlin.properties.ReadWriteProperty
abstract class AbstractFir2IrLazyFunction<F : FirMemberDeclaration>( abstract class AbstractFir2IrLazyFunction<F : FirMemberDeclaration>(
components: Fir2IrComponents, components: Fir2IrComponents,
@@ -29,7 +34,7 @@ abstract class AbstractFir2IrLazyFunction<F : FirMemberDeclaration>(
override var origin: IrDeclarationOrigin, override var origin: IrDeclarationOrigin,
override val symbol: Fir2IrSimpleFunctionSymbol, override val symbol: Fir2IrSimpleFunctionSymbol,
override val isFakeOverride: Boolean 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 typeParameters: List<IrTypeParameter>
override lateinit var parent: IrDeclarationParent 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 { companion object {
private val JVM_STATIC_CLASS_ID = ClassId.topLevel(JVM_STATIC_ANNOTATION_FQ_NAME) 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.backend.*
import org.jetbrains.kotlin.fir.declarations.* 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.fir.symbols.Fir2IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar
@@ -81,7 +82,18 @@ class Fir2IrLazyPropertyAccessor(
} }
override var overriddenSymbols: List<IrSimpleFunctionSymbol> by lazyVar { 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? 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.backend.*
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.initialSignatureAttr
import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol import org.jetbrains.kotlin.fir.symbols.Fir2IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar
@@ -72,7 +73,11 @@ class Fir2IrLazySimpleFunction(
parent.declarations parent.declarations
fakeOverrideGenerator.getOverriddenSymbols(this)?.let { return@lazyVar it } 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? 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.impl.FirResolvedDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty 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.JavaTypeParameterStack
import org.jetbrains.kotlin.fir.java.declarations.* import org.jetbrains.kotlin.fir.java.declarations.*
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
@@ -55,7 +56,13 @@ class FirSignatureEnhancement(
function: FirFunctionSymbol<*>, function: FirFunctionSymbol<*>,
name: Name? name: Name?
): FirFunctionSymbol<*> { ): 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<*> { fun enhancedProperty(property: FirVariableSymbol<*>, name: Name): FirVariableSymbol<*> {
@@ -70,3 +70,6 @@ var <D : FirCallableDeclaration<*>>
private object IntersectionOverrideOriginalKey : FirDeclarationDataKey() private object IntersectionOverrideOriginalKey : FirDeclarationDataKey()
var <D : FirCallableDeclaration<*>> var <D : FirCallableDeclaration<*>>
D.originalForIntersectionOverrideAttr: D? by FirDeclarationDataRegistry.data(IntersectionOverrideOriginalKey) D.originalForIntersectionOverrideAttr: D? by FirDeclarationDataRegistry.data(IntersectionOverrideOriginalKey)
private object InitialSignatureKey : FirDeclarationDataKey()
var FirCallableDeclaration<*>.initialSignatureAttr: FirCallableDeclaration<*>? by FirDeclarationDataRegistry.data(InitialSignatureKey)