Data flow to/from here: supported expected/actual declarations and extension receivers

This commit is contained in:
Valentin Kipyatkov
2020-04-09 22:01:22 +03:00
parent bfa3fb0589
commit 90188ef44f
78 changed files with 1704 additions and 801 deletions
@@ -0,0 +1,5 @@
class JavaClass {
void f() {
KotlinUtil.extensionFun("x");
}
}
+13
View File
@@ -0,0 +1,13 @@
// FLOW: IN
@file: JvmName("KotlinUtil")
import kotlin.jvm.JvmName
fun <caret>Any.extensionFun() {
}
fun foo() {
"".extensionFun()
1.extensionFun()
}
@@ -0,0 +1,12 @@
11 <bold>""</bold>.extensionFun()
7 fun <bold>Any</bold>.extensionFun() {
11 <bold>""</bold>.extensionFun()
3 KotlinUtil.extensionFun(<bold>"x"</bold>);
7 fun <bold>Any</bold>.extensionFun() {
3 KotlinUtil.extensionFun(<bold>"x"</bold>);
12 <bold>1</bold>.extensionFun()
7 fun <bold>Any</bold>.extensionFun() {
12 <bold>1</bold>.extensionFun()
@@ -0,0 +1,13 @@
[NotNull Values]
11 <bold>""</bold>.extensionFun()
7 fun <bold>Any</bold>.extensionFun() {
11 <bold>""</bold>.extensionFun()
12 <bold>1</bold>.extensionFun()
7 fun <bold>Any</bold>.extensionFun() {
12 <bold>1</bold>.extensionFun()
[Other Values]
3 KotlinUtil.extensionFun(<bold>"x"</bold>);
7 fun <bold>Any</bold>.extensionFun() {
3 KotlinUtil.extensionFun(<bold>"x"</bold>);
@@ -0,0 +1,4 @@
7 fun <bold>Any</bold>.extensionFun() {
3 KotlinUtil.extensionFun(<bold>"x"</bold>);
11 <bold>""</bold>.extensionFun()
12 <bold>1</bold>.extensionFun()
+10
View File
@@ -0,0 +1,10 @@
// FLOW: IN
var <caret>Any.property: Int
get() = 1
set(value) { }
fun foo() {
println("a".property)
"b".property = 2
}
@@ -0,0 +1,7 @@
9 <bold>"b"</bold>.property = 2
3 var <bold>Any</bold>.property: Int
9 <bold>"b"</bold>.property = 2
8 println(<bold>"a"</bold>.property)
3 var <bold>Any</bold>.property: Int
8 println(<bold>"a"</bold>.property)
@@ -0,0 +1,7 @@
[NotNull Values]
8 println(<bold>"a"</bold>.property)
3 var <bold>Any</bold>.property: Int
8 println(<bold>"a"</bold>.property)
9 <bold>"b"</bold>.property = 2
3 var <bold>Any</bold>.property: Int
9 <bold>"b"</bold>.property = 2
@@ -0,0 +1,3 @@
3 var <bold>Any</bold>.property: Int
8 println(<bold>"a"</bold>.property)
9 <bold>"b"</bold>.property = 2
+20
View File
@@ -0,0 +1,20 @@
// FLOW: IN
open class Base {
open fun Int.extensionFun() {
println(<caret>this)
}
fun baseF() {
1.extensionFun()
}
}
class Derived : Base() {
override fun Int.extensionFun() {
}
fun derivedF() {
2.extensionFun()
}
}
@@ -0,0 +1,4 @@
9 <bold>1</bold>.extensionFun()
5 println(<bold>this</bold>)
4 open fun <bold>Int</bold>.extensionFun() {
9 <bold>1</bold>.extensionFun()
@@ -0,0 +1,3 @@
[NotNull Values]
5 println(<bold>this</bold>)
5 println(<bold>this</bold>)
@@ -0,0 +1,3 @@
5 println(<bold>this</bold>)
4 open fun <bold>Int</bold>.extensionFun() {
9 <bold>1</bold>.extensionFun()
+20
View File
@@ -0,0 +1,20 @@
// FLOW: IN
open class Base {
open fun <caret>Int.extensionFun() {
println(this)
}
fun baseF() {
1.extensionFun()
}
}
class Derived : Base() {
override fun Int.extensionFun() {
}
fun derivedF() {
2.extensionFun()
}
}
@@ -0,0 +1,7 @@
9 <bold>1</bold>.extensionFun()
4 open fun <bold>Int</bold>.extensionFun() {
9 <bold>1</bold>.extensionFun()
18 <bold>2</bold>.extensionFun()
4 open fun <bold>Int</bold>.extensionFun() {
18 <bold>2</bold>.extensionFun()
@@ -0,0 +1,7 @@
[NotNull Values]
9 <bold>1</bold>.extensionFun()
4 open fun <bold>Int</bold>.extensionFun() {
9 <bold>1</bold>.extensionFun()
18 <bold>2</bold>.extensionFun()
4 open fun <bold>Int</bold>.extensionFun() {
18 <bold>2</bold>.extensionFun()
@@ -0,0 +1,3 @@
4 open fun <bold>Int</bold>.extensionFun() {
9 <bold>1</bold>.extensionFun()
18 <bold>2</bold>.extensionFun()
@@ -0,0 +1,9 @@
// FLOW: IN
fun Any.extensionFun(): Any {
return this
}
fun foo() {
val <caret>x = "".extensionFun()
}
@@ -0,0 +1,8 @@
8 val x = <bold>""</bold>.extensionFun()
8 val <bold>x = "".extensionFun()</bold>
8 val x = <bold>"".extensionFun()</bold>
3 fun Any.<bold>extensionFun(): Any {</bold>
4 return <bold>this</bold>
3 fun <bold>Any</bold>.extensionFun(): Any {
8 val x = <bold>""</bold>.extensionFun()
@@ -0,0 +1,3 @@
[NotNull Values]
8 val <bold>x = "".extensionFun()</bold>
8 val <bold>x = "".extensionFun()</bold>
@@ -0,0 +1,6 @@
8 val <bold>x = "".extensionFun()</bold>
8 val x = <bold>"".extensionFun()</bold>
3 fun Any.<bold>extensionFun(): Any {</bold>
4 return <bold>this</bold>
3 fun <bold>Any</bold>.extensionFun(): Any {
8 val x = <bold>""</bold>.extensionFun()
@@ -0,0 +1,8 @@
// FLOW: IN
val Any.extensionProp: Any
get() = this
fun foo() {
val <caret>x = "".extensionProp
}
@@ -0,0 +1,8 @@
7 val x = <bold>""</bold>.extensionProp
7 val <bold>x = "".extensionProp</bold>
7 val x = <bold>"".extensionProp</bold>
3 val Any.<bold>extensionProp: Any</bold>
4 get() = <bold>this</bold>
3 val <bold>Any</bold>.extensionProp: Any
7 val x = <bold>""</bold>.extensionProp
@@ -0,0 +1,3 @@
[NotNull Values]
7 val <bold>x = "".extensionProp</bold>
7 val <bold>x = "".extensionProp</bold>
@@ -0,0 +1,6 @@
7 val <bold>x = "".extensionProp</bold>
7 val x = <bold>"".extensionProp</bold>
3 val Any.<bold>extensionProp: Any</bold>
4 get() = <bold>this</bold>
3 val <bold>Any</bold>.extensionProp: Any
7 val x = <bold>""</bold>.extensionProp
@@ -0,0 +1,9 @@
package sample
expect class ExpectClass() {
fun foo(p: Any)
}
fun f(c: ExpectClass) {
c.foo(1)
}
@@ -0,0 +1,9 @@
// FLOW: IN
package sample
actual class ExpectClass {
actual fun foo(p: Any) {
println(<caret>p)
}
}
@@ -0,0 +1,3 @@
7 println(<bold>p</bold>)
6 actual fun foo(<bold>p: Any</bold>) {
8 c.foo(<bold>1</bold>)
@@ -0,0 +1,5 @@
expect fun foo(p: Any)
fun bar() {
foo(1)
}
@@ -0,0 +1,5 @@
// FLOW: IN
actual fun foo(p: Any) {
println(<caret>p)
}
@@ -0,0 +1,3 @@
4 println(<bold>p</bold>)
3 actual fun foo(<bold>p: Any</bold>) {
4 foo(<bold>1</bold>)
@@ -0,0 +1,11 @@
// FLOW: OUT
package sample
expect class ExpectClass() {
fun foo(p: Any)
}
fun f(c: ExpectClass) {
c.foo(<caret>1)
}
@@ -0,0 +1,7 @@
package sample
actual class ExpectClass {
actual fun foo(p: Any) {
println(p)
}
}
@@ -0,0 +1,4 @@
10 c.foo(<bold>1</bold>)
6 fun foo(<bold>p: Any</bold>)
4 actual fun foo(<bold>p: Any</bold>) {
5 println(<bold>p</bold>)
@@ -0,0 +1,8 @@
// FLOW: OUT
expect fun Any.foo(): Any
fun bar() {
val result = <caret>1.foo()
println(result)
}
@@ -0,0 +1,3 @@
actual fun Any.foo(): Any {
return this
}
@@ -0,0 +1,8 @@
6 val result = <bold>1</bold>.foo()
3 expect fun <bold>Any</bold>.foo(): Any
1 actual fun <bold>Any</bold>.foo(): Any {
2 return <bold>this</bold>
1 actual fun Any.<bold>foo(): Any {</bold>
6 val result = 1.<bold>foo()</bold>
6 val <bold>result = 1.foo()</bold>
7 println(<bold>result</bold>)
@@ -0,0 +1,7 @@
// FLOW: OUT
expect fun foo(p: Any)
fun bar() {
foo(<caret>1)
}
@@ -0,0 +1,3 @@
actual fun foo(p: Any) {
println(p)
}
@@ -0,0 +1,4 @@
6 foo(<bold>1</bold>)
3 expect fun foo(<bold>p: Any</bold>)
1 actual fun foo(<bold>p: Any</bold>) {
2 println(<bold>p</bold>)
@@ -0,0 +1,8 @@
// FLOW: IN
expect fun foo(p: Any): Any
fun bar() {
val result = foo(1)
println(<caret>result)
}
@@ -0,0 +1,3 @@
actual fun foo(p: Any): Any {
return p
}
@@ -0,0 +1,8 @@
7 println(<bold>result</bold>)
6 val <bold>result = foo(1)</bold>
6 val result = <bold>foo(1)</bold>
1 actual fun <bold>foo(p: Any): Any {</bold>
2 return <bold>p</bold>
1 actual fun foo(<bold>p: Any</bold>): Any {
6 val result = foo(<bold>1</bold>)
3 expect fun <bold>foo(p: Any): Any</bold>
@@ -0,0 +1,8 @@
// FLOW: OUT
expect fun foo(p: Any): Any
fun bar() {
val result = foo(<caret>1)
println(result)
}
@@ -0,0 +1,3 @@
actual fun foo(p: Any): Any {
return p
}
@@ -0,0 +1,8 @@
6 val result = foo(<bold>1</bold>)
3 expect fun foo(<bold>p: Any</bold>): Any
1 actual fun foo(<bold>p: Any</bold>): Any {
2 return <bold>p</bold>
1 actual fun <bold>foo(p: Any): Any {</bold>
6 val result = <bold>foo(1)</bold>
6 val <bold>result = foo(1)</bold>
7 println(<bold>result</bold>)
@@ -0,0 +1,8 @@
// FLOW: IN
expect val Int.property: Any
fun bar() {
val result = 1.property
println(<caret>result)
}
@@ -0,0 +1,2 @@
actual val Int.property: Any
get() = this
@@ -0,0 +1,8 @@
7 println(<bold>result</bold>)
6 val <bold>result = 1.property</bold>
6 val result = <bold>1.property</bold>
1 actual val Int.<bold>property: Any</bold>
2 get() = <bold>this</bold>
1 actual val <bold>Int</bold>.property: Any
6 val result = <bold>1</bold>.property
3 expect val Int.<bold>property: Any</bold>
@@ -0,0 +1,8 @@
// FLOW: OUT
expect val Int.property: Any
fun bar() {
val result = <caret>1.property
println(result)
}
@@ -0,0 +1,2 @@
actual val Int.property: Any
get() = this
@@ -0,0 +1,8 @@
6 val result = <bold>1</bold>.property
3 expect val <bold>Int</bold>.property: Any
1 actual val <bold>Int</bold>.property: Any
2 get() = <bold>this</bold>
2 <bold>get() = this</bold>
6 val result = 1.<bold>property</bold>
6 val <bold>result = 1.property</bold>
7 println(<bold>result</bold>)
@@ -5,5 +5,18 @@
22 DEREFERENCE: <bold>x</bold> += 1
23 DEREFERENCE: <bold>x</bold> *= 1
25 -<bold>x</bold>
12 operator fun <bold>A</bold>.unaryMinus() = this
12 operator fun A.unaryMinus() = <bold>this</bold>
12 operator fun A.<bold>unaryMinus() = this</bold>
25 <bold>-x</bold>
26 <bold>x</bold> - 1
11 operator fun <bold>A</bold>.minus(n: Int) = this
11 operator fun A.minus(n: Int) = <bold>this</bold>
11 operator fun A.<bold>minus(n: Int) = this</bold>
26 <bold>x - 1</bold>
28 <bold>x -= 1</bold>
17 DUPLICATE: var <bold>x = A()</bold>
29 <bold>x</bold> /= 1
14 operator fun <bold>A</bold>.divAssign(n: Int) = this
14 operator fun A.divAssign(n: Int) = <bold>this</bold>
14 operator fun A.<bold>divAssign(n: Int) = this</bold>
@@ -2,10 +2,14 @@
15 DEREFERENCE: <bold>x</bold>.foo()
16 DEREFERENCE: <bold>x</bold>.bar
17 <bold>x</bold>.fooExt()
9 fun <bold>A</bold>.fooExt() = 1
18 <bold>x</bold>.barExt
10 val <bold>A</bold>.barExt: Int get() = 2
20 val y: A? = <bold>x</bold>
20 val <bold>y: A? = x</bold>
22 DEREFERENCE: <bold>y</bold>?.foo()
23 DEREFERENCE: <bold>y</bold>?.bar
24 <bold>y</bold>?.fooExt()
9 DUPLICATE: fun <bold>A</bold>.fooExt() = 1
25 <bold>y</bold>?.barExt
10 DUPLICATE: val <bold>A</bold>.barExt: Int get() = 2
@@ -0,0 +1,7 @@
// FLOW: OUT
fun String.extensionFun(): Any = this
fun foo() {
val x = <caret>"".extensionFun()
}
@@ -0,0 +1,6 @@
6 val x = <bold>""</bold>.extensionFun()
3 fun <bold>String</bold>.extensionFun(): Any = this
3 fun String.extensionFun(): Any = <bold>this</bold>
3 fun String.<bold>extensionFun(): Any = this</bold>
6 val x = "".<bold>extensionFun()</bold>
6 val <bold>x = "".extensionFun()</bold>
@@ -0,0 +1,8 @@
// FLOW: OUT
val String.extensionProp: Any
get() = this
fun foo() {
val x = <caret>"".extensionProp
}
@@ -0,0 +1,6 @@
7 val x = <bold>""</bold>.extensionProp
3 val <bold>String</bold>.extensionProp: Any
4 get() = <bold>this</bold>
4 <bold>get() = this</bold>
7 val x = "".<bold>extensionProp</bold>
7 val <bold>x = "".extensionProp</bold>
+19
View File
@@ -0,0 +1,19 @@
// FLOW: OUT
class C {
fun String.extensionFun(): Any {
with("A") {
println(this.length)
println(this@extensionFun.length)
}
return this@C
}
fun foo() {
val x = <caret>"".extensionFun()
}
}
inline fun <T, R> with(receiver: T, block: T.() -> R): R {
return receiver.block()
}
+3
View File
@@ -0,0 +1,3 @@
13 val x = <bold>""</bold>.extensionFun()
4 fun <bold>String</bold>.extensionFun(): Any {
7 println(<bold>this@extensionFun</bold>.length)