psi2ir: dynamic member simple assignment/augmented assignment/++/--
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
fun testMemberAssignment(d: dynamic) {
|
||||
d.m = 1
|
||||
}
|
||||
|
||||
fun testSafeMemberAssignment(d: dynamic) {
|
||||
d?.m = 1
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
FILE fqName:<root> fileName:/dynamicMemberAssignment.kt
|
||||
FUN name:testMemberAssignment visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Unit flags:
|
||||
VALUE_PARAMETER name:d index:0 type:dynamic flags:
|
||||
BLOCK_BODY
|
||||
DYN_OP operator=EQ type=kotlin.Unit
|
||||
receiver: GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
|
||||
0: CONST Int type=kotlin.Int value=1
|
||||
FUN name:testSafeMemberAssignment visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Unit flags:
|
||||
VALUE_PARAMETER name:d index:0 type:dynamic flags:
|
||||
BLOCK_BODY
|
||||
BLOCK type=kotlin.Unit origin=SAFE_CALL
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp0_safe_receiver type:dynamic flags:val
|
||||
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
|
||||
WHEN type=kotlin.Unit origin=null
|
||||
BRANCH
|
||||
if: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'tmp0_safe_receiver: dynamic' type=dynamic origin=null
|
||||
arg1: CONST Null type=kotlin.Nothing? value=null
|
||||
then: TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
|
||||
typeOperand: CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public flags: superTypes:[kotlin.Any]
|
||||
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: GET_VAR 'tmp0_safe_receiver: dynamic' type=dynamic origin=null
|
||||
0: CONST Int type=kotlin.Int value=1
|
||||
@@ -0,0 +1,16 @@
|
||||
fun testAugmentedMemberAssignment(d: dynamic) {
|
||||
d.m += "+="
|
||||
d.m -= "-="
|
||||
d.m *= "*="
|
||||
d.m /= "/="
|
||||
d.m %= "%="
|
||||
}
|
||||
|
||||
// see KT-29768
|
||||
fun testSafeAugmentedMemberAssignment(d: dynamic) {
|
||||
d?.m += "+="
|
||||
d?.m -= "-="
|
||||
d?.m *= "*="
|
||||
d?.m /= "/="
|
||||
d?.m %= "%="
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
FILE fqName:<root> fileName:/dynamicMemberAugmentedAssignment.kt
|
||||
FUN name:testAugmentedMemberAssignment visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Unit flags:
|
||||
VALUE_PARAMETER name:d index:0 type:dynamic flags:
|
||||
BLOCK_BODY
|
||||
DYN_OP operator=PLUSEQ type=kotlin.Unit
|
||||
receiver: DYN_MEMBER memberName='m' type=dynamic
|
||||
GET_VAR 'value-parameter d: dynamic' 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 'value-parameter d: dynamic' 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 'value-parameter d: dynamic' 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 'value-parameter d: dynamic' 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 'value-parameter d: dynamic' type=dynamic origin=null
|
||||
0: CONST String type=kotlin.String value="%="
|
||||
FUN name:testSafeAugmentedMemberAssignment visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Unit flags:
|
||||
VALUE_PARAMETER name:d index:0 type:dynamic flags:
|
||||
BLOCK_BODY
|
||||
BLOCK type=kotlin.Unit origin=SAFE_CALL
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp0_safe_receiver type:dynamic flags:val
|
||||
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
|
||||
WHEN type=kotlin.Unit origin=null
|
||||
BRANCH
|
||||
if: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'tmp0_safe_receiver: dynamic' type=dynamic origin=null
|
||||
arg1: CONST Null type=kotlin.Nothing? value=null
|
||||
then: TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
|
||||
typeOperand: CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public flags: superTypes:[kotlin.Any]
|
||||
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 'tmp0_safe_receiver: dynamic' type=dynamic origin=null
|
||||
0: CONST String type=kotlin.String value="+="
|
||||
BLOCK type=kotlin.Unit origin=SAFE_CALL
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp1_safe_receiver type:dynamic flags:val
|
||||
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
|
||||
WHEN type=kotlin.Unit origin=null
|
||||
BRANCH
|
||||
if: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'tmp1_safe_receiver: dynamic' type=dynamic origin=null
|
||||
arg1: CONST Null type=kotlin.Nothing? value=null
|
||||
then: TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
|
||||
typeOperand: CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public flags: superTypes:[kotlin.Any]
|
||||
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 'tmp1_safe_receiver: dynamic' type=dynamic origin=null
|
||||
0: CONST String type=kotlin.String value="-="
|
||||
BLOCK type=kotlin.Unit origin=SAFE_CALL
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp2_safe_receiver type:dynamic flags:val
|
||||
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
|
||||
WHEN type=kotlin.Unit origin=null
|
||||
BRANCH
|
||||
if: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'tmp2_safe_receiver: dynamic' type=dynamic origin=null
|
||||
arg1: CONST Null type=kotlin.Nothing? value=null
|
||||
then: TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
|
||||
typeOperand: CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public flags: superTypes:[kotlin.Any]
|
||||
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 'tmp2_safe_receiver: dynamic' type=dynamic origin=null
|
||||
0: CONST String type=kotlin.String value="*="
|
||||
BLOCK type=kotlin.Unit origin=SAFE_CALL
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp3_safe_receiver type:dynamic flags:val
|
||||
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
|
||||
WHEN type=kotlin.Unit origin=null
|
||||
BRANCH
|
||||
if: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'tmp3_safe_receiver: dynamic' type=dynamic origin=null
|
||||
arg1: CONST Null type=kotlin.Nothing? value=null
|
||||
then: TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
|
||||
typeOperand: CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public flags: superTypes:[kotlin.Any]
|
||||
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 'tmp3_safe_receiver: dynamic' type=dynamic origin=null
|
||||
0: CONST String type=kotlin.String value="/="
|
||||
BLOCK type=kotlin.Unit origin=SAFE_CALL
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp4_safe_receiver type:dynamic flags:val
|
||||
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
|
||||
WHEN type=kotlin.Unit origin=null
|
||||
BRANCH
|
||||
if: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'tmp4_safe_receiver: dynamic' type=dynamic origin=null
|
||||
arg1: CONST Null type=kotlin.Nothing? value=null
|
||||
then: TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit
|
||||
typeOperand: CLASS IR_EXTERNAL_DECLARATION_STUB OBJECT name:Unit modality:FINAL visibility:public flags: superTypes:[kotlin.Any]
|
||||
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 'tmp4_safe_receiver: dynamic' type=dynamic origin=null
|
||||
0: CONST String type=kotlin.String value="%="
|
||||
@@ -0,0 +1,14 @@
|
||||
|
||||
fun testMemberIncrementDecrement(d: dynamic) {
|
||||
val t1 = ++d.prefixIncr
|
||||
val t2 = --d.prefixDecr
|
||||
val t3 = d.postfixIncr++
|
||||
val t4 = d.postfixDecr--
|
||||
}
|
||||
|
||||
fun testSafeMemberIncrementDecrement(d: dynamic) {
|
||||
val t1 = ++d?.prefixIncr
|
||||
val t2 = --d?.prefixDecr
|
||||
val t3 = d?.postfixIncr++
|
||||
val t4 = d?.postfixDecr--
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
FILE fqName:<root> fileName:/dynamicMemberIncrementDecrement.kt
|
||||
FUN name:testMemberIncrementDecrement visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Unit flags:
|
||||
VALUE_PARAMETER name:d index:0 type:dynamic flags:
|
||||
BLOCK_BODY
|
||||
VAR name:t1 type:dynamic flags:val
|
||||
DYN_OP operator=PREFIX_INCREMENT type=dynamic
|
||||
receiver: DYN_MEMBER memberName='prefixIncr' type=dynamic
|
||||
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
|
||||
VAR name:t2 type:dynamic flags:val
|
||||
DYN_OP operator=PREFIX_DECREMENT type=dynamic
|
||||
receiver: DYN_MEMBER memberName='prefixDecr' type=dynamic
|
||||
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
|
||||
VAR name:t3 type:dynamic flags:val
|
||||
DYN_OP operator=POSTFIX_INCREMENT type=dynamic
|
||||
receiver: DYN_MEMBER memberName='postfixIncr' type=dynamic
|
||||
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
|
||||
VAR name:t4 type:dynamic flags:val
|
||||
DYN_OP operator=POSTFIX_DECREMENT type=dynamic
|
||||
receiver: DYN_MEMBER memberName='postfixDecr' type=dynamic
|
||||
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
|
||||
FUN name:testSafeMemberIncrementDecrement visibility:public modality:FINAL <> (d:dynamic) returnType:kotlin.Unit flags:
|
||||
VALUE_PARAMETER name:d index:0 type:dynamic flags:
|
||||
BLOCK_BODY
|
||||
VAR name:t1 type:dynamic flags:val
|
||||
BLOCK type=dynamic origin=SAFE_CALL
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp0_safe_receiver type:dynamic flags:val
|
||||
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
|
||||
WHEN type=dynamic origin=null
|
||||
BRANCH
|
||||
if: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'tmp0_safe_receiver: dynamic' 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 'tmp0_safe_receiver: dynamic' type=dynamic origin=null
|
||||
VAR name:t2 type:dynamic flags:val
|
||||
BLOCK type=dynamic origin=SAFE_CALL
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp1_safe_receiver type:dynamic flags:val
|
||||
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
|
||||
WHEN type=dynamic origin=null
|
||||
BRANCH
|
||||
if: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'tmp1_safe_receiver: dynamic' 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 'tmp1_safe_receiver: dynamic' type=dynamic origin=null
|
||||
VAR name:t3 type:dynamic flags:val
|
||||
BLOCK type=dynamic origin=SAFE_CALL
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp2_safe_receiver type:dynamic flags:val
|
||||
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
|
||||
WHEN type=dynamic origin=null
|
||||
BRANCH
|
||||
if: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'tmp2_safe_receiver: dynamic' 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 'tmp2_safe_receiver: dynamic' type=dynamic origin=null
|
||||
VAR name:t4 type:dynamic flags:val
|
||||
BLOCK type=dynamic origin=SAFE_CALL
|
||||
VAR IR_TEMPORARY_VARIABLE name:tmp3_safe_receiver type:dynamic flags:val
|
||||
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
|
||||
WHEN type=dynamic origin=null
|
||||
BRANCH
|
||||
if: CALL 'EQEQ(Any?, Any?): Boolean' type=kotlin.Boolean origin=EQEQ
|
||||
arg0: GET_VAR 'tmp3_safe_receiver: dynamic' 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 'tmp3_safe_receiver: dynamic' type=dynamic origin=null
|
||||
Reference in New Issue
Block a user