From 62ec19bda2c124bacce3d75e89bba0e941628c24 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Mon, 28 Mar 2022 11:38:26 +0300 Subject: [PATCH] [FIR JS] Fix current tests --- .../withInvisibleSynthesized.fir.kt | 4 +- .../dynamic/dynamicAndMembersOfAny.ir.txt | 23 +++ .../dynamic/dynamicAndMembersOfAny.kt | 1 + .../dynamic/dynamicArrayAccess.ir.txt | 24 +++ .../ir/irJsText/dynamic/dynamicArrayAccess.kt | 1 + .../dynamic/dynamicArrayAssignment.fir.ir.txt | 19 +++ .../dynamic/dynamicArrayAssignment.fir.kt.txt | 8 + .../dynamicArrayAugmentedAssignment.ir.txt | 29 ++++ .../dynamicArrayAugmentedAssignment.kt | 1 + .../dynamicArrayIncrementDecrement.ir.txt | 24 +++ .../dynamic/dynamicArrayIncrementDecrement.kt | 1 + .../dynamicBinaryEqualityOperator.ir.txt | 29 ++++ .../dynamic/dynamicBinaryEqualityOperator.kt | 1 + .../dynamicBinaryLogicalOperator.ir.txt | 15 ++ .../dynamic/dynamicBinaryLogicalOperator.kt | 1 + .../dynamic/dynamicBinaryOperator.ir.txt | 36 +++++ .../irJsText/dynamic/dynamicBinaryOperator.kt | 1 + .../dynamicBinaryRelationalOperator.ir.txt | 29 ++++ .../dynamicBinaryRelationalOperator.kt | 1 + .../ir/irJsText/dynamic/dynamicCall.ir.txt | 42 +++++ .../ir/irJsText/dynamic/dynamicCall.kt | 1 + .../dynamic/dynamicElvisOperator.fir.ir.txt | 17 ++ .../dynamic/dynamicElvisOperator.fir.kt.txt | 10 ++ .../dynamicExclExclOperator.fir.ir.txt | 8 + .../dynamicExclExclOperator.fir.kt.txt | 3 + .../dynamic/dynamicExclExclOperator.ir.txt | 8 + .../irJsText/dynamic/dynamicInfixCall.ir.txt | 17 ++ .../ir/irJsText/dynamic/dynamicInfixCall.kt | 1 + .../dynamic/dynamicMemberAccess.ir.txt | 24 +++ .../irJsText/dynamic/dynamicMemberAccess.kt | 1 + .../dynamicMemberAssignment.fir.ir.txt | 27 ++++ .../dynamicMemberAssignment.fir.kt.txt | 14 ++ ...ynamicMemberAugmentedAssignment.fir.ir.txt | 107 +++++++++++++ ...ynamicMemberAugmentedAssignment.fir.kt.txt | 46 ++++++ .../dynamicMemberIncrementDecrement.ir.txt | 83 ++++++++++ .../dynamicMemberIncrementDecrement.kt | 1 + .../dynamic/dynamicUnaryOperator.ir.txt | 19 +++ .../irJsText/dynamic/dynamicUnaryOperator.kt | 1 + .../dynamic/dynamicWithSmartCast.fir.ir.txt | 29 ++++ .../dynamic/dynamicWithSmartCast.fir.kt.txt | 14 ++ .../dynamic/implicitCastFromDynamic.ir.txt | 48 ++++++ .../dynamic/implicitCastFromDynamic.kt | 1 + .../dynamic/implicitCastToDynamic.fir.ir.txt | 79 +++++++++ .../dynamic/implicitCastToDynamic.fir.kt.txt | 42 +++++ .../ir/irJsText/dynamic/invokeOperator.ir.txt | 61 +++++++ .../ir/irJsText/dynamic/invokeOperator.kt | 1 + .../ir/irJsText/external/kt38765.fir.ir.txt | 151 ++++++++++++++++++ .../ir/irJsText/external/kt38765.fir.kt.txt | 58 +++++++ .../native/nativeNativeKotlin.fir.ir.txt | 80 ++++++++++ .../native/nativeNativeKotlin.fir.kt.txt | 37 +++++ 50 files changed, 1277 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicAndMembersOfAny.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicArrayAccess.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicArrayAssignment.fir.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicArrayAssignment.fir.kt.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicArrayAugmentedAssignment.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicArrayIncrementDecrement.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicBinaryEqualityOperator.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicBinaryLogicalOperator.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicBinaryOperator.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicBinaryRelationalOperator.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicCall.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicElvisOperator.fir.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicElvisOperator.fir.kt.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicExclExclOperator.fir.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicExclExclOperator.fir.kt.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicExclExclOperator.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicInfixCall.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicMemberAccess.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicMemberAssignment.fir.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicMemberAssignment.fir.kt.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicMemberAugmentedAssignment.fir.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicMemberAugmentedAssignment.fir.kt.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicMemberIncrementDecrement.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicUnaryOperator.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicWithSmartCast.fir.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/dynamicWithSmartCast.fir.kt.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/implicitCastFromDynamic.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/implicitCastToDynamic.fir.ir.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/implicitCastToDynamic.fir.kt.txt create mode 100644 compiler/testData/ir/irJsText/dynamic/invokeOperator.ir.txt create mode 100644 compiler/testData/ir/irJsText/external/kt38765.fir.ir.txt create mode 100644 compiler/testData/ir/irJsText/external/kt38765.fir.kt.txt create mode 100644 compiler/testData/ir/irJsText/native/nativeNativeKotlin.fir.ir.txt create mode 100644 compiler/testData/ir/irJsText/native/nativeNativeKotlin.fir.kt.txt diff --git a/compiler/testData/diagnostics/tests/dynamicTypes/withInvisibleSynthesized.fir.kt b/compiler/testData/diagnostics/tests/dynamicTypes/withInvisibleSynthesized.fir.kt index 082ceb5519f..f10ce8fde54 100644 --- a/compiler/testData/diagnostics/tests/dynamicTypes/withInvisibleSynthesized.fir.kt +++ b/compiler/testData/diagnostics/tests/dynamicTypes/withInvisibleSynthesized.fir.kt @@ -21,8 +21,8 @@ import p.* class K: J.C() { fun dynamic.test() { - sam(null) - sam( + sam(null) + sam( name = null, name = null ) diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicAndMembersOfAny.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicAndMembersOfAny.ir.txt new file mode 100644 index 00000000000..88d0613f7c7 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicAndMembersOfAny.ir.txt @@ -0,0 +1,23 @@ +FILE fqName: fileName:/dynamicAndMembersOfAny.kt + FUN name:test1 visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.String + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test1 (d: dynamic): kotlin.String declared in ' + CALL 'public open fun toString (): kotlin.String declared in kotlin.Any' type=kotlin.String origin=null + $this: TYPE_OP type=kotlin.Any origin=IMPLICIT_DYNAMIC_CAST typeOperand=kotlin.Any + GET_VAR 'd: dynamic declared in .test1' type=dynamic origin=null + FUN name:test2 visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Int + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test2 (d: dynamic): kotlin.Int declared in ' + CALL 'public open fun hashCode (): kotlin.Int declared in kotlin.Any' type=kotlin.Int origin=null + $this: TYPE_OP type=kotlin.Any origin=IMPLICIT_DYNAMIC_CAST typeOperand=kotlin.Any + GET_VAR 'd: dynamic declared in .test2' type=dynamic origin=null + FUN name:test3 visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Boolean + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test3 (d: dynamic): kotlin.Boolean declared in ' + CALL 'public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any' type=kotlin.Boolean origin=null + $this: TYPE_OP type=kotlin.Any origin=IMPLICIT_DYNAMIC_CAST typeOperand=kotlin.Any + GET_VAR 'd: dynamic declared in .test3' type=dynamic origin=null + other: CONST Int type=kotlin.Int value=42 diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicAndMembersOfAny.kt b/compiler/testData/ir/irJsText/dynamic/dynamicAndMembersOfAny.kt index 78271d02e1a..10609344895 100644 --- a/compiler/testData/ir/irJsText/dynamic/dynamicAndMembersOfAny.kt +++ b/compiler/testData/ir/irJsText/dynamic/dynamicAndMembersOfAny.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // WITH_STDLIB fun test1(d: dynamic) = d.toString() diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicArrayAccess.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicArrayAccess.ir.txt new file mode 100644 index 00000000000..870cf1fdb45 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicArrayAccess.ir.txt @@ -0,0 +1,24 @@ +FILE fqName: fileName:/dynamicArrayAccess.kt + FUN name:testArrayAccess1 visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testArrayAccess1 (d: dynamic): dynamic declared in ' + DYN_OP operator=ARRAY_ACCESS type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testArrayAccess1' type=dynamic origin=null + 0: CONST String type=kotlin.String value="KEY" + FUN name:testArrayAccess2 visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testArrayAccess2 (d: dynamic): dynamic declared in ' + DYN_OP operator=ARRAY_ACCESS type=dynamic + receiver: DYN_OP operator=INVOKE type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testArrayAccess2' type=dynamic origin=VARIABLE_AS_FUNCTION + 0: CONST String type=kotlin.String value="KEY" + FUN name:testArrayAccess3 visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testArrayAccess3 (d: dynamic): dynamic declared in ' + DYN_OP operator=INVOKE type=dynamic + receiver: DYN_MEMBER memberName='get' type=dynamic + GET_VAR 'd: dynamic declared in .testArrayAccess3' type=dynamic origin=null + 0: CONST String type=kotlin.String value="KEY" diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicArrayAccess.kt b/compiler/testData/ir/irJsText/dynamic/dynamicArrayAccess.kt index 669c803a347..4bc47f516a3 100644 --- a/compiler/testData/ir/irJsText/dynamic/dynamicArrayAccess.kt +++ b/compiler/testData/ir/irJsText/dynamic/dynamicArrayAccess.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun testArrayAccess1(d: dynamic) = d["KEY"] fun testArrayAccess2(d: dynamic) = d()["KEY"] diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicArrayAssignment.fir.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicArrayAssignment.fir.ir.txt new file mode 100644 index 00000000000..6795f662951 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicArrayAssignment.fir.ir.txt @@ -0,0 +1,19 @@ +FILE fqName: fileName:/dynamicArrayAssignment.kt + FUN name:testArrayAssignment visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Unit + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + DYN_OP operator=EQ type=dynamic + receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testArrayAssignment' type=dynamic origin=null + 0: CONST String type=kotlin.String value="KEY" + 0: CONST Int type=kotlin.Int value=1 + FUN name:testArrayAssignmentFake visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Unit + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + DYN_OP operator=INVOKE type=dynamic + receiver: DYN_MEMBER memberName='set' type=dynamic + GET_VAR 'd: dynamic declared in .testArrayAssignmentFake' type=dynamic origin=null + 0: CONST String type=kotlin.String value="KEY" + 1: CONST Int type=kotlin.Int value=2 diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicArrayAssignment.fir.kt.txt b/compiler/testData/ir/irJsText/dynamic/dynamicArrayAssignment.fir.kt.txt new file mode 100644 index 00000000000..439e51ee5f2 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicArrayAssignment.fir.kt.txt @@ -0,0 +1,8 @@ +fun testArrayAssignment(d: dynamic) { + d["KEY"] = 1 /*~> Unit */ +} + +fun testArrayAssignmentFake(d: dynamic) { + d.set("KEY", 2) /*~> Unit */ +} + diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicArrayAugmentedAssignment.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicArrayAugmentedAssignment.ir.txt new file mode 100644 index 00000000000..afa91756446 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicArrayAugmentedAssignment.ir.txt @@ -0,0 +1,29 @@ +FILE fqName: fileName:/dynamicArrayAugmentedAssignment.kt + FUN name:testArrayAugmentedAssignment visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Unit + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + DYN_OP operator=PLUSEQ type=kotlin.Unit + receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testArrayAugmentedAssignment' type=dynamic origin=null + 0: CONST String type=kotlin.String value="KEY" + 0: CONST String type=kotlin.String value="+=" + DYN_OP operator=MINUSEQ type=kotlin.Unit + receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testArrayAugmentedAssignment' type=dynamic origin=null + 0: CONST String type=kotlin.String value="KEY" + 0: CONST String type=kotlin.String value="-=" + DYN_OP operator=MULEQ type=kotlin.Unit + receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testArrayAugmentedAssignment' type=dynamic origin=null + 0: CONST String type=kotlin.String value="KEY" + 0: CONST String type=kotlin.String value="*=" + DYN_OP operator=DIVEQ type=kotlin.Unit + receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testArrayAugmentedAssignment' type=dynamic origin=null + 0: CONST String type=kotlin.String value="KEY" + 0: CONST String type=kotlin.String value="/=" + DYN_OP operator=MODEQ type=kotlin.Unit + receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testArrayAugmentedAssignment' type=dynamic origin=null + 0: CONST String type=kotlin.String value="KEY" + 0: CONST String type=kotlin.String value="%=" diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicArrayAugmentedAssignment.kt b/compiler/testData/ir/irJsText/dynamic/dynamicArrayAugmentedAssignment.kt index da63654627c..be1d3797788 100644 --- a/compiler/testData/ir/irJsText/dynamic/dynamicArrayAugmentedAssignment.kt +++ b/compiler/testData/ir/irJsText/dynamic/dynamicArrayAugmentedAssignment.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun testArrayAugmentedAssignment(d: dynamic) { d["KEY"] += "+=" d["KEY"] -= "-=" diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicArrayIncrementDecrement.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicArrayIncrementDecrement.ir.txt new file mode 100644 index 00000000000..a583eaf6cd4 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicArrayIncrementDecrement.ir.txt @@ -0,0 +1,24 @@ +FILE fqName: fileName:/dynamicArrayIncrementDecrement.kt + FUN name:testArrayIncrementDecrement visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Unit + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + VAR name:t1 type:dynamic [val] + DYN_OP operator=PREFIX_INCREMENT type=dynamic + receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testArrayIncrementDecrement' type=dynamic origin=null + 0: CONST String type=kotlin.String value="prefixIncr" + VAR name:t2 type:dynamic [val] + DYN_OP operator=PREFIX_DECREMENT type=dynamic + receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testArrayIncrementDecrement' type=dynamic origin=null + 0: CONST String type=kotlin.String value="prefixDecr" + VAR name:t3 type:dynamic [val] + DYN_OP operator=POSTFIX_INCREMENT type=dynamic + receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testArrayIncrementDecrement' type=dynamic origin=null + 0: CONST String type=kotlin.String value="postfixIncr" + VAR name:t4 type:dynamic [val] + DYN_OP operator=POSTFIX_DECREMENT type=dynamic + receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testArrayIncrementDecrement' type=dynamic origin=null + 0: CONST String type=kotlin.String value="postfixDecr" diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicArrayIncrementDecrement.kt b/compiler/testData/ir/irJsText/dynamic/dynamicArrayIncrementDecrement.kt index f4e03c88ad3..5784989e7f4 100644 --- a/compiler/testData/ir/irJsText/dynamic/dynamicArrayIncrementDecrement.kt +++ b/compiler/testData/ir/irJsText/dynamic/dynamicArrayIncrementDecrement.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun testArrayIncrementDecrement(d: dynamic) { val t1 = ++d["prefixIncr"] diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicBinaryEqualityOperator.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicBinaryEqualityOperator.ir.txt new file mode 100644 index 00000000000..e653e552ccf --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicBinaryEqualityOperator.ir.txt @@ -0,0 +1,29 @@ +FILE fqName: fileName:/dynamicBinaryEqualityOperator.kt + FUN name:testEqeq visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Boolean + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testEqeq (d: dynamic): kotlin.Boolean declared in ' + DYN_OP operator=EQEQ type=kotlin.Boolean + receiver: GET_VAR 'd: dynamic declared in .testEqeq' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=3 + FUN name:testExclEq visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Boolean + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testExclEq (d: dynamic): kotlin.Boolean declared in ' + DYN_OP operator=EXCLEQ type=kotlin.Boolean + receiver: GET_VAR 'd: dynamic declared in .testExclEq' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=3 + FUN name:testEqeqeq visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Boolean + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testEqeqeq (d: dynamic): kotlin.Boolean declared in ' + DYN_OP operator=EQEQEQ type=kotlin.Boolean + receiver: GET_VAR 'd: dynamic declared in .testEqeqeq' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=3 + FUN name:testExclEqeq visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Boolean + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testExclEqeq (d: dynamic): kotlin.Boolean declared in ' + DYN_OP operator=EXCLEQEQ type=kotlin.Boolean + receiver: GET_VAR 'd: dynamic declared in .testExclEqeq' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=3 diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicBinaryEqualityOperator.kt b/compiler/testData/ir/irJsText/dynamic/dynamicBinaryEqualityOperator.kt index 51f0399c277..d86ef848c80 100644 --- a/compiler/testData/ir/irJsText/dynamic/dynamicBinaryEqualityOperator.kt +++ b/compiler/testData/ir/irJsText/dynamic/dynamicBinaryEqualityOperator.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun testEqeq(d: dynamic) = d == 3 fun testExclEq(d: dynamic) = d != 3 fun testEqeqeq(d: dynamic) = d === 3 diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicBinaryLogicalOperator.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicBinaryLogicalOperator.ir.txt new file mode 100644 index 00000000000..70826708f19 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicBinaryLogicalOperator.ir.txt @@ -0,0 +1,15 @@ +FILE fqName: fileName:/dynamicBinaryLogicalOperator.kt + FUN name:testAndAnd visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Boolean + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testAndAnd (d: dynamic): kotlin.Boolean declared in ' + DYN_OP operator=ANDAND type=kotlin.Boolean + receiver: GET_VAR 'd: dynamic declared in .testAndAnd' type=dynamic origin=null + 0: GET_VAR 'd: dynamic declared in .testAndAnd' type=dynamic origin=null + FUN name:testOrOr visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Boolean + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testOrOr (d: dynamic): kotlin.Boolean declared in ' + DYN_OP operator=OROR type=kotlin.Boolean + receiver: GET_VAR 'd: dynamic declared in .testOrOr' type=dynamic origin=null + 0: GET_VAR 'd: dynamic declared in .testOrOr' type=dynamic origin=null diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicBinaryLogicalOperator.kt b/compiler/testData/ir/irJsText/dynamic/dynamicBinaryLogicalOperator.kt index 48409698c97..c3a6bf11492 100644 --- a/compiler/testData/ir/irJsText/dynamic/dynamicBinaryLogicalOperator.kt +++ b/compiler/testData/ir/irJsText/dynamic/dynamicBinaryLogicalOperator.kt @@ -1,2 +1,3 @@ +// FIR_IDENTICAL fun testAndAnd(d: dynamic) = d && d fun testOrOr(d: dynamic) = d || d diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicBinaryOperator.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicBinaryOperator.ir.txt new file mode 100644 index 00000000000..cd8195fd4fa --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicBinaryOperator.ir.txt @@ -0,0 +1,36 @@ +FILE fqName: fileName:/dynamicBinaryOperator.kt + FUN name:testBinaryPlus visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testBinaryPlus (d: dynamic): dynamic declared in ' + DYN_OP operator=BINARY_PLUS type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testBinaryPlus' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=1 + FUN name:testBinaryMinus visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testBinaryMinus (d: dynamic): dynamic declared in ' + DYN_OP operator=BINARY_MINUS type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testBinaryMinus' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=1 + FUN name:testMul visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testMul (d: dynamic): dynamic declared in ' + DYN_OP operator=MUL type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testMul' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=2 + FUN name:testDiv visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testDiv (d: dynamic): dynamic declared in ' + DYN_OP operator=DIV type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testDiv' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=2 + FUN name:testMod visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testMod (d: dynamic): dynamic declared in ' + DYN_OP operator=MOD type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testMod' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=2 diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicBinaryOperator.kt b/compiler/testData/ir/irJsText/dynamic/dynamicBinaryOperator.kt index 7b8e1ae89fa..c064ca3b344 100644 --- a/compiler/testData/ir/irJsText/dynamic/dynamicBinaryOperator.kt +++ b/compiler/testData/ir/irJsText/dynamic/dynamicBinaryOperator.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun testBinaryPlus(d: dynamic) = d + 1 fun testBinaryMinus(d: dynamic) = d - 1 fun testMul(d: dynamic) = d * 2 diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicBinaryRelationalOperator.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicBinaryRelationalOperator.ir.txt new file mode 100644 index 00000000000..18df105dad6 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicBinaryRelationalOperator.ir.txt @@ -0,0 +1,29 @@ +FILE fqName: fileName:/dynamicBinaryRelationalOperator.kt + FUN name:testLess visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Boolean + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testLess (d: dynamic): kotlin.Boolean declared in ' + DYN_OP operator=LT type=kotlin.Boolean + receiver: GET_VAR 'd: dynamic declared in .testLess' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=2 + FUN name:testLessOrEqual visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Boolean + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testLessOrEqual (d: dynamic): kotlin.Boolean declared in ' + DYN_OP operator=LE type=kotlin.Boolean + receiver: GET_VAR 'd: dynamic declared in .testLessOrEqual' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=2 + FUN name:testGreater visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Boolean + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testGreater (d: dynamic): kotlin.Boolean declared in ' + DYN_OP operator=GT type=kotlin.Boolean + receiver: GET_VAR 'd: dynamic declared in .testGreater' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=2 + FUN name:testGreaterOrEqual visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Boolean + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testGreaterOrEqual (d: dynamic): kotlin.Boolean declared in ' + DYN_OP operator=GE type=kotlin.Boolean + receiver: GET_VAR 'd: dynamic declared in .testGreaterOrEqual' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=2 diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicBinaryRelationalOperator.kt b/compiler/testData/ir/irJsText/dynamic/dynamicBinaryRelationalOperator.kt index 2827598766b..00eb65373b3 100644 --- a/compiler/testData/ir/irJsText/dynamic/dynamicBinaryRelationalOperator.kt +++ b/compiler/testData/ir/irJsText/dynamic/dynamicBinaryRelationalOperator.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun testLess(d: dynamic) = d < 2 fun testLessOrEqual(d: dynamic) = d <= 2 fun testGreater(d: dynamic) = d > 2 diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicCall.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicCall.ir.txt new file mode 100644 index 00000000000..48e177593ba --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicCall.ir.txt @@ -0,0 +1,42 @@ +FILE fqName: fileName:/dynamicCall.kt + FUN name:test1 visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test1 (d: dynamic): dynamic declared in ' + DYN_OP operator=INVOKE type=dynamic + receiver: DYN_MEMBER memberName='member' type=dynamic + GET_VAR 'd: dynamic declared in .test1' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=1 + 1: CONST Int type=kotlin.Int value=2 + 2: CONST Int type=kotlin.Int value=3 + FUN name:test2 visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test2 (d: dynamic): dynamic declared in ' + BLOCK type=dynamic origin=SAFE_CALL + VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:dynamic [val] + GET_VAR 'd: dynamic declared in .test2' type=dynamic origin=null + WHEN type=dynamic origin=null + BRANCH + if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ + arg0: GET_VAR 'val tmp_0: dynamic [val] declared in .test2' type=dynamic origin=null + arg1: CONST Null type=kotlin.Nothing? value=null + then: CONST Null type=kotlin.Nothing? value=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: DYN_OP operator=INVOKE type=dynamic + receiver: DYN_MEMBER memberName='member' type=dynamic + GET_VAR 'val tmp_0: dynamic [val] declared in .test2' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=1 + 1: CONST Int type=kotlin.Int value=2 + 2: CONST Int type=kotlin.Int value=3 + FUN name:test3 visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test3 (d: dynamic): dynamic declared in ' + DYN_OP operator=INVOKE type=dynamic + receiver: DYN_MEMBER memberName='member' type=dynamic + GET_VAR 'd: dynamic declared in .test3' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=1 + 1: CONST Int type=kotlin.Int value=2 + 2: CONST Int type=kotlin.Int value=3 diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicCall.kt b/compiler/testData/ir/irJsText/dynamic/dynamicCall.kt index 7a42237ea11..41e488758b1 100644 --- a/compiler/testData/ir/irJsText/dynamic/dynamicCall.kt +++ b/compiler/testData/ir/irJsText/dynamic/dynamicCall.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun test1(d: dynamic) = d.member(1, 2, 3) fun test2(d: dynamic) = d?.member(1, 2, 3) diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicElvisOperator.fir.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicElvisOperator.fir.ir.txt new file mode 100644 index 00000000000..8146538096e --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicElvisOperator.fir.ir.txt @@ -0,0 +1,17 @@ +FILE fqName: fileName:/dynamicElvisOperator.kt + FUN name:test visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test (d: dynamic): dynamic declared in ' + BLOCK type=dynamic origin=ELVIS + VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:dynamic [val] + GET_VAR 'd: dynamic declared in .test' type=dynamic origin=null + WHEN type=dynamic origin=ELVIS + BRANCH + if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ + arg0: GET_VAR 'val tmp_0: dynamic [val] declared in .test' type=dynamic origin=null + arg1: CONST Null type=kotlin.Nothing? value=null + then: CONST String type=kotlin.String value="other" + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: GET_VAR 'val tmp_0: dynamic [val] declared in .test' type=dynamic origin=null diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicElvisOperator.fir.kt.txt b/compiler/testData/ir/irJsText/dynamic/dynamicElvisOperator.fir.kt.txt new file mode 100644 index 00000000000..f77173054ba --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicElvisOperator.fir.kt.txt @@ -0,0 +1,10 @@ +fun test(d: dynamic): dynamic { + return { // BLOCK + val : dynamic = d + when { + EQEQ(arg0 = , arg1 = null) -> "other" + else -> + } + } +} + diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicExclExclOperator.fir.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicExclExclOperator.fir.ir.txt new file mode 100644 index 00000000000..37d3c98dc0c --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicExclExclOperator.fir.ir.txt @@ -0,0 +1,8 @@ +FILE fqName: fileName:/dynamicExclExclOperator.kt + FUN name:test visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test (d: dynamic): dynamic declared in ' + CALL 'public final fun CHECK_NOT_NULL (arg0: T0 of kotlin.internal.ir.CHECK_NOT_NULL?): {T0 of kotlin.internal.ir.CHECK_NOT_NULL & Any} declared in kotlin.internal.ir' type=dynamic origin=EXCLEXCL + : dynamic + arg0: GET_VAR 'd: dynamic declared in .test' type=dynamic origin=null diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicExclExclOperator.fir.kt.txt b/compiler/testData/ir/irJsText/dynamic/dynamicExclExclOperator.fir.kt.txt new file mode 100644 index 00000000000..400eeff9463 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicExclExclOperator.fir.kt.txt @@ -0,0 +1,3 @@ +fun test(d: dynamic): dynamic { + return CHECK_NOT_NULL(arg0 = d) +} diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicExclExclOperator.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicExclExclOperator.ir.txt new file mode 100644 index 00000000000..a42e946b202 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicExclExclOperator.ir.txt @@ -0,0 +1,8 @@ +FILE fqName: fileName:/dynamicExclExclOperator.kt + FUN name:test visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test (d: dynamic): dynamic declared in ' + CALL 'public final fun CHECK_NOT_NULL (arg0: T0 of kotlin.internal.ir.CHECK_NOT_NULL?): T0 of kotlin.internal.ir.CHECK_NOT_NULL declared in kotlin.internal.ir' type=dynamic origin=EXCLEXCL + : dynamic + arg0: GET_VAR 'd: dynamic declared in .test' type=dynamic origin=null diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicInfixCall.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicInfixCall.ir.txt new file mode 100644 index 00000000000..82b87efdaca --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicInfixCall.ir.txt @@ -0,0 +1,17 @@ +FILE fqName: fileName:/dynamicInfixCall.kt + FUN name:test1 visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test1 (d: dynamic): dynamic declared in ' + DYN_OP operator=INVOKE type=dynamic + receiver: DYN_MEMBER memberName='foo' type=dynamic + GET_VAR 'd: dynamic declared in .test1' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=123 + FUN name:test2 visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test2 (d: dynamic): dynamic declared in ' + DYN_OP operator=INVOKE type=dynamic + receiver: DYN_MEMBER memberName='invoke' type=dynamic + GET_VAR 'd: dynamic declared in .test2' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=123 diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicInfixCall.kt b/compiler/testData/ir/irJsText/dynamic/dynamicInfixCall.kt index 89d8f86d5cc..9baa036558d 100644 --- a/compiler/testData/ir/irJsText/dynamic/dynamicInfixCall.kt +++ b/compiler/testData/ir/irJsText/dynamic/dynamicInfixCall.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun test1(d: dynamic) = d foo 123 fun test2(d: dynamic) = d invoke 123 \ No newline at end of file diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicMemberAccess.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicMemberAccess.ir.txt new file mode 100644 index 00000000000..af86f363c62 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicMemberAccess.ir.txt @@ -0,0 +1,24 @@ +FILE fqName: fileName:/dynamicMemberAccess.kt + FUN name:test1 visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test1 (d: dynamic): dynamic declared in ' + DYN_MEMBER memberName='member' type=dynamic + GET_VAR 'd: dynamic declared in .test1' type=dynamic origin=null + FUN name:test2 visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test2 (d: dynamic): dynamic declared in ' + BLOCK type=dynamic origin=SAFE_CALL + VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:dynamic [val] + GET_VAR 'd: dynamic declared in .test2' type=dynamic origin=null + WHEN type=dynamic origin=null + BRANCH + if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ + arg0: GET_VAR 'val tmp_0: dynamic [val] declared in .test2' type=dynamic origin=null + arg1: CONST Null type=kotlin.Nothing? value=null + then: CONST Null type=kotlin.Nothing? value=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: DYN_MEMBER memberName='member' type=dynamic + GET_VAR 'val tmp_0: dynamic [val] declared in .test2' type=dynamic origin=null diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicMemberAccess.kt b/compiler/testData/ir/irJsText/dynamic/dynamicMemberAccess.kt index b8ea0ab61d7..1543e16c005 100644 --- a/compiler/testData/ir/irJsText/dynamic/dynamicMemberAccess.kt +++ b/compiler/testData/ir/irJsText/dynamic/dynamicMemberAccess.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun test1(d: dynamic) = d.member fun test2(d: dynamic) = d?.member \ No newline at end of file diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicMemberAssignment.fir.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicMemberAssignment.fir.ir.txt new file mode 100644 index 00000000000..81d5f55343d --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicMemberAssignment.fir.ir.txt @@ -0,0 +1,27 @@ +FILE fqName: fileName:/dynamicMemberAssignment.kt + FUN name:testMemberAssignment visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Unit + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + DYN_OP operator=EQ type=kotlin.Unit + receiver: DYN_MEMBER memberName='m' type=kotlin.Unit + GET_VAR 'd: dynamic declared in .testMemberAssignment' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=1 + FUN name:testSafeMemberAssignment visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Unit + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + BLOCK type=kotlin.Unit? origin=SAFE_CALL + VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:dynamic [val] + GET_VAR 'd: dynamic declared in .testSafeMemberAssignment' type=dynamic origin=null + WHEN type=kotlin.Unit? origin=null + BRANCH + if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ + arg0: GET_VAR 'val tmp_0: dynamic [val] declared in .testSafeMemberAssignment' type=dynamic origin=null + arg1: CONST Null type=kotlin.Nothing? value=null + then: CONST Null type=kotlin.Nothing? value=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: DYN_OP operator=EQ type=kotlin.Unit + receiver: DYN_MEMBER memberName='m' type=kotlin.Unit + GET_VAR 'val tmp_0: dynamic [val] declared in .testSafeMemberAssignment' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=1 diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicMemberAssignment.fir.kt.txt b/compiler/testData/ir/irJsText/dynamic/dynamicMemberAssignment.fir.kt.txt new file mode 100644 index 00000000000..423f93f656c --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicMemberAssignment.fir.kt.txt @@ -0,0 +1,14 @@ +fun testMemberAssignment(d: dynamic) { + d.m = 1 +} + +fun testSafeMemberAssignment(d: dynamic) { + { // BLOCK + val tmp0_safe_receiver: dynamic = d + when { + EQEQ(arg0 = tmp0_safe_receiver, arg1 = null) -> null + else -> tmp0_safe_receiver.m = 1 + } + } /*~> Unit */ +} + diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicMemberAugmentedAssignment.fir.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicMemberAugmentedAssignment.fir.ir.txt new file mode 100644 index 00000000000..3b807254943 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicMemberAugmentedAssignment.fir.ir.txt @@ -0,0 +1,107 @@ +FILE fqName: fileName:/dynamicMemberAugmentedAssignment.kt + FUN name:testAugmentedMemberAssignment visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Unit + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + DYN_OP operator=PLUSEQ type=kotlin.Unit + receiver: DYN_MEMBER memberName='m' type=dynamic + GET_VAR 'd: dynamic declared in .testAugmentedMemberAssignment' type=dynamic origin=null + 0: CONST String type=kotlin.String value="+=" + DYN_OP operator=MINUSEQ type=kotlin.Unit + receiver: DYN_MEMBER memberName='m' type=dynamic + GET_VAR 'd: dynamic declared in .testAugmentedMemberAssignment' type=dynamic origin=null + 0: CONST String type=kotlin.String value="-=" + DYN_OP operator=MULEQ type=kotlin.Unit + receiver: DYN_MEMBER memberName='m' type=dynamic + GET_VAR 'd: dynamic declared in .testAugmentedMemberAssignment' type=dynamic origin=null + 0: CONST String type=kotlin.String value="*=" + DYN_OP operator=DIVEQ type=kotlin.Unit + receiver: DYN_MEMBER memberName='m' type=dynamic + GET_VAR 'd: dynamic declared in .testAugmentedMemberAssignment' type=dynamic origin=null + 0: CONST String type=kotlin.String value="/=" + DYN_OP operator=MODEQ type=kotlin.Unit + receiver: DYN_MEMBER memberName='m' type=dynamic + GET_VAR 'd: dynamic declared in .testAugmentedMemberAssignment' type=dynamic origin=null + 0: CONST String type=kotlin.String value="%=" + FUN name:testSafeAugmentedMemberAssignment visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Unit + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + BLOCK type=kotlin.Unit? origin=SAFE_CALL + VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:dynamic [val] + GET_VAR 'd: dynamic declared in .testSafeAugmentedMemberAssignment' type=dynamic origin=null + WHEN type=kotlin.Unit? origin=null + BRANCH + if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ + arg0: GET_VAR 'val tmp_0: dynamic [val] declared in .testSafeAugmentedMemberAssignment' type=dynamic origin=null + arg1: CONST Null type=kotlin.Nothing? value=null + then: CONST Null type=kotlin.Nothing? value=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: DYN_OP operator=PLUSEQ type=kotlin.Unit + receiver: DYN_MEMBER memberName='m' type=dynamic + GET_VAR 'val tmp_0: dynamic [val] declared in .testSafeAugmentedMemberAssignment' type=dynamic origin=null + 0: CONST String type=kotlin.String value="+=" + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + BLOCK type=kotlin.Unit? origin=SAFE_CALL + VAR IR_TEMPORARY_VARIABLE name:tmp_1 type:dynamic [val] + GET_VAR 'd: dynamic declared in .testSafeAugmentedMemberAssignment' type=dynamic origin=null + WHEN type=kotlin.Unit? origin=null + BRANCH + if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ + arg0: GET_VAR 'val tmp_1: dynamic [val] declared in .testSafeAugmentedMemberAssignment' type=dynamic origin=null + arg1: CONST Null type=kotlin.Nothing? value=null + then: CONST Null type=kotlin.Nothing? value=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: DYN_OP operator=MINUSEQ type=kotlin.Unit + receiver: DYN_MEMBER memberName='m' type=dynamic + GET_VAR 'val tmp_1: dynamic [val] declared in .testSafeAugmentedMemberAssignment' type=dynamic origin=null + 0: CONST String type=kotlin.String value="-=" + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + BLOCK type=kotlin.Unit? origin=SAFE_CALL + VAR IR_TEMPORARY_VARIABLE name:tmp_2 type:dynamic [val] + GET_VAR 'd: dynamic declared in .testSafeAugmentedMemberAssignment' type=dynamic origin=null + WHEN type=kotlin.Unit? origin=null + BRANCH + if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ + arg0: GET_VAR 'val tmp_2: dynamic [val] declared in .testSafeAugmentedMemberAssignment' type=dynamic origin=null + arg1: CONST Null type=kotlin.Nothing? value=null + then: CONST Null type=kotlin.Nothing? value=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: DYN_OP operator=MULEQ type=kotlin.Unit + receiver: DYN_MEMBER memberName='m' type=dynamic + GET_VAR 'val tmp_2: dynamic [val] declared in .testSafeAugmentedMemberAssignment' type=dynamic origin=null + 0: CONST String type=kotlin.String value="*=" + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + BLOCK type=kotlin.Unit? origin=SAFE_CALL + VAR IR_TEMPORARY_VARIABLE name:tmp_3 type:dynamic [val] + GET_VAR 'd: dynamic declared in .testSafeAugmentedMemberAssignment' type=dynamic origin=null + WHEN type=kotlin.Unit? origin=null + BRANCH + if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ + arg0: GET_VAR 'val tmp_3: dynamic [val] declared in .testSafeAugmentedMemberAssignment' type=dynamic origin=null + arg1: CONST Null type=kotlin.Nothing? value=null + then: CONST Null type=kotlin.Nothing? value=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: DYN_OP operator=DIVEQ type=kotlin.Unit + receiver: DYN_MEMBER memberName='m' type=dynamic + GET_VAR 'val tmp_3: dynamic [val] declared in .testSafeAugmentedMemberAssignment' type=dynamic origin=null + 0: CONST String type=kotlin.String value="/=" + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + BLOCK type=kotlin.Unit? origin=SAFE_CALL + VAR IR_TEMPORARY_VARIABLE name:tmp_4 type:dynamic [val] + GET_VAR 'd: dynamic declared in .testSafeAugmentedMemberAssignment' type=dynamic origin=null + WHEN type=kotlin.Unit? origin=null + BRANCH + if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ + arg0: GET_VAR 'val tmp_4: dynamic [val] declared in .testSafeAugmentedMemberAssignment' type=dynamic origin=null + arg1: CONST Null type=kotlin.Nothing? value=null + then: CONST Null type=kotlin.Nothing? value=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: DYN_OP operator=MODEQ type=kotlin.Unit + receiver: DYN_MEMBER memberName='m' type=dynamic + GET_VAR 'val tmp_4: dynamic [val] declared in .testSafeAugmentedMemberAssignment' type=dynamic origin=null + 0: CONST String type=kotlin.String value="%=" diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicMemberAugmentedAssignment.fir.kt.txt b/compiler/testData/ir/irJsText/dynamic/dynamicMemberAugmentedAssignment.fir.kt.txt new file mode 100644 index 00000000000..923db22041f --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicMemberAugmentedAssignment.fir.kt.txt @@ -0,0 +1,46 @@ +fun testAugmentedMemberAssignment(d: dynamic) { + d.m += "+=" + d.m -= "-=" + d.m *= "*=" + d.m /= "/=" + d.m %= "%=" +} + +fun testSafeAugmentedMemberAssignment(d: dynamic) { + { // BLOCK + val tmp0_safe_receiver: dynamic = d + when { + EQEQ(arg0 = tmp0_safe_receiver, arg1 = null) -> null + else -> tmp0_safe_receiver.m += "+=" + } + } /*~> Unit */ + { // BLOCK + val tmp1_safe_receiver: dynamic = d + when { + EQEQ(arg0 = tmp1_safe_receiver, arg1 = null) -> null + else -> tmp1_safe_receiver.m -= "-=" + } + } /*~> Unit */ + { // BLOCK + val tmp2_safe_receiver: dynamic = d + when { + EQEQ(arg0 = tmp2_safe_receiver, arg1 = null) -> null + else -> tmp2_safe_receiver.m *= "*=" + } + } /*~> Unit */ + { // BLOCK + val tmp3_safe_receiver: dynamic = d + when { + EQEQ(arg0 = tmp3_safe_receiver, arg1 = null) -> null + else -> tmp3_safe_receiver.m /= "/=" + } + } /*~> Unit */ + { // BLOCK + val tmp4_safe_receiver: dynamic = d + when { + EQEQ(arg0 = tmp4_safe_receiver, arg1 = null) -> null + else -> tmp4_safe_receiver.m %= "%=" + } + } /*~> Unit */ +} + diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicMemberIncrementDecrement.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicMemberIncrementDecrement.ir.txt new file mode 100644 index 00000000000..c4ad7dd4613 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicMemberIncrementDecrement.ir.txt @@ -0,0 +1,83 @@ +FILE fqName: fileName:/dynamicMemberIncrementDecrement.kt + FUN name:testMemberIncrementDecrement visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Unit + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + VAR name:t1 type:dynamic [val] + DYN_OP operator=PREFIX_INCREMENT type=dynamic + receiver: DYN_MEMBER memberName='prefixIncr' type=dynamic + GET_VAR 'd: dynamic declared in .testMemberIncrementDecrement' type=dynamic origin=null + VAR name:t2 type:dynamic [val] + DYN_OP operator=PREFIX_DECREMENT type=dynamic + receiver: DYN_MEMBER memberName='prefixDecr' type=dynamic + GET_VAR 'd: dynamic declared in .testMemberIncrementDecrement' type=dynamic origin=null + VAR name:t3 type:dynamic [val] + DYN_OP operator=POSTFIX_INCREMENT type=dynamic + receiver: DYN_MEMBER memberName='postfixIncr' type=dynamic + GET_VAR 'd: dynamic declared in .testMemberIncrementDecrement' type=dynamic origin=null + VAR name:t4 type:dynamic [val] + DYN_OP operator=POSTFIX_DECREMENT type=dynamic + receiver: DYN_MEMBER memberName='postfixDecr' type=dynamic + GET_VAR 'd: dynamic declared in .testMemberIncrementDecrement' type=dynamic origin=null + FUN name:testSafeMemberIncrementDecrement visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Unit + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + VAR name:t1 type:dynamic [val] + BLOCK type=dynamic origin=SAFE_CALL + VAR IR_TEMPORARY_VARIABLE name:tmp_0 type:dynamic [val] + GET_VAR 'd: dynamic declared in .testSafeMemberIncrementDecrement' type=dynamic origin=null + WHEN type=dynamic origin=null + BRANCH + if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ + arg0: GET_VAR 'val tmp_0: dynamic [val] declared in .testSafeMemberIncrementDecrement' type=dynamic origin=null + arg1: CONST Null type=kotlin.Nothing? value=null + then: CONST Null type=kotlin.Nothing? value=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: DYN_OP operator=PREFIX_INCREMENT type=dynamic + receiver: DYN_MEMBER memberName='prefixIncr' type=dynamic + GET_VAR 'val tmp_0: dynamic [val] declared in .testSafeMemberIncrementDecrement' type=dynamic origin=null + VAR name:t2 type:dynamic [val] + BLOCK type=dynamic origin=SAFE_CALL + VAR IR_TEMPORARY_VARIABLE name:tmp_1 type:dynamic [val] + GET_VAR 'd: dynamic declared in .testSafeMemberIncrementDecrement' type=dynamic origin=null + WHEN type=dynamic origin=null + BRANCH + if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ + arg0: GET_VAR 'val tmp_1: dynamic [val] declared in .testSafeMemberIncrementDecrement' type=dynamic origin=null + arg1: CONST Null type=kotlin.Nothing? value=null + then: CONST Null type=kotlin.Nothing? value=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: DYN_OP operator=PREFIX_DECREMENT type=dynamic + receiver: DYN_MEMBER memberName='prefixDecr' type=dynamic + GET_VAR 'val tmp_1: dynamic [val] declared in .testSafeMemberIncrementDecrement' type=dynamic origin=null + VAR name:t3 type:dynamic [val] + BLOCK type=dynamic origin=SAFE_CALL + VAR IR_TEMPORARY_VARIABLE name:tmp_2 type:dynamic [val] + GET_VAR 'd: dynamic declared in .testSafeMemberIncrementDecrement' type=dynamic origin=null + WHEN type=dynamic origin=null + BRANCH + if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ + arg0: GET_VAR 'val tmp_2: dynamic [val] declared in .testSafeMemberIncrementDecrement' type=dynamic origin=null + arg1: CONST Null type=kotlin.Nothing? value=null + then: CONST Null type=kotlin.Nothing? value=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: DYN_OP operator=POSTFIX_INCREMENT type=dynamic + receiver: DYN_MEMBER memberName='postfixIncr' type=dynamic + GET_VAR 'val tmp_2: dynamic [val] declared in .testSafeMemberIncrementDecrement' type=dynamic origin=null + VAR name:t4 type:dynamic [val] + BLOCK type=dynamic origin=SAFE_CALL + VAR IR_TEMPORARY_VARIABLE name:tmp_3 type:dynamic [val] + GET_VAR 'd: dynamic declared in .testSafeMemberIncrementDecrement' type=dynamic origin=null + WHEN type=dynamic origin=null + BRANCH + if: CALL 'public final fun EQEQ (arg0: kotlin.Any?, arg1: kotlin.Any?): kotlin.Boolean declared in kotlin.internal.ir' type=kotlin.Boolean origin=EQEQ + arg0: GET_VAR 'val tmp_3: dynamic [val] declared in .testSafeMemberIncrementDecrement' type=dynamic origin=null + arg1: CONST Null type=kotlin.Nothing? value=null + then: CONST Null type=kotlin.Nothing? value=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: DYN_OP operator=POSTFIX_DECREMENT type=dynamic + receiver: DYN_MEMBER memberName='postfixDecr' type=dynamic + GET_VAR 'val tmp_3: dynamic [val] declared in .testSafeMemberIncrementDecrement' type=dynamic origin=null diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicMemberIncrementDecrement.kt b/compiler/testData/ir/irJsText/dynamic/dynamicMemberIncrementDecrement.kt index 9f8ce1dd8ac..0611eddf573 100644 --- a/compiler/testData/ir/irJsText/dynamic/dynamicMemberIncrementDecrement.kt +++ b/compiler/testData/ir/irJsText/dynamic/dynamicMemberIncrementDecrement.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun testMemberIncrementDecrement(d: dynamic) { val t1 = ++d.prefixIncr diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicUnaryOperator.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicUnaryOperator.ir.txt new file mode 100644 index 00000000000..a20103c524a --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicUnaryOperator.ir.txt @@ -0,0 +1,19 @@ +FILE fqName: fileName:/dynamicUnaryOperator.kt + FUN name:testUnaryMinus visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testUnaryMinus (d: dynamic): dynamic declared in ' + DYN_OP operator=UNARY_MINUS type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testUnaryMinus' type=dynamic origin=null + FUN name:testUnaryPlus visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testUnaryPlus (d: dynamic): dynamic declared in ' + DYN_OP operator=UNARY_PLUS type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testUnaryPlus' type=dynamic origin=null + FUN name:testExcl visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun testExcl (d: dynamic): dynamic declared in ' + DYN_OP operator=EXCL type=dynamic + receiver: GET_VAR 'd: dynamic declared in .testExcl' type=dynamic origin=null diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicUnaryOperator.kt b/compiler/testData/ir/irJsText/dynamic/dynamicUnaryOperator.kt index 9d4240a1f01..aa1a8cfce7e 100644 --- a/compiler/testData/ir/irJsText/dynamic/dynamicUnaryOperator.kt +++ b/compiler/testData/ir/irJsText/dynamic/dynamicUnaryOperator.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun testUnaryMinus(d: dynamic) = -d fun testUnaryPlus(d: dynamic) = +d fun testExcl(d: dynamic) = !d \ No newline at end of file diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicWithSmartCast.fir.ir.txt b/compiler/testData/ir/irJsText/dynamic/dynamicWithSmartCast.fir.ir.txt new file mode 100644 index 00000000000..dd9446e0445 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicWithSmartCast.fir.ir.txt @@ -0,0 +1,29 @@ +FILE fqName: fileName:/dynamicWithSmartCast.kt + FUN name:test1 visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Int + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test1 (d: dynamic): kotlin.Int declared in ' + WHEN type=kotlin.Int origin=IF + BRANCH + if: TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=kotlin.String + GET_VAR 'd: dynamic declared in .test1' type=dynamic origin=null + then: CALL 'public open fun (): kotlin.Int declared in kotlin.String' type=kotlin.Int origin=GET_PROPERTY + $this: TYPE_OP type=kotlin.String origin=IMPLICIT_DYNAMIC_CAST typeOperand=kotlin.String + GET_VAR 'd: dynamic declared in .test1' type=dynamic origin=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: CONST Int type=kotlin.Int value=-1 + FUN name:test2 visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Int + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test2 (d: dynamic): kotlin.Int declared in ' + WHEN type=kotlin.Int origin=IF + BRANCH + if: TYPE_OP type=kotlin.Boolean origin=INSTANCEOF typeOperand=kotlin.Array<*> + GET_VAR 'd: dynamic declared in .test2' type=dynamic origin=null + then: CALL 'public final fun (): kotlin.Int declared in kotlin.Array' type=kotlin.Int origin=GET_PROPERTY + $this: TYPE_OP type=kotlin.Array<*> origin=IMPLICIT_DYNAMIC_CAST typeOperand=kotlin.Array<*> + GET_VAR 'd: dynamic declared in .test2' type=dynamic origin=null + BRANCH + if: CONST Boolean type=kotlin.Boolean value=true + then: CONST Int type=kotlin.Int value=-1 diff --git a/compiler/testData/ir/irJsText/dynamic/dynamicWithSmartCast.fir.kt.txt b/compiler/testData/ir/irJsText/dynamic/dynamicWithSmartCast.fir.kt.txt new file mode 100644 index 00000000000..e94c5950c8a --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/dynamicWithSmartCast.fir.kt.txt @@ -0,0 +1,14 @@ +fun test1(d: dynamic): Int { + return when { + d is String -> d /*~> String */.() + else -> -1 + } +} + +fun test2(d: dynamic): Int { + return when { + d is Array<*> -> d /*~> Array<*> */.() + else -> -1 + } +} + diff --git a/compiler/testData/ir/irJsText/dynamic/implicitCastFromDynamic.ir.txt b/compiler/testData/ir/irJsText/dynamic/implicitCastFromDynamic.ir.txt new file mode 100644 index 00000000000..c17eacdd40d --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/implicitCastFromDynamic.ir.txt @@ -0,0 +1,48 @@ +FILE fqName: fileName:/implicitCastFromDynamic.kt + PROPERTY name:d visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:d type:dynamic visibility:private [final,static] + EXPRESSION_BODY + CONST Int type=kotlin.Int value=1 + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:dynamic + correspondingProperty: PROPERTY name:d visibility:public modality:FINAL [val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): dynamic declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:d type:dynamic visibility:private [final,static]' type=dynamic origin=null + PROPERTY name:p visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:p type:kotlin.Int visibility:private [final,static] + EXPRESSION_BODY + TYPE_OP type=kotlin.Int origin=IMPLICIT_DYNAMIC_CAST typeOperand=kotlin.Int + CALL 'public final fun (): dynamic declared in ' type=dynamic origin=GET_PROPERTY + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Int + correspondingProperty: PROPERTY name:p visibility:public modality:FINAL [val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:p type:kotlin.Int visibility:private [final,static]' type=kotlin.Int origin=null + FUN name:test1 visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Int + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test1 (d: dynamic): kotlin.Int declared in ' + TYPE_OP type=kotlin.Int origin=IMPLICIT_DYNAMIC_CAST typeOperand=kotlin.Int + GET_VAR 'd: dynamic declared in .test1' type=dynamic origin=null + FUN name:test2 visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Any + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test2 (d: dynamic): kotlin.Any declared in ' + TYPE_OP type=kotlin.Any origin=IMPLICIT_DYNAMIC_CAST typeOperand=kotlin.Any + GET_VAR 'd: dynamic declared in .test2' type=dynamic origin=null + FUN name:test3 visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Any? + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test3 (d: dynamic): kotlin.Any? declared in ' + GET_VAR 'd: dynamic declared in .test3' type=dynamic origin=null + FUN name:test4 visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.String + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test4 (d: dynamic): kotlin.String declared in ' + TYPE_OP type=kotlin.String origin=IMPLICIT_DYNAMIC_CAST typeOperand=kotlin.String + DYN_OP operator=INVOKE type=dynamic + receiver: DYN_MEMBER memberName='member' type=dynamic + GET_VAR 'd: dynamic declared in .test4' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=1 + 1: CONST Int type=kotlin.Int value=2 + 2: CONST Int type=kotlin.Int value=3 diff --git a/compiler/testData/ir/irJsText/dynamic/implicitCastFromDynamic.kt b/compiler/testData/ir/irJsText/dynamic/implicitCastFromDynamic.kt index 7fbe04ab6cf..8e5d8b86249 100644 --- a/compiler/testData/ir/irJsText/dynamic/implicitCastFromDynamic.kt +++ b/compiler/testData/ir/irJsText/dynamic/implicitCastFromDynamic.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL val d: dynamic = 1 val p: Int = d diff --git a/compiler/testData/ir/irJsText/dynamic/implicitCastToDynamic.fir.ir.txt b/compiler/testData/ir/irJsText/dynamic/implicitCastToDynamic.fir.ir.txt new file mode 100644 index 00000000000..d8a0a83b802 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/implicitCastToDynamic.fir.ir.txt @@ -0,0 +1,79 @@ +FILE fqName: fileName:/implicitCastToDynamic.kt + PROPERTY name:d1 visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:d1 type:dynamic visibility:private [final,static] + EXPRESSION_BODY + CONST Int type=kotlin.Int value=1 + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:dynamic + correspondingProperty: PROPERTY name:d1 visibility:public modality:FINAL [val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): dynamic declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:d1 type:dynamic visibility:private [final,static]' type=dynamic origin=null + PROPERTY name:p visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:p type:kotlin.Int visibility:private [final,static] + EXPRESSION_BODY + CONST Int type=kotlin.Int value=1 + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:kotlin.Int + correspondingProperty: PROPERTY name:p visibility:public modality:FINAL [val] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): kotlin.Int declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:p type:kotlin.Int visibility:private [final,static]' type=kotlin.Int origin=null + PROPERTY name:d2 visibility:public modality:FINAL [var] + FIELD PROPERTY_BACKING_FIELD name:d2 type:dynamic visibility:private [static] + EXPRESSION_BODY + CALL 'public final fun (): kotlin.Int declared in ' type=kotlin.Int origin=GET_PROPERTY + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> () returnType:dynamic + correspondingProperty: PROPERTY name:d2 visibility:public modality:FINAL [var] + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): dynamic declared in ' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:d2 type:dynamic visibility:private [static]' type=dynamic origin=null + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> (:dynamic) returnType:kotlin.Unit + correspondingProperty: PROPERTY name:d2 visibility:public modality:FINAL [var] + VALUE_PARAMETER name: index:0 type:dynamic + BLOCK_BODY + SET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:d2 type:dynamic visibility:private [static]' type=kotlin.Unit origin=null + value: GET_VAR ': dynamic declared in .' type=dynamic origin=null + FUN name:withDynamic visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic + VALUE_PARAMETER name:d index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun withDynamic (d: dynamic): dynamic declared in ' + GET_VAR 'd: dynamic declared in .withDynamic' type=dynamic origin=null + FUN name:test1 visibility:public modality:FINAL <> (s:kotlin.String) returnType:kotlin.Unit + VALUE_PARAMETER name:s index:0 type:kotlin.String + BLOCK_BODY + TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit + CALL 'public final fun withDynamic (d: dynamic): dynamic declared in ' type=dynamic origin=null + d: GET_VAR 's: kotlin.String declared in .test1' type=kotlin.String origin=null + FUN name:test2 visibility:public modality:FINAL <> (a:kotlin.Any) returnType:kotlin.Unit + VALUE_PARAMETER name:a index:0 type:kotlin.Any + BLOCK_BODY + VAR name:d type:dynamic [val] + GET_VAR 'a: kotlin.Any declared in .test2' type=kotlin.Any origin=null + FUN name:test3 visibility:public modality:FINAL <> (a:kotlin.Any?) returnType:kotlin.Unit + VALUE_PARAMETER name:a index:0 type:kotlin.Any? + BLOCK_BODY + VAR name:d type:dynamic [val] + GET_VAR 'a: kotlin.Any? declared in .test3' type=kotlin.Any? origin=null + FUN name:test4 visibility:public modality:FINAL <> (a:kotlin.Any, s:kotlin.String, na:kotlin.Any?) returnType:kotlin.Unit + VALUE_PARAMETER name:a index:0 type:kotlin.Any + VALUE_PARAMETER name:s index:1 type:kotlin.String + VALUE_PARAMETER name:na index:2 type:kotlin.Any? + BLOCK_BODY + VAR name:d type:dynamic [var] + CALL 'public final fun (): kotlin.Int declared in ' type=kotlin.Int origin=GET_PROPERTY + SET_VAR 'var d: dynamic [var] declared in .test4' type=kotlin.Unit origin=EQ + GET_VAR 'a: kotlin.Any declared in .test4' type=kotlin.Any origin=null + SET_VAR 'var d: dynamic [var] declared in .test4' type=kotlin.Unit origin=EQ + GET_VAR 'na: kotlin.Any? declared in .test4' type=kotlin.Any? origin=null + SET_VAR 'var d: dynamic [var] declared in .test4' type=kotlin.Unit origin=EQ + GET_VAR 's: kotlin.String declared in .test4' type=kotlin.String origin=null + FUN name:test5 visibility:public modality:FINAL <> (a:kotlin.Any, s:kotlin.String, na:kotlin.Any?) returnType:kotlin.Unit + VALUE_PARAMETER name:a index:0 type:kotlin.Any + VALUE_PARAMETER name:s index:1 type:kotlin.String + VALUE_PARAMETER name:na index:2 type:kotlin.Any? + BLOCK_BODY + CALL 'public final fun (: dynamic): kotlin.Unit declared in ' type=kotlin.Unit origin=EQ + : GET_VAR 'a: kotlin.Any declared in .test5' type=kotlin.Any origin=null + CALL 'public final fun (: dynamic): kotlin.Unit declared in ' type=kotlin.Unit origin=EQ + : GET_VAR 'na: kotlin.Any? declared in .test5' type=kotlin.Any? origin=null + CALL 'public final fun (: dynamic): kotlin.Unit declared in ' type=kotlin.Unit origin=EQ + : GET_VAR 's: kotlin.String declared in .test5' type=kotlin.String origin=null diff --git a/compiler/testData/ir/irJsText/dynamic/implicitCastToDynamic.fir.kt.txt b/compiler/testData/ir/irJsText/dynamic/implicitCastToDynamic.fir.kt.txt new file mode 100644 index 00000000000..f6b20195db7 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/implicitCastToDynamic.fir.kt.txt @@ -0,0 +1,42 @@ +val d1: dynamic + field = 1 + get + +val p: Int + field = 1 + get + +var d2: dynamic + field = () + get + set + +fun withDynamic(d: dynamic): dynamic { + return d +} + +fun test1(s: String) { + withDynamic(d = s) /*~> Unit */ +} + +fun test2(a: Any) { + val d: dynamic = a +} + +fun test3(a: Any?) { + val d: dynamic = a +} + +fun test4(a: Any, s: String, na: Any?) { + var d: dynamic = () + d = a + d = na + d = s +} + +fun test5(a: Any, s: String, na: Any?) { + ( = a) + ( = na) + ( = s) +} + diff --git a/compiler/testData/ir/irJsText/dynamic/invokeOperator.ir.txt b/compiler/testData/ir/irJsText/dynamic/invokeOperator.ir.txt new file mode 100644 index 00000000000..f0e53697f11 --- /dev/null +++ b/compiler/testData/ir/irJsText/dynamic/invokeOperator.ir.txt @@ -0,0 +1,61 @@ +FILE fqName: fileName:/invokeOperator.kt + FUN name:invoke visibility:public modality:FINAL <> () returnType:kotlin.Unit + BLOCK_BODY + FUN name:test1 visibility:public modality:FINAL <> (a:dynamic) returnType:dynamic + VALUE_PARAMETER name:a index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test1 (a: dynamic): dynamic declared in ' + DYN_OP operator=INVOKE type=dynamic + receiver: GET_VAR 'a: dynamic declared in .test1' type=dynamic origin=VARIABLE_AS_FUNCTION + 0: CONST Int type=kotlin.Int value=1 + FUN name:test2 visibility:public modality:FINAL <> (a:dynamic) returnType:dynamic + VALUE_PARAMETER name:a index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test2 (a: dynamic): dynamic declared in ' + DYN_OP operator=INVOKE type=dynamic + receiver: DYN_MEMBER memberName='invoke' type=dynamic + GET_VAR 'a: dynamic declared in .test2' type=dynamic origin=null + 0: CONST Int type=kotlin.Int value=1 + FUN name:test3 visibility:public modality:FINAL <> (a:dynamic, b:dynamic) returnType:dynamic + VALUE_PARAMETER name:a index:0 type:dynamic + VALUE_PARAMETER name:b index:1 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test3 (a: dynamic, b: dynamic): dynamic declared in ' + DYN_OP operator=INVOKE type=dynamic + receiver: GET_VAR 'a: dynamic declared in .test3' type=dynamic origin=VARIABLE_AS_FUNCTION + 0: GET_VAR 'b: dynamic declared in .test3' type=dynamic origin=null + FUN name:test4 visibility:public modality:FINAL <> (a:dynamic, b:dynamic) returnType:dynamic + VALUE_PARAMETER name:a index:0 type:dynamic + VALUE_PARAMETER name:b index:1 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test4 (a: dynamic, b: dynamic): dynamic declared in ' + DYN_OP operator=INVOKE type=dynamic + receiver: DYN_MEMBER memberName='invoke' type=dynamic + GET_VAR 'a: dynamic declared in .test4' type=dynamic origin=null + 0: GET_VAR 'b: dynamic declared in .test4' type=dynamic origin=null + FUN name:test5 visibility:public modality:FINAL <> (a:dynamic, b:dynamic) returnType:dynamic + VALUE_PARAMETER name:a index:0 type:dynamic + VALUE_PARAMETER name:b index:1 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test5 (a: dynamic, b: dynamic): dynamic declared in ' + DYN_OP operator=INVOKE type=dynamic + receiver: DYN_OP operator=INVOKE type=dynamic + receiver: GET_VAR 'a: dynamic declared in .test5' type=dynamic origin=VARIABLE_AS_FUNCTION + 0: GET_VAR 'b: dynamic declared in .test5' type=dynamic origin=null + 0: GET_VAR 'b: dynamic declared in .test5' type=dynamic origin=null + FUN name:test6 visibility:public modality:FINAL <> (a:dynamic, b:dynamic) returnType:dynamic + VALUE_PARAMETER name:a index:0 type:dynamic + VALUE_PARAMETER name:b index:1 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test6 (a: dynamic, b: dynamic): dynamic declared in ' + DYN_OP operator=INVOKE type=dynamic + receiver: DYN_MEMBER memberName='invoke' type=dynamic + DYN_OP operator=INVOKE type=dynamic + receiver: GET_VAR 'a: dynamic declared in .test6' type=dynamic origin=VARIABLE_AS_FUNCTION + 0: GET_VAR 'b: dynamic declared in .test6' type=dynamic origin=null + 0: GET_VAR 'b: dynamic declared in .test6' type=dynamic origin=null + FUN name:test7 visibility:public modality:FINAL <> (a:dynamic) returnType:kotlin.Unit + VALUE_PARAMETER name:a index:0 type:dynamic + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun test7 (a: dynamic): kotlin.Unit declared in ' + CALL 'public final fun invoke (): kotlin.Unit declared in ' type=kotlin.Unit origin=null diff --git a/compiler/testData/ir/irJsText/dynamic/invokeOperator.kt b/compiler/testData/ir/irJsText/dynamic/invokeOperator.kt index cde4c76f6a3..7d72c50a96d 100644 --- a/compiler/testData/ir/irJsText/dynamic/invokeOperator.kt +++ b/compiler/testData/ir/irJsText/dynamic/invokeOperator.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun invoke() {} fun test1(a: dynamic) = a(1) diff --git a/compiler/testData/ir/irJsText/external/kt38765.fir.ir.txt b/compiler/testData/ir/irJsText/external/kt38765.fir.ir.txt new file mode 100644 index 00000000000..35a662d173f --- /dev/null +++ b/compiler/testData/ir/irJsText/external/kt38765.fir.ir.txt @@ -0,0 +1,151 @@ +FILE fqName:events fileName:/kt38765.kt + CLASS CLASS name:internal modality:OPEN visibility:public [external] superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:events.internal + CONSTRUCTOR visibility:public <> () returnType:events.internal [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:internal modality:OPEN visibility:public [external] superTypes:[kotlin.Any]' + CLASS CLASS name:EventEmitterP modality:OPEN visibility:public superTypes:[events.internal] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:events.internal.EventEmitterP + CONSTRUCTOR visibility:public <> () returnType:events.internal.EventEmitterP [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in events.internal' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:EventEmitterP modality:OPEN visibility:public superTypes:[events.internal]' + 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 [fake_override,operator] declared in events.internal + $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 [fake_override] declared in events.internal + $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 [fake_override] declared in events.internal + $this: VALUE_PARAMETER name: type:kotlin.Any + CLASS CLASS name:EventEmitterS modality:OPEN visibility:public superTypes:[events.internal] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:events.internal.EventEmitterS + CONSTRUCTOR visibility:public <> (a:kotlin.Any) returnType:events.internal.EventEmitterS + VALUE_PARAMETER name:a index:0 type:kotlin.Any + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in events.internal' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:EventEmitterS modality:OPEN visibility:public superTypes:[events.internal]' + 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 [fake_override,operator] declared in events.internal + $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 [fake_override] declared in events.internal + $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 [fake_override] declared in events.internal + $this: VALUE_PARAMETER name: type:kotlin.Any + CLASS OBJECT name:NestedExternalObject modality:FINAL visibility:public superTypes:[events.internal] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:events.internal.NestedExternalObject + CONSTRUCTOR visibility:private <> () returnType:events.internal.NestedExternalObject [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in events.internal' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS OBJECT name:NestedExternalObject modality:FINAL visibility:public superTypes:[events.internal]' + 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 [fake_override,operator] declared in events.internal + $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 [fake_override] declared in events.internal + $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 [fake_override] declared in events.internal + $this: VALUE_PARAMETER name: type:kotlin.Any + CLASS ENUM_CLASS name:NestedExternalEnum modality:FINAL visibility:public superTypes:[kotlin.Enum] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:events.internal.NestedExternalEnum + CONSTRUCTOR visibility:private <> () returnType:events.internal.NestedExternalEnum [primary] + BLOCK_BODY + ENUM_CONSTRUCTOR_CALL 'public constructor (name: kotlin.String, ordinal: kotlin.Int) [primary] declared in kotlin.Enum' + : events.internal.NestedExternalEnum + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS ENUM_CLASS name:NestedExternalEnum modality:FINAL visibility:public superTypes:[kotlin.Enum]' + ENUM_ENTRY name:A + init: EXPRESSION_BODY + ENUM_CONSTRUCTOR_CALL 'private constructor () [primary] declared in events.internal.NestedExternalEnum' + ENUM_ENTRY name:B + init: EXPRESSION_BODY + ENUM_CONSTRUCTOR_CALL 'private constructor () [primary] declared in events.internal.NestedExternalEnum' + FUN ENUM_CLASS_SPECIAL_MEMBER name:values visibility:public modality:FINAL <> () returnType:kotlin.Array + SYNTHETIC_BODY kind=ENUM_VALUES + FUN ENUM_CLASS_SPECIAL_MEMBER name:valueOf visibility:public modality:FINAL <> (value:kotlin.String) returnType:events.internal.NestedExternalEnum + VALUE_PARAMETER name:value index:0 type:kotlin.String + SYNTHETIC_BODY kind=ENUM_VALUEOF + FUN FAKE_OVERRIDE name:clone visibility:protected modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Any [fake_override] + overridden: + protected final fun clone (): kotlin.Any declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum + FUN FAKE_OVERRIDE name:compareTo visibility:public modality:FINAL <> ($this:kotlin.Enum, other:events.internal.NestedExternalEnum) returnType:kotlin.Int [fake_override,operator] + overridden: + public final fun compareTo (other: E of kotlin.Enum): kotlin.Int [operator] declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum + VALUE_PARAMETER name:other index:0 type:events.internal.NestedExternalEnum + FUN FAKE_OVERRIDE name:equals visibility:public modality:FINAL <> ($this:kotlin.Enum, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public final fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int [fake_override] + overridden: + public final fun hashCode (): kotlin.Int declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Enum) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum + PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL [fake_override,val] + annotations: + IntrinsicConstEvaluation + overridden: + public final name: kotlin.String [val] + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.String [fake_override] + correspondingProperty: PROPERTY FAKE_OVERRIDE name:name visibility:public modality:FINAL [fake_override,val] + overridden: + public final fun (): kotlin.String declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum + PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL [fake_override,val] + overridden: + public final ordinal: kotlin.Int [val] + FUN FAKE_OVERRIDE name: visibility:public modality:FINAL <> ($this:kotlin.Enum) returnType:kotlin.Int [fake_override] + correspondingProperty: PROPERTY FAKE_OVERRIDE name:ordinal visibility:public modality:FINAL [fake_override,val] + overridden: + public final fun (): kotlin.Int declared in kotlin.Enum + $this: VALUE_PARAMETER name: type:kotlin.Enum + CLASS INTERFACE name:NestedExternalInterface modality:ABSTRACT visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:events.internal.NestedExternalInterface + 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 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 diff --git a/compiler/testData/ir/irJsText/external/kt38765.fir.kt.txt b/compiler/testData/ir/irJsText/external/kt38765.fir.kt.txt new file mode 100644 index 00000000000..477c488a046 --- /dev/null +++ b/compiler/testData/ir/irJsText/external/kt38765.fir.kt.txt @@ -0,0 +1,58 @@ +package events + +open external class internal { + constructor() /* primary */ { + super/*Any*/() + /* () */ + + } + + open class EventEmitterP : internal { + constructor() /* primary */ { + super/*internal*/() + /* () */ + + } + + } + + open class EventEmitterS : internal { + constructor(a: Any) { + super/*internal*/() + /* () */ + + } + + } + + object NestedExternalObject : internal { + private constructor() /* primary */ { + super/*internal*/() + /* () */ + + } + + } + + enum class NestedExternalEnum : Enum { + private constructor() /* primary */ { + super/*Enum*/() + /* () */ + + } + + A = NestedExternalEnum() + + B = NestedExternalEnum() + + fun values(): Array /* Synthetic body for ENUM_VALUES */ + + fun valueOf(value: String): NestedExternalEnum /* Synthetic body for ENUM_VALUEOF */ + + } + + interface NestedExternalInterface { + + } + +} diff --git a/compiler/testData/ir/irJsText/native/nativeNativeKotlin.fir.ir.txt b/compiler/testData/ir/irJsText/native/nativeNativeKotlin.fir.ir.txt new file mode 100644 index 00000000000..d8656a63fe0 --- /dev/null +++ b/compiler/testData/ir/irJsText/native/nativeNativeKotlin.fir.ir.txt @@ -0,0 +1,80 @@ +FILE fqName:foo fileName:/nativeNativeKotlin.kt + CLASS CLASS name:A modality:OPEN visibility:public [external] superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:foo.A + CONSTRUCTOR visibility:public <> () returnType:foo.A [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:A modality:OPEN visibility:public [external] superTypes:[kotlin.Any]' + FUN name:foo visibility:public modality:FINAL <> ($this:foo.A) returnType:kotlin.String + $this: VALUE_PARAMETER name: type:foo.A + 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 + CLASS CLASS name:B modality:OPEN visibility:public [external] superTypes:[foo.A] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:foo.B + CONSTRUCTOR visibility:public <> () returnType:foo.B [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in foo.A' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:B modality:OPEN visibility:public [external] superTypes:[foo.A]' + FUN name:bar visibility:public modality:FINAL <> ($this:foo.B) returnType:kotlin.String + $this: VALUE_PARAMETER name: type:foo.B + FUN FAKE_OVERRIDE name:foo visibility:public modality:FINAL <> ($this:foo.A) returnType:kotlin.String [fake_override] + overridden: + public final fun foo (): kotlin.String declared in foo.A + $this: VALUE_PARAMETER name: type:foo.A + 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 [fake_override,operator] declared in foo.A + $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 [fake_override] declared in foo.A + $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 [fake_override] declared in foo.A + $this: VALUE_PARAMETER name: type:kotlin.Any + CLASS CLASS name:C modality:FINAL visibility:public superTypes:[foo.B] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:foo.C + CONSTRUCTOR visibility:public <> () returnType:foo.C [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in foo.B' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:C modality:FINAL visibility:public superTypes:[foo.B]' + FUN FAKE_OVERRIDE name:bar visibility:public modality:FINAL <> ($this:foo.B) returnType:kotlin.String [fake_override] + overridden: + public final fun bar (): kotlin.String declared in foo.B + $this: VALUE_PARAMETER name: type:foo.B + FUN FAKE_OVERRIDE name:foo visibility:public modality:FINAL <> ($this:foo.A) returnType:kotlin.String [fake_override] + overridden: + public final fun foo (): kotlin.String [fake_override] declared in foo.B + $this: VALUE_PARAMETER name: type:foo.A + 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 [fake_override,operator] declared in foo.B + $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 [fake_override] declared in foo.B + $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 [fake_override] declared in foo.B + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN name:box visibility:public modality:FINAL <> () returnType:kotlin.String + BLOCK_BODY + VAR name:c type:foo.C [val] + CONSTRUCTOR_CALL 'public constructor () [primary] declared in foo.C' type=foo.C origin=null + RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in foo' + CONST String type=kotlin.String value="OK" diff --git a/compiler/testData/ir/irJsText/native/nativeNativeKotlin.fir.kt.txt b/compiler/testData/ir/irJsText/native/nativeNativeKotlin.fir.kt.txt new file mode 100644 index 00000000000..dd9dfda4280 --- /dev/null +++ b/compiler/testData/ir/irJsText/native/nativeNativeKotlin.fir.kt.txt @@ -0,0 +1,37 @@ +package foo + +open external class A { + constructor() /* primary */ { + super/*Any*/() + /* () */ + + } + + fun foo(): String + +} + +open external class B : A { + constructor() /* primary */ { + super/*A*/() + /* () */ + + } + + fun bar(): String + +} + +class C : B { + constructor() /* primary */ { + super/*B*/() + /* () */ + + } + +} + +fun box(): String { + val c: C = C() + return "OK" +}