[IR] Add returnType to consturcotrs of IrFunctionBase
This commit is contained in:
@@ -42,10 +42,9 @@ class IrMemberFunctionBuilder(
|
||||
lateinit var irFunction: IrFunction
|
||||
|
||||
inline fun addToClass(body: IrMemberFunctionBuilder.(IrFunction) -> Unit): IrFunction {
|
||||
irFunction = IrFunctionImpl(startOffset, endOffset, origin, function)
|
||||
irFunction = IrFunctionImpl(startOffset, endOffset, origin, function, returnType)
|
||||
body(irFunction)
|
||||
irFunction.body = doBuild()
|
||||
irFunction.returnType = returnType
|
||||
irClass.declarations.add(irFunction)
|
||||
return irFunction
|
||||
}
|
||||
|
||||
+9
-4
@@ -35,13 +35,14 @@ class IrConstructorImpl(
|
||||
override val symbol: IrConstructorSymbol,
|
||||
name: Name,
|
||||
visibility: Visibility,
|
||||
returnType: IrType,
|
||||
isInline: Boolean,
|
||||
isExternal: Boolean,
|
||||
override val isPrimary: Boolean
|
||||
) :
|
||||
IrFunctionBase(
|
||||
startOffset, endOffset, origin, name,
|
||||
visibility, isInline, isExternal
|
||||
visibility, isInline, isExternal, returnType
|
||||
),
|
||||
IrConstructor {
|
||||
|
||||
@@ -50,11 +51,13 @@ class IrConstructorImpl(
|
||||
endOffset: Int,
|
||||
origin: IrDeclarationOrigin,
|
||||
symbol: IrConstructorSymbol,
|
||||
returnType: IrType,
|
||||
body: IrBody? = null
|
||||
) : this(
|
||||
startOffset, endOffset, origin, symbol,
|
||||
symbol.descriptor.name,
|
||||
symbol.descriptor.visibility,
|
||||
returnType,
|
||||
symbol.descriptor.isInline,
|
||||
symbol.descriptor.isEffectivelyExternal(),
|
||||
symbol.descriptor.isPrimary
|
||||
@@ -66,8 +69,9 @@ class IrConstructorImpl(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
origin: IrDeclarationOrigin,
|
||||
descriptor: ClassConstructorDescriptor
|
||||
) : this(startOffset, endOffset, origin, IrConstructorSymbolImpl(descriptor))
|
||||
descriptor: ClassConstructorDescriptor,
|
||||
returnType: IrType
|
||||
) : this(startOffset, endOffset, origin, IrConstructorSymbolImpl(descriptor), returnType)
|
||||
|
||||
@Deprecated("Use constructor which takes symbol instead of descriptor")
|
||||
constructor(
|
||||
@@ -75,8 +79,9 @@ class IrConstructorImpl(
|
||||
endOffset: Int,
|
||||
origin: IrDeclarationOrigin,
|
||||
descriptor: ClassConstructorDescriptor,
|
||||
returnType: IrType,
|
||||
body: IrBody?
|
||||
) : this(startOffset, endOffset, origin, descriptor) {
|
||||
) : this(startOffset, endOffset, origin, descriptor, returnType) {
|
||||
this.body = body
|
||||
}
|
||||
|
||||
|
||||
+10
-3
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
|
||||
import org.jetbrains.kotlin.ir.declarations.IrValueParameter
|
||||
import org.jetbrains.kotlin.ir.expressions.IrBody
|
||||
import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType
|
||||
import org.jetbrains.kotlin.ir.util.transform
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||
@@ -36,11 +37,19 @@ abstract class IrFunctionBase(
|
||||
override val name: Name,
|
||||
override val visibility: Visibility,
|
||||
override val isInline: Boolean,
|
||||
override val isExternal: Boolean
|
||||
override val isExternal: Boolean,
|
||||
returnType: IrType
|
||||
) :
|
||||
IrDeclarationBase(startOffset, endOffset, origin),
|
||||
IrFunction {
|
||||
|
||||
final override var returnType: IrType = returnType
|
||||
get() = if (field === IrUninitializedType) {
|
||||
error("Return type is not initialized")
|
||||
} else {
|
||||
field
|
||||
}
|
||||
|
||||
override val typeParameters: MutableList<IrTypeParameter> = SmartList()
|
||||
|
||||
override var dispatchReceiverParameter: IrValueParameter? = null
|
||||
@@ -49,8 +58,6 @@ abstract class IrFunctionBase(
|
||||
|
||||
final override var body: IrBody? = null
|
||||
|
||||
final override lateinit var returnType: IrType
|
||||
|
||||
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
|
||||
typeParameters.forEach { it.accept(visitor, data) }
|
||||
|
||||
|
||||
@@ -27,12 +27,13 @@ class IrFunctionImpl(
|
||||
name: Name,
|
||||
visibility: Visibility,
|
||||
override val modality: Modality,
|
||||
returnType: IrType,
|
||||
isInline: Boolean,
|
||||
isExternal: Boolean,
|
||||
override val isTailrec: Boolean,
|
||||
override val isSuspend: Boolean
|
||||
) :
|
||||
IrFunctionBase(startOffset, endOffset, origin, name, visibility, isInline, isExternal),
|
||||
IrFunctionBase(startOffset, endOffset, origin, name, visibility, isInline, isExternal, returnType),
|
||||
IrSimpleFunction {
|
||||
|
||||
constructor(
|
||||
@@ -40,6 +41,7 @@ class IrFunctionImpl(
|
||||
endOffset: Int,
|
||||
origin: IrDeclarationOrigin,
|
||||
symbol: IrSimpleFunctionSymbol,
|
||||
returnType: IrType,
|
||||
visibility: Visibility = symbol.descriptor.visibility,
|
||||
modality: Modality = symbol.descriptor.modality
|
||||
) : this(
|
||||
@@ -47,6 +49,7 @@ class IrFunctionImpl(
|
||||
symbol.descriptor.name,
|
||||
visibility,
|
||||
modality,
|
||||
returnType,
|
||||
symbol.descriptor.isInline,
|
||||
symbol.descriptor.isExternal,
|
||||
symbol.descriptor.isTailrec,
|
||||
@@ -63,10 +66,11 @@ class IrFunctionImpl(
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
origin: IrDeclarationOrigin,
|
||||
descriptor: FunctionDescriptor
|
||||
descriptor: FunctionDescriptor,
|
||||
returnType: IrType
|
||||
) : this(
|
||||
startOffset, endOffset, origin,
|
||||
IrSimpleFunctionSymbolImpl(descriptor)
|
||||
IrSimpleFunctionSymbolImpl(descriptor), returnType
|
||||
)
|
||||
|
||||
constructor(
|
||||
@@ -74,8 +78,9 @@ class IrFunctionImpl(
|
||||
endOffset: Int,
|
||||
origin: IrDeclarationOrigin,
|
||||
descriptor: FunctionDescriptor,
|
||||
returnType: IrType,
|
||||
body: IrBody?
|
||||
) : this(startOffset, endOffset, origin, descriptor) {
|
||||
) : this(startOffset, endOffset, origin, descriptor, returnType) {
|
||||
this.body = body
|
||||
}
|
||||
|
||||
|
||||
@@ -38,4 +38,9 @@ val IrType.originalKotlinType: KotlinType?
|
||||
get() = safeAs<IrTypeBase>()?.kotlinType
|
||||
|
||||
|
||||
object IrStarProjectionImpl : IrStarProjection
|
||||
object IrStarProjectionImpl : IrStarProjection
|
||||
|
||||
@Deprecated("Hack to temporary cover late type initialization")
|
||||
object IrUninitializedType : IrType {
|
||||
override val annotations: List<IrCall> = emptyList()
|
||||
}
|
||||
|
||||
@@ -116,6 +116,7 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
|
||||
declaration.startOffset, declaration.endOffset,
|
||||
mapDeclarationOrigin(declaration.origin),
|
||||
mapFunctionDeclaration(declaration.descriptor),
|
||||
declaration.returnType, // TODO
|
||||
declaration.body?.transform()
|
||||
).transformParameters(declaration).apply {
|
||||
transformAnnotations(declaration)
|
||||
@@ -126,7 +127,6 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
|
||||
else
|
||||
IrSimpleFunctionSymbolImpl(overriddenDescriptor.original)
|
||||
}
|
||||
returnType = declaration.returnType // TODO
|
||||
}
|
||||
|
||||
override fun visitConstructor(declaration: IrConstructor): IrConstructor =
|
||||
@@ -134,10 +134,10 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
|
||||
declaration.startOffset, declaration.endOffset,
|
||||
mapDeclarationOrigin(declaration.origin),
|
||||
mapConstructorDeclaration(declaration.descriptor),
|
||||
declaration.returnType, // TODO
|
||||
declaration.body?.transform()
|
||||
).transformParameters(declaration).apply {
|
||||
transformAnnotations(declaration)
|
||||
returnType = declaration.returnType // TODO
|
||||
}
|
||||
|
||||
protected fun <T : IrTypeParametersContainer> T.transformTypeParameters(
|
||||
|
||||
@@ -155,6 +155,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
symbolRenamer.getFunctionName(declaration.symbol),
|
||||
declaration.visibility,
|
||||
declaration.modality,
|
||||
declaration.returnType,
|
||||
declaration.isInline,
|
||||
declaration.isExternal,
|
||||
declaration.isTailrec,
|
||||
@@ -173,6 +174,7 @@ open class DeepCopyIrTreeWithSymbols(
|
||||
symbolRemapper.getDeclaredConstructor(declaration.symbol),
|
||||
declaration.name,
|
||||
declaration.visibility,
|
||||
declaration.returnType,
|
||||
declaration.isInline,
|
||||
declaration.isExternal,
|
||||
declaration.isPrimary
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
|
||||
import org.jetbrains.kotlin.ir.symbols.*
|
||||
import org.jetbrains.kotlin.ir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.ir.types.IrType
|
||||
import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType
|
||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||
@@ -235,7 +236,7 @@ open class SymbolTable : ReferenceSymbolTable {
|
||||
endOffset: Int,
|
||||
origin: IrDeclarationOrigin,
|
||||
descriptor: ClassConstructorDescriptor,
|
||||
constructorFactory: (IrConstructorSymbol) -> IrConstructor = { IrConstructorImpl(startOffset, endOffset, origin, it) }
|
||||
constructorFactory: (IrConstructorSymbol) -> IrConstructor = { IrConstructorImpl(startOffset, endOffset, origin, it, IrUninitializedType) }
|
||||
): IrConstructor =
|
||||
constructorSymbolTable.declare(
|
||||
descriptor,
|
||||
@@ -299,7 +300,7 @@ open class SymbolTable : ReferenceSymbolTable {
|
||||
endOffset: Int,
|
||||
origin: IrDeclarationOrigin,
|
||||
descriptor: FunctionDescriptor,
|
||||
functionFactory: (IrSimpleFunctionSymbol) -> IrSimpleFunction = { IrFunctionImpl(startOffset, endOffset, origin, it) }
|
||||
functionFactory: (IrSimpleFunctionSymbol) -> IrSimpleFunction = { IrFunctionImpl(startOffset, endOffset, origin, it, IrUninitializedType) }
|
||||
): IrSimpleFunction {
|
||||
return simpleFunctionSymbolTable.declare(
|
||||
descriptor,
|
||||
|
||||
Reference in New Issue
Block a user