diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index 019504e4354..359589c6240 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -1126,8 +1126,12 @@ public class FunctionCodegen { boolean isSpecialOrDelegationToSuper = isSpecialBridge || isStubDeclarationWithDelegationToSuper; int flags = ACC_PUBLIC | ACC_BRIDGE | (!isSpecialOrDelegationToSuper ? ACC_SYNTHETIC : 0) | (isSpecialBridge ? ACC_FINAL : 0); // TODO. - MethodVisitor mv = - v.newMethod(JvmDeclarationOriginKt.Bridge(descriptor, origin), flags, bridge.getName(), bridge.getDescriptor(), null, null); + String bridgeSignature = + isSpecialBridge ? typeMapper.mapSignatureWithGeneric(descriptor, OwnerKind.IMPLEMENTATION).getGenericsSignature() + : null; + + MethodVisitor mv = v.newMethod(JvmDeclarationOriginKt.Bridge(descriptor, origin), flags, + bridge.getName(), bridge.getDescriptor(), bridgeSignature, null); if (!state.getClassBuilderMode().generateBodies) return; mv.visitCode(); diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/signatureForSpecialBridge.kt b/compiler/testData/codegen/bytecodeListing/specialBridges/signatureForSpecialBridge.kt deleted file mode 100644 index b49589e3ded..00000000000 --- a/compiler/testData/codegen/bytecodeListing/specialBridges/signatureForSpecialBridge.kt +++ /dev/null @@ -1,3 +0,0 @@ -// WITH_SIGNATURES - -class MyMap : MutableMap by HashMap() diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/signatureForSpecialBridge.txt b/compiler/testData/codegen/bytecodeListing/specialBridges/signatureForSpecialBridge.txt deleted file mode 100644 index dd62ea01aae..00000000000 --- a/compiler/testData/codegen/bytecodeListing/specialBridges/signatureForSpecialBridge.txt +++ /dev/null @@ -1,21 +0,0 @@ -@kotlin.Metadata -public final class<Ljava/lang/Object;Ljava/util/Map;Lkotlin/jvm/internal/markers/KMutableMap;> MyMap { - public @org.jetbrains.annotations.NotNull <()Ljava/util/Collection;> method getValues(): java.util.Collection - public @org.jetbrains.annotations.NotNull <()Ljava/util/Set;>;> method getEntries(): java.util.Set - public @org.jetbrains.annotations.NotNull <()Ljava/util/Set;> method getKeys(): java.util.Set - public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method get(p0: java.lang.Object): java.lang.Object - public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method remove(p0: java.lang.Object): java.lang.Object - public <(Ljava/util/Map<+TK;+TV;>;)V> method putAll(@org.jetbrains.annotations.NotNull p0: java.util.Map): void - public @org.jetbrains.annotations.Nullable <(TK;TV;)TV;> method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object - public method (): void - public method clear(): void - public method containsKey(p0: java.lang.Object): boolean - public method containsValue(p0: java.lang.Object): boolean - public final method entrySet(): java.util.Set - public method getSize(): int - public method isEmpty(): boolean - public final method keySet(): java.util.Set - public final method size(): int - public final method values(): java.util.Collection - private synthetic final field $$delegate_0: java.util.HashMap -} diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/genericClass.kt b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/genericClass.kt new file mode 100644 index 00000000000..1eb2dbc6c7b --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/genericClass.kt @@ -0,0 +1,5 @@ +// WITH_SIGNATURES + +class GenericMap : MutableMap by HashMap() + +abstract class AbstractGenericMap : MutableMap by HashMap() diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/genericClass.txt b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/genericClass.txt new file mode 100644 index 00000000000..a225db878da --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/genericClass.txt @@ -0,0 +1,43 @@ +@kotlin.Metadata +public abstract class<Ljava/lang/Object;Ljava/util/Map;Lkotlin/jvm/internal/markers/KMutableMap;> AbstractGenericMap { + public @org.jetbrains.annotations.NotNull <()Ljava/util/Collection;> method getValues(): java.util.Collection + public final <()Ljava/util/Collection;> method values(): java.util.Collection + public final <()Ljava/util/Set;>;> method entrySet(): java.util.Set + public @org.jetbrains.annotations.NotNull <()Ljava/util/Set;>;> method getEntries(): java.util.Set + public @org.jetbrains.annotations.NotNull <()Ljava/util/Set;> method getKeys(): java.util.Set + public final <()Ljava/util/Set;> method keySet(): java.util.Set + public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method get(p0: java.lang.Object): java.lang.Object + public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method remove(p0: java.lang.Object): java.lang.Object + public <(Ljava/util/Map<+TK;+TV;>;)V> method putAll(@org.jetbrains.annotations.NotNull p0: java.util.Map): void + public @org.jetbrains.annotations.Nullable <(TK;TV;)TV;> method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object + public method (): void + public method clear(): void + public method containsKey(p0: java.lang.Object): boolean + public method containsValue(p0: java.lang.Object): boolean + public method getSize(): int + public method isEmpty(): boolean + public final method size(): int + private synthetic final field $$delegate_0: java.util.HashMap +} + +@kotlin.Metadata +public final class<Ljava/lang/Object;Ljava/util/Map;Lkotlin/jvm/internal/markers/KMutableMap;> GenericMap { + public @org.jetbrains.annotations.NotNull <()Ljava/util/Collection;> method getValues(): java.util.Collection + public final <()Ljava/util/Collection;> method values(): java.util.Collection + public final <()Ljava/util/Set;>;> method entrySet(): java.util.Set + public @org.jetbrains.annotations.NotNull <()Ljava/util/Set;>;> method getEntries(): java.util.Set + public @org.jetbrains.annotations.NotNull <()Ljava/util/Set;> method getKeys(): java.util.Set + public final <()Ljava/util/Set;> method keySet(): java.util.Set + public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method get(p0: java.lang.Object): java.lang.Object + public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method remove(p0: java.lang.Object): java.lang.Object + public <(Ljava/util/Map<+TK;+TV;>;)V> method putAll(@org.jetbrains.annotations.NotNull p0: java.util.Map): void + public @org.jetbrains.annotations.Nullable <(TK;TV;)TV;> method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object + public method (): void + public method clear(): void + public method containsKey(p0: java.lang.Object): boolean + public method containsValue(p0: java.lang.Object): boolean + public method getSize(): int + public method isEmpty(): boolean + public final method size(): int + private synthetic final field $$delegate_0: java.util.HashMap +} diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.kt b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.kt new file mode 100644 index 00000000000..efab98d9f34 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.kt @@ -0,0 +1,5 @@ +// WITH_SIGNATURES + +class StringStringMap : MutableMap by HashMap() + +abstract class AbstractStringStringMap : MutableMap by HashMap() diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.txt b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.txt new file mode 100644 index 00000000000..f33c4ce18c6 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.txt @@ -0,0 +1,53 @@ +@kotlin.Metadata +public abstract class;Lkotlin/jvm/internal/markers/KMutableMap;> AbstractStringStringMap { + public @org.jetbrains.annotations.NotNull <()Ljava/util/Collection;> method getValues(): java.util.Collection + public final <()Ljava/util/Collection;> method values(): java.util.Collection + public @org.jetbrains.annotations.NotNull <()Ljava/util/Set;> method getKeys(): java.util.Set + public final <()Ljava/util/Set;> method keySet(): java.util.Set + public final <()Ljava/util/Set;>;> method entrySet(): java.util.Set + public @org.jetbrains.annotations.NotNull <()Ljava/util/Set;>;> method getEntries(): java.util.Set + public <(Ljava/util/Map<+Ljava/lang/String;+Ljava/lang/String;>;)V> method putAll(@org.jetbrains.annotations.NotNull p0: java.util.Map): void + public method (): void + public method clear(): void + public method containsKey(@org.jetbrains.annotations.NotNull p0: java.lang.String): boolean + public final method containsKey(p0: java.lang.Object): boolean + public method containsValue(@org.jetbrains.annotations.NotNull p0: java.lang.String): boolean + public final method containsValue(p0: java.lang.Object): boolean + public @org.jetbrains.annotations.Nullable method get(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.String + public final method get(p0: java.lang.Object): java.lang.Object + public method getSize(): int + public method isEmpty(): boolean + public @org.jetbrains.annotations.Nullable method put(@org.jetbrains.annotations.NotNull p0: java.lang.String, @org.jetbrains.annotations.NotNull p1: java.lang.String): java.lang.String + public synthetic method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object + public @org.jetbrains.annotations.Nullable method remove(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.String + public final method remove(p0: java.lang.Object): java.lang.Object + public final method size(): int + private synthetic final field $$delegate_0: java.util.HashMap +} + +@kotlin.Metadata +public final class;Lkotlin/jvm/internal/markers/KMutableMap;> StringStringMap { + public @org.jetbrains.annotations.NotNull <()Ljava/util/Collection;> method getValues(): java.util.Collection + public final <()Ljava/util/Collection;> method values(): java.util.Collection + public @org.jetbrains.annotations.NotNull <()Ljava/util/Set;> method getKeys(): java.util.Set + public final <()Ljava/util/Set;> method keySet(): java.util.Set + public final <()Ljava/util/Set;>;> method entrySet(): java.util.Set + public @org.jetbrains.annotations.NotNull <()Ljava/util/Set;>;> method getEntries(): java.util.Set + public <(Ljava/util/Map<+Ljava/lang/String;+Ljava/lang/String;>;)V> method putAll(@org.jetbrains.annotations.NotNull p0: java.util.Map): void + public method (): void + public method clear(): void + public method containsKey(@org.jetbrains.annotations.NotNull p0: java.lang.String): boolean + public final method containsKey(p0: java.lang.Object): boolean + public method containsValue(@org.jetbrains.annotations.NotNull p0: java.lang.String): boolean + public final method containsValue(p0: java.lang.Object): boolean + public @org.jetbrains.annotations.Nullable method get(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.String + public final method get(p0: java.lang.Object): java.lang.Object + public method getSize(): int + public method isEmpty(): boolean + public @org.jetbrains.annotations.Nullable method put(@org.jetbrains.annotations.NotNull p0: java.lang.String, @org.jetbrains.annotations.NotNull p1: java.lang.String): java.lang.String + public synthetic method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object + public @org.jetbrains.annotations.Nullable method remove(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.String + public final method remove(p0: java.lang.Object): java.lang.Object + public final method size(): int + private synthetic final field $$delegate_0: java.util.HashMap +} diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/partiallySpecializedClass.kt b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/partiallySpecializedClass.kt new file mode 100644 index 00000000000..6d50b49f84d --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/partiallySpecializedClass.kt @@ -0,0 +1,5 @@ +// WITH_SIGNATURES + +class StringMap : MutableMap by HashMap() + +abstract class AbstractStringMap : MutableMap by HashMap() diff --git a/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/partiallySpecializedClass.txt b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/partiallySpecializedClass.txt new file mode 100644 index 00000000000..94b7cd849ef --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/specialBridges/signatures/partiallySpecializedClass.txt @@ -0,0 +1,51 @@ +@kotlin.Metadata +public abstract class<Ljava/lang/Object;Ljava/util/Map;Lkotlin/jvm/internal/markers/KMutableMap;> AbstractStringMap { + public @org.jetbrains.annotations.NotNull <()Ljava/util/Collection;> method getValues(): java.util.Collection + public final <()Ljava/util/Collection;> method values(): java.util.Collection + public @org.jetbrains.annotations.NotNull <()Ljava/util/Set;> method getKeys(): java.util.Set + public final <()Ljava/util/Set;> method keySet(): java.util.Set + public final <()Ljava/util/Set;>;> method entrySet(): java.util.Set + public @org.jetbrains.annotations.NotNull <()Ljava/util/Set;>;> method getEntries(): java.util.Set + public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method get(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object + public final <(Ljava/lang/Object;)TV;> method get(p0: java.lang.Object): java.lang.Object + public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method remove(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object + public final <(Ljava/lang/Object;)TV;> method remove(p0: java.lang.Object): java.lang.Object + public @org.jetbrains.annotations.Nullable <(Ljava/lang/String;TV;)TV;> method put(@org.jetbrains.annotations.NotNull p0: java.lang.String, p1: java.lang.Object): java.lang.Object + public <(Ljava/util/Map<+Ljava/lang/String;+TV;>;)V> method putAll(@org.jetbrains.annotations.NotNull p0: java.util.Map): void + public method (): void + public method clear(): void + public method containsKey(@org.jetbrains.annotations.NotNull p0: java.lang.String): boolean + public final method containsKey(p0: java.lang.Object): boolean + public method containsValue(p0: java.lang.Object): boolean + public method getSize(): int + public method isEmpty(): boolean + public synthetic method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object + public final method size(): int + private synthetic final field $$delegate_0: java.util.HashMap +} + +@kotlin.Metadata +public final class<Ljava/lang/Object;Ljava/util/Map;Lkotlin/jvm/internal/markers/KMutableMap;> StringMap { + public @org.jetbrains.annotations.NotNull <()Ljava/util/Collection;> method getValues(): java.util.Collection + public final <()Ljava/util/Collection;> method values(): java.util.Collection + public @org.jetbrains.annotations.NotNull <()Ljava/util/Set;> method getKeys(): java.util.Set + public final <()Ljava/util/Set;> method keySet(): java.util.Set + public final <()Ljava/util/Set;>;> method entrySet(): java.util.Set + public @org.jetbrains.annotations.NotNull <()Ljava/util/Set;>;> method getEntries(): java.util.Set + public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method get(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object + public final <(Ljava/lang/Object;)TV;> method get(p0: java.lang.Object): java.lang.Object + public @org.jetbrains.annotations.Nullable <(Ljava/lang/Object;)TV;> method remove(@org.jetbrains.annotations.NotNull p0: java.lang.String): java.lang.Object + public final <(Ljava/lang/Object;)TV;> method remove(p0: java.lang.Object): java.lang.Object + public @org.jetbrains.annotations.Nullable <(Ljava/lang/String;TV;)TV;> method put(@org.jetbrains.annotations.NotNull p0: java.lang.String, p1: java.lang.Object): java.lang.Object + public <(Ljava/util/Map<+Ljava/lang/String;+TV;>;)V> method putAll(@org.jetbrains.annotations.NotNull p0: java.util.Map): void + public method (): void + public method clear(): void + public method containsKey(@org.jetbrains.annotations.NotNull p0: java.lang.String): boolean + public final method containsKey(p0: java.lang.Object): boolean + public method containsValue(p0: java.lang.Object): boolean + public method getSize(): int + public method isEmpty(): boolean + public synthetic method put(p0: java.lang.Object, p1: java.lang.Object): java.lang.Object + public final method size(): int + private synthetic final field $$delegate_0: java.util.HashMap +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java index 33b0c55eb30..ec3efbc3873 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java @@ -242,10 +242,31 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest { doTest(fileName); } - @TestMetadata("signatureForSpecialBridge.kt") - public void testSignatureForSpecialBridge() throws Exception { - String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/specialBridges/signatureForSpecialBridge.kt"); - doTest(fileName); + @TestMetadata("compiler/testData/codegen/bytecodeListing/specialBridges/signatures") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class Signatures extends AbstractBytecodeListingTest { + public void testAllFilesPresentInSignatures() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/bytecodeListing/specialBridges/signatures"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("genericClass.kt") + public void testGenericClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/genericClass.kt"); + doTest(fileName); + } + + @TestMetadata("nonGenericClass.kt") + public void testNonGenericClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/nonGenericClass.kt"); + doTest(fileName); + } + + @TestMetadata("partiallySpecializedClass.kt") + public void testPartiallySpecializedClass() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/specialBridges/signatures/partiallySpecializedClass.kt"); + doTest(fileName); + } } } }