IR: transform base classes of lazy IR to interfaces

This commit is contained in:
Alexander Udalov
2020-07-22 13:41:56 +02:00
parent b02653a524
commit 3cecf81176
16 changed files with 252 additions and 251 deletions
@@ -5,30 +5,28 @@
package org.jetbrains.kotlin.fir.lazy
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
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.IrElementBase
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import kotlin.properties.ReadWriteProperty
interface AbstractFir2IrLazyDeclaration<F : FirMemberDeclaration, D : IrSymbolOwner> :
IrDeclaration, IrDeclarationParent, Fir2IrComponents {
val fir: F
val symbol: Fir2IrBindableSymbol<*, D>
abstract class AbstractFir2IrLazyDeclaration<F : FirMemberDeclaration, D : IrSymbolOwner>(
private val components: Fir2IrComponents,
startOffset: Int,
endOffset: Int,
override var origin: IrDeclarationOrigin,
val fir: F,
open val symbol: Fir2IrBindableSymbol<*, D>
) : IrElementBase(startOffset, endOffset), IrDeclaration, IrDeclarationParent, Fir2IrComponents by components {
override val factory: IrFactory
get() = components.irFactory
get() = irFactory
internal fun prepareTypeParameters() {
var typeParameters: List<IrTypeParameter>
fun prepareTypeParameters() {
typeParameters = fir.typeParameters.mapIndexedNotNull { index, typeParameter ->
if (typeParameter !is FirTypeParameter) return@mapIndexedNotNull null
classifierStorage.getIrTypeParameter(typeParameter, index).apply {
@@ -40,15 +38,7 @@ abstract class AbstractFir2IrLazyDeclaration<F : FirMemberDeclaration, D : IrSym
}
}
lateinit var typeParameters: List<IrTypeParameter>
override lateinit var parent: IrDeclarationParent
@ObsoleteDescriptorBasedAPI
override val descriptor: DeclarationDescriptor
get() = symbol.descriptor
override var annotations: List<IrConstructorCall> by lazyVar {
fun createLazyAnnotations(): ReadWriteProperty<Any?, List<IrConstructorCall>> = lazyVar {
fir.annotations.mapNotNull {
callGenerator.convertToIrConstructorCall(it) as? IrConstructorCall
}
@@ -19,34 +19,34 @@ import org.jetbrains.kotlin.fir.types.isNullableAny
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
import org.jetbrains.kotlin.name.Name
class Fir2IrLazyClass(
components: Fir2IrComponents,
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
fir: FirRegularClass,
symbol: Fir2IrClassSymbol
) : AbstractFir2IrLazyDeclaration<FirRegularClass, IrClass>(
components, startOffset, endOffset, origin, fir, symbol
), IrClass {
override val startOffset: Int,
override val endOffset: Int,
override var origin: IrDeclarationOrigin,
override val fir: FirRegularClass,
override val symbol: Fir2IrClassSymbol,
) : IrClass, AbstractFir2IrLazyDeclaration<FirRegularClass, IrClass>, Fir2IrComponents by components {
init {
symbol.bind(this)
classifierStorage.preCacheTypeParameters(fir)
}
override var annotations: List<IrConstructorCall> by createLazyAnnotations()
override lateinit var typeParameters: List<IrTypeParameter>
override lateinit var parent: IrDeclarationParent
override val source: SourceElement
get() = SourceElement.NO_SOURCE
@ObsoleteDescriptorBasedAPI
override val descriptor: ClassDescriptor
get() = super.descriptor as ClassDescriptor
override val symbol: Fir2IrClassSymbol
get() = super.symbol as Fir2IrClassSymbol
get() = symbol.descriptor
override val name: Name
get() = fir.name
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
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.types.IrType
import org.jetbrains.kotlin.ir.util.parentClassOrNull
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -23,28 +24,27 @@ import org.jetbrains.kotlin.name.Name
class Fir2IrLazyConstructor(
components: Fir2IrComponents,
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
fir: FirConstructor,
symbol: Fir2IrConstructorSymbol
) : AbstractFir2IrLazyDeclaration<FirConstructor, IrConstructor>(
components, startOffset, endOffset, origin, fir, symbol
), IrConstructor {
override val startOffset: Int,
override val endOffset: Int,
override var origin: IrDeclarationOrigin,
override val fir: FirConstructor,
override val symbol: Fir2IrConstructorSymbol,
) : IrConstructor, AbstractFir2IrLazyDeclaration<FirConstructor, IrConstructor>, Fir2IrComponents by components {
init {
symbol.bind(this)
classifierStorage.preCacheTypeParameters(fir)
}
override var annotations: List<IrConstructorCall> by createLazyAnnotations()
override lateinit var typeParameters: List<IrTypeParameter>
override lateinit var parent: IrDeclarationParent
override val isPrimary: Boolean
get() = fir.isPrimary
@ObsoleteDescriptorBasedAPI
override val descriptor: ClassConstructorDescriptor
get() = super.descriptor as ClassConstructorDescriptor
override val symbol: Fir2IrConstructorSymbol
get() = super.symbol as Fir2IrConstructorSymbol
get() = symbol.descriptor
override val isInline: Boolean
get() = fir.isInline
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.symbols.Fir2IrPropertySymbol
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.lazy.lazyVar
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.types.IrErrorType
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.isInterface
@@ -25,27 +26,25 @@ import org.jetbrains.kotlin.name.Name
class Fir2IrLazyProperty(
components: Fir2IrComponents,
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
fir: FirProperty,
symbol: Fir2IrPropertySymbol,
override val startOffset: Int,
override val endOffset: Int,
override var origin: IrDeclarationOrigin,
override val fir: FirProperty,
override val symbol: Fir2IrPropertySymbol,
override val isFakeOverride: Boolean
) : AbstractFir2IrLazyDeclaration<FirProperty, IrProperty>(
components, startOffset, endOffset, origin, fir, symbol
), IrProperty {
) : IrProperty, AbstractFir2IrLazyDeclaration<FirProperty, IrProperty>, Fir2IrComponents by components {
init {
symbol.bind(this)
classifierStorage.preCacheTypeParameters(fir)
typeParameters = emptyList()
}
override var annotations: List<IrConstructorCall> by createLazyAnnotations()
override var typeParameters: List<IrTypeParameter> = emptyList()
override lateinit var parent: IrDeclarationParent
@ObsoleteDescriptorBasedAPI
override val descriptor: PropertyDescriptor
get() = super.descriptor as PropertyDescriptor
override val symbol: Fir2IrPropertySymbol
get() = super.symbol as Fir2IrPropertySymbol
get() = symbol.descriptor
override val isVar: Boolean
get() = fir.isVar
@@ -7,20 +7,18 @@ package org.jetbrains.kotlin.fir.lazy
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.fir.backend.Fir2IrComponents
import org.jetbrains.kotlin.fir.backend.declareThisReceiverParameter
import org.jetbrains.kotlin.fir.backend.generateOverriddenFunctionSymbols
import org.jetbrains.kotlin.fir.backend.toIrType
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
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.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.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
@@ -28,21 +26,23 @@ import org.jetbrains.kotlin.name.Name
class Fir2IrLazySimpleFunction(
components: Fir2IrComponents,
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
fir: FirSimpleFunction,
override val startOffset: Int,
override val endOffset: Int,
override var origin: IrDeclarationOrigin,
override val fir: FirSimpleFunction,
firParent: FirRegularClass,
symbol: Fir2IrSimpleFunctionSymbol,
override val symbol: Fir2IrSimpleFunctionSymbol,
override val isFakeOverride: Boolean
) : AbstractFir2IrLazyDeclaration<FirSimpleFunction, IrSimpleFunction>(
components, startOffset, endOffset, origin, fir, symbol
), IrSimpleFunction {
) : IrSimpleFunction, AbstractFir2IrLazyDeclaration<FirSimpleFunction, IrSimpleFunction>, Fir2IrComponents by components {
init {
symbol.bind(this)
classifierStorage.preCacheTypeParameters(fir)
}
override var annotations: List<IrConstructorCall> by createLazyAnnotations()
override lateinit var typeParameters: List<IrTypeParameter>
override lateinit var parent: IrDeclarationParent
override val isTailrec: Boolean
get() = fir.isTailRec
@@ -57,10 +57,7 @@ class Fir2IrLazySimpleFunction(
@ObsoleteDescriptorBasedAPI
override val descriptor: FunctionDescriptor
get() = super.descriptor as FunctionDescriptor
override val symbol: Fir2IrSimpleFunctionSymbol
get() = super.symbol as Fir2IrSimpleFunctionSymbol
get() = symbol.descriptor
override val isInline: Boolean
get() = fir.isInline