Anonymous object support

This commit is contained in:
Michael Bogdanov
2016-09-28 17:43:37 +03:00
committed by Dmitry Petrov
parent 567b174e15
commit 3a9f1e267b
2 changed files with 16 additions and 1 deletions
@@ -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) {
@@ -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)