diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/DelegationFieldsInfo.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/DelegationFieldsInfo.java index 8aa6c904b70..a51690ff8d6 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/DelegationFieldsInfo.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/DelegationFieldsInfo.java @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.codegen; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.backend.common.CodegenUtil; +import org.jetbrains.kotlin.codegen.signature.BothSignatureWriter; import org.jetbrains.kotlin.codegen.state.GenerationState; import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper; import org.jetbrains.kotlin.descriptors.ClassDescriptor; @@ -49,11 +50,17 @@ public class DelegationFieldsInfo { public final Type type; public final String name; public final boolean generateField; + public final String genericSignature; - private Field(Type type, String name, boolean generateField) { + private Field(Type type, String name, boolean generateField, String genericSignature) { this.type = type; this.name = name; this.generateField = generateField; + this.genericSignature = genericSignature; + } + + private Field(Type type, String name, boolean generateField) { + this(type, name, generateField, null); } @NotNull @@ -75,8 +82,8 @@ public class DelegationFieldsInfo { new DelegationFieldsInfo.Field(typeMapper.mapType(propertyDescriptor), propertyDescriptor.getName().asString(), false)); } - private void addField(KtDelegatedSuperTypeEntry specifier, Type type, String name) { - fields.put(specifier, new DelegationFieldsInfo.Field(type, name, true)); + private void addField(KtDelegatedSuperTypeEntry specifier, Type type, String name, String genericSignature) { + fields.put(specifier, new DelegationFieldsInfo.Field(type, name, true, genericSignature)); } @NotNull @@ -97,13 +104,15 @@ public class DelegationFieldsInfo { else { KotlinType expressionType = bindingContext.getType(expression); ClassDescriptor superClass = JvmCodegenUtil.getSuperClass(specifier, state, bindingContext); + BothSignatureWriter sw = new BothSignatureWriter(BothSignatureWriter.Mode.TYPE); Type asmType = - expressionType != null ? typeMapper.mapType(expressionType) : - superClass != null ? typeMapper.mapType(superClass) : null; + expressionType != null ? typeMapper.mapType(expressionType, sw) : + superClass != null ? typeMapper.mapType(superClass.getDefaultType(), sw) : null; if (asmType == null) continue; - result.addField((KtDelegatedSuperTypeEntry) specifier, asmType, DELEGATE_SUPER_FIELD_PREFIX + n); + String genericSignature = sw.makeJavaGenericSignature(); + result.addField((KtDelegatedSuperTypeEntry) specifier, asmType, DELEGATE_SUPER_FIELD_PREFIX + n, genericSignature); } n++; } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index d2045d7bd8a..be3b1c1be03 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -1176,7 +1176,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { if (!fieldInfo.generateField) return; v.newField(JvmDeclarationOrigin.NO_ORIGIN, ACC_PRIVATE | ACC_FINAL | ACC_SYNTHETIC, - fieldInfo.name, fieldInfo.type.getDescriptor(), /*TODO*/null, null); + fieldInfo.name, fieldInfo.type.getDescriptor(), fieldInfo.genericSignature, null); } private void generateDelegates( diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/genericClass.txt b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/genericClass.txt index bba8ff41170..2b7ac793b62 100644 --- a/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/genericClass.txt +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/genericClass.txt @@ -17,7 +17,7 @@ public abstract class<Ljava/lang/Objec public method getSize(): int public method isEmpty(): boolean public bridge final method size(): int - private synthetic final field $$delegate_0: java.util.HashMap + private synthetic final field ;> $$delegate_0: java.util.HashMap } @kotlin.Metadata @@ -39,5 +39,5 @@ public final class<Ljava/lang/Object;L public method getSize(): int public method isEmpty(): boolean public bridge final method size(): int - private synthetic final field $$delegate_0: java.util.HashMap + private synthetic final field ;> $$delegate_0: java.util.HashMap } diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.txt b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.txt index 1b62812417f..73e95131f07 100644 --- a/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.txt +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.txt @@ -22,7 +22,7 @@ public abstract class method remove(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.String public bridge final method remove(p0: java.lang.Object): java.lang.Object public bridge final method size(): int - private synthetic final field $$delegate_0: java.util.HashMap + private synthetic final field ;> $$delegate_0: java.util.HashMap } @kotlin.Metadata @@ -49,5 +49,5 @@ public final class method remove(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.String public bridge final method remove(p0: java.lang.Object): java.lang.Object public bridge final method size(): int - private synthetic final field $$delegate_0: java.util.HashMap + private synthetic final field ;> $$delegate_0: java.util.HashMap } diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/partiallySpecializedClass.txt b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/partiallySpecializedClass.txt index 57e07289184..3f31dcae953 100644 --- a/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/partiallySpecializedClass.txt +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/partiallySpecializedClass.txt @@ -21,7 +21,7 @@ public abstract class<Ljava/lang/Object;Ljava/util/Map method isEmpty(): boolean public synthetic bridge method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object public bridge final method size(): int - private synthetic final field $$delegate_0: java.util.HashMap + private synthetic final field ;> $$delegate_0: java.util.HashMap } @kotlin.Metadata @@ -47,5 +47,5 @@ public final class<Ljava/lang/Object;Ljava/util/Map method isEmpty(): boolean public synthetic bridge method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object public bridge final method size(): int - private synthetic final field $$delegate_0: java.util.HashMap + private synthetic final field ;> $$delegate_0: java.util.HashMap }