From ef78d4b95a61968182fed324a7d19ac384c07f9d Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Thu, 26 Oct 2023 15:10:09 +0200 Subject: [PATCH] [FIR] Fix deserialization of generic context receivers We need to pass the local deserialization context so that generic type parameters can be referenced. #KT-62607 Fixed --- .../fir/deserialization/FirMemberDeserializer.kt | 10 +++++----- ...lFirICLightTreeJvmCompilerRunnerTestGenerated.java | 5 +++++ ...talFirLightTreeJvmCompilerRunnerTestGenerated.java | 5 +++++ ...ncrementalK1JsKlibCompilerRunnerTestGenerated.java | 5 +++++ ...CompilerWithScopeExpansionRunnerTestGenerated.java | 5 +++++ .../IncrementalK1JvmCompilerRunnerTestGenerated.java | 5 +++++ ...CompilerWithScopeExpansionRunnerTestGenerated.java | 5 +++++ .../IncrementalK2JvmCompilerRunnerTestGenerated.java | 5 +++++ .../jps/build/IncrementalK1JvmJpsTestGenerated.java | 5 +++++ ...ncrementalK2FirICLightTreeJvmJpsTestGenerated.java | 5 +++++ .../jps/build/IncrementalK2JvmJpsTestGenerated.java | 5 +++++ .../IncrementalK2LightTreeJvmJpsTestGenerated.java | 5 +++++ .../pureKotlin/genericContextReceiver/args.txt | 1 + .../pureKotlin/genericContextReceiver/bar.kt | 8 ++++++++ .../pureKotlin/genericContextReceiver/bar.kt.touch | 0 .../pureKotlin/genericContextReceiver/build.log | 11 +++++++++++ .../pureKotlin/genericContextReceiver/foo.kt | 7 +++++++ 17 files changed, 87 insertions(+), 5 deletions(-) create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/args.txt create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/bar.kt create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/bar.kt.touch create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/build.log create mode 100644 jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/foo.kt diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt index 5c7532c0a01..87f94f7afbe 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/deserialization/FirMemberDeserializer.kt @@ -468,7 +468,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { else -> null } - proto.contextReceiverTypes(c.typeTable).mapTo(contextReceivers, ::loadContextReceiver) + proto.contextReceiverTypes(c.typeTable).mapTo(contextReceivers) { loadContextReceiver(it, local) } }.apply { initializer?.replaceConeTypeOrNull(returnTypeRef.type) this.versionRequirements = versionRequirements @@ -479,8 +479,8 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { } } - private fun loadContextReceiver(proto: ProtoBuf.Type): FirContextReceiver { - val typeRef = proto.toTypeRef(c) + private fun loadContextReceiver(proto: ProtoBuf.Type, context: FirDeserializationContext): FirContextReceiver { + val typeRef = proto.toTypeRef(context) return buildContextReceiver { val type = typeRef.coneType this.labelNameFromTypeRef = (type as? ConeLookupTagBasedType)?.lookupTag?.name @@ -489,7 +489,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { } internal fun createContextReceiversForClass(classProto: ProtoBuf.Class): List = - classProto.contextReceiverTypes(c.typeTable).map(::loadContextReceiver) + classProto.contextReceiverTypes(c.typeTable).map { loadContextReceiver(it, c) } fun loadFunction( proto: ProtoBuf.Function, @@ -559,7 +559,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) { deprecationsProvider = annotations.getDeprecationsProviderFromAnnotations(c.session, fromJava = false, versionRequirements) this.containerSource = c.containerSource - proto.contextReceiverTypes(c.typeTable).mapTo(contextReceivers, ::loadContextReceiver) + proto.contextReceiverTypes(c.typeTable).mapTo(contextReceivers) { loadContextReceiver(it, local) } }.apply { this.versionRequirements = versionRequirements setLazyPublishedVisibility(c.session) diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalFirICLightTreeJvmCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalFirICLightTreeJvmCompilerRunnerTestGenerated.java index c1a4f80213a..2878c544923 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalFirICLightTreeJvmCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalFirICLightTreeJvmCompilerRunnerTestGenerated.java @@ -247,6 +247,11 @@ public class IncrementalFirICLightTreeJvmCompilerRunnerTestGenerated extends Abs runTest("jps/jps-plugin/testData/incremental/pureKotlin/functionReferencingClass/"); } + @TestMetadata("genericContextReceiver") + public void testGenericContextReceiver() throws Exception { + runTest("jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/"); + } + @TestMetadata("independentClasses") public void testIndependentClasses() throws Exception { runTest("jps/jps-plugin/testData/incremental/pureKotlin/independentClasses/"); diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalFirLightTreeJvmCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalFirLightTreeJvmCompilerRunnerTestGenerated.java index 34ece9d8cf4..c8e2ac673db 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalFirLightTreeJvmCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalFirLightTreeJvmCompilerRunnerTestGenerated.java @@ -247,6 +247,11 @@ public class IncrementalFirLightTreeJvmCompilerRunnerTestGenerated extends Abstr runTest("jps/jps-plugin/testData/incremental/pureKotlin/functionReferencingClass/"); } + @TestMetadata("genericContextReceiver") + public void testGenericContextReceiver() throws Exception { + runTest("jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/"); + } + @TestMetadata("independentClasses") public void testIndependentClasses() throws Exception { runTest("jps/jps-plugin/testData/incremental/pureKotlin/independentClasses/"); diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK1JsKlibCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK1JsKlibCompilerRunnerTestGenerated.java index 96b615abc1b..c896835422c 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK1JsKlibCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK1JsKlibCompilerRunnerTestGenerated.java @@ -256,6 +256,11 @@ public class IncrementalK1JsKlibCompilerRunnerTestGenerated extends AbstractIncr runTest("jps/jps-plugin/testData/incremental/pureKotlin/functionReferencingClass/"); } + @TestMetadata("genericContextReceiver") + public void testGenericContextReceiver() throws Exception { + runTest("jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/"); + } + @TestMetadata("independentClasses") public void testIndependentClasses() throws Exception { runTest("jps/jps-plugin/testData/incremental/pureKotlin/independentClasses/"); diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK1JsKlibCompilerWithScopeExpansionRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK1JsKlibCompilerWithScopeExpansionRunnerTestGenerated.java index b50074cd5e2..772725e2d4e 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK1JsKlibCompilerWithScopeExpansionRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK1JsKlibCompilerWithScopeExpansionRunnerTestGenerated.java @@ -256,6 +256,11 @@ public class IncrementalK1JsKlibCompilerWithScopeExpansionRunnerTestGenerated ex runTest("jps/jps-plugin/testData/incremental/pureKotlin/functionReferencingClass/"); } + @TestMetadata("genericContextReceiver") + public void testGenericContextReceiver() throws Exception { + runTest("jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/"); + } + @TestMetadata("independentClasses") public void testIndependentClasses() throws Exception { runTest("jps/jps-plugin/testData/incremental/pureKotlin/independentClasses/"); diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK1JvmCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK1JvmCompilerRunnerTestGenerated.java index 0fd6b85a556..da0d2afd8ea 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK1JvmCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK1JvmCompilerRunnerTestGenerated.java @@ -257,6 +257,11 @@ public class IncrementalK1JvmCompilerRunnerTestGenerated extends AbstractIncreme runTest("jps/jps-plugin/testData/incremental/pureKotlin/functionReferencingClass/"); } + @TestMetadata("genericContextReceiver") + public void testGenericContextReceiver() throws Exception { + runTest("jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/"); + } + @TestMetadata("independentClasses") public void testIndependentClasses() throws Exception { runTest("jps/jps-plugin/testData/incremental/pureKotlin/independentClasses/"); diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK2JsKlibCompilerWithScopeExpansionRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK2JsKlibCompilerWithScopeExpansionRunnerTestGenerated.java index 6896e5523e4..a28e6eab1c0 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK2JsKlibCompilerWithScopeExpansionRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK2JsKlibCompilerWithScopeExpansionRunnerTestGenerated.java @@ -241,6 +241,11 @@ public class IncrementalK2JsKlibCompilerWithScopeExpansionRunnerTestGenerated ex runTest("jps/jps-plugin/testData/incremental/pureKotlin/functionReferencingClass/"); } + @TestMetadata("genericContextReceiver") + public void testGenericContextReceiver() throws Exception { + runTest("jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/"); + } + @TestMetadata("independentClasses") public void testIndependentClasses() throws Exception { runTest("jps/jps-plugin/testData/incremental/pureKotlin/independentClasses/"); diff --git a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK2JvmCompilerRunnerTestGenerated.java b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK2JvmCompilerRunnerTestGenerated.java index 5a7ac8f9430..aac8440a1b5 100644 --- a/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK2JvmCompilerRunnerTestGenerated.java +++ b/compiler/incremental-compilation-impl/test/org/jetbrains/kotlin/incremental/IncrementalK2JvmCompilerRunnerTestGenerated.java @@ -247,6 +247,11 @@ public class IncrementalK2JvmCompilerRunnerTestGenerated extends AbstractIncreme runTest("jps/jps-plugin/testData/incremental/pureKotlin/functionReferencingClass/"); } + @TestMetadata("genericContextReceiver") + public void testGenericContextReceiver() throws Exception { + runTest("jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/"); + } + @TestMetadata("independentClasses") public void testIndependentClasses() throws Exception { runTest("jps/jps-plugin/testData/incremental/pureKotlin/independentClasses/"); diff --git a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalK1JvmJpsTestGenerated.java b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalK1JvmJpsTestGenerated.java index 68153fbfca6..41e8a2bf8f6 100644 --- a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalK1JvmJpsTestGenerated.java +++ b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalK1JvmJpsTestGenerated.java @@ -926,6 +926,11 @@ public class IncrementalK1JvmJpsTestGenerated extends AbstractIncrementalK1JvmJp runTest("jps/jps-plugin/testData/incremental/pureKotlin/functionReferencingClass/"); } + @TestMetadata("genericContextReceiver") + public void testGenericContextReceiver() throws Exception { + runTest("jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/"); + } + @TestMetadata("independentClasses") public void testIndependentClasses() throws Exception { runTest("jps/jps-plugin/testData/incremental/pureKotlin/independentClasses/"); diff --git a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalK2FirICLightTreeJvmJpsTestGenerated.java b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalK2FirICLightTreeJvmJpsTestGenerated.java index 953c207cc82..4b8cfc15fcf 100644 --- a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalK2FirICLightTreeJvmJpsTestGenerated.java +++ b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalK2FirICLightTreeJvmJpsTestGenerated.java @@ -252,6 +252,11 @@ public class IncrementalK2FirICLightTreeJvmJpsTestGenerated extends AbstractIncr runTest("jps/jps-plugin/testData/incremental/pureKotlin/functionReferencingClass/"); } + @TestMetadata("genericContextReceiver") + public void testGenericContextReceiver() throws Exception { + runTest("jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/"); + } + @TestMetadata("independentClasses") public void testIndependentClasses() throws Exception { runTest("jps/jps-plugin/testData/incremental/pureKotlin/independentClasses/"); diff --git a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalK2JvmJpsTestGenerated.java b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalK2JvmJpsTestGenerated.java index 142c488f210..0c06ee5a802 100644 --- a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalK2JvmJpsTestGenerated.java +++ b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalK2JvmJpsTestGenerated.java @@ -252,6 +252,11 @@ public class IncrementalK2JvmJpsTestGenerated extends AbstractIncrementalK2JvmJp runTest("jps/jps-plugin/testData/incremental/pureKotlin/functionReferencingClass/"); } + @TestMetadata("genericContextReceiver") + public void testGenericContextReceiver() throws Exception { + runTest("jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/"); + } + @TestMetadata("independentClasses") public void testIndependentClasses() throws Exception { runTest("jps/jps-plugin/testData/incremental/pureKotlin/independentClasses/"); diff --git a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalK2LightTreeJvmJpsTestGenerated.java b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalK2LightTreeJvmJpsTestGenerated.java index 224b7dc4bcf..c733fc91f3d 100644 --- a/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalK2LightTreeJvmJpsTestGenerated.java +++ b/jps/jps-plugin/jps-tests/test/org/jetbrains/kotlin/jps/build/IncrementalK2LightTreeJvmJpsTestGenerated.java @@ -252,6 +252,11 @@ public class IncrementalK2LightTreeJvmJpsTestGenerated extends AbstractIncrement runTest("jps/jps-plugin/testData/incremental/pureKotlin/functionReferencingClass/"); } + @TestMetadata("genericContextReceiver") + public void testGenericContextReceiver() throws Exception { + runTest("jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/"); + } + @TestMetadata("independentClasses") public void testIndependentClasses() throws Exception { runTest("jps/jps-plugin/testData/incremental/pureKotlin/independentClasses/"); diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/args.txt b/jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/args.txt new file mode 100644 index 00000000000..2de8c64d4b4 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/args.txt @@ -0,0 +1 @@ +-XXLanguage:+ContextReceivers diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/bar.kt b/jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/bar.kt new file mode 100644 index 00000000000..f4df1e68f8d --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/bar.kt @@ -0,0 +1,8 @@ +package test + +fun test() { + with("") { + foo() + foo + } +} \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/bar.kt.touch b/jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/bar.kt.touch new file mode 100644 index 00000000000..e69de29bb2d diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/build.log b/jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/build.log new file mode 100644 index 00000000000..bb16ea78598 --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/build.log @@ -0,0 +1,11 @@ +================ Step #1 ================= + +Cleaning output files: + out/production/module/META-INF/module.kotlin_module + out/production/module/test/BarKt.class +End of files +Compiling files: + src/bar.kt +End of files +Exit code: OK +------------------------------------------ \ No newline at end of file diff --git a/jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/foo.kt b/jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/foo.kt new file mode 100644 index 00000000000..9f6dcfde72f --- /dev/null +++ b/jps/jps-plugin/testData/incremental/pureKotlin/genericContextReceiver/foo.kt @@ -0,0 +1,7 @@ +package test + +context(T) +fun foo() {} + +context(T) +val T.foo get() = 1 \ No newline at end of file