psi2ir: dynamic array element get/set

This commit is contained in:
Dmitry Petrov
2019-02-11 14:17:06 +03:00
parent 9a2bd5f4e6
commit fbbe4f6e92
12 changed files with 273 additions and 24 deletions
@@ -0,0 +1,5 @@
fun testArrayAccess1(d: dynamic) = d["KEY"]
fun testArrayAccess2(d: dynamic) = d()["KEY"]
fun testArrayAccess3(d: dynamic) = d.get("KEY")
@@ -0,0 +1,24 @@
FILE fqName:<root> fileName:/dynamicArrayAccess.kt
FUN name:testArrayAccess1 visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic flags:
VALUE_PARAMETER name:d index:0 type:dynamic flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='testArrayAccess1(dynamic): dynamic'
DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
0: CONST String type=kotlin.String value="KEY"
FUN name:testArrayAccess2 visibility:public modality:FINAL <> (d:dynamic) returnType:dynamic flags:
VALUE_PARAMETER name:d index:0 type:dynamic flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='testArrayAccess2(dynamic): dynamic'
DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: DYN_OP operator=INVOKE type=dynamic
receiver: GET_VAR 'value-parameter d: dynamic' 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 flags:
VALUE_PARAMETER name:d index:0 type:dynamic flags:
BLOCK_BODY
RETURN type=kotlin.Nothing from='testArrayAccess3(dynamic): dynamic'
DYN_OP operator=INVOKE type=dynamic
receiver: DYN_MEMBER memberName='get' type=dynamic
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
0: CONST String type=kotlin.String value="KEY"
@@ -0,0 +1,7 @@
fun testArrayAssignment(d: dynamic) {
d["KEY"] = 1
}
fun testArrayAssignmentFake(d: dynamic) {
d.set("KEY", 2)
}
@@ -0,0 +1,17 @@
FILE fqName:<root> fileName:/dynamicArrayAssignment.kt
FUN name:testArrayAssignment 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=dynamic
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'value-parameter d: dynamic' 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 flags:
VALUE_PARAMETER name:d index:0 type:dynamic flags:
BLOCK_BODY
DYN_OP operator=INVOKE type=dynamic
receiver: DYN_MEMBER memberName='set' type=dynamic
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
0: CONST String type=kotlin.String value="KEY"
1: CONST Int type=kotlin.Int value=2
@@ -0,0 +1,7 @@
fun testArrayAugmentedAssignment(d: dynamic) {
d["KEY"] += "+="
d["KEY"] -= "-="
d["KEY"] *= "*="
d["KEY"] /= "/="
d["KEY"] %= "%="
}
@@ -0,0 +1,54 @@
FILE fqName:<root> fileName:/dynamicArrayAugmentedAssignment.kt
FUN name:testArrayAugmentedAssignment 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=PLUSEQ
VAR IR_TEMPORARY_VARIABLE name:tmp0_array type:dynamic flags:val
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
VAR IR_TEMPORARY_VARIABLE name:tmp1_index0 type:kotlin.String flags:val
CONST String type=kotlin.String value="KEY"
DYN_OP operator=PLUSEQ type=kotlin.Unit
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'tmp0_array: dynamic' type=dynamic origin=null
0: GET_VAR 'tmp1_index0: String' type=kotlin.String origin=null
0: CONST String type=kotlin.String value="+="
BLOCK type=kotlin.Unit origin=MINUSEQ
VAR IR_TEMPORARY_VARIABLE name:tmp2_array type:dynamic flags:val
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
VAR IR_TEMPORARY_VARIABLE name:tmp3_index0 type:kotlin.String flags:val
CONST String type=kotlin.String value="KEY"
DYN_OP operator=MINUSEQ type=kotlin.Unit
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'tmp2_array: dynamic' type=dynamic origin=null
0: GET_VAR 'tmp3_index0: String' type=kotlin.String origin=null
0: CONST String type=kotlin.String value="-="
BLOCK type=kotlin.Unit origin=MULTEQ
VAR IR_TEMPORARY_VARIABLE name:tmp4_array type:dynamic flags:val
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
VAR IR_TEMPORARY_VARIABLE name:tmp5_index0 type:kotlin.String flags:val
CONST String type=kotlin.String value="KEY"
DYN_OP operator=MULEQ type=kotlin.Unit
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'tmp4_array: dynamic' type=dynamic origin=null
0: GET_VAR 'tmp5_index0: String' type=kotlin.String origin=null
0: CONST String type=kotlin.String value="*="
BLOCK type=kotlin.Unit origin=DIVEQ
VAR IR_TEMPORARY_VARIABLE name:tmp6_array type:dynamic flags:val
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
VAR IR_TEMPORARY_VARIABLE name:tmp7_index0 type:kotlin.String flags:val
CONST String type=kotlin.String value="KEY"
DYN_OP operator=DIVEQ type=kotlin.Unit
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'tmp6_array: dynamic' type=dynamic origin=null
0: GET_VAR 'tmp7_index0: String' type=kotlin.String origin=null
0: CONST String type=kotlin.String value="/="
BLOCK type=kotlin.Unit origin=PERCEQ
VAR IR_TEMPORARY_VARIABLE name:tmp8_array type:dynamic flags:val
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
VAR IR_TEMPORARY_VARIABLE name:tmp9_index0 type:kotlin.String flags:val
CONST String type=kotlin.String value="KEY"
DYN_OP operator=MODEQ type=kotlin.Unit
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'tmp8_array: dynamic' type=dynamic origin=null
0: GET_VAR 'tmp9_index0: String' type=kotlin.String origin=null
0: CONST String type=kotlin.String value="%="
@@ -0,0 +1,7 @@
fun testArrayIncrementDecrement(d: dynamic) {
val t1 = ++d["prefixIncr"]
val t2 = --d["prefixDecr"]
val t3 = d["postfixIncr"]++
val t4 = d["postfixDecr"]--
}
@@ -0,0 +1,44 @@
FILE fqName:<root> fileName:/dynamicArrayIncrementDecrement.kt
FUN name:testArrayIncrementDecrement 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=PREFIX_INCR
VAR IR_TEMPORARY_VARIABLE name:tmp0_array type:dynamic flags:val
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
VAR IR_TEMPORARY_VARIABLE name:tmp1_index0 type:kotlin.String flags:val
CONST String type=kotlin.String value="prefixIncr"
DYN_OP operator=PREFIX_INCREMENT type=dynamic
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'tmp0_array: dynamic' type=dynamic origin=null
0: GET_VAR 'tmp1_index0: String' type=kotlin.String origin=null
VAR name:t2 type:dynamic flags:val
BLOCK type=dynamic origin=PREFIX_DECR
VAR IR_TEMPORARY_VARIABLE name:tmp2_array type:dynamic flags:val
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
VAR IR_TEMPORARY_VARIABLE name:tmp3_index0 type:kotlin.String flags:val
CONST String type=kotlin.String value="prefixDecr"
DYN_OP operator=PREFIX_DECREMENT type=dynamic
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'tmp2_array: dynamic' type=dynamic origin=null
0: GET_VAR 'tmp3_index0: String' type=kotlin.String origin=null
VAR name:t3 type:dynamic flags:val
BLOCK type=dynamic origin=POSTFIX_INCR
VAR IR_TEMPORARY_VARIABLE name:tmp4_array type:dynamic flags:val
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
VAR IR_TEMPORARY_VARIABLE name:tmp5_index0 type:kotlin.String flags:val
CONST String type=kotlin.String value="postfixIncr"
DYN_OP operator=POSTFIX_INCREMENT type=dynamic
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'tmp4_array: dynamic' type=dynamic origin=null
0: GET_VAR 'tmp5_index0: String' type=kotlin.String origin=null
VAR name:t4 type:dynamic flags:val
BLOCK type=dynamic origin=POSTFIX_DECR
VAR IR_TEMPORARY_VARIABLE name:tmp6_array type:dynamic flags:val
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
VAR IR_TEMPORARY_VARIABLE name:tmp7_index0 type:kotlin.String flags:val
CONST String type=kotlin.String value="postfixDecr"
DYN_OP operator=POSTFIX_DECREMENT type=dynamic
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'tmp6_array: dynamic' type=dynamic origin=null
0: GET_VAR 'tmp7_index0: String' type=kotlin.String origin=null