This commit is contained in:
SvyatoslavScherbina
2018-09-17 17:44:42 +03:00
committed by Nikolay Igotti
parent 9d6e6a1392
commit 0faee23b1d
7 changed files with 67 additions and 8 deletions
@@ -0,0 +1,16 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
package org.jetbrains.kotlin.backend.konan
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.name.FqName
internal fun IrClass.isNonGeneratedAnnotation(): Boolean =
this.kind == ClassKind.ANNOTATION_CLASS &&
!this.descriptor.annotations.hasAnnotation(serialInfoAnnotationFqName)
private val serialInfoAnnotationFqName = FqName("kotlinx.serialization.SerialInfo")
@@ -758,8 +758,8 @@ internal class CodeGeneratorVisitor(val context: Context, val lifetimes: Map<IrE
override fun visitClass(declaration: IrClass) {
context.log{"visitClass : ${ir2string(declaration)}"}
if (declaration.descriptor.kind == ClassKind.ANNOTATION_CLASS) {
// For annotation classes generate only nested classes.
if (declaration.isNonGeneratedAnnotation()) {
// For non-generated annotation classes generate only nested classes.
declaration.declarations
.filterIsInstance<IrClass>()
.forEach { it.acceptVoid(this) }
@@ -7,17 +7,21 @@ package org.jetbrains.kotlin.backend.konan.lower
import org.jetbrains.kotlin.backend.common.ClassLoweringPass
import org.jetbrains.kotlin.backend.common.CommonBackendContext
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
import org.jetbrains.kotlin.backend.common.lower.irBlockBody
import org.jetbrains.kotlin.backend.konan.descriptors.synthesizedName
import org.jetbrains.kotlin.backend.konan.isNonGeneratedAnnotation
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.SimpleFunctionDescriptorImpl
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.builders.irDelegatingConstructorCall
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.util.addChild
import org.jetbrains.kotlin.ir.util.constructors
import org.jetbrains.kotlin.ir.util.createDispatchReceiverParameter
import org.jetbrains.kotlin.ir.util.transformFlat
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
@@ -134,8 +138,16 @@ internal class InitializersLowering(val context: CommonBackendContext) : ClassLo
}
private fun lowerConstructors(initializerMethodSymbol: IrSimpleFunctionSymbol?) {
if (irClass.kind == ClassKind.ANNOTATION_CLASS)
return
if (irClass.kind == ClassKind.ANNOTATION_CLASS) {
if (irClass.isNonGeneratedAnnotation()) return
val irConstructor = irClass.declarations.filterIsInstance<IrConstructor>().single()
assert(irConstructor.body == null)
irConstructor.body = context.createIrBuilder(irConstructor.symbol).irBlockBody(irConstructor) {
+irDelegatingConstructorCall(context.irBuiltIns.anyClass.owner.constructors.single())
+IrInstanceInitializerCallImpl(startOffset, endOffset, irClass.symbol, context.irBuiltIns.unitType)
}
}
irClass.transformChildrenVoid(object : IrElementTransformerVoid() {
override fun visitClass(declaration: IrClass): IrStatement {
@@ -17,7 +17,6 @@ import org.jetbrains.kotlin.backend.konan.descriptors.target
import org.jetbrains.kotlin.backend.konan.irasdescriptors.*
import org.jetbrains.kotlin.backend.konan.llvm.functionName
import org.jetbrains.kotlin.backend.konan.llvm.localHash
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.*
@@ -201,7 +200,7 @@ internal class ModuleDFGBuilder(val context: Context, val irModule: IrModuleFrag
override fun visitConstructor(declaration: IrConstructor) {
val body = declaration.body
assert (body != null || declaration.constructedClass.kind == ClassKind.ANNOTATION_CLASS) {
assert (body != null || declaration.constructedClass.isNonGeneratedAnnotation()) {
"Non-annotation class constructor has empty body"
}
DEBUG_OUTPUT(0) {
@@ -598,7 +598,7 @@ internal object DataFlowIR {
}
val bridgeTargetSymbol = if (isSpecialBridge || bridgeTarget == null) null else mapFunction(bridgeTarget)
val placeToFunctionsTable = !isAbstract && it !is ConstructorDescriptor && classDescriptor != null
&& classDescriptor.kind != ClassKind.ANNOTATION_CLASS
&& !classDescriptor.isNonGeneratedAnnotation()
&& (it.isOverridableOrOverrides || bridgeTarget != null || descriptor.name.asString().contains("<bridge-") || !classDescriptor.isFinal())
val symbolTableIndex = if (placeToFunctionsTable) module.numberOfFunctions++ else -1
if (it.isExported())
+5
View File
@@ -1659,6 +1659,11 @@ task statements0(type: RunKonanTest) {
source = "runtime/basic/statements0.kt"
}
task annotations0(type: RunStandaloneKonanTest) {
source = "codegen/annotations/annotations0.kt"
flags = ['-tr']
}
task boxing0(type: RunKonanTest) {
goldValue = "17\n"
source = "codegen/boxing/boxing0.kt"
@@ -0,0 +1,27 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the LICENSE file.
*/
// FILE: 1.kt
package codegen.annotations.annotations0
import kotlin.test.*
import kotlinx.serialization.*
@SerialInfo
annotation class Foo(val x: Int, val y: String)
@Test fun runTest() {
val foo = @Suppress("ANNOTATION_CLASS_CONSTRUCTOR_CALL") Foo(42, "17")
assertEquals(foo.x, 42)
assertEquals(foo.y, "17")
}
// FILE: 2.kt
package kotlinx.serialization
@Target(AnnotationTarget.ANNOTATION_CLASS)
annotation class SerialInfo