diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index d3a95084bec..b049522a282 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -88,6 +88,7 @@ import static org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin. import static org.jetbrains.kotlin.types.Variance.INVARIANT; import static org.jetbrains.kotlin.types.expressions.ExpressionTypingUtils.isLocalFunction; import static org.jetbrains.org.objectweb.asm.Opcodes.*; +import static org.jetbrains.org.objectweb.asm.Type.getObjectType; public class ImplementationBodyCodegen extends ClassBodyCodegen { private static final String ENUM_VALUES_FIELD_NAME = "$VALUES"; @@ -113,7 +114,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { boolean isLocal ) { super(aClass, context, v, state, parentCodegen); - this.classAsmType = typeMapper.mapClass(descriptor); + this.classAsmType = getObjectType(typeMapper.classInternalName(descriptor)); this.isLocal = isLocal; delegationFieldsInfo = getDelegationFieldsInfo(myClass.getSuperTypeListEntries()); } @@ -332,7 +333,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { for (String kotlinMarkerInterface : kotlinMarkerInterfaces) { sw.writeInterface(); - sw.writeAsmType(Type.getObjectType(kotlinMarkerInterface)); + sw.writeAsmType(getObjectType(kotlinMarkerInterface)); sw.writeInterfaceEnd(); } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java index 55e19db062b..141b05d7e73 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/MemberCodegen.java @@ -349,10 +349,10 @@ public abstract class MemberCodegen mapType( descriptor is ClassDescriptor -> { val jvmType = - if (mode.isForAnnotationParameter && KotlinBuiltIns.isKClass(descriptor)) + if (mode.isForAnnotationParameter && KotlinBuiltIns.isKClass(descriptor)) { factory.javaLangClassType - else + } + else { typeMappingConfiguration.getPredefinedTypeForClass(descriptor.original) - ?: factory.createObjectType(computeInternalName(descriptor.original, typeMappingConfiguration)) + ?: run { + // refer to enum entries by enum type in bytecode unless ASM_TYPE is written + val enumClassIfEnumEntry = if (descriptor.kind == ClassKind.ENUM_ENTRY) + descriptor.containingDeclaration as ClassDescriptor + else descriptor + factory.createObjectType(computeInternalName(enumClassIfEnumEntry.original, typeMappingConfiguration)) + } + } writeGenericType(kotlinType, jvmType, mode) @@ -211,7 +217,7 @@ private fun mapBuiltInType( return null } -internal fun computeInternalName( +fun computeInternalName( klass: ClassDescriptor, typeMappingConfiguration: TypeMappingConfiguration<*> = TypeMappingConfigurationImpl ): String { @@ -229,8 +235,7 @@ internal fun computeInternalName( val containerInternalName = typeMappingConfiguration.getPredefinedInternalNameForClass(containerClass) ?: computeInternalName(containerClass, typeMappingConfiguration) - return if (klass.kind == ClassKind.ENUM_ENTRY) containerInternalName - else typeMappingConfiguration.innerClassNameFactory(containerInternalName, name) + return typeMappingConfiguration.innerClassNameFactory(containerInternalName, name) } private fun getRepresentativeUpperBound(descriptor: TypeParameterDescriptor): KotlinType {