From 1658e110f21dadc213e5899cf7f7d9dc6c15f5cc Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Thu, 6 Oct 2016 18:23:25 +0300 Subject: [PATCH] Support default values for annotation properties --- .../backend/jvm/codegen/FunctionCodegen.kt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt index a8bcf96156c..2c619c29f7a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/FunctionCodegen.kt @@ -24,10 +24,13 @@ import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.ir.declarations.IrFunction +import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.jvm.AsmTypes import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodParameterKind import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature +import org.jetbrains.kotlin.resolve.source.getPsi +import org.jetbrains.org.objectweb.asm.MethodVisitor import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter @@ -61,12 +64,29 @@ class FunctionCodegen(val irFunction: IrFunction, val classCodegen: ClassCodegen FunctionCodegen.generateParameterAnnotations(descriptor, methodVisitor, signature, classCodegen, state) if (!state.classBuilderMode.generateBodies || flags.and(Opcodes.ACC_ABSTRACT) != 0) { + generateAnnotationDefaultValueIfNeeded(methodVisitor) methodVisitor.visitEnd() return } ExpressionCodegen(irFunction, frameMap, InstructionAdapter(methodVisitor), classCodegen).generate() } + + private fun generateAnnotationDefaultValueIfNeeded(methodVisitor: MethodVisitor) { + val directMember = JvmCodegenUtil.getDirectMember(descriptor) + if (DescriptorUtils.isAnnotationClass(directMember.containingDeclaration)) { + val source = directMember.source + (source.getPsi() as? KtParameter)?.defaultValue?.apply { + val defaultValue = this + val constant = org.jetbrains.kotlin.codegen.ExpressionCodegen.getCompileTimeConstant(defaultValue, state.bindingContext, true) + assert(!state.classBuilderMode.generateBodies || constant != null) { "Default value for annotation parameter should be compile time value: " + defaultValue.getText() } + if (constant != null) { + val annotationCodegen = AnnotationCodegen.forAnnotationDefaultValue(methodVisitor, classCodegen, state.typeMapper) + annotationCodegen.generateAnnotationDefaultValue(constant, descriptor.returnType!!) + } + } + } + } } fun createFrameMapWithReceivers(