Analyze Data Flow: Support dereference processing

#KT-11994 In Progress
This commit is contained in:
Alexey Sedunov
2017-05-31 21:16:45 +03:00
parent 858b454138
commit 0f44dd6ab0
14 changed files with 260 additions and 15 deletions
@@ -0,0 +1,21 @@
// FLOW: OUT
// WITH_DEREFERENCES
class A
operator fun A.get(i: Int) = this
operator fun A.set(i: Int, a: A) = this
operator fun A.plusAssign(a: A) = this
operator fun A.times(a: A) = this
operator fun A.inc() = this
fun test() {
val <caret>x = A()
val y = A()
x[1]
x[1] = y
x[1] += y
x[1] *= y
x[1]++
}
@@ -0,0 +1 @@
13 val <bold>x = A()</bold>
+21
View File
@@ -0,0 +1,21 @@
// FLOW: OUT
// WITH_DEREFERENCES
class A {
operator fun get(i: Int) = this
operator fun set(i: Int, a: A) = this
operator fun plusAssign(a: A) = this
operator fun times(a: A) = this
operator fun inc() = this
}
fun test() {
val <caret>x = A()
val y = A()
x[1]
x[1] = y
x[1] += y
x[1] *= y
x[1]++
}
@@ -0,0 +1,6 @@
13 val <bold>x = A()</bold>
16 DEREFERENCE: <bold>x</bold>[1]
17 DEREFERENCE: <bold>x</bold>[1] = y
18 DEREFERENCE: <bold>x</bold>[1] += y
19 DEREFERENCE: <bold>x</bold>[1] *= y
20 DEREFERENCE: <bold>x</bold>[1]++
@@ -0,0 +1,30 @@
// FLOW: OUT
// WITH_DEREFERENCES
class A {
operator fun plus(n: Int) = this
operator fun unaryPlus() = this
operator fun inc() = this
operator fun timesAssign(n: Int) = this
}
operator fun A.minus(n: Int) = this
operator fun A.unaryMinus() = this
operator fun A.dec() = this
operator fun A.divAssign(n: Int) = this
fun test() {
var <caret>x = A()
+x
x + 1
x++
x += 1
x *= 1
-x
x - 1
x--
x -= 1
x /= 1
}
@@ -0,0 +1,6 @@
17 var <bold>x = A()</bold>
19 DEREFERENCE: +<bold>x</bold>
20 DEREFERENCE: <bold>x</bold> + 1
21 DEREFERENCE: <bold>x</bold>++
22 DEREFERENCE: <bold>x</bold> += 1
23 DEREFERENCE: <bold>x</bold> *= 1
+26
View File
@@ -0,0 +1,26 @@
// FLOW: OUT
// WITH_DEREFERENCES
class A {
fun foo() = 1
val bar = 2
}
fun A.fooExt() = 1
val A.barExt: Int get() = 2
fun test() {
val <caret>x = A()
x.foo()
x.bar
x.fooExt()
x.barExt
val y: A? = x
y?.foo()
y?.bar
y?.fooExt()
y?.barExt
}
@@ -0,0 +1,6 @@
13 val <bold>x = A()</bold>
15 DEREFERENCE: <bold>x</bold>.foo()
16 DEREFERENCE: <bold>x</bold>.bar
20 val <bold>y: A? = x</bold>
22 DEREFERENCE: <bold>y</bold>?.foo()
23 DEREFERENCE: <bold>y</bold>?.bar