Introduce special IrDeclarationOrigin's for for-loop variables

FOR_LOOP_ITERATOR
 - temporary variable for for-loop iterator

FOR_LOOP_VARIABLE
 - `x` in `for (x in xs)`

FOR_LOOP_IMPLICIT_VARIABLE
 - temporary variable for for-loop with destructuring, e.g.:
   for ((x, y) in xys)
   =>
   for (tmp in xys) {
     val (x, y) = tmp
   }
This commit is contained in:
Dmitry Petrov
2017-07-12 17:34:39 +03:00
parent 1cab0d09ab
commit a687dea898
9 changed files with 41 additions and 33 deletions
@@ -44,7 +44,7 @@ FILE /breakContinueInLoopHeader.kt
condition: CONST Boolean type=kotlin.Boolean value='true'
body: BLOCK type=kotlin.Unit origin=null
BLOCK type=kotlin.Unit origin=FOR_LOOP
VAR IR_TEMPORARY_VARIABLE val tmp1_iterator: kotlin.collections.Iterator<kotlin.String>
VAR FOR_LOOP_ITERATOR val tmp1_iterator: kotlin.collections.Iterator<kotlin.String>
CALL 'iterator(): Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=FOR_LOOP_ITERATOR
$this: BLOCK type=kotlin.collections.List<kotlin.String> origin=ELVIS
VAR IR_TEMPORARY_VARIABLE val tmp0_elvis_lhs: kotlin.collections.List<kotlin.String>?
@@ -62,7 +62,7 @@ FILE /breakContinueInLoopHeader.kt
condition: CALL 'hasNext(): Boolean' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT
$this: GET_VAR 'tmp1_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
body: BLOCK type=kotlin.Unit origin=FOR_LOOP_INNER_WHILE
VAR val s: kotlin.String
VAR FOR_LOOP_VARIABLE val s: kotlin.String
CALL 'next(): String' type=kotlin.String origin=FOR_LOOP_NEXT
$this: GET_VAR 'tmp1_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
FUN public fun test4(ss: kotlin.collections.List<kotlin.String>?): kotlin.Unit
@@ -72,7 +72,7 @@ FILE /breakContinueInLoopHeader.kt
condition: CONST Boolean type=kotlin.Boolean value='true'
body: BLOCK type=kotlin.Unit origin=null
BLOCK type=kotlin.Unit origin=FOR_LOOP
VAR IR_TEMPORARY_VARIABLE val tmp1_iterator: kotlin.collections.Iterator<kotlin.String>
VAR FOR_LOOP_ITERATOR val tmp1_iterator: kotlin.collections.Iterator<kotlin.String>
CALL 'iterator(): Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=FOR_LOOP_ITERATOR
$this: BLOCK type=kotlin.collections.List<kotlin.String> origin=ELVIS
VAR IR_TEMPORARY_VARIABLE val tmp0_elvis_lhs: kotlin.collections.List<kotlin.String>?
@@ -90,7 +90,7 @@ FILE /breakContinueInLoopHeader.kt
condition: CALL 'hasNext(): Boolean' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT
$this: GET_VAR 'tmp1_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
body: BLOCK type=kotlin.Unit origin=FOR_LOOP_INNER_WHILE
VAR val s: kotlin.String
VAR FOR_LOOP_VARIABLE val s: kotlin.String
CALL 'next(): String' type=kotlin.String origin=FOR_LOOP_NEXT
$this: GET_VAR 'tmp1_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
FUN public fun test5(): kotlin.Unit
+6 -6
View File
@@ -3,28 +3,28 @@ FILE /for.kt
VALUE_PARAMETER value-parameter ss: kotlin.collections.List<kotlin.String>
BLOCK_BODY
BLOCK type=kotlin.Unit origin=FOR_LOOP
VAR IR_TEMPORARY_VARIABLE val tmp0_iterator: kotlin.collections.Iterator<kotlin.String>
VAR FOR_LOOP_ITERATOR val tmp0_iterator: kotlin.collections.Iterator<kotlin.String>
CALL 'iterator(): Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=FOR_LOOP_ITERATOR
$this: GET_VAR 'value-parameter ss: List<String>' type=kotlin.collections.List<kotlin.String> origin=null
WHILE label=null origin=FOR_LOOP_INNER_WHILE
condition: CALL 'hasNext(): Boolean' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT
$this: GET_VAR 'tmp0_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
body: BLOCK type=kotlin.Unit origin=FOR_LOOP_INNER_WHILE
VAR val s: kotlin.String
VAR FOR_LOOP_VARIABLE val s: kotlin.String
CALL 'next(): String' type=kotlin.String origin=FOR_LOOP_NEXT
$this: GET_VAR 'tmp0_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
FUN public fun testIterable(ss: kotlin.collections.List<kotlin.String>): kotlin.Unit
VALUE_PARAMETER value-parameter ss: kotlin.collections.List<kotlin.String>
BLOCK_BODY
BLOCK type=kotlin.Unit origin=FOR_LOOP
VAR IR_TEMPORARY_VARIABLE val tmp0_iterator: kotlin.collections.Iterator<kotlin.String>
VAR FOR_LOOP_ITERATOR val tmp0_iterator: kotlin.collections.Iterator<kotlin.String>
CALL 'iterator(): Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=FOR_LOOP_ITERATOR
$this: GET_VAR 'value-parameter ss: List<String>' type=kotlin.collections.List<kotlin.String> origin=null
WHILE label=null origin=FOR_LOOP_INNER_WHILE
condition: CALL 'hasNext(): Boolean' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT
$this: GET_VAR 'tmp0_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
body: BLOCK type=kotlin.Unit origin=FOR_LOOP_INNER_WHILE
VAR val s: kotlin.String
VAR FOR_LOOP_VARIABLE val s: kotlin.String
CALL 'next(): String' type=kotlin.String origin=FOR_LOOP_NEXT
$this: GET_VAR 'tmp0_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
BLOCK type=kotlin.Unit origin=null
@@ -34,14 +34,14 @@ FILE /for.kt
VALUE_PARAMETER value-parameter pp: kotlin.collections.List<kotlin.Pair<kotlin.Int, kotlin.String>>
BLOCK_BODY
BLOCK type=kotlin.Unit origin=FOR_LOOP
VAR IR_TEMPORARY_VARIABLE val tmp0_iterator: kotlin.collections.Iterator<kotlin.Pair<kotlin.Int, kotlin.String>>
VAR FOR_LOOP_ITERATOR val tmp0_iterator: kotlin.collections.Iterator<kotlin.Pair<kotlin.Int, kotlin.String>>
CALL 'iterator(): Iterator<Pair<Int, String>>' type=kotlin.collections.Iterator<kotlin.Pair<kotlin.Int, kotlin.String>> origin=FOR_LOOP_ITERATOR
$this: GET_VAR 'value-parameter pp: List<Pair<Int, String>>' type=kotlin.collections.List<kotlin.Pair<kotlin.Int, kotlin.String>> origin=null
WHILE label=null origin=FOR_LOOP_INNER_WHILE
condition: CALL 'hasNext(): Boolean' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT
$this: GET_VAR 'tmp0_iterator: Iterator<Pair<Int, String>>' type=kotlin.collections.Iterator<kotlin.Pair<kotlin.Int, kotlin.String>> origin=null
body: BLOCK type=kotlin.Unit origin=FOR_LOOP_INNER_WHILE
VAR IR_TEMPORARY_VARIABLE val tmp1_loop_parameter: kotlin.Pair<kotlin.Int, kotlin.String>
VAR FOR_LOOP_IMPLICIT_VARIABLE val tmp1_loop_parameter: kotlin.Pair<kotlin.Int, kotlin.String>
CALL 'next(): Pair<Int, String>' type=kotlin.Pair<kotlin.Int, kotlin.String> origin=FOR_LOOP_NEXT
$this: GET_VAR 'tmp0_iterator: Iterator<Pair<Int, String>>' type=kotlin.collections.Iterator<kotlin.Pair<kotlin.Int, kotlin.String>> origin=null
VAR val i: kotlin.Int
@@ -3,14 +3,14 @@ FILE /forWithBreakContinue.kt
VALUE_PARAMETER value-parameter ss: kotlin.collections.List<kotlin.String>
BLOCK_BODY
BLOCK type=kotlin.Unit origin=FOR_LOOP
VAR IR_TEMPORARY_VARIABLE val tmp0_iterator: kotlin.collections.Iterator<kotlin.String>
VAR FOR_LOOP_ITERATOR val tmp0_iterator: kotlin.collections.Iterator<kotlin.String>
CALL 'iterator(): Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=FOR_LOOP_ITERATOR
$this: GET_VAR 'value-parameter ss: List<String>' type=kotlin.collections.List<kotlin.String> origin=null
WHILE label=null origin=FOR_LOOP_INNER_WHILE
condition: CALL 'hasNext(): Boolean' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT
$this: GET_VAR 'tmp0_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
body: BLOCK type=kotlin.Unit origin=FOR_LOOP_INNER_WHILE
VAR val s: kotlin.String
VAR FOR_LOOP_VARIABLE val s: kotlin.String
CALL 'next(): String' type=kotlin.String origin=FOR_LOOP_NEXT
$this: GET_VAR 'tmp0_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
BLOCK type=kotlin.Nothing origin=null
@@ -19,26 +19,26 @@ FILE /forWithBreakContinue.kt
VALUE_PARAMETER value-parameter ss: kotlin.collections.List<kotlin.String>
BLOCK_BODY
BLOCK type=kotlin.Unit origin=FOR_LOOP
VAR IR_TEMPORARY_VARIABLE val tmp0_iterator: kotlin.collections.Iterator<kotlin.String>
VAR FOR_LOOP_ITERATOR val tmp0_iterator: kotlin.collections.Iterator<kotlin.String>
CALL 'iterator(): Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=FOR_LOOP_ITERATOR
$this: GET_VAR 'value-parameter ss: List<String>' type=kotlin.collections.List<kotlin.String> origin=null
WHILE label=OUTER origin=FOR_LOOP_INNER_WHILE
condition: CALL 'hasNext(): Boolean' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT
$this: GET_VAR 'tmp0_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
body: BLOCK type=kotlin.Unit origin=FOR_LOOP_INNER_WHILE
VAR val s1: kotlin.String
VAR FOR_LOOP_VARIABLE val s1: kotlin.String
CALL 'next(): String' type=kotlin.String origin=FOR_LOOP_NEXT
$this: GET_VAR 'tmp0_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
BLOCK type=kotlin.Nothing origin=null
BLOCK type=kotlin.Unit origin=FOR_LOOP
VAR IR_TEMPORARY_VARIABLE val tmp1_iterator: kotlin.collections.Iterator<kotlin.String>
VAR FOR_LOOP_ITERATOR val tmp1_iterator: kotlin.collections.Iterator<kotlin.String>
CALL 'iterator(): Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=FOR_LOOP_ITERATOR
$this: GET_VAR 'value-parameter ss: List<String>' type=kotlin.collections.List<kotlin.String> origin=null
WHILE label=INNER origin=FOR_LOOP_INNER_WHILE
condition: CALL 'hasNext(): Boolean' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT
$this: GET_VAR 'tmp1_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
body: BLOCK type=kotlin.Unit origin=FOR_LOOP_INNER_WHILE
VAR val s2: kotlin.String
VAR FOR_LOOP_VARIABLE val s2: kotlin.String
CALL 'next(): String' type=kotlin.String origin=FOR_LOOP_NEXT
$this: GET_VAR 'tmp1_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
BLOCK type=kotlin.Nothing origin=null
@@ -50,14 +50,14 @@ FILE /forWithBreakContinue.kt
VALUE_PARAMETER value-parameter ss: kotlin.collections.List<kotlin.String>
BLOCK_BODY
BLOCK type=kotlin.Unit origin=FOR_LOOP
VAR IR_TEMPORARY_VARIABLE val tmp0_iterator: kotlin.collections.Iterator<kotlin.String>
VAR FOR_LOOP_ITERATOR val tmp0_iterator: kotlin.collections.Iterator<kotlin.String>
CALL 'iterator(): Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=FOR_LOOP_ITERATOR
$this: GET_VAR 'value-parameter ss: List<String>' type=kotlin.collections.List<kotlin.String> origin=null
WHILE label=null origin=FOR_LOOP_INNER_WHILE
condition: CALL 'hasNext(): Boolean' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT
$this: GET_VAR 'tmp0_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
body: BLOCK type=kotlin.Unit origin=FOR_LOOP_INNER_WHILE
VAR val s: kotlin.String
VAR FOR_LOOP_VARIABLE val s: kotlin.String
CALL 'next(): String' type=kotlin.String origin=FOR_LOOP_NEXT
$this: GET_VAR 'tmp0_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
BLOCK type=kotlin.Nothing origin=null
@@ -66,26 +66,26 @@ FILE /forWithBreakContinue.kt
VALUE_PARAMETER value-parameter ss: kotlin.collections.List<kotlin.String>
BLOCK_BODY
BLOCK type=kotlin.Unit origin=FOR_LOOP
VAR IR_TEMPORARY_VARIABLE val tmp0_iterator: kotlin.collections.Iterator<kotlin.String>
VAR FOR_LOOP_ITERATOR val tmp0_iterator: kotlin.collections.Iterator<kotlin.String>
CALL 'iterator(): Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=FOR_LOOP_ITERATOR
$this: GET_VAR 'value-parameter ss: List<String>' type=kotlin.collections.List<kotlin.String> origin=null
WHILE label=OUTER origin=FOR_LOOP_INNER_WHILE
condition: CALL 'hasNext(): Boolean' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT
$this: GET_VAR 'tmp0_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
body: BLOCK type=kotlin.Unit origin=FOR_LOOP_INNER_WHILE
VAR val s1: kotlin.String
VAR FOR_LOOP_VARIABLE val s1: kotlin.String
CALL 'next(): String' type=kotlin.String origin=FOR_LOOP_NEXT
$this: GET_VAR 'tmp0_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
BLOCK type=kotlin.Nothing origin=null
BLOCK type=kotlin.Unit origin=FOR_LOOP
VAR IR_TEMPORARY_VARIABLE val tmp1_iterator: kotlin.collections.Iterator<kotlin.String>
VAR FOR_LOOP_ITERATOR val tmp1_iterator: kotlin.collections.Iterator<kotlin.String>
CALL 'iterator(): Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=FOR_LOOP_ITERATOR
$this: GET_VAR 'value-parameter ss: List<String>' type=kotlin.collections.List<kotlin.String> origin=null
WHILE label=INNER origin=FOR_LOOP_INNER_WHILE
condition: CALL 'hasNext(): Boolean' type=kotlin.Boolean origin=FOR_LOOP_HAS_NEXT
$this: GET_VAR 'tmp1_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
body: BLOCK type=kotlin.Unit origin=FOR_LOOP_INNER_WHILE
VAR val s2: kotlin.String
VAR FOR_LOOP_VARIABLE val s2: kotlin.String
CALL 'next(): String' type=kotlin.String origin=FOR_LOOP_NEXT
$this: GET_VAR 'tmp1_iterator: Iterator<String>' type=kotlin.collections.Iterator<kotlin.String> origin=null
BLOCK type=kotlin.Nothing origin=null
@@ -90,7 +90,7 @@ FILE /forWithImplicitReceivers.kt
$receiver: VALUE_PARAMETER this@test: IReceiver
BLOCK_BODY
BLOCK type=kotlin.Unit origin=FOR_LOOP
VAR IR_TEMPORARY_VARIABLE val tmp0_iterator: IntCell
VAR FOR_LOOP_ITERATOR val tmp0_iterator: IntCell
CALL 'iterator() on FiveTimes: IntCell' type=IntCell origin=FOR_LOOP_ITERATOR
$this: GET_VAR 'this@test: IReceiver' type=IReceiver origin=null
$receiver: GET_OBJECT 'FiveTimes' type=FiveTimes
@@ -99,7 +99,7 @@ FILE /forWithImplicitReceivers.kt
$this: GET_VAR 'this@test: IReceiver' type=IReceiver origin=null
$receiver: GET_VAR 'tmp0_iterator: IntCell' type=IntCell origin=null
body: BLOCK type=kotlin.Unit origin=FOR_LOOP_INNER_WHILE
VAR val i: kotlin.Int
VAR FOR_LOOP_VARIABLE val i: kotlin.Int
CALL 'next() on IntCell: Int' type=kotlin.Int origin=FOR_LOOP_NEXT
$this: GET_VAR 'this@test: IReceiver' type=IReceiver origin=null
$receiver: GET_VAR 'tmp0_iterator: IntCell' type=IntCell origin=null