diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/SignatureDumpingBuilderFactory.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/SignatureDumpingBuilderFactory.kt index 12929772fcf..ab8eb2c51db 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/SignatureDumpingBuilderFactory.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/SignatureDumpingBuilderFactory.kt @@ -30,6 +30,8 @@ import org.jetbrains.kotlin.resolve.jvm.diagnostics.MemberKind import org.jetbrains.kotlin.resolve.jvm.diagnostics.RawSignature import org.jetbrains.org.objectweb.asm.FieldVisitor import org.jetbrains.org.objectweb.asm.MethodVisitor +import org.jetbrains.kotlin.codegen.coroutines.unwrapInitialDescriptorForSuspendFunction +import org.jetbrains.kotlin.descriptors.CallableDescriptor import java.io.BufferedWriter import java.io.File @@ -82,7 +84,9 @@ class SignatureDumpingBuilderFactory( } override fun newMethod(origin: JvmDeclarationOrigin, access: Int, name: String, desc: String, signature: String?, exceptions: Array?): MethodVisitor { - signatures += RawSignature(name, desc, MemberKind.METHOD) to origin.descriptor + signatures += RawSignature(name, desc, MemberKind.METHOD) to origin.descriptor?.let { + if (it is CallableDescriptor) it.unwrapInitialDescriptorForSuspendFunction() else it + } return super.newMethod(origin, access, name, desc, signature, exceptions) } diff --git a/compiler/testData/codegen/dumpDeclarations/intermediateAbstractSuspendFunction.json b/compiler/testData/codegen/dumpDeclarations/intermediateAbstractSuspendFunction.json new file mode 100644 index 00000000000..3f158182dee --- /dev/null +++ b/compiler/testData/codegen/dumpDeclarations/intermediateAbstractSuspendFunction.json @@ -0,0 +1,44 @@ +[ + { + "declaration": "abstract class C : B defined in root package", + "visibility": "public", + "class": "C", + "members": [ + {"visibility": "public", "declaration": "open suspend fun foo(): V", "name": "foo", "desc": "(Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;"}, + {"visibility": "public", "declaration": "open suspend fun foo(): V", "name": "foo$suspendImpl", "desc": "(LC;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;"}, + {"visibility": "public", "declaration": "constructor C()", "name": "", "desc": "()V"} + ] + }, + { + "declaration": "interface B : A defined in root package", + "visibility": "public", + "class": "B$DefaultImpls", + "members": [ + + ] + }, + { + "declaration": "interface B : A defined in root package", + "visibility": "public", + "class": "B", + "members": [ + + ] + }, + { + "declaration": "interface A defined in root package", + "visibility": "public", + "class": "A$DefaultImpls", + "members": [ + + ] + }, + { + "declaration": "interface A defined in root package", + "visibility": "public", + "class": "A", + "members": [ + {"visibility": "public", "declaration": "abstract suspend fun foo(): T", "name": "foo", "desc": "(Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;"} + ] + } +] diff --git a/compiler/testData/codegen/dumpDeclarations/intermediateAbstractSuspendFunction.kt b/compiler/testData/codegen/dumpDeclarations/intermediateAbstractSuspendFunction.kt new file mode 100644 index 00000000000..5175afc62ee --- /dev/null +++ b/compiler/testData/codegen/dumpDeclarations/intermediateAbstractSuspendFunction.kt @@ -0,0 +1,9 @@ +interface A { + suspend fun foo(): T +} + +interface B : A + +abstract class C : B { + override suspend fun foo(): V = TODO() +} diff --git a/compiler/testData/codegen/dumpDeclarations/suspendLambda.json b/compiler/testData/codegen/dumpDeclarations/suspendLambda.json index ba114b0c326..cec1eb53995 100644 --- a/compiler/testData/codegen/dumpDeclarations/suspendLambda.json +++ b/compiler/testData/codegen/dumpDeclarations/suspendLambda.json @@ -4,10 +4,10 @@ "visibility": "local", "class": "SuspendLambdaKt$invokeCoroutineBuilder$1", "members": [ - {"visibility": "local", "declaration": "final fun kotlin.Any.(continuation: kotlin.coroutines.experimental.Continuation): kotlin.Any?", "name": "invoke", "desc": "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"}, + {"visibility": "local", "declaration": "final suspend fun kotlin.Any.(): kotlin.Unit", "name": "invoke", "desc": "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"}, {"visibility": "local", "declaration": "", "name": "p$", "desc": "Ljava/lang/Object;"}, {"name": "doResume", "desc": "(Ljava/lang/Object;Ljava/lang/Throwable;)Ljava/lang/Object;"}, - {"visibility": "local", "declaration": "final fun kotlin.Any.(continuation: kotlin.coroutines.experimental.Continuation): kotlin.Any?", "name": "", "desc": "(Lkotlin/coroutines/experimental/Continuation;)V"}, + {"visibility": "local", "declaration": "final suspend fun kotlin.Any.(): kotlin.Unit", "name": "", "desc": "(Lkotlin/coroutines/experimental/Continuation;)V"}, {"name": "create", "desc": "(Ljava/lang/Object;Lkotlin/coroutines/experimental/Continuation;)Lkotlin/coroutines/experimental/Continuation;"}, {"name": "invoke", "desc": "(Ljava/lang/Object;Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;"} ] diff --git a/compiler/testData/codegen/dumpDeclarations/suspendOverride.json b/compiler/testData/codegen/dumpDeclarations/suspendOverride.json index d652b1d1022..fdf61e84d76 100644 --- a/compiler/testData/codegen/dumpDeclarations/suspendOverride.json +++ b/compiler/testData/codegen/dumpDeclarations/suspendOverride.json @@ -4,7 +4,7 @@ "visibility": "public", "class": "B", "members": [ - {"visibility": "public", "declaration": "open suspend fun foo(continuation: kotlin.coroutines.experimental.Continuation): kotlin.Any?", "name": "foo", "desc": "(Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;"}, + {"visibility": "public", "declaration": "open suspend fun foo(): kotlin.Boolean", "name": "foo", "desc": "(Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;"}, {"visibility": "public", "declaration": "constructor B()", "name": "", "desc": "()V"} ] }, @@ -29,7 +29,7 @@ "visibility": "public", "class": "A", "members": [ - {"visibility": "public", "declaration": "abstract suspend fun foo(continuation: kotlin.coroutines.experimental.Continuation): kotlin.Any?", "name": "foo", "desc": "(Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;"} + {"visibility": "public", "declaration": "abstract suspend fun foo(): kotlin.Boolean", "name": "foo", "desc": "(Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;"} ] }, { @@ -37,7 +37,7 @@ "visibility": "public", "class": "C", "members": [ - {"visibility": "public", "declaration": "final suspend fun foo(continuation: kotlin.coroutines.experimental.Continuation): kotlin.Any?", "name": "foo", "desc": "(Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;"}, + {"visibility": "public", "declaration": "final suspend fun foo(): kotlin.Boolean", "name": "foo", "desc": "(Lkotlin/coroutines/experimental/Continuation;)Ljava/lang/Object;"}, {"visibility": "public", "declaration": "constructor C()", "name": "", "desc": "()V"} ] } diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/DumpDeclarationsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/DumpDeclarationsTestGenerated.java index 58dcf480f0e..ba7ded4ff7d 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/DumpDeclarationsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/DumpDeclarationsTestGenerated.java @@ -49,6 +49,12 @@ public class DumpDeclarationsTestGenerated extends AbstractDumpDeclarationsTest doTest(fileName); } + @TestMetadata("intermediateAbstractSuspendFunction.kt") + public void testIntermediateAbstractSuspendFunction() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/dumpDeclarations/intermediateAbstractSuspendFunction.kt"); + doTest(fileName); + } + @TestMetadata("localClasses.kt") public void testLocalClasses() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/dumpDeclarations/localClasses.kt");