Render unwrapped suspend function in backend
Hierarchy of specially wrapped suspend function may have inconsistent overridden descriptors: some of them may be wrapped, some unwrapped. To mitigate this problem, currently it's proposed to render only unwrapped functions, which are always have stable overridden descriptors #KT-23809 Fixed
This commit is contained in:
+5
-1
@@ -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<out String>?): 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)
|
||||
}
|
||||
|
||||
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
[
|
||||
{
|
||||
"declaration": "abstract class C<V> : B<V> 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<V>()", "name": "<init>", "desc": "()V"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"declaration": "interface B<K> : A<K> defined in root package",
|
||||
"visibility": "public",
|
||||
"class": "B$DefaultImpls",
|
||||
"members": [
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"declaration": "interface B<K> : A<K> defined in root package",
|
||||
"visibility": "public",
|
||||
"class": "B",
|
||||
"members": [
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"declaration": "interface A<T> defined in root package",
|
||||
"visibility": "public",
|
||||
"class": "A$DefaultImpls",
|
||||
"members": [
|
||||
|
||||
]
|
||||
},
|
||||
{
|
||||
"declaration": "interface A<T> 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;"}
|
||||
]
|
||||
}
|
||||
]
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
interface A<T> {
|
||||
suspend fun foo(): T
|
||||
}
|
||||
|
||||
interface B<K> : A<K>
|
||||
|
||||
abstract class C<V> : B<V> {
|
||||
override suspend fun foo(): V = TODO()
|
||||
}
|
||||
@@ -4,10 +4,10 @@
|
||||
"visibility": "local",
|
||||
"class": "SuspendLambdaKt$invokeCoroutineBuilder$1",
|
||||
"members": [
|
||||
{"visibility": "local", "declaration": "final fun kotlin.Any.<anonymous>(continuation: kotlin.coroutines.experimental.Continuation<kotlin.Unit>): kotlin.Any?", "name": "invoke", "desc": "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"},
|
||||
{"visibility": "local", "declaration": "final suspend fun kotlin.Any.<anonymous>(): kotlin.Unit", "name": "invoke", "desc": "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"},
|
||||
{"visibility": "local", "declaration": "<this>", "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.<anonymous>(continuation: kotlin.coroutines.experimental.Continuation<kotlin.Unit>): kotlin.Any?", "name": "<init>", "desc": "(Lkotlin/coroutines/experimental/Continuation;)V"},
|
||||
{"visibility": "local", "declaration": "final suspend fun kotlin.Any.<anonymous>(): kotlin.Unit", "name": "<init>", "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;"}
|
||||
]
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"visibility": "public",
|
||||
"class": "B",
|
||||
"members": [
|
||||
{"visibility": "public", "declaration": "open suspend fun foo(continuation: kotlin.coroutines.experimental.Continuation<kotlin.Boolean>): 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": "<init>", "desc": "()V"}
|
||||
]
|
||||
},
|
||||
@@ -29,7 +29,7 @@
|
||||
"visibility": "public",
|
||||
"class": "A",
|
||||
"members": [
|
||||
{"visibility": "public", "declaration": "abstract suspend fun foo(continuation: kotlin.coroutines.experimental.Continuation<kotlin.Boolean>): 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.Boolean>): 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": "<init>", "desc": "()V"}
|
||||
]
|
||||
}
|
||||
|
||||
+6
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user