diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java index ab9bc4d7c99..05628aa8213 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java @@ -270,7 +270,7 @@ public abstract class MemberCodegen { + declaration.backingField?.let { + generateField(it) + } + + declaration.getter?.let { + generateMethod(it) + } + + declaration.setter?.let { + generateMethod(it) + } + } + is IrFunction -> { + generateMethod(declaration) + } + else -> throw RuntimeException("Unsupported declaration $declaration") + } + } + + + fun generateField(field: IrField) { + val fieldType = typeMapper.mapType(field.descriptor) + val fieldSignature = typeMapper.mapFieldSignature(field.descriptor.type, field.descriptor) + visitor.newField(field.OtherOrigin, field.descriptor.calculateCommonFlags(), field.descriptor.name.asString(), fieldType.descriptor, + fieldSignature, null/*TODO support default values*/) + } + + fun generateMethod(method: IrFunction) { + val signature = typeMapper.mapSignatureWithGeneric(method.descriptor, OwnerKind.IMPLEMENTATION) + visitor.newMethod(method.OtherOrigin, method.descriptor.calculateCommonFlags(), method.descriptor.name.asString(), signature.asmMethod.descriptor, + signature.genericsSignature, null/*TODO support exception*/) + } + +} + +fun ClassDescriptor.calculateClassFlags(): Int { + return Opcodes.ACC_SUPER.or(calculateCommonFlags()).or(if (DescriptorUtils.isInterface(this)) Opcodes.ACC_INTERFACE else 0) +} + +fun MemberDescriptor.calculateCommonFlags(): Int { + var flags = 0 + if (Visibilities.isPrivate(visibility)) { + flags = flags.or(Opcodes.ACC_PRIVATE) + } + else if (visibility == Visibilities.PUBLIC || visibility == Visibilities.INTERNAL) { + flags = flags.or(Opcodes.ACC_PUBLIC) + } + else if (visibility == Visibilities.PROTECTED) { + flags = flags.or(Opcodes.ACC_PROTECTED) + } + else { + throw RuntimeException("Unsupported visibility $visibility for descriptor $this") + } + + when (modality) { + Modality.ABSTRACT -> {flags = flags.or(Opcodes.ACC_ABSTRACT)} + Modality.FINAL -> {flags = flags.or(Opcodes.ACC_FINAL)} + Modality.OPEN -> { + assert(!Visibilities.isPrivate(visibility)) + } + else -> throw RuntimeException("Unsupported modality $modality for descriptor $this") + } + return flags +} + +val IrClass.OtherOrigin: JvmDeclarationOrigin + get() = OtherOrigin((this.descriptor.source as PsiSourceElement).psi!!, this.descriptor) + +val IrField.OtherOrigin: JvmDeclarationOrigin + get() = OtherOrigin((this.descriptor.source as PsiSourceElement).psi!!, this.descriptor) + +val IrFunction.OtherOrigin: JvmDeclarationOrigin + get() = OtherOrigin((this.descriptor.source as PsiSourceElement).psi!!, this.descriptor) \ No newline at end of file diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmCodegen.kt index 9d5b8bd84fa..0c1ddb38bae 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmCodegen.kt @@ -20,6 +20,6 @@ import org.jetbrains.kotlin.ir.declarations.IrClass class JvmCodegen(val context: JvmBackendContext) { fun generateClass(irClass: IrClass) { - // TODO + JvmClassGenerator.generate(irClass, context) } }