JVM IR: Fix modalities in JvmSymbols

This commit is contained in:
Steven Schäfer
2020-01-14 12:07:50 +01:00
committed by Georgy Bronnikov
parent cfcdf05c92
commit 73b4f897b6
2 changed files with 35 additions and 31 deletions
@@ -179,6 +179,7 @@ fun IrDeclarationContainer.addFunction(
name: String,
returnType: IrType,
modality: Modality = Modality.FINAL,
visibility: Visibility = Visibilities.PUBLIC,
isStatic: Boolean = false,
isSuspend: Boolean = false,
origin: IrDeclarationOrigin = IrDeclarationOrigin.DEFINED
@@ -187,6 +188,7 @@ fun IrDeclarationContainer.addFunction(
this.name = Name.identifier(name)
this.returnType = returnType
this.modality = modality
this.visibility = visibility
this.isSuspend = isSuspend
this.origin = origin
}.apply {
@@ -202,7 +202,7 @@ class JvmSymbols(
}
private val javaLangAssertionError: IrClassSymbol =
createClass(FqName("java.lang.AssertionError")) { klass ->
createClass(FqName("java.lang.AssertionError"), classModality = Modality.OPEN) { klass ->
klass.addConstructor().apply {
addValueParameter("detailMessage", irBuiltIns.anyNType)
}
@@ -238,29 +238,30 @@ class JvmSymbols(
val suspendFunctionInterface: IrClassSymbol =
createClass(FqName("kotlin.coroutines.jvm.internal.SuspendFunction"), ClassKind.INTERFACE)
val lambdaClass: IrClassSymbol = createClass(FqName("kotlin.jvm.internal.Lambda")) { klass ->
val lambdaClass: IrClassSymbol = createClass(FqName("kotlin.jvm.internal.Lambda"), classModality = Modality.ABSTRACT) { klass ->
klass.addConstructor().apply {
addValueParameter("arity", irBuiltIns.intType)
}
}
val suspendLambdaClass: IrClassSymbol = createClass(FqName("kotlin.coroutines.jvm.internal.SuspendLambda")) { klass ->
klass.superTypes += suspendFunctionInterface.defaultType
klass.addConstructor().apply {
addValueParameter("arity", irBuiltIns.intType)
addValueParameter(SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME, continuationClass.typeWith(irBuiltIns.anyNType).makeNullable())
val suspendLambdaClass: IrClassSymbol =
createClass(FqName("kotlin.coroutines.jvm.internal.SuspendLambda"), classModality = Modality.ABSTRACT) { klass ->
klass.superTypes += suspendFunctionInterface.defaultType
klass.addConstructor().apply {
addValueParameter("arity", irBuiltIns.intType)
addValueParameter(SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME, continuationClass.typeWith(irBuiltIns.anyNType).makeNullable())
}
klass.addFunction(INVOKE_SUSPEND_METHOD_NAME, irBuiltIns.anyNType, Modality.ABSTRACT, Visibilities.PROTECTED).apply {
addValueParameter(SUSPEND_CALL_RESULT_NAME, resultClassStub.typeWith(irBuiltIns.anyNType))
}
klass.addFunction(SUSPEND_FUNCTION_CREATE_METHOD_NAME, continuationClass.typeWith(irBuiltIns.unitType), Modality.OPEN).apply {
addValueParameter(SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME, continuationClass.typeWith(irBuiltIns.nothingType))
}
klass.addFunction(SUSPEND_FUNCTION_CREATE_METHOD_NAME, continuationClass.typeWith(irBuiltIns.unitType), Modality.OPEN).apply {
addValueParameter("value", irBuiltIns.anyNType)
addValueParameter(SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME, continuationClass.typeWith(irBuiltIns.nothingType))
}
}
klass.addFunction(INVOKE_SUSPEND_METHOD_NAME, irBuiltIns.anyNType, Modality.ABSTRACT).apply {
addValueParameter(SUSPEND_CALL_RESULT_NAME, resultClassStub.typeWith(irBuiltIns.anyNType))
}
klass.addFunction(SUSPEND_FUNCTION_CREATE_METHOD_NAME, continuationClass.typeWith(irBuiltIns.unitType)).apply {
addValueParameter(SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME, continuationClass.typeWith(irBuiltIns.nothingType))
}
klass.addFunction(SUSPEND_FUNCTION_CREATE_METHOD_NAME, continuationClass.typeWith(irBuiltIns.unitType)).apply {
addValueParameter("value", irBuiltIns.anyNType)
addValueParameter(SUSPEND_FUNCTION_COMPLETION_PARAMETER_NAME, continuationClass.typeWith(irBuiltIns.nothingType))
}
}
private fun generateCallableReferenceMethods(klass: IrClass) {
klass.addFunction("getSignature", irBuiltIns.stringType, Modality.OPEN)
@@ -268,21 +269,22 @@ class JvmSymbols(
klass.addFunction("getOwner", kDeclarationContainer.defaultType, Modality.OPEN)
}
val functionReference: IrClassSymbol = createClass(FqName("kotlin.jvm.internal.FunctionReference")) { klass ->
klass.addConstructor().apply {
addValueParameter("arity", irBuiltIns.intType)
val functionReference: IrClassSymbol =
createClass(FqName("kotlin.jvm.internal.FunctionReference"), classModality = Modality.OPEN) { klass ->
klass.addConstructor().apply {
addValueParameter("arity", irBuiltIns.intType)
}
klass.addConstructor().apply {
addValueParameter("arity", irBuiltIns.intType)
addValueParameter("receiver", irBuiltIns.anyNType)
}
klass.addField("receiver", irBuiltIns.anyNType, Visibilities.PROTECTED)
generateCallableReferenceMethods(klass)
}
klass.addConstructor().apply {
addValueParameter("arity", irBuiltIns.intType)
addValueParameter("receiver", irBuiltIns.anyNType)
}
klass.addField("receiver", irBuiltIns.anyNType, Visibilities.PROTECTED)
generateCallableReferenceMethods(klass)
}
val functionReferenceReceiverField: IrFieldSymbol = functionReference.fieldByName("receiver")
val functionReferenceGetSignature: IrSimpleFunctionSymbol = functionReference.functionByName("getSignature")
val functionReferenceGetName: IrSimpleFunctionSymbol = functionReference.functionByName("getName")