diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt index 17ca612df96..09667cf30af 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ClassCodegen.kt @@ -22,13 +22,16 @@ import org.jetbrains.kotlin.backend.jvm.descriptors.JvmSpecialDescriptor import org.jetbrains.kotlin.backend.jvm.lower.FileClassDescriptor import org.jetbrains.kotlin.codegen.* import org.jetbrains.kotlin.codegen.MemberCodegen.badDescriptor +import org.jetbrains.kotlin.codegen.binding.CodegenBinding import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.name.SpecialNames +import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.resolve.jvm.diagnostics.OtherOrigin import org.jetbrains.kotlin.resolve.source.PsiSourceElement +import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.types.ErrorUtils import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Type @@ -42,7 +45,9 @@ class ClassCodegen private constructor(val irClass: IrClass, val context: JvmBac val descriptor = irClass.descriptor - val type: Type = typeMapper.mapType(descriptor) + val isAnonymous = DescriptorUtils.isAnonymousObject(irClass.descriptor) + + val type: Type = if (isAnonymous) CodegenBinding.asmTypeForAnonymousClass(state.bindingContext, descriptor.source.getPsi() as KtElement) else typeMapper.mapType(descriptor) val psiElement = irClass.descriptor.psiElement!! @@ -85,6 +90,10 @@ 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) { 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 56d8cd1c9b3..336eb70b941 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 @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.codegen.StackValue.* import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrVariable import org.jetbrains.kotlin.ir.expressions.* @@ -300,6 +301,11 @@ class ExpressionCodegen( TODO("not implemented for $element") //To change body of created functions use File | Settings | File Templates. } + override fun visitClass(declaration: IrClass, data: BlockInfo): StackValue { + ClassCodegen.generateAnonymous(declaration, classCodegen.context) + return none() + } + override fun visitVararg(expression: IrVararg, data: BlockInfo): StackValue { val size = expression.elements.size mv.iconst(size)