From 08570a37b8819c45814fb31a91415216e0b6fd34 Mon Sep 17 00:00:00 2001 From: Anastasiya Shadrina Date: Thu, 18 Nov 2021 16:04:22 +0700 Subject: [PATCH] [PSI2IR] Check how contextual functional type works with IR --- .../FirBlackBoxCodegenTestGenerated.java | 12 +++++ .../runners/ir/Fir2IrTextTestGenerated.java | 12 +++++ .../contextualFunctionConversion.kt | 12 +++++ .../passingLambdaToContextualParam.kt | 11 ++++ .../contextualFunctionConversion.ir.txt | 24 +++++++++ .../contextualFunctionConversion.kt | 12 +++++ .../contextualFunctionConversion.kt.txt | 14 ++++++ .../passingLambdaToContextualParam.ir.txt | 50 +++++++++++++++++++ .../passingLambdaToContextualParam.kt | 11 ++++ .../passingLambdaToContextualParam.kt.txt | 23 +++++++++ .../IrBlackBoxCodegenTestGenerated.java | 12 +++++ .../test/runners/ir/IrTextTestGenerated.java | 12 +++++ .../NativeExtBlackBoxTestGenerated.java | 12 +++++ 13 files changed, 217 insertions(+) create mode 100644 compiler/testData/codegen/box/extensionFunctions/contextReceivers/contextualFunctionConversion.kt create mode 100644 compiler/testData/codegen/box/extensionFunctions/contextReceivers/passingLambdaToContextualParam.kt create mode 100644 compiler/testData/ir/irText/declarations/contextReceivers/contextualFunctionConversion.ir.txt create mode 100644 compiler/testData/ir/irText/declarations/contextReceivers/contextualFunctionConversion.kt create mode 100644 compiler/testData/ir/irText/declarations/contextReceivers/contextualFunctionConversion.kt.txt create mode 100644 compiler/testData/ir/irText/declarations/contextReceivers/passingLambdaToContextualParam.ir.txt create mode 100644 compiler/testData/ir/irText/declarations/contextReceivers/passingLambdaToContextualParam.kt create mode 100644 compiler/testData/ir/irText/declarations/contextReceivers/passingLambdaToContextualParam.kt.txt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 19c55892f1d..84f761632be 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -16199,6 +16199,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/contextAndExtensionSameName.kt"); } + @Test + @TestMetadata("contextualFunctionConversion.kt") + public void testContextualFunctionConversion() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/contextualFunctionConversion.kt"); + } + @Test @TestMetadata("delegatedPropertiesOperators.kt") public void testDelegatedPropertiesOperators() throws Exception { @@ -16235,6 +16241,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/overloading.kt"); } + @Test + @TestMetadata("passingLambdaToContextualParam.kt") + public void testPassingLambdaToContextualParam() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/passingLambdaToContextualParam.kt"); + } + @Test @TestMetadata("plusAssign.kt") public void testPlusAssign() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java index bbb7182c889..49c1fa73086 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java @@ -775,6 +775,12 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest { runTest("compiler/testData/ir/irText/declarations/contextReceivers/compoundAssignmentOperators.kt"); } + @Test + @TestMetadata("contextualFunctionConversion.kt") + public void testContextualFunctionConversion() throws Exception { + runTest("compiler/testData/ir/irText/declarations/contextReceivers/contextualFunctionConversion.kt"); + } + @Test @TestMetadata("contextualPrimaryConstructorWithParams.kt") public void testContextualPrimaryConstructorWithParams() throws Exception { @@ -835,6 +841,12 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest { runTest("compiler/testData/ir/irText/declarations/contextReceivers/overloading.kt"); } + @Test + @TestMetadata("passingLambdaToContextualParam.kt") + public void testPassingLambdaToContextualParam() throws Exception { + runTest("compiler/testData/ir/irText/declarations/contextReceivers/passingLambdaToContextualParam.kt"); + } + @Test @TestMetadata("plusMatrix.kt") public void testPlusMatrix() throws Exception { diff --git a/compiler/testData/codegen/box/extensionFunctions/contextReceivers/contextualFunctionConversion.kt b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/contextualFunctionConversion.kt new file mode 100644 index 00000000000..2ef5c9f8337 --- /dev/null +++ b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/contextualFunctionConversion.kt @@ -0,0 +1,12 @@ +// !LANGUAGE: +ContextReceivers +// TARGET_BACKEND: JVM_IR +// IGNORE_BACKEND_FIR: JVM_IR + +fun withContext(f: context(String) () -> String) = f("OK") + +fun callWithContext(f: (String) -> String) = withContext(f) + +fun box(): String { + return callWithContext { s -> s } +} + diff --git a/compiler/testData/codegen/box/extensionFunctions/contextReceivers/passingLambdaToContextualParam.kt b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/passingLambdaToContextualParam.kt new file mode 100644 index 00000000000..4a8fc45080b --- /dev/null +++ b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/passingLambdaToContextualParam.kt @@ -0,0 +1,11 @@ +// !LANGUAGE: +ContextReceivers +// TARGET_BACKEND: JVM_IR +// IGNORE_BACKEND_FIR: JVM_IR + +class C { + val result = "OK" +} + +fun contextual(f: context(C) () -> String) = f(C()) + +fun box(): String = contextual { result } \ No newline at end of file diff --git a/compiler/testData/ir/irText/declarations/contextReceivers/contextualFunctionConversion.ir.txt b/compiler/testData/ir/irText/declarations/contextReceivers/contextualFunctionConversion.ir.txt new file mode 100644 index 00000000000..44870c746ec --- /dev/null +++ b/compiler/testData/ir/irText/declarations/contextReceivers/contextualFunctionConversion.ir.txt @@ -0,0 +1,24 @@ +FILE fqName: fileName:/contextualFunctionConversion.kt + FUN name:withContext visibility:public modality:FINAL <> (f:@[ContextFunctionTypeParams(count = '1')] kotlin.Function1) returnType:kotlin.String + VALUE_PARAMETER name:f index:0 type:@[ContextFunctionTypeParams(count = '1')] kotlin.Function1 + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun withContext (f: @[ContextFunctionTypeParams(count = '1')] kotlin.Function1): kotlin.String declared in ' + CALL 'public abstract fun invoke (p1: P1 of kotlin.Function1): R of kotlin.Function1 [operator] declared in kotlin.Function1' type=kotlin.String origin=INVOKE + $this: GET_VAR 'f: @[ContextFunctionTypeParams(count = '1')] kotlin.Function1 declared in .withContext' type=@[ContextFunctionTypeParams(count = '1')] kotlin.Function1 origin=VARIABLE_AS_FUNCTION + p1: CONST String type=kotlin.String value="OK" + FUN name:callWithContext visibility:public modality:FINAL <> (f:kotlin.Function1) returnType:kotlin.String + VALUE_PARAMETER name:f index:0 type:kotlin.Function1 + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun callWithContext (f: kotlin.Function1): kotlin.String declared in ' + CALL 'public final fun withContext (f: @[ContextFunctionTypeParams(count = '1')] kotlin.Function1): kotlin.String declared in ' type=kotlin.String origin=null + f: GET_VAR 'f: kotlin.Function1 declared in .callWithContext' type=kotlin.Function1 origin=null + FUN name:box visibility:public modality:FINAL <> () returnType:kotlin.String + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in ' + CALL 'public final fun callWithContext (f: kotlin.Function1): kotlin.String declared in ' type=kotlin.String origin=null + f: FUN_EXPR type=kotlin.Function1 origin=LAMBDA + FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> (s:kotlin.String) returnType:kotlin.String + VALUE_PARAMETER name:s index:0 type:kotlin.String + BLOCK_BODY + RETURN type=kotlin.Nothing from='local final fun (s: kotlin.String): kotlin.String declared in .box' + GET_VAR 's: kotlin.String declared in .box.' type=kotlin.String origin=null diff --git a/compiler/testData/ir/irText/declarations/contextReceivers/contextualFunctionConversion.kt b/compiler/testData/ir/irText/declarations/contextReceivers/contextualFunctionConversion.kt new file mode 100644 index 00000000000..2ef5c9f8337 --- /dev/null +++ b/compiler/testData/ir/irText/declarations/contextReceivers/contextualFunctionConversion.kt @@ -0,0 +1,12 @@ +// !LANGUAGE: +ContextReceivers +// TARGET_BACKEND: JVM_IR +// IGNORE_BACKEND_FIR: JVM_IR + +fun withContext(f: context(String) () -> String) = f("OK") + +fun callWithContext(f: (String) -> String) = withContext(f) + +fun box(): String { + return callWithContext { s -> s } +} + diff --git a/compiler/testData/ir/irText/declarations/contextReceivers/contextualFunctionConversion.kt.txt b/compiler/testData/ir/irText/declarations/contextReceivers/contextualFunctionConversion.kt.txt new file mode 100644 index 00000000000..178bc5e4b51 --- /dev/null +++ b/compiler/testData/ir/irText/declarations/contextReceivers/contextualFunctionConversion.kt.txt @@ -0,0 +1,14 @@ +fun withContext(f: @ContextFunctionTypeParams(count = 1) Function1): String { + return f.invoke(p1 = "OK") +} + +fun callWithContext(f: Function1): String { + return withContext(f = f) +} + +fun box(): String { + return callWithContext(f = local fun (s: String): String { + return s + } +) +} diff --git a/compiler/testData/ir/irText/declarations/contextReceivers/passingLambdaToContextualParam.ir.txt b/compiler/testData/ir/irText/declarations/contextReceivers/passingLambdaToContextualParam.ir.txt new file mode 100644 index 00000000000..cf726e3140a --- /dev/null +++ b/compiler/testData/ir/irText/declarations/contextReceivers/passingLambdaToContextualParam.ir.txt @@ -0,0 +1,50 @@ +FILE fqName: fileName:/passingLambdaToContextualParam.kt + CLASS CLASS name:C modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.C + CONSTRUCTOR visibility:public <> () returnType:.C [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:C modality:FINAL visibility:public superTypes:[kotlin.Any]' + PROPERTY name:result visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:result type:kotlin.String visibility:private [final] + EXPRESSION_BODY + CONST String type=kotlin.String value="OK" + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:.C) returnType:kotlin.String + correspondingProperty: PROPERTY name:result visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:.C + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.String declared in .C' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:result type:kotlin.String visibility:private [final]' type=kotlin.String origin=null + receiver: GET_VAR ': .C declared in .C.' type=.C origin=null + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN name:contextual visibility:public modality:FINAL <> (f:@[ContextFunctionTypeParams(count = '1')] kotlin.Function1<.C, kotlin.String>) returnType:kotlin.String + VALUE_PARAMETER name:f index:0 type:@[ContextFunctionTypeParams(count = '1')] kotlin.Function1<.C, kotlin.String> + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun contextual (f: @[ContextFunctionTypeParams(count = '1')] kotlin.Function1<.C, kotlin.String>): kotlin.String declared in ' + CALL 'public abstract fun invoke (p1: P1 of kotlin.Function1): R of kotlin.Function1 [operator] declared in kotlin.Function1' type=kotlin.String origin=INVOKE + $this: GET_VAR 'f: @[ContextFunctionTypeParams(count = '1')] kotlin.Function1<.C, kotlin.String> declared in .contextual' type=@[ContextFunctionTypeParams(count = '1')] kotlin.Function1<.C, kotlin.String> origin=VARIABLE_AS_FUNCTION + p1: CONSTRUCTOR_CALL 'public constructor () [primary] declared in .C' type=.C origin=null + FUN name:box visibility:public modality:FINAL <> () returnType:kotlin.String + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in ' + CALL 'public final fun contextual (f: @[ContextFunctionTypeParams(count = '1')] kotlin.Function1<.C, kotlin.String>): kotlin.String declared in ' type=kotlin.String origin=null + f: FUN_EXPR type=@[ContextFunctionTypeParams(count = '1')] kotlin.Function1<.C, kotlin.String> origin=LAMBDA + FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> (:.C) returnType:kotlin.String + contextReceiverParametersCount: 1 + VALUE_PARAMETER name: index:0 type:.C + BLOCK_BODY + RETURN type=kotlin.Nothing from='local final fun (: .C): kotlin.String declared in .box' + CALL 'public final fun (): kotlin.String declared in .C' type=kotlin.String origin=GET_PROPERTY + $this: GET_VAR ': .C declared in .box.' type=.C origin=null diff --git a/compiler/testData/ir/irText/declarations/contextReceivers/passingLambdaToContextualParam.kt b/compiler/testData/ir/irText/declarations/contextReceivers/passingLambdaToContextualParam.kt new file mode 100644 index 00000000000..4a8fc45080b --- /dev/null +++ b/compiler/testData/ir/irText/declarations/contextReceivers/passingLambdaToContextualParam.kt @@ -0,0 +1,11 @@ +// !LANGUAGE: +ContextReceivers +// TARGET_BACKEND: JVM_IR +// IGNORE_BACKEND_FIR: JVM_IR + +class C { + val result = "OK" +} + +fun contextual(f: context(C) () -> String) = f(C()) + +fun box(): String = contextual { result } \ No newline at end of file diff --git a/compiler/testData/ir/irText/declarations/contextReceivers/passingLambdaToContextualParam.kt.txt b/compiler/testData/ir/irText/declarations/contextReceivers/passingLambdaToContextualParam.kt.txt new file mode 100644 index 00000000000..0f2a9be31dc --- /dev/null +++ b/compiler/testData/ir/irText/declarations/contextReceivers/passingLambdaToContextualParam.kt.txt @@ -0,0 +1,23 @@ +class C { + constructor() /* primary */ { + super/*Any*/() + /* () */ + + } + + val result: String + field = "OK" + get + +} + +fun contextual(f: @ContextFunctionTypeParams(count = 1) Function1): String { + return f.invoke(p1 = C()) +} + +fun box(): String { + return contextual(f = local fun (: C): String { + return .() + } +) +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index b3d4b696ef9..1b6f7377319 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -16199,6 +16199,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/contextAndExtensionSameName.kt"); } + @Test + @TestMetadata("contextualFunctionConversion.kt") + public void testContextualFunctionConversion() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/contextualFunctionConversion.kt"); + } + @Test @TestMetadata("delegatedPropertiesOperators.kt") public void testDelegatedPropertiesOperators() throws Exception { @@ -16235,6 +16241,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/overloading.kt"); } + @Test + @TestMetadata("passingLambdaToContextualParam.kt") + public void testPassingLambdaToContextualParam() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/passingLambdaToContextualParam.kt"); + } + @Test @TestMetadata("plusAssign.kt") public void testPlusAssign() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java index 92e4dca6c1f..acef506060a 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java @@ -775,6 +775,12 @@ public class IrTextTestGenerated extends AbstractIrTextTest { runTest("compiler/testData/ir/irText/declarations/contextReceivers/compoundAssignmentOperators.kt"); } + @Test + @TestMetadata("contextualFunctionConversion.kt") + public void testContextualFunctionConversion() throws Exception { + runTest("compiler/testData/ir/irText/declarations/contextReceivers/contextualFunctionConversion.kt"); + } + @Test @TestMetadata("contextualPrimaryConstructorWithParams.kt") public void testContextualPrimaryConstructorWithParams() throws Exception { @@ -835,6 +841,12 @@ public class IrTextTestGenerated extends AbstractIrTextTest { runTest("compiler/testData/ir/irText/declarations/contextReceivers/overloading.kt"); } + @Test + @TestMetadata("passingLambdaToContextualParam.kt") + public void testPassingLambdaToContextualParam() throws Exception { + runTest("compiler/testData/ir/irText/declarations/contextReceivers/passingLambdaToContextualParam.kt"); + } + @Test @TestMetadata("plusMatrix.kt") public void testPlusMatrix() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java index c6e8724ce48..fa72ef1fd17 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeExtBlackBoxTestGenerated.java @@ -16386,6 +16386,12 @@ public class NativeExtBlackBoxTestGenerated extends AbstractNativeBlackBoxTest { runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/contextAndExtensionSameName.kt"); } + @Test + @TestMetadata("contextualFunctionConversion.kt") + public void testContextualFunctionConversion() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/contextualFunctionConversion.kt"); + } + @Test @TestMetadata("delegatedPropertiesOperators.kt") public void testDelegatedPropertiesOperators() throws Exception { @@ -16422,6 +16428,12 @@ public class NativeExtBlackBoxTestGenerated extends AbstractNativeBlackBoxTest { runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/overloading.kt"); } + @Test + @TestMetadata("passingLambdaToContextualParam.kt") + public void testPassingLambdaToContextualParam() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/passingLambdaToContextualParam.kt"); + } + @Test @TestMetadata("plusAssign.kt") public void testPlusAssign() throws Exception {