committed by
Nikolay Igotti
parent
9d6e6a1392
commit
0faee23b1d
+16
@@ -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")
|
||||
+2
-2
@@ -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) }
|
||||
|
||||
+15
-3
@@ -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 {
|
||||
|
||||
+1
-2
@@ -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) {
|
||||
|
||||
+1
-1
@@ -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())
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user