Anonymous object support
This commit is contained in:
committed by
Dmitry Petrov
parent
567b174e15
commit
3a9f1e267b
+10
-1
@@ -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) {
|
||||
|
||||
+6
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user