AnnotationConstructorLowering

This commit is contained in:
Anton Bannykh
2020-01-03 16:08:42 +03:00
committed by Anton Bannykh
parent d76bfdf860
commit 6e501e5f9b
@@ -5,26 +5,32 @@
package org.jetbrains.kotlin.ir.backend.js.lower package org.jetbrains.kotlin.ir.backend.js.lower
import org.jetbrains.kotlin.backend.common.ClassLoweringPass
import org.jetbrains.kotlin.backend.common.CommonBackendContext import org.jetbrains.kotlin.backend.common.CommonBackendContext
import org.jetbrains.kotlin.backend.common.DeclarationTransformer
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrConstructor import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrInstanceInitializerCallImpl
import org.jetbrains.kotlin.ir.util.parentAsClass
class AnnotationConstructorLowering(context: CommonBackendContext) : ClassLoweringPass { class AnnotationConstructorLowering(context: CommonBackendContext) : DeclarationTransformer {
private val unitType = context.irBuiltIns.unitType private val unitType = context.irBuiltIns.unitType
override fun lower(irClass: IrClass) { override fun transformFlat(declaration: IrDeclaration): List<IrDeclaration>? {
if (irClass.kind != ClassKind.ANNOTATION_CLASS) return if (declaration !is IrConstructor || !declaration.isPrimary) return null
val irClass = declaration.parentAsClass
if (irClass.kind != ClassKind.ANNOTATION_CLASS) return null
val constructor = irClass.declarations.filterIsInstance<IrConstructor>().single()
assert(constructor.isPrimary)
// put empty body to make sure proper initializer is generated // put empty body to make sure proper initializer is generated
constructor.body = IrBlockBodyImpl(constructor.startOffset, constructor.endOffset).apply { // TODO what about its previous body?
declaration.body = IrBlockBodyImpl(declaration.startOffset, declaration.endOffset) {
statements += IrInstanceInitializerCallImpl(startOffset, endOffset, irClass.symbol, unitType) statements += IrInstanceInitializerCallImpl(startOffset, endOffset, irClass.symbol, unitType)
} }
return null
} }
} }