Fix issue on dumping override of suspend function
The meaning of `setDropOriginalInContainingParts()` call is that it makes copyBuilder forget the original parts, in particular the valueParameter.original.containingDeclaration does not reference original descriptor no more Otherwise the following exception is happening: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.RangeCheck(ArrayList.java:547) at java.util.ArrayList.get(ArrayList.java:322) at org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl.getOverriddenDescriptors(ValueParameterDescriptorImpl.kt:119) at java.util.ArrayList.RangeCheck(ArrayList.java:547) at java.util.ArrayList.get(ArrayList.java:322) at org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl.getOverriddenDescriptors(ValueParameterDescriptorImpl.kt:119) at org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt$hasDefaultValue$1.getNeighbors(DescriptorUtils.kt:192) at org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt$hasDefaultValue$1.getNeighbors(DescriptorUtils.kt) at org.jetbrains.kotlin.utils.DFS.doDfs(DFS.java:98) at org.jetbrains.kotlin.utils.DFS.doDfs(DFS.java:99) at org.jetbrains.kotlin.utils.DFS.dfs(DFS.java:27) at org.jetbrains.kotlin.utils.DFS.dfs(DFS.java:37) at org.jetbrains.kotlin.utils.DFS.ifAny(DFS.java:47) at org.jetbrains.kotlin.resolve.descriptorUtil.DescriptorUtilsKt.hasDefaultValue(DescriptorUtils.kt:189) at org.jetbrains.kotlin.renderer.DescriptorRendererImpl.renderValueParameter(DescriptorRendererImpl.kt:803) at org.jetbrains.kotlin.renderer.DescriptorRendererImpl.renderValueParameters(DescriptorRendererImpl.kt:767) at org.jetbrains.kotlin.renderer.DescriptorRendererImpl.renderFunction(DescriptorRendererImpl.kt:683) at org.jetbrains.kotlin.renderer.DescriptorRendererImpl.access$renderFunction(DescriptorRendererImpl.kt:42) at org.jetbrains.kotlin.renderer.DescriptorRendererImpl$RenderDeclarationDescriptorVisitor.visitFunctionDescriptor(DescriptorRendererImpl.kt:1039) at org.jetbrains.kotlin.renderer.DescriptorRendererImpl$RenderDeclarationDescriptorVisitor.visitFunctionDescriptor(DescriptorRendererImpl.kt:1002) at org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl.accept(FunctionDescriptorImpl.java:760)
This commit is contained in:
@@ -125,6 +125,7 @@ fun <D : FunctionDescriptor> createJvmSuspendFunctionView(function: D): D {
|
||||
)
|
||||
|
||||
return function.createCustomCopy {
|
||||
setDropOriginalInContainingParts()
|
||||
setPreserveSourceElement()
|
||||
setReturnType(function.builtIns.nullableAnyType)
|
||||
setValueParameters(it.valueParameters + continuationParameter)
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
[
|
||||
{
|
||||
"declaration": "final class B : A defined in root package",
|
||||
"visibility": "public",
|
||||
"class": "B",
|
||||
"members": [
|
||||
{"visibility": "public", "declaration": "open suspend fun foo(`$continuation`: kotlin.coroutines.Continuation<kotlin.Boolean>): kotlin.Any?", "name": "foo", "desc": "(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;"},
|
||||
{"visibility": "public", "declaration": "constructor B()", "name": "<init>", "desc": "()V"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"declaration": "final class D : C, A defined in root package",
|
||||
"visibility": "public",
|
||||
"class": "D",
|
||||
"members": [
|
||||
{"visibility": "public", "declaration": "constructor D()", "name": "<init>", "desc": "()V"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"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(`$continuation`: kotlin.coroutines.Continuation<kotlin.Boolean>): kotlin.Any?", "name": "foo", "desc": "(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;"}
|
||||
]
|
||||
},
|
||||
{
|
||||
"declaration": "open class C defined in root package",
|
||||
"visibility": "public",
|
||||
"class": "C",
|
||||
"members": [
|
||||
{"visibility": "public", "declaration": "final suspend fun foo(`$continuation`: kotlin.coroutines.Continuation<kotlin.Boolean>): kotlin.Any?", "name": "foo", "desc": "(Lkotlin/coroutines/Continuation;)Ljava/lang/Object;"},
|
||||
{"visibility": "public", "declaration": "constructor C()", "name": "<init>", "desc": "()V"}
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,13 @@
|
||||
interface A {
|
||||
suspend fun foo(): Boolean
|
||||
}
|
||||
|
||||
class B : A {
|
||||
suspend override fun foo(): Boolean = true
|
||||
}
|
||||
|
||||
open class C {
|
||||
suspend fun foo(): Boolean = true
|
||||
}
|
||||
|
||||
class D : C(), A
|
||||
@@ -72,6 +72,12 @@ public class DumpDeclarationsTestGenerated extends AbstractDumpDeclarationsTest
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("suspendOverride.kt")
|
||||
public void testSuspendOverride() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/dumpDeclarations/suspendOverride.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("topLevelMembers.kt")
|
||||
public void testTopLevelMembers() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/dumpDeclarations/topLevelMembers.kt");
|
||||
|
||||
+5
-3
@@ -625,7 +625,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
|
||||
}
|
||||
|
||||
List<ValueParameterDescriptor> substitutedValueParameters = getSubstitutedValueParameters(
|
||||
substitutedDescriptor, configuration.newValueParameterDescriptors, substitutor, configuration.dropOriginalInContainingParts
|
||||
substitutedDescriptor, configuration.newValueParameterDescriptors, substitutor, configuration.dropOriginalInContainingParts,
|
||||
configuration.preserveSourceElement
|
||||
);
|
||||
if (substitutedValueParameters == null) {
|
||||
return null;
|
||||
@@ -765,7 +766,8 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
|
||||
FunctionDescriptor substitutedDescriptor,
|
||||
@NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters,
|
||||
@NotNull TypeSubstitutor substitutor,
|
||||
boolean dropOriginal
|
||||
boolean dropOriginal,
|
||||
boolean preserveSourceElement
|
||||
) {
|
||||
List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>(unsubstitutedValueParameters.size());
|
||||
for (ValueParameterDescriptor unsubstitutedValueParameter : unsubstitutedValueParameters) {
|
||||
@@ -787,7 +789,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
|
||||
unsubstitutedValueParameter.isCrossinline(),
|
||||
unsubstitutedValueParameter.isNoinline(),
|
||||
substituteVarargElementType,
|
||||
SourceElement.NO_SOURCE
|
||||
preserveSourceElement ? unsubstitutedValueParameter.getSource() : SourceElement.NO_SOURCE
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
+2
-1
@@ -293,7 +293,8 @@ public class PropertyDescriptorImpl extends VariableDescriptorWithInitializerImp
|
||||
);
|
||||
if (newSetter != null) {
|
||||
List<ValueParameterDescriptor> substitutedValueParameters = FunctionDescriptorImpl.getSubstitutedValueParameters(
|
||||
newSetter, setter.getValueParameters(), substitutor, /* dropOriginal = */ false
|
||||
newSetter, setter.getValueParameters(), substitutor, /* dropOriginal = */ false,
|
||||
false
|
||||
);
|
||||
if (substitutedValueParameters == null) {
|
||||
// The setter is projected out, e.g. in this case:
|
||||
|
||||
+1
-1
@@ -119,7 +119,7 @@ class TypeAliasConstructorDescriptorImpl private constructor(
|
||||
TypeAliasConstructorDescriptorImpl(typeAliasDescriptor, constructor, null, constructor.annotations,
|
||||
constructor.kind, typeAliasDescriptor.source)
|
||||
|
||||
val valueParameters = FunctionDescriptorImpl.getSubstitutedValueParameters(typeAliasConstructor, constructor.valueParameters, substitutor, false)
|
||||
val valueParameters = FunctionDescriptorImpl.getSubstitutedValueParameters(typeAliasConstructor, constructor.valueParameters, substitutor, false, false)
|
||||
?: return null
|
||||
|
||||
val returnType = substitutor.substitute(constructor.returnType, Variance.INVARIANT)
|
||||
|
||||
Reference in New Issue
Block a user