[IR] Add returnType to consturcotrs of IrFunctionBase

This commit is contained in:
Svyatoslav Kuzmich
2018-11-19 16:03:32 +03:00
parent fe6b36391d
commit d5f8c63130
31 changed files with 131 additions and 71 deletions
@@ -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
}
@@ -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
}
@@ -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,