Analyze Data Flow: Support properties with custom accessors

#KT-11994 In Progress
This commit is contained in:
Alexey Sedunov
2017-05-30 19:40:14 +03:00
parent d61ddaccb6
commit ea7d535ae7
25 changed files with 267 additions and 32 deletions
@@ -0,0 +1,13 @@
// FLOW: IN
class A(var b: Boolean) {
var foo: Int
set(value) {
field = if (b) value else 0
}
fun test() {
val x = <caret>foo
foo = 1
}
}
@@ -0,0 +1,7 @@
10 val x = <bold>foo</bold>
4 var <bold>foo: Int</bold>
6 field = <bold>if (b) value else 0</bold>
6 field = if (b) <bold>value</bold> else 0
5 set(<bold>value</bold>) {
11 foo = <bold>1</bold>
6 field = if (b) value else <bold>0</bold>
+13
View File
@@ -0,0 +1,13 @@
// FLOW: IN
import kotlin.reflect.KProperty
object D {
operator fun getValue(thisRef: Any?, property: KProperty<*>) = 1
}
val foo: Int by D
fun test() {
val <caret>x = foo
}
@@ -0,0 +1,5 @@
12 val <bold>x = foo</bold>
12 val x = <bold>foo</bold>
9 val <bold>foo: Int by D</bold>
6 operator fun <bold>getValue(thisRef: Any?, property: KProperty<*>) = 1</bold>
6 operator fun getValue(thisRef: Any?, property: KProperty<*>) = <bold>1</bold>
@@ -0,0 +1,14 @@
// FLOW: IN
class A(var b: Boolean) {
var foo: Int
get() = if (b) field else 0
set(value) {
field = if (b) value else 0
}
fun test() {
val x = <caret>foo
foo = 1
}
}
@@ -0,0 +1,10 @@
11 val x = <bold>foo</bold>
4 var <bold>foo: Int</bold>
5 get() = <bold>if (b) field else 0</bold>
5 get() = if (b) <bold>field</bold> else 0
7 field = <bold>if (b) value else 0</bold>
7 field = if (b) <bold>value</bold> else 0
6 set(<bold>value</bold>) {
12 foo = <bold>1</bold>
7 field = if (b) value else <bold>0</bold>
5 get() = if (b) field else <bold>0</bold>
+8
View File
@@ -0,0 +1,8 @@
// FLOW: IN
val foo: Int
get() = 0
fun test() {
val <caret>x = foo
}
@@ -0,0 +1,4 @@
7 val <bold>x = foo</bold>
7 val x = <bold>foo</bold>
3 val <bold>foo: Int</bold>
4 get() = <bold>0</bold>
+10
View File
@@ -0,0 +1,10 @@
// FLOW: IN
val foo: Int
get(): Int {
return 0
}
fun test() {
val <caret>x = foo
}
@@ -0,0 +1,4 @@
9 val <bold>x = foo</bold>
9 val x = <bold>foo</bold>
3 val <bold>foo: Int</bold>
5 return <bold>0</bold>
+13
View File
@@ -0,0 +1,13 @@
// FLOW: IN
class A(var b: Boolean) {
var foo: Int
get() = 1
set(value) {
field = value + 1
}
fun test() {
val x = <caret>foo
}
}
@@ -0,0 +1,3 @@
11 val x = <bold>foo</bold>
4 var <bold>foo: Int</bold>
5 get() = <bold>1</bold>
+8
View File
@@ -0,0 +1,8 @@
// FLOW: OUT
val foo: Int
get() = <caret>0
fun test() {
val x = foo
}
@@ -0,0 +1,3 @@
4 get() = <bold>0</bold>
4 <bold>get() = 0</bold>
7 val <bold>x = foo</bold>
+10
View File
@@ -0,0 +1,10 @@
// FLOW: OUT
val foo: Int
get(): Int {
return <caret>0
}
fun test() {
val x = foo
}
@@ -0,0 +1,3 @@
5 return <bold>0</bold>
4 <bold>get(): Int {</bold>
9 val <bold>x = foo</bold>