New J2K: implement mutability inference in post-processing

#KT-24293 fixed
#KT-19603 fixed
This commit is contained in:
Ilya Kirillov
2019-09-02 18:56:50 +03:00
parent c28515be59
commit f61bb5aa39
81 changed files with 1263 additions and 231 deletions
+1 -1
View File
@@ -7,4 +7,4 @@ fun test() {
//T0 <: T1 due to 'INITIALIZER'
//T2 <: T4 due to 'INITIALIZER'
//T3 <: T1 due to 'ASSIGNMENT'
//T1 <: T3 due to 'ASSIGNMENT'
+5
View File
@@ -0,0 +1,5 @@
class Test {
val x: /*T2@*/List</*T1@*/Int> = ArrayList</*T0@*/Int>()/*ArrayList<T0@Int>*/
}
//T1 := T0 due to 'INITIALIZER'
@@ -0,0 +1,8 @@
fun a(
l0: /*T1@*/MutableIterator</*T0@*/Int>
) {
l0/*T1@MutableIterator<T0@Int>*/.remove()
}
//T0 <: T0 due to 'RECEIVER_PARAMETER'
//T1 := LOWER due to 'USE_AS_RECEIVER'
+7
View File
@@ -0,0 +1,7 @@
import java.util.ArrayList
fun a() {
val list: /*T2@*/List</*T1@*/Int> = ArrayList</*T0@*/Int>()/*ArrayList<T0@Int>*/
}
//T1 := T0 due to 'INITIALIZER'
@@ -0,0 +1,30 @@
fun a(
l0: /*T1@*/MutableCollection</*T0@*/Int>,
l1: /*T3@*/MutableCollection</*T2@*/Int>,
l2: /*T5@*/MutableCollection</*T4@*/Int>,
l3: /*T7@*/MutableCollection</*T6@*/Int>,
l4: /*T9@*/MutableCollection</*T8@*/Int>
) {
l0/*T1@MutableCollection<T0@Int>*/.add(1/*LIT*/)
l1/*T3@MutableCollection<T2@Int>*/.addAll(l1/*T3@MutableCollection<T2@Int>*/)
l2/*T5@MutableCollection<T4@Int>*/.clear()
l3/*T7@MutableCollection<T6@Int>*/.removeAll(l1/*T3@MutableCollection<T2@Int>*/)
l4/*T9@MutableCollection<T8@Int>*/.retainAll(l1/*T3@MutableCollection<T2@Int>*/)
}
//T0 := T0 due to 'RECEIVER_PARAMETER'
//T1 := LOWER due to 'USE_AS_RECEIVER'
//T2 := T2 due to 'RECEIVER_PARAMETER'
//T2 := T2 due to 'PARAMETER'
//T3 <: UPPER due to 'PARAMETER'
//T3 := LOWER due to 'USE_AS_RECEIVER'
//T4 := T4 due to 'RECEIVER_PARAMETER'
//T5 := LOWER due to 'USE_AS_RECEIVER'
//T6 := T6 due to 'RECEIVER_PARAMETER'
//T6 := T2 due to 'PARAMETER'
//T3 <: UPPER due to 'PARAMETER'
//T7 := LOWER due to 'USE_AS_RECEIVER'
//T8 := T8 due to 'RECEIVER_PARAMETER'
//T8 := T2 due to 'PARAMETER'
//T3 <: UPPER due to 'PARAMETER'
//T9 := LOWER due to 'USE_AS_RECEIVER'
+8
View File
@@ -0,0 +1,8 @@
class Nya {
private val hashMap: /*T6@*/Map</*T3@*/String, /*T5@*/List</*T4@*/Int>> =
HashMap</*T0@*/String, /*T2@*/List</*T1@*/Int>>()/*HashMap<T0@String, T2@MutableList<T1@Int>>*/
}
//T3 := T0 due to 'INITIALIZER'
//T4 := T1 due to 'INITIALIZER'
//T5 := T2 due to 'INITIALIZER'
+10
View File
@@ -0,0 +1,10 @@
fun a(l0: /*T1@*/MutableList</*T0@*/Int>) {
val iterator: /*T3@*/MutableIterator</*T2@*/Int> = l0/*T1@MutableList<T0@Int>*/.iterator()/*T1@MutableList<T0@Int>*/
iterator/*T3@MutableIterator<T2@Int>*/.remove()
}
//T0 := T0 due to 'RECEIVER_PARAMETER'
//T2 := T0 due to 'INITIALIZER'
//T1 <: T3 due to 'INITIALIZER'
//T2 <: T2 due to 'RECEIVER_PARAMETER'
//T3 := LOWER due to 'USE_AS_RECEIVER'
+4
View File
@@ -0,0 +1,4 @@
class A {
val l: /*T1@*/List</*T0@*/Int>
}
@@ -0,0 +1,16 @@
fun a(
l0: /*T1@*/MutableListIterator</*T0@*/Int>,
l1: /*T3@*/MutableListIterator</*T2@*/Int>,
l2: /*T5@*/MutableListIterator</*T4@*/Int>
) {
l0/*T1@MutableListIterator<T0@Int>*/.add(1/*LIT*/)
l1/*T3@MutableListIterator<T2@Int>*/.remove()
l2/*T5@MutableListIterator<T4@Int>*/.set(1/*LIT*/)
}
//T0 := T0 due to 'RECEIVER_PARAMETER'
//T1 := LOWER due to 'USE_AS_RECEIVER'
//T2 := T2 due to 'RECEIVER_PARAMETER'
//T3 := LOWER due to 'USE_AS_RECEIVER'
//T4 := T4 due to 'RECEIVER_PARAMETER'
//T5 := LOWER due to 'USE_AS_RECEIVER'
+46
View File
@@ -0,0 +1,46 @@
fun a(
l0: /*T1@*/MutableList</*T0@*/Int>,
l1: /*T3@*/MutableList</*T2@*/Int>,
l2: /*T5@*/MutableList</*T4@*/Int>,
l3: /*T7@*/MutableList</*T6@*/Int>,
l4: /*T9@*/MutableList</*T8@*/Int>,
l5: /*T11@*/MutableList</*T10@*/Int>,
l6: /*T13@*/MutableList</*T12@*/Int>,
l7: /*T15@*/MutableList</*T14@*/Int>
) {
l0/*T1@MutableList<T0@Int>*/.add(1/*LIT*/)
l1/*T3@MutableList<T2@Int>*/.addAll(1/*LIT*/, l1/*T3@MutableList<T2@Int>*/)
l2/*T5@MutableList<T4@Int>*/.addAll(l1/*T3@MutableList<T2@Int>*/)
l3/*T7@MutableList<T6@Int>*/.clear()
l4/*T9@MutableList<T8@Int>*/.remove(1/*LIT*/)
l5/*T11@MutableList<T10@Int>*/.removeAll(l1/*T3@MutableList<T2@Int>*/)
l5/*T11@MutableList<T10@Int>*/.removeAt(0/*LIT*/)
l6/*T13@MutableList<T12@Int>*/.retainAll(l1/*T3@MutableList<T2@Int>*/)
l7/*T15@MutableList<T14@Int>*/.set(0/*LIT*/, 0/*LIT*/)
}
//T0 := T0 due to 'RECEIVER_PARAMETER'
//T1 := LOWER due to 'USE_AS_RECEIVER'
//T2 := T2 due to 'RECEIVER_PARAMETER'
//T2 := T2 due to 'PARAMETER'
//T3 <: UPPER due to 'PARAMETER'
//T3 := LOWER due to 'USE_AS_RECEIVER'
//T4 := T4 due to 'RECEIVER_PARAMETER'
//T4 := T2 due to 'PARAMETER'
//T3 <: UPPER due to 'PARAMETER'
//T5 := LOWER due to 'USE_AS_RECEIVER'
//T6 := T6 due to 'RECEIVER_PARAMETER'
//T7 := LOWER due to 'USE_AS_RECEIVER'
//T8 := T8 due to 'RECEIVER_PARAMETER'
//T9 := LOWER due to 'USE_AS_RECEIVER'
//T10 := T10 due to 'RECEIVER_PARAMETER'
//T10 := T2 due to 'PARAMETER'
//T3 <: UPPER due to 'PARAMETER'
//T11 := LOWER due to 'USE_AS_RECEIVER'
//T10 := T10 due to 'RECEIVER_PARAMETER'
//T12 := T12 due to 'RECEIVER_PARAMETER'
//T12 := T2 due to 'PARAMETER'
//T3 <: UPPER due to 'PARAMETER'
//T13 := LOWER due to 'USE_AS_RECEIVER'
//T14 := T14 due to 'RECEIVER_PARAMETER'
//T15 := LOWER due to 'USE_AS_RECEIVER'
@@ -0,0 +1,15 @@
import java.util.ArrayList
fun test() {
val list: /*T4@*/List</*T3@*/MutableList</*T2@*/Int>> = ArrayList</*T1@*/MutableList</*T0@*/Int>>()/*ArrayList<T1@MutableList<T0@Int>>*/
for(l: /*T6@*/MutableList</*T5@*/Int> in list/*T4@MutableList<T3@MutableList<T2@Int>>*/) {
l/*T6@MutableList<T5@Int>*/.add(42/*LIT*/)
}
}
//T2 := T0 due to 'INITIALIZER'
//T3 := T1 due to 'INITIALIZER'
//T5 := T5 due to 'RECEIVER_PARAMETER'
//T6 := LOWER due to 'USE_AS_RECEIVER'
//T5 := T2 due to 'ASSIGNMENT'
//T3 <: T6 due to 'ASSIGNMENT'
+14
View File
@@ -0,0 +1,14 @@
import java.util.ArrayList
fun a() {
val list: /*T4@*/List</*T3@*/MutableList</*T2@*/Int>> = ArrayList</*T1@*/MutableList</*T0@*/Int>>()/*ArrayList<T1@MutableList<T0@Int>>*/
list/*T4@MutableList<T3@MutableList<T2@Int>>*/.get(0/*LIT*/)/*T3@MutableList<T2@Int>*/.add(1/*LIT*/)
}
//T2 := T0 due to 'INITIALIZER'
//T3 := T1 due to 'INITIALIZER'
//T2 := T2 due to 'RECEIVER_PARAMETER'
//T3 := T3 due to 'RECEIVER_PARAMETER'
//T4 <: UPPER due to 'RECEIVER_PARAMETER'
//T2 := T2 due to 'RECEIVER_PARAMETER'
//T3 := LOWER due to 'USE_AS_RECEIVER'
@@ -0,0 +1,9 @@
fun a(
l0: /*T2@*/MutableMap.MutableEntry</*T0@*/Int, /*T1@*/String>
) {
l0/*T2@MutableEntry<T0@Int, T1@String>*/.setValue(1/*LIT*/, "nya")
}
//T0 := T0 due to 'RECEIVER_PARAMETER'
//T1 := T1 due to 'RECEIVER_PARAMETER'
//T2 := LOWER due to 'USE_AS_RECEIVER'
+27
View File
@@ -0,0 +1,27 @@
fun a(
l0: /*T2@*/MutableMap</*T0@*/Int, /*T1@*/String>,
l1: /*T5@*/MutableMap</*T3@*/Int, /*T4@*/String>,
l2: /*T8@*/MutableMap</*T6@*/Int, /*T7@*/String>,
l3: /*T11@*/MutableMap</*T9@*/Int, /*T10@*/String>
) {
l0/*T2@MutableMap<T0@Int, T1@String>*/.put(1)
l1/*T5@MutableMap<T3@Int, T4@String>*/.remove(1/*LIT*/, l1)
l2/*T8@MutableMap<T6@Int, T7@String>*/.putAll(l1/*T5@MutableMap<T3@Int, T4@String>*/)
l3/*T11@MutableMap<T9@Int, T10@String>*/.clear(1)
}
//T0 := T0 due to 'RECEIVER_PARAMETER'
//T1 := T1 due to 'RECEIVER_PARAMETER'
//T2 := LOWER due to 'USE_AS_RECEIVER'
//T3 := T3 due to 'RECEIVER_PARAMETER'
//T4 := T4 due to 'RECEIVER_PARAMETER'
//T5 := LOWER due to 'USE_AS_RECEIVER'
//T6 := T6 due to 'RECEIVER_PARAMETER'
//T7 := T7 due to 'RECEIVER_PARAMETER'
//T6 := T3 due to 'PARAMETER'
//T7 := T4 due to 'PARAMETER'
//T5 <: UPPER due to 'PARAMETER'
//T8 := LOWER due to 'USE_AS_RECEIVER'
//T9 := T9 due to 'RECEIVER_PARAMETER'
//T10 := T10 due to 'RECEIVER_PARAMETER'
//T11 := LOWER due to 'USE_AS_RECEIVER'
+30
View File
@@ -0,0 +1,30 @@
fun a(
l0: /*T1@*/MutableSet</*T0@*/Int>,
l1: /*T3@*/MutableSet</*T2@*/Int>,
l2: /*T5@*/MutableSet</*T4@*/Int>,
l3: /*T7@*/MutableSet</*T6@*/Int>,
l4: /*T9@*/MutableSet</*T8@*/Int>
) {
l0/*T1@MutableSet<T0@Int>*/.add(1/*LIT*/)
l1/*T3@MutableSet<T2@Int>*/.addAll(l1/*T3@MutableSet<T2@Int>*/)
l2/*T5@MutableSet<T4@Int>*/.clear()
l3/*T7@MutableSet<T6@Int>*/.removeAll(l1/*T3@MutableSet<T2@Int>*/)
l4/*T9@MutableSet<T8@Int>*/.retainAll(l1/*T3@MutableSet<T2@Int>*/)
}
//T0 := T0 due to 'RECEIVER_PARAMETER'
//T1 := LOWER due to 'USE_AS_RECEIVER'
//T2 := T2 due to 'RECEIVER_PARAMETER'
//T2 := T2 due to 'PARAMETER'
//T3 <: UPPER due to 'PARAMETER'
//T3 := LOWER due to 'USE_AS_RECEIVER'
//T4 := T4 due to 'RECEIVER_PARAMETER'
//T5 := LOWER due to 'USE_AS_RECEIVER'
//T6 := T6 due to 'RECEIVER_PARAMETER'
//T6 := T2 due to 'PARAMETER'
//T3 <: UPPER due to 'PARAMETER'
//T7 := LOWER due to 'USE_AS_RECEIVER'
//T8 := T8 due to 'RECEIVER_PARAMETER'
//T8 := T2 due to 'PARAMETER'
//T3 <: UPPER due to 'PARAMETER'
//T9 := LOWER due to 'USE_AS_RECEIVER'
+1 -1
View File
@@ -4,5 +4,5 @@ fun test(a: /*T1@*/List</*T0@*/Int?>) {
}
}
//T2 <: T0 due to 'ASSIGNMENT'
//T0 <: T2 due to 'ASSIGNMENT'
//T1 := LOWER due to 'USE_AS_RECEIVER'
+5 -5
View File
@@ -1,4 +1,4 @@
fun bar(map: /*T2@*/HashMap</*T0@*/String?, /*T1@*/Int>, list1: /*T4@*/List</*T3@*/Int?>, list2: /*T6@*/List</*T5@*/String?>) {
fun bar(map: /*T2@*/HashMap</*T0@*/String?, /*T1@*/Int>, list1: /*T4@*/List</*T3@*/Int>, list2: /*T6@*/List</*T5@*/String?>) {
for (entry: /*T9@*/MutableMap.MutableEntry</*T7@*/String?, /*T8@*/Int> in map/*T2@HashMap<T0@String, T1@Int>*/.entries/*MutableSet<MutableEntry<T0@String, T1@Int>>*/) {
val value: /*T10@*/Int = entry/*T9@MutableEntry<T7@String, T8@Int>*/.value/*T8@Int*/
if (entry/*T9@MutableEntry<T7@String, T8@Int>*/.key/*T7@String*/ == null/*LIT*/) {
@@ -21,11 +21,11 @@ fun bar(map: /*T2@*/HashMap</*T0@*/String?, /*T1@*/Int>, list1: /*T4@*/List</*T3
//T9 := LOWER due to 'USE_AS_RECEIVER'
//T7 := UPPER due to 'COMPARE_WITH_NULL'
//T10 := LOWER due to 'USE_AS_RECEIVER'
//T0 := T7 due to 'ASSIGNMENT'
//T1 := T8 due to 'ASSIGNMENT'
//T7 := T0 due to 'ASSIGNMENT'
//T8 := T1 due to 'ASSIGNMENT'
//T11 := LOWER due to 'USE_AS_RECEIVER'
//T11 <: T3 due to 'ASSIGNMENT'
//T3 <: T11 due to 'ASSIGNMENT'
//T4 := LOWER due to 'USE_AS_RECEIVER'
//T12 := UPPER due to 'COMPARE_WITH_NULL'
//T12 <: T5 due to 'ASSIGNMENT'
//T5 <: T12 due to 'ASSIGNMENT'
//T6 := LOWER due to 'USE_AS_RECEIVER'