From e40c434c57a7a507f0653e4c5d3a986a885a65f3 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Fri, 30 Sep 2016 15:00:46 +0300 Subject: [PATCH] Write inner class attributes --- .../kotlin/codegen/MemberCodegen.java | 4 ++ .../backend/jvm/codegen/ClassCodegen.kt | 41 ++++++++++++++++--- .../backend/jvm/codegen/ExpressionCodegen.kt | 2 +- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java index 05628aa8213..6778a676c3c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java @@ -315,6 +315,10 @@ public abstract class MemberCodegen() val state = context.state @@ -71,6 +74,8 @@ class ClassCodegen private constructor(val irClass: IrClass, val context: JvmBac generateDeclaration(it) } + writeInnerClasses() + visitor.done() } @@ -90,10 +95,6 @@ class ClassCodegen private constructor(val irClass: IrClass, val context: JvmBac ClassCodegen(irClass, context).generate() } - - fun generateAnonymous(irClass: IrClass, context: JvmBackendContext) { - ClassCodegen(irClass, context).generate() - } } fun generateDeclaration(declaration: IrDeclaration) { @@ -110,7 +111,7 @@ class ClassCodegen private constructor(val irClass: IrClass, val context: JvmBac // skip } is IrClass -> { - ClassCodegen(declaration, context).generate() + ClassCodegen(declaration, context, this).generate() } else -> throw RuntimeException("Unsupported declaration $declaration") } @@ -128,6 +129,34 @@ class ClassCodegen private constructor(val irClass: IrClass, val context: JvmBac FunctionCodegen(method, this).generate() } + private fun writeInnerClasses() { + // JVMS7 (4.7.6): a nested class or interface member will have InnerClasses information + // for each enclosing class and for each immediate member + val classDescriptor = classForInnerClassRecord() + if (classDescriptor != null) { + if (parentClassCodegen != null) { + parentClassCodegen.innerClasses.add(classDescriptor) + } + + var codegen: ClassCodegen? = this + while (codegen != null) { + val outerClass = codegen.classForInnerClassRecord() + if (outerClass != null) { + innerClasses.add(outerClass) + } + codegen = codegen.parentClassCodegen + } + } + + for (innerClass in innerClasses) { + MemberCodegen.writeInnerClass(innerClass, typeMapper, visitor) + } + } + + private fun classForInnerClassRecord(): ClassDescriptor? { + return if (parentClassCodegen != null) descriptor else null + } + } fun ClassDescriptor.calculateClassFlags(): Int { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index bd74794202a..b4457bf824d 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -296,7 +296,7 @@ class ExpressionCodegen( } override fun visitClass(declaration: IrClass, data: BlockInfo): StackValue { - ClassCodegen.generateAnonymous(declaration, classCodegen.context) + classCodegen.generateDeclaration(declaration) return none() }