diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index 7d45ee8016c..834c32866f3 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -1354,8 +1354,6 @@ class Fir2IrDeclarationStorage( } } propertyCache[fir] = irProperty - // NB: this is needed to prevent recursions in case of self bounds - (irProperty as Fir2IrLazyProperty).prepareTypeParameters() return irProperty } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyDeclaration.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyDeclaration.kt index 0ba3a2ae1da..4fce672b855 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyDeclaration.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/AbstractFir2IrLazyDeclaration.kt @@ -7,14 +7,11 @@ package org.jetbrains.kotlin.fir.lazy import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.backend.Fir2IrComponents -import org.jetbrains.kotlin.fir.backend.toIrType import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration -import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.symbols.Fir2IrBindableSymbol import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent import org.jetbrains.kotlin.ir.declarations.IrFactory -import org.jetbrains.kotlin.ir.declarations.IrTypeParameter import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyDeclarationBase import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar import org.jetbrains.kotlin.ir.expressions.IrConstructorCall @@ -23,7 +20,7 @@ import org.jetbrains.kotlin.ir.util.TypeTranslator import kotlin.properties.ReadWriteProperty interface AbstractFir2IrLazyDeclaration : - IrDeclaration, IrDeclarationParent, IrLazyDeclarationBase, Fir2IrComponents where F : FirMemberDeclaration, F : FirAnnotationContainer { + IrDeclaration, IrLazyDeclarationBase, Fir2IrComponents where F : FirMemberDeclaration, F : FirAnnotationContainer { val fir: F override val symbol: Fir2IrBindableSymbol<*, D> @@ -31,20 +28,6 @@ interface AbstractFir2IrLazyDeclaration : override val factory: IrFactory get() = irFactory - var typeParameters: List - - fun prepareTypeParameters() { - typeParameters = fir.typeParameters.mapIndexedNotNull { index, typeParameter -> - if (typeParameter !is FirTypeParameter) return@mapIndexedNotNull null - classifierStorage.getIrTypeParameter(typeParameter, index).apply { - parent = this@AbstractFir2IrLazyDeclaration - if (superTypes.isEmpty()) { - superTypes = typeParameter.bounds.map { it.toIrType(typeConverter) } - } - } - } - } - override fun createLazyAnnotations(): ReadWriteProperty> = lazyVar(lock) { fir.annotations.mapNotNull { callGenerator.convertToIrConstructorCall(it) as? IrConstructorCall 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 a8c6599871f..060590a9ab5 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 @@ -22,8 +22,6 @@ 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.isFacadeClass import org.jetbrains.kotlin.ir.util.isObject import org.jetbrains.kotlin.name.ClassId @@ -37,7 +35,8 @@ abstract class AbstractFir2IrLazyFunction( override var origin: IrDeclarationOrigin, override val symbol: Fir2IrSimpleFunctionSymbol, override val isFakeOverride: Boolean -) : IrSimpleFunction(), AbstractFir2IrLazyDeclaration, IrLazyFunctionBase, Fir2IrComponents by components { +) : IrSimpleFunction(), AbstractFir2IrLazyDeclaration, Fir2IrTypeParametersContainer, IrLazyFunctionBase, + Fir2IrComponents by components { override lateinit var typeParameters: List override lateinit var parent: IrDeclarationParent diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt index fada2638288..49ccf819289 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyClass.kt @@ -41,7 +41,7 @@ class Fir2IrLazyClass( override var origin: IrDeclarationOrigin, override val fir: FirRegularClass, override val symbol: Fir2IrClassSymbol, -) : IrClass(), AbstractFir2IrLazyDeclaration, +) : IrClass(), AbstractFir2IrLazyDeclaration, Fir2IrTypeParametersContainer, IrMaybeDeserializedClass, DeserializableClass, Fir2IrComponents by components { init { symbol.bind(this) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt index 370935e3ab2..b0a4ab81583 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyConstructor.kt @@ -35,7 +35,8 @@ class Fir2IrLazyConstructor( override var origin: IrDeclarationOrigin, override val fir: FirConstructor, override val symbol: Fir2IrConstructorSymbol, -) : IrConstructor(), AbstractFir2IrLazyDeclaration, Fir2IrComponents by components { +) : IrConstructor(), AbstractFir2IrLazyDeclaration, Fir2IrTypeParametersContainer, + Fir2IrComponents by components { init { symbol.bind(this) classifierStorage.preCacheTypeParameters(fir) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt index 8feb7d2b0cc..4d87dac9917 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrLazyProperty.kt @@ -49,7 +49,6 @@ class Fir2IrLazyProperty( } override var annotations: List by createLazyAnnotations() - override var typeParameters: List = emptyList() override lateinit var parent: IrDeclarationParent @ObsoleteDescriptorBasedAPI diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrTypeParametersContainer.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrTypeParametersContainer.kt new file mode 100644 index 00000000000..7ad3a5d5d09 --- /dev/null +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/lazy/Fir2IrTypeParametersContainer.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.lazy + +import org.jetbrains.kotlin.fir.backend.Fir2IrComponents +import org.jetbrains.kotlin.fir.backend.toIrType +import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration +import org.jetbrains.kotlin.fir.declarations.FirTypeParameter +import org.jetbrains.kotlin.ir.declarations.IrTypeParametersContainer + +interface Fir2IrTypeParametersContainer : IrTypeParametersContainer, Fir2IrComponents { + val fir: FirMemberDeclaration + + fun prepareTypeParameters() { + typeParameters = fir.typeParameters.mapIndexedNotNull { index, typeParameter -> + if (typeParameter !is FirTypeParameter) return@mapIndexedNotNull null + classifierStorage.getIrTypeParameter(typeParameter, index).apply { + parent = this@Fir2IrTypeParametersContainer + if (superTypes.isEmpty()) { + superTypes = typeParameter.bounds.map { it.toIrType(typeConverter) } + } + } + } + } +} \ No newline at end of file