From 4b0aeb71057894141782a5d45fd332ae7738ad11 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Wed, 17 Feb 2021 18:08:16 +0300 Subject: [PATCH] FIR2IR: Support initialSignatureDescriptor It will be used for overrides of renamed special built-ins during signature mapping to obtain initial signature --- .../fir/lazy/AbstractFir2IrLazyFunction.kt | 21 +++++++++++++++++-- .../fir/lazy/Fir2IrLazyPropertyAccessor.kt | 14 ++++++++++++- .../fir/lazy/Fir2IrLazySimpleFunction.kt | 7 ++++++- .../java/enhancement/SignatureEnhancement.kt | 9 +++++++- .../org/jetbrains/kotlin/fir/ClassMembers.kt | 3 +++ 5 files changed, 49 insertions(+), 5 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyFunction.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyFunction.kt index c2d9b9e09bf..3abcb2334a2 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyFunction.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyFunction.kt @@ -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( components: Fir2IrComponents, @@ -29,7 +34,7 @@ abstract class AbstractFir2IrLazyFunction( override var origin: IrDeclarationOrigin, override val symbol: Fir2IrSimpleFunctionSymbol, override val isFakeOverride: Boolean -) : IrSimpleFunction(), AbstractFir2IrLazyDeclaration, Fir2IrComponents by components { +) : IrSimpleFunction(), AbstractFir2IrLazyDeclaration, IrLazyFunctionBase, Fir2IrComponents by components { override lateinit var typeParameters: List override lateinit var parent: IrDeclarationParent @@ -94,7 +99,19 @@ abstract class AbstractFir2IrLazyFunction( } } + 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.factory + + override fun createLazyAnnotations(): ReadWriteProperty> { + return super.createLazyAnnotations() + } + companion object { private val JVM_STATIC_CLASS_ID = ClassId.topLevel(JVM_STATIC_ANNOTATION_FQ_NAME) } -} \ No newline at end of file +} diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyPropertyAccessor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyPropertyAccessor.kt index a954f94cbd2..bec9694e3f3 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyPropertyAccessor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyPropertyAccessor.kt @@ -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 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? diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt index 3a02aad285e..30c2d974326 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazySimpleFunction.kt @@ -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? diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt index 9359dd373bd..a3839b387b6 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt @@ -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<*> { diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt index 70886469e9b..ed307ebf44b 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/ClassMembers.kt @@ -70,3 +70,6 @@ var > private object IntersectionOverrideOriginalKey : FirDeclarationDataKey() var > D.originalForIntersectionOverrideAttr: D? by FirDeclarationDataRegistry.data(IntersectionOverrideOriginalKey) + +private object InitialSignatureKey : FirDeclarationDataKey() +var FirCallableDeclaration<*>.initialSignatureAttr: FirCallableDeclaration<*>? by FirDeclarationDataRegistry.data(InitialSignatureKey)