Fir2Ir: add Fir2IrTypeParametersContainer

Fir2IrLazyProperty should not be a IrTypeParametersContainer.
This commit is contained in:
Georgy Bronnikov
2022-01-11 19:46:17 +03:00
committed by Alexander Udalov
parent 4b34648327
commit f94b0bbcea
7 changed files with 34 additions and 26 deletions
@@ -1354,8 +1354,6 @@ class Fir2IrDeclarationStorage(
} }
} }
propertyCache[fir] = irProperty propertyCache[fir] = irProperty
// NB: this is needed to prevent recursions in case of self bounds
(irProperty as Fir2IrLazyProperty).prepareTypeParameters()
return irProperty return irProperty
} }
@@ -7,14 +7,11 @@ package org.jetbrains.kotlin.fir.lazy
import org.jetbrains.kotlin.fir.FirAnnotationContainer import org.jetbrains.kotlin.fir.FirAnnotationContainer
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents 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.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.symbols.Fir2IrBindableSymbol import org.jetbrains.kotlin.fir.symbols.Fir2IrBindableSymbol
import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.declarations.IrFactory 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.IrLazyDeclarationBase
import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
@@ -23,7 +20,7 @@ import org.jetbrains.kotlin.ir.util.TypeTranslator
import kotlin.properties.ReadWriteProperty import kotlin.properties.ReadWriteProperty
interface AbstractFir2IrLazyDeclaration<F, D : IrDeclaration> : interface AbstractFir2IrLazyDeclaration<F, D : IrDeclaration> :
IrDeclaration, IrDeclarationParent, IrLazyDeclarationBase, Fir2IrComponents where F : FirMemberDeclaration, F : FirAnnotationContainer { IrDeclaration, IrLazyDeclarationBase, Fir2IrComponents where F : FirMemberDeclaration, F : FirAnnotationContainer {
val fir: F val fir: F
override val symbol: Fir2IrBindableSymbol<*, D> override val symbol: Fir2IrBindableSymbol<*, D>
@@ -31,20 +28,6 @@ interface AbstractFir2IrLazyDeclaration<F, D : IrDeclaration> :
override val factory: IrFactory override val factory: IrFactory
get() = irFactory get() = irFactory
var typeParameters: List<IrTypeParameter>
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<Any?, List<IrConstructorCall>> = lazyVar(lock) { override fun createLazyAnnotations(): ReadWriteProperty<Any?, List<IrConstructorCall>> = lazyVar(lock) {
fir.annotations.mapNotNull { fir.annotations.mapNotNull {
callGenerator.convertToIrConstructorCall(it) as? IrConstructorCall callGenerator.convertToIrConstructorCall(it) as? IrConstructorCall
@@ -22,8 +22,6 @@ import org.jetbrains.kotlin.ir.expressions.IrBody
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall 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.isFacadeClass import org.jetbrains.kotlin.ir.util.isFacadeClass
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
@@ -37,7 +35,8 @@ abstract class AbstractFir2IrLazyFunction<F : FirCallableDeclaration>(
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>, IrLazyFunctionBase, Fir2IrComponents by components { ) : IrSimpleFunction(), AbstractFir2IrLazyDeclaration<F, IrSimpleFunction>, Fir2IrTypeParametersContainer, 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
@@ -41,7 +41,7 @@ class Fir2IrLazyClass(
override var origin: IrDeclarationOrigin, override var origin: IrDeclarationOrigin,
override val fir: FirRegularClass, override val fir: FirRegularClass,
override val symbol: Fir2IrClassSymbol, override val symbol: Fir2IrClassSymbol,
) : IrClass(), AbstractFir2IrLazyDeclaration<FirRegularClass, IrClass>, ) : IrClass(), AbstractFir2IrLazyDeclaration<FirRegularClass, IrClass>, Fir2IrTypeParametersContainer,
IrMaybeDeserializedClass, DeserializableClass, Fir2IrComponents by components { IrMaybeDeserializedClass, DeserializableClass, Fir2IrComponents by components {
init { init {
symbol.bind(this) symbol.bind(this)
@@ -35,7 +35,8 @@ class Fir2IrLazyConstructor(
override var origin: IrDeclarationOrigin, override var origin: IrDeclarationOrigin,
override val fir: FirConstructor, override val fir: FirConstructor,
override val symbol: Fir2IrConstructorSymbol, override val symbol: Fir2IrConstructorSymbol,
) : IrConstructor(), AbstractFir2IrLazyDeclaration<FirConstructor, IrConstructor>, Fir2IrComponents by components { ) : IrConstructor(), AbstractFir2IrLazyDeclaration<FirConstructor, IrConstructor>, Fir2IrTypeParametersContainer,
Fir2IrComponents by components {
init { init {
symbol.bind(this) symbol.bind(this)
classifierStorage.preCacheTypeParameters(fir) classifierStorage.preCacheTypeParameters(fir)
@@ -49,7 +49,6 @@ class Fir2IrLazyProperty(
} }
override var annotations: List<IrConstructorCall> by createLazyAnnotations() override var annotations: List<IrConstructorCall> by createLazyAnnotations()
override var typeParameters: List<IrTypeParameter> = emptyList()
override lateinit var parent: IrDeclarationParent override lateinit var parent: IrDeclarationParent
@ObsoleteDescriptorBasedAPI @ObsoleteDescriptorBasedAPI
@@ -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) }
}
}
}
}
}