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.backend.jvm.lower.FileClassDescriptor
|
||||||
import org.jetbrains.kotlin.codegen.*
|
import org.jetbrains.kotlin.codegen.*
|
||||||
import org.jetbrains.kotlin.codegen.MemberCodegen.badDescriptor
|
import org.jetbrains.kotlin.codegen.MemberCodegen.badDescriptor
|
||||||
|
import org.jetbrains.kotlin.codegen.binding.CodegenBinding
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.name.SpecialNames
|
import org.jetbrains.kotlin.name.SpecialNames
|
||||||
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.resolve.jvm.diagnostics.OtherOrigin
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.OtherOrigin
|
||||||
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
|
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
|
||||||
|
import org.jetbrains.kotlin.resolve.source.getPsi
|
||||||
import org.jetbrains.kotlin.types.ErrorUtils
|
import org.jetbrains.kotlin.types.ErrorUtils
|
||||||
import org.jetbrains.org.objectweb.asm.Opcodes
|
import org.jetbrains.org.objectweb.asm.Opcodes
|
||||||
import org.jetbrains.org.objectweb.asm.Type
|
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 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!!
|
val psiElement = irClass.descriptor.psiElement!!
|
||||||
|
|
||||||
@@ -85,6 +90,10 @@ class ClassCodegen private constructor(val irClass: IrClass, val context: JvmBac
|
|||||||
|
|
||||||
ClassCodegen(irClass, context).generate()
|
ClassCodegen(irClass, context).generate()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun generateAnonymous(irClass: IrClass, context: JvmBackendContext) {
|
||||||
|
ClassCodegen(irClass, context).generate()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun generateDeclaration(declaration: IrDeclaration) {
|
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.*
|
||||||
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
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.IrFunction
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
import org.jetbrains.kotlin.ir.declarations.IrVariable
|
||||||
import org.jetbrains.kotlin.ir.expressions.*
|
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.
|
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 {
|
override fun visitVararg(expression: IrVararg, data: BlockInfo): StackValue {
|
||||||
val size = expression.elements.size
|
val size = expression.elements.size
|
||||||
mv.iconst(size)
|
mv.iconst(size)
|
||||||
|
|||||||
Reference in New Issue
Block a user