diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt index 9bfbf413b2b..b0dc548883d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/coroutines/CoroutineCodegen.kt @@ -84,11 +84,17 @@ class CoroutineCodegen( val resumeFunctionDescriptor = createSynthesizedImplementationByName( - "resume", interfaceSupertype = continuationSuperType, implementationClass = classDescriptor) + "resume", + interfaceSupertype = continuationSuperType, + implementationClass = classDescriptor, + sourceElement = funDescriptor.source) val resumeWithExceptionFunctionDescriptor = createSynthesizedImplementationByName( - "resumeWithException", interfaceSupertype = continuationSuperType, implementationClass = classDescriptor) + "resumeWithException", + interfaceSupertype = continuationSuperType, + implementationClass = classDescriptor, + sourceElement = funDescriptor.source) // private fun resume(result, throwable) val combinedResumeFunctionDescriptor = @@ -96,6 +102,7 @@ class CoroutineCodegen( .setVisibility(Visibilities.PRIVATE) .setName(Name.identifier("doResume")) .setCopyOverrides(false) + .setPreserveSourceElement() .setValueParameters( listOf( resumeFunctionDescriptor.valueParameters[0].copy( @@ -120,10 +127,11 @@ class CoroutineCodegen( private fun createSynthesizedImplementationByName( name: String, interfaceSupertype: KotlinType, - implementationClass: ClassDescriptor + implementationClass: ClassDescriptor, + sourceElement: SourceElement ): SimpleFunctionDescriptor { val inSuperType = interfaceSupertype.memberScope.getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_BACKEND).single() - val result = inSuperType.newCopyBuilder().setOwner(implementationClass).setModality(Modality.FINAL).build()!! + val result = inSuperType.newCopyBuilder().setSource(sourceElement).setOwner(implementationClass).setModality(Modality.FINAL).build()!! result.setSingleOverridden(inSuperType) return result @@ -174,7 +182,7 @@ class CoroutineCodegen( } ?: return null val descriptorWithContinuationReturnType = - originalCoroutineLambdaDescriptor.newCopyBuilder().setReturnType(continuationSupertype).build()!! + originalCoroutineLambdaDescriptor.newCopyBuilder().setPreserveSourceElement().setReturnType(continuationSupertype).build()!! val state = expressionCodegen.state return CoroutineCodegen( diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt index d27d92b9e01..81b15d95c8e 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedMemberDescriptor.kt @@ -55,7 +55,7 @@ class DeserializedSimpleFunctionDescriptor( ) : DeserializedCallableMemberDescriptor, SimpleFunctionDescriptorImpl( containingDeclaration, original, annotations, name, kind, - source ?: org.jetbrains.kotlin.descriptors.SourceElement.NO_SOURCE) { + source ?: SourceElement.NO_SOURCE) { override fun createSubstitutedCopy( newOwner: DeclarationDescriptor, @@ -114,9 +114,10 @@ class DeserializedConstructorDescriptor( override val proto: ProtoBuf.Constructor, override val nameResolver: NameResolver, override val typeTable: TypeTable, - override val containerSource: SourceElement? + override val containerSource: SourceElement?, + source: SourceElement? = null ) : DeserializedCallableMemberDescriptor, - ConstructorDescriptorImpl(containingDeclaration, original, annotations, isPrimary, kind, SourceElement.NO_SOURCE) { + ConstructorDescriptorImpl(containingDeclaration, original, annotations, isPrimary, kind, source ?: SourceElement.NO_SOURCE) { override fun createSubstitutedCopy( newOwner: DeclarationDescriptor, @@ -128,7 +129,7 @@ class DeserializedConstructorDescriptor( ): DeserializedConstructorDescriptor { return DeserializedConstructorDescriptor( newOwner as ClassDescriptor, original as ConstructorDescriptor?, annotations, isPrimary, kind, - proto, nameResolver, typeTable, source + proto, nameResolver, typeTable, containerSource, source ) } diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java index c88cb6cc955..4daade82888 100644 --- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java +++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/ExperimentalIncrementalJpsTestGenerated.java @@ -1124,6 +1124,12 @@ public class ExperimentalIncrementalJpsTestGenerated extends AbstractExperimenta doTest(fileName); } + @TestMetadata("coroutine") + public void testCoroutine() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/inlineFunCallSite/coroutine/"); + doTest(fileName); + } + @TestMetadata("function") public void testFunction() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/inlineFunCallSite/function/"); diff --git a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java index 23aba42cd33..bcc80c08637 100644 --- a/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java +++ b/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalJpsTestGenerated.java @@ -1124,6 +1124,12 @@ public class IncrementalJpsTestGenerated extends AbstractIncrementalJpsTest { doTest(fileName); } + @TestMetadata("coroutine") + public void testCoroutine() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/inlineFunCallSite/coroutine/"); + doTest(fileName); + } + @TestMetadata("function") public void testFunction() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("jps-plugin/testData/incremental/inlineFunCallSite/function/"); diff --git a/jps-plugin/testData/incremental/inlineFunCallSite/coroutine/build.log b/jps-plugin/testData/incremental/inlineFunCallSite/coroutine/build.log new file mode 100644 index 00000000000..c8c6fee67d7 --- /dev/null +++ b/jps-plugin/testData/incremental/inlineFunCallSite/coroutine/build.log @@ -0,0 +1,24 @@ +================ Step #1 ================= + +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/inline/InlineKt.class +End of files +Compiling files: + src/inline.kt +End of files +Marked as dirty by Kotlin: + src/usage.kt +Exit code: ADDITIONAL_PASS_REQUIRED +------------------------------------------ +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/usage/Controller.class + out/production/module/usage/UsageKt$bar$1.class + out/production/module/usage/UsageKt.class +End of files +Compiling files: + src/usage.kt +End of files +Exit code: OK +------------------------------------------ diff --git a/jps-plugin/testData/incremental/inlineFunCallSite/coroutine/inline.kt b/jps-plugin/testData/incremental/inlineFunCallSite/coroutine/inline.kt new file mode 100644 index 00000000000..9c46b1383d6 --- /dev/null +++ b/jps-plugin/testData/incremental/inlineFunCallSite/coroutine/inline.kt @@ -0,0 +1,5 @@ +package inline + +inline fun f(x: Int): Int { + return x - 1 +} diff --git a/jps-plugin/testData/incremental/inlineFunCallSite/coroutine/inline.kt.new b/jps-plugin/testData/incremental/inlineFunCallSite/coroutine/inline.kt.new new file mode 100644 index 00000000000..7c3b34f3b5d --- /dev/null +++ b/jps-plugin/testData/incremental/inlineFunCallSite/coroutine/inline.kt.new @@ -0,0 +1,5 @@ +package inline + +inline fun f(x: Int): Int { + return x + 1 +} diff --git a/jps-plugin/testData/incremental/inlineFunCallSite/coroutine/usage.kt b/jps-plugin/testData/incremental/inlineFunCallSite/coroutine/usage.kt new file mode 100644 index 00000000000..ed10ee21c2d --- /dev/null +++ b/jps-plugin/testData/incremental/inlineFunCallSite/coroutine/usage.kt @@ -0,0 +1,18 @@ +package usage + +fun async(coroutine x: Controller.() -> Continuation) { + x(Controller()).resume(Unit) +} + +class Controller { + suspend fun step(param: Int, next: Continuation) { + next.resume(param + 1) + } +} + +fun bar() { + async { + val result = step(1) + inline.f(result) + } +}