Rewrote annotations building from descriptors to IR

This commit is contained in:
Igor Chevdar
2019-05-14 16:51:08 +03:00
parent b843c95b52
commit 9946fcb8c1
4 changed files with 44 additions and 45 deletions
@@ -12,14 +12,12 @@ import org.jetbrains.kotlin.backend.common.lower.at
import org.jetbrains.kotlin.backend.common.lower.irNot
import org.jetbrains.kotlin.backend.konan.PrimitiveBinaryType
import org.jetbrains.kotlin.backend.konan.RuntimeNames
import org.jetbrains.kotlin.backend.konan.descriptors.createAnnotation
import org.jetbrains.kotlin.backend.konan.ir.*
import org.jetbrains.kotlin.backend.konan.isObjCMetaClass
import org.jetbrains.kotlin.builtins.UnsignedType
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
@@ -534,19 +532,7 @@ private fun KotlinStubs.createFakeKotlinExternalFunction(
cFunctionName: String,
isObjCMethod: Boolean
): IrSimpleFunction {
val objCMethodImpAnnotation = if (isObjCMethod) {
val methodInfo = signature.getObjCMethodInfo()!!
createObjCMethodImpAnnotation(methodInfo.selector, methodInfo.encoding, symbols)
} else {
null
}
val bridgeAnnotations = Annotations.create(
listOfNotNull(
createAnnotation(symbols.symbolName.descriptor, "value" to cFunctionName),
objCMethodImpAnnotation
)
)
val bridgeDescriptor = WrappedSimpleFunctionDescriptor(bridgeAnnotations)
val bridgeDescriptor = WrappedSimpleFunctionDescriptor()
val bridge = IrFunctionImpl(
UNDEFINED_OFFSET,
UNDEFINED_OFFSET,
@@ -563,12 +549,18 @@ private fun KotlinStubs.createFakeKotlinExternalFunction(
)
bridgeDescriptor.bind(bridge)
bridge.annotations += buildSimpleAnnotation(irBuiltIns, UNDEFINED_OFFSET, UNDEFINED_OFFSET,
symbols.symbolName.owner, cFunctionName)
if (isObjCMethod) {
val methodInfo = signature.getObjCMethodInfo()!!
bridge.annotations += buildSimpleAnnotation(irBuiltIns, UNDEFINED_OFFSET, UNDEFINED_OFFSET,
symbols.objCMethodImp.owner, methodInfo.selector, methodInfo.encoding)
}
return bridge
}
private fun createObjCMethodImpAnnotation(selector: String, encoding: String, symbols: KonanSymbols) =
createAnnotation(symbols.objCMethodImp.descriptor, "selector" to selector, "encoding" to encoding)
private val cCall = RuntimeNames.cCall
private fun IrType.isUnsigned(unsignedType: UnsignedType) = this is IrSimpleType && !this.hasQuestionMark &&
@@ -5,20 +5,17 @@ import org.jetbrains.kotlin.backend.common.descriptors.WrappedValueParameterDesc
import org.jetbrains.kotlin.backend.common.ir.simpleFunctions
import org.jetbrains.kotlin.backend.common.lower.irBlock
import org.jetbrains.kotlin.backend.common.lower.irThrow
import org.jetbrains.kotlin.backend.konan.descriptors.createAnnotation
import org.jetbrains.kotlin.backend.konan.ir.KonanSymbols
import org.jetbrains.kotlin.backend.konan.ir.buildSimpleAnnotation
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.builders.*
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrTryImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl
@@ -72,7 +69,7 @@ internal class KotlinBridgeBuilder(
isExternal: Boolean
) {
private var counter = 0
private val bridge: IrFunction = createKotlinBridge(startOffset, endOffset, cName, stubs.symbols, isExternal)
private val bridge: IrFunction = createKotlinBridge(startOffset, endOffset, cName, stubs, isExternal)
val irBuilder: IrBuilderWithScope = irBuilder(stubs.irBuiltIns, bridge.symbol).at(startOffset, endOffset)
fun addParameter(type: IrType): IrValueParameter {
@@ -102,19 +99,10 @@ private fun createKotlinBridge(
startOffset: Int,
endOffset: Int,
cBridgeName: String,
symbols: KonanSymbols,
stubs: KotlinStubs,
isExternal: Boolean
): IrFunctionImpl {
val bridgeAnnotations = Annotations.create(
listOf(
if (isExternal) {
createAnnotation(symbols.symbolName.descriptor, "value" to cBridgeName)
} else {
createAnnotation(symbols.exportForCppRuntime.descriptor, "name" to cBridgeName)
}
)
)
val bridgeDescriptor = WrappedSimpleFunctionDescriptor(bridgeAnnotations)
val bridgeDescriptor = WrappedSimpleFunctionDescriptor()
val bridge = IrFunctionImpl(
startOffset,
endOffset,
@@ -131,9 +119,13 @@ private fun createKotlinBridge(
)
bridgeDescriptor.bind(bridge)
if (isExternal) {
val constructor = symbols.filterExceptions.owner.constructors.single()
bridge.annotations +=
IrConstructorCallImpl.fromSymbolOwner(startOffset, endOffset, constructor.returnType, constructor.symbol)
bridge.annotations += buildSimpleAnnotation(stubs.irBuiltIns, startOffset, endOffset,
stubs.symbols.symbolName.owner, cBridgeName)
bridge.annotations += buildSimpleAnnotation(stubs.irBuiltIns, startOffset, endOffset,
stubs.symbols.filterExceptions.owner)
} else {
bridge.annotations += buildSimpleAnnotation(stubs.irBuiltIns, startOffset, endOffset,
stubs.symbols.exportForCppRuntime.owner, cBridgeName)
}
return bridge
}
@@ -7,18 +7,19 @@ package org.jetbrains.kotlin.backend.konan.ir
import org.jetbrains.kotlin.backend.common.atMostOne
import org.jetbrains.kotlin.backend.konan.descriptors.getArgumentValueOrNull
import org.jetbrains.kotlin.backend.konan.descriptors.isInterface
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.expressions.IrConst
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.expressions.impl.IrConstImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.types.classifierOrFail
import org.jetbrains.kotlin.ir.types.isMarkedNullable
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
@@ -124,3 +125,16 @@ val IrDeclaration.isGetter get() = this is IrSimpleFunction && this == this.corr
val IrDeclaration.isSetter get() = this is IrSimpleFunction && this == this.correspondingProperty?.setter
val IrDeclaration.isAccessor get() = this.isGetter || this.isSetter
fun buildSimpleAnnotation(irBuiltIns: IrBuiltIns, startOffset: Int, endOffset: Int,
annotationClass: IrClass, vararg args: String): IrConstructorCall {
val constructor = annotationClass.constructors.single()
return IrConstructorCallImpl.fromSymbolOwner(startOffset, endOffset, constructor.returnType, constructor.symbol).apply {
args.forEachIndexed { index, arg ->
assert(constructor.valueParameters[index].type == irBuiltIns.stringType) {
"String type expected but was ${constructor.valueParameters[index].type}"
}
putValueArgument(index, IrConstImpl.string(startOffset, endOffset, irBuiltIns.stringType, arg))
}
}
}
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.backend.konan.llvm.llvmSymbolOrigin
import org.jetbrains.kotlin.backend.konan.llvm.tryGetIntrinsicType
import org.jetbrains.kotlin.builtins.UnsignedTypes
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
@@ -390,12 +389,9 @@ internal class InteropLoweringPart1(val context: Context) : BaseInteropIrTransfo
}
}
// Annotations to be detected in KotlinObjCClassInfoGenerator:
val annotations = createObjCMethodImpAnnotations(selector = selector, encoding = signatureEncoding)
val newDescriptor = SimpleFunctionDescriptorImpl.create(
function.descriptor.containingDeclaration,
annotations,
Annotations.EMPTY,
("imp:" + selector).synthesizedName,
CallableMemberDescriptor.Kind.SYNTHESIZED,
SourceElement.NO_SOURCE
@@ -444,6 +440,11 @@ internal class InteropLoweringPart1(val context: Context) : BaseInteropIrTransfo
}
}
// Annotations to be detected in KotlinObjCClassInfoGenerator:
newFunction.annotations += buildSimpleAnnotation(context.irBuiltIns, function.startOffset, function.endOffset,
symbols.objCMethodImp.owner, selector, signatureEncoding)
val builder = context.createIrBuilder(newFunction.symbol)
newFunction.body = builder.irBlockBody(newFunction) {
+irCall(function).apply {