From 760f89efd3eef8f2428bbdf8b8c6aa88c469bdcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Fri, 16 Sep 2022 15:56:12 +0200 Subject: [PATCH] FIR: Fix operator and infix flags for FIR builtins --- .../kotlin/fir/backend/IrBuiltInsOverFir.kt | 15 ++++++++---- .../independentBackingFieldType.ir.txt | 2 +- .../runners/ir/Fir2IrTextTestGenerated.java | 6 +++++ .../ir/LightTreeFir2IrTextTestGenerated.java | 6 +++++ .../expressions/builtinOperators.ir.txt | 24 +++++++++++++++++++ .../ir/irText/expressions/builtinOperators.kt | 12 ++++++++++ .../expressions/builtinOperators.kt.txt | 9 +++++++ .../test/runners/ir/IrTextTestGenerated.java | 6 +++++ .../klib/KlibTextTestCaseGenerated.java | 5 ++++ 9 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/ir/irText/expressions/builtinOperators.ir.txt create mode 100644 compiler/testData/ir/irText/expressions/builtinOperators.kt create mode 100644 compiler/testData/ir/irText/expressions/builtinOperators.kt.txt diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt index f7a22d8229a..84a4c3d41d2 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt @@ -823,10 +823,11 @@ class IrBuiltInsOverFir( origin: IrDeclarationOrigin = object : IrDeclarationOriginImpl("BUILTIN_CLASS_METHOD") {}, modality: Modality = Modality.FINAL, isOperator: Boolean = false, + isInfix: Boolean = false, isIntrinsicConst: Boolean = true, build: IrFunctionBuilder.() -> Unit = {} ) = parent.createFunction( - name, returnType, valueParameterTypes, origin, modality, isOperator, isIntrinsicConst, build + name, returnType, valueParameterTypes, origin, modality, isOperator, isInfix, isIntrinsicConst, build ).also { fn -> fn.addDispatchReceiver { type = this@createMemberFunction.defaultType } declarations.add(fn) @@ -856,12 +857,14 @@ class IrBuiltInsOverFir( origin: IrDeclarationOrigin = object : IrDeclarationOriginImpl("BUILTIN_CLASS_METHOD") {}, modality: Modality = Modality.FINAL, isOperator: Boolean = false, + isInfix: Boolean = false, isIntrinsicConst: Boolean = true, build: IrFunctionBuilder.() -> Unit = {} ) = createMemberFunction( name.asString(), returnType, *valueParameterTypes, - origin = origin, modality = modality, isOperator = isOperator, isIntrinsicConst = isIntrinsicConst, build = build + origin = origin, modality = modality, isOperator = isOperator, isInfix = isInfix, + isIntrinsicConst = isIntrinsicConst, build = build ) private fun IrClass.configureSuperTypes(vararg superTypes: BuiltInClassValue, defaultAny: Boolean = true) { @@ -887,6 +890,7 @@ class IrBuiltInsOverFir( origin: IrDeclarationOrigin = IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB, modality: Modality = Modality.FINAL, isOperator: Boolean = false, + isInfix: Boolean = false, isIntrinsicConst: Boolean = false, build: IrFunctionBuilder.() -> Unit = {} ) = irFactory.buildFun { @@ -895,6 +899,7 @@ class IrBuiltInsOverFir( this.origin = origin this.modality = modality this.isOperator = isOperator + this.isInfix = isInfix build() }.also { fn -> valueParameterTypes.forEachIndexed { index, (pName, irType) -> @@ -1074,12 +1079,12 @@ class IrBuiltInsOverFir( private fun IrClass.createStandardBitwiseOps(thisType: IrType) { for (op in bitwiseOperators) { - createMemberFunction(op, thisType, "other" to thisType, isOperator = true) + createMemberFunction(op, thisType, "other" to thisType, isInfix = true) } for (op in shiftOperators) { - createMemberFunction(op, thisType, "bitCount" to intType, isOperator = true) + createMemberFunction(op, thisType, "bitCount" to intType, isInfix = true) } - createMemberFunction(OperatorNameConventions.INV, thisType, isOperator = true) + createMemberFunction(OperatorNameConventions.INV, thisType) } private fun IrClass.createStandardRangeMembers(thisType: IrType) { diff --git a/compiler/fir/fir2ir/testData/ir/irText/properties/backingField/independentBackingFieldType.ir.txt b/compiler/fir/fir2ir/testData/ir/irText/properties/backingField/independentBackingFieldType.ir.txt index 5d9dc92ca62..c115296e87d 100644 --- a/compiler/fir/fir2ir/testData/ir/irText/properties/backingField/independentBackingFieldType.ir.txt +++ b/compiler/fir/fir2ir/testData/ir/irText/properties/backingField/independentBackingFieldType.ir.txt @@ -48,7 +48,7 @@ FILE fqName: fileName:/independentBackingFieldType.kt VAR name:a type:.A [val] CONSTRUCTOR_CALL 'public constructor () [primary] declared in .A' type=.A origin=null VAR name:it type:kotlin.Int [val] - CALL 'public final fun and (other: kotlin.Int): kotlin.Int [operator] declared in kotlin.Int' type=kotlin.Int origin=null + CALL 'public final fun and (other: kotlin.Int): kotlin.Int [infix] declared in kotlin.Int' type=kotlin.Int origin=null $this: CALL 'public final fun (): kotlin.Int declared in .A' type=kotlin.Int origin=GET_PROPERTY $this: CONSTRUCTOR_CALL 'public constructor () [primary] declared in .A' type=.A origin=null other: CONST Int type=kotlin.Int value=10 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 49f9e55175d..33c4f205b82 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 @@ -1284,6 +1284,12 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest { runTest("compiler/testData/ir/irText/expressions/breakContinueInWhen.kt"); } + @Test + @TestMetadata("builtinOperators.kt") + public void testBuiltinOperators() throws Exception { + runTest("compiler/testData/ir/irText/expressions/builtinOperators.kt"); + } + @Test @TestMetadata("callWithReorderedArguments.kt") public void testCallWithReorderedArguments() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java index 88a1e7c5cc3..f20663c7583 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java @@ -1284,6 +1284,12 @@ public class LightTreeFir2IrTextTestGenerated extends AbstractLightTreeFir2IrTex runTest("compiler/testData/ir/irText/expressions/breakContinueInWhen.kt"); } + @Test + @TestMetadata("builtinOperators.kt") + public void testBuiltinOperators() throws Exception { + runTest("compiler/testData/ir/irText/expressions/builtinOperators.kt"); + } + @Test @TestMetadata("callWithReorderedArguments.kt") public void testCallWithReorderedArguments() throws Exception { diff --git a/compiler/testData/ir/irText/expressions/builtinOperators.ir.txt b/compiler/testData/ir/irText/expressions/builtinOperators.ir.txt new file mode 100644 index 00000000000..abf75e88882 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/builtinOperators.ir.txt @@ -0,0 +1,24 @@ +FILE fqName:test fileName:/test.kt + FUN name:callBuiltinFunctions visibility:public modality:FINAL <> (a:kotlin.Int, b:kotlin.Int) returnType:kotlin.Unit + VALUE_PARAMETER name:a index:0 type:kotlin.Int + VALUE_PARAMETER name:b index:1 type:kotlin.Int + BLOCK_BODY + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + CALL 'public final fun plus (other: kotlin.Int): kotlin.Int [operator] declared in kotlin.Int' type=kotlin.Int origin=PLUS + $this: GET_VAR 'a: kotlin.Int declared in test.callBuiltinFunctions' type=kotlin.Int origin=null + other: GET_VAR 'b: kotlin.Int declared in test.callBuiltinFunctions' type=kotlin.Int origin=null + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + CALL 'public final fun or (other: kotlin.Int): kotlin.Int [infix] declared in kotlin.Int' type=kotlin.Int origin=null + $this: GET_VAR 'a: kotlin.Int declared in test.callBuiltinFunctions' type=kotlin.Int origin=null + other: GET_VAR 'b: kotlin.Int declared in test.callBuiltinFunctions' type=kotlin.Int origin=null + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + CALL 'public final fun and (other: kotlin.Int): kotlin.Int [infix] declared in kotlin.Int' type=kotlin.Int origin=null + $this: GET_VAR 'a: kotlin.Int declared in test.callBuiltinFunctions' type=kotlin.Int origin=null + other: GET_VAR 'b: kotlin.Int declared in test.callBuiltinFunctions' type=kotlin.Int origin=null + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + CALL 'public final fun inv (): kotlin.Int declared in kotlin.Int' type=kotlin.Int origin=null + $this: GET_VAR 'a: kotlin.Int declared in test.callBuiltinFunctions' type=kotlin.Int origin=null + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + CALL 'public final fun shl (bitCount: kotlin.Int): kotlin.Int [infix] declared in kotlin.Int' type=kotlin.Int origin=null + $this: GET_VAR 'a: kotlin.Int declared in test.callBuiltinFunctions' type=kotlin.Int origin=null + bitCount: GET_VAR 'b: kotlin.Int declared in test.callBuiltinFunctions' type=kotlin.Int origin=null diff --git a/compiler/testData/ir/irText/expressions/builtinOperators.kt b/compiler/testData/ir/irText/expressions/builtinOperators.kt new file mode 100644 index 00000000000..5155c49588c --- /dev/null +++ b/compiler/testData/ir/irText/expressions/builtinOperators.kt @@ -0,0 +1,12 @@ +// FIR_IDENTICAL +// FILE: test.kt + +package test + +fun callBuiltinFunctions(a: Int, b: Int) { + a + b + a or b + a and b + a.inv() + a shl b +} diff --git a/compiler/testData/ir/irText/expressions/builtinOperators.kt.txt b/compiler/testData/ir/irText/expressions/builtinOperators.kt.txt new file mode 100644 index 00000000000..855e5eee5ea --- /dev/null +++ b/compiler/testData/ir/irText/expressions/builtinOperators.kt.txt @@ -0,0 +1,9 @@ +package test + +fun callBuiltinFunctions(a: Int, b: Int) { + a.plus(other = b) /*~> Unit */ + a.or(other = b) /*~> Unit */ + a.and(other = b) /*~> Unit */ + a.inv() /*~> Unit */ + a.shl(bitCount = b) /*~> Unit */ +} 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 4b55f1f7a4f..eb0ed1c9b4c 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 @@ -1284,6 +1284,12 @@ public class IrTextTestGenerated extends AbstractIrTextTest { runTest("compiler/testData/ir/irText/expressions/breakContinueInWhen.kt"); } + @Test + @TestMetadata("builtinOperators.kt") + public void testBuiltinOperators() throws Exception { + runTest("compiler/testData/ir/irText/expressions/builtinOperators.kt"); + } + @Test @TestMetadata("callWithReorderedArguments.kt") public void testCallWithReorderedArguments() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibTextTestCaseGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibTextTestCaseGenerated.java index da27da675e3..60919259058 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibTextTestCaseGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/klib/KlibTextTestCaseGenerated.java @@ -985,6 +985,11 @@ public class KlibTextTestCaseGenerated extends AbstractKlibTextTestCase { runTest("compiler/testData/ir/irText/expressions/breakContinueInWhen.kt"); } + @TestMetadata("builtinOperators.kt") + public void testBuiltinOperators() throws Exception { + runTest("compiler/testData/ir/irText/expressions/builtinOperators.kt"); + } + @TestMetadata("callWithReorderedArguments.kt") public void testCallWithReorderedArguments() throws Exception { runTest("compiler/testData/ir/irText/expressions/callWithReorderedArguments.kt");