Tracking of incoming lambda's for outflow analysis

This commit is contained in:
Valentin Kipyatkov
2020-04-12 17:34:21 +03:00
parent a09a9a65ff
commit 8f01427534
9 changed files with 259 additions and 55 deletions
+18
View File
@@ -0,0 +1,18 @@
// FLOW: OUT
fun foo(<caret>p: String) {
val v1 = p.let { value -> bar(value) }
val v2 = p.let { it }
val v3 = p.let {
val it = "a"
it
}
}
fun bar(s: String) = s
inline fun <T, R> T.let(block: (T) -> R): R {
return block(this)
}
+35
View File
@@ -0,0 +1,35 @@
3 fun foo(<bold>p: String</bold>) {
4 val v1 = <bold>p</bold>.let { value -> bar(value) }
16 (INLINE CALL let) inline fun <T, R> <bold>T</bold>.let(block: (T) -> R): R {
17 (INLINE CALL let) return block(<bold>this</bold>)
16 (INLINE CALL let) [LAMBDA ARGUMENT IN] inline fun <T, R> T.let(<bold>block: (T) -> R</bold>): R {
4 [LAMBDA ARGUMENT IN] val v1 = p.let <bold>{ value -> bar(value) }</bold>
4 val v1 = p.let { <bold>value</bold> -> bar(value) }
4 val v1 = p.let { value -> bar(<bold>value</bold>) }
14 fun bar(<bold>s: String</bold>) = s
14 fun bar(s: String) = <bold>s</bold>
14 fun <bold>bar(s: String) = s</bold>
4 val v1 = p.let { value -> <bold>bar(value)</bold> }
4 val v1 = p.let <bold>{ value -> bar(value) }</bold>
4 [LAMBDA CALLS] val v1 = p.let <bold>{ value -> bar(value) }</bold>
16 (INLINE CALL let) [LAMBDA CALLS] inline fun <T, R> T.let(<bold>block: (T) -> R</bold>): R {
17 (INLINE CALL let) return <bold>block(this)</bold>
4 val v1 = p.<bold>let { value -> bar(value) }</bold>
4 val <bold>v1 = p.let { value -> bar(value) }</bold>
6 val v2 = <bold>p</bold>.let { it }
16 (INLINE CALL let) inline fun <T, R> <bold>T</bold>.let(block: (T) -> R): R {
17 (INLINE CALL let) return block(<bold>this</bold>)
16 (INLINE CALL let) [LAMBDA ARGUMENT IN] inline fun <T, R> T.let(<bold>block: (T) -> R</bold>): R {
6 [LAMBDA ARGUMENT IN] val v2 = p.let <bold>{ it }</bold>
6 val v2 = p.let { <bold>it</bold> }
6 val v2 = p.let <bold>{ it }</bold>
6 [LAMBDA CALLS] val v2 = p.let <bold>{ it }</bold>
16 (INLINE CALL let) [LAMBDA CALLS] inline fun <T, R> T.let(<bold>block: (T) -> R</bold>): R {
17 (INLINE CALL let) return <bold>block(this)</bold>
6 val v2 = p.<bold>let { it }</bold>
6 val <bold>v2 = p.let { it }</bold>
8 val v3 = <bold>p</bold>.let {
16 (INLINE CALL let) inline fun <T, R> <bold>T</bold>.let(block: (T) -> R): R {
17 (INLINE CALL let) return block(<bold>this</bold>)
16 (INLINE CALL let) [LAMBDA ARGUMENT IN] inline fun <T, R> T.let(<bold>block: (T) -> R</bold>): R {
8 [LAMBDA ARGUMENT IN] val v3 = p.let <bold>{</bold>
+18
View File
@@ -0,0 +1,18 @@
// FLOW: OUT
fun foo(<caret>p: String) {
val v1 = p.let { value -> bar(value) }
val v2 = p.let { it }
val v3 = p.let {
val it = "a"
it
}
}
fun bar(s: String) = s
fun <T, R> T.let(block: (T) -> R): R {
return block(this)
}
@@ -0,0 +1,33 @@
3 fun foo(<bold>p: String</bold>) {
4 val v1 = <bold>p</bold>.let { value -> bar(value) }
16 fun <T, R> <bold>T</bold>.let(block: (T) -> R): R {
17 return block(<bold>this</bold>)
16 [LAMBDA ARGUMENT IN] fun <T, R> T.let(<bold>block: (T) -> R</bold>): R {
4 [LAMBDA ARGUMENT IN] val v1 = p.let <bold>{ value -> bar(value) }</bold>
4 val v1 = p.let { <bold>value</bold> -> bar(value) }
4 val v1 = p.let { value -> bar(<bold>value</bold>) }
14 fun bar(<bold>s: String</bold>) = s
14 fun bar(s: String) = <bold>s</bold>
14 fun <bold>bar(s: String) = s</bold>
4 val v1 = p.let { value -> <bold>bar(value)</bold> }
4 val v1 = p.let <bold>{ value -> bar(value) }</bold>
4 [LAMBDA CALLS] val v1 = p.let <bold>{ value -> bar(value) }</bold>
16 [LAMBDA CALLS] fun <T, R> T.let(<bold>block: (T) -> R</bold>): R {
17 return <bold>block(this)</bold>
16 fun <T, R> T.<bold>let(block: (T) -> R): R {</bold>
4 val v1 = p.<bold>let { value -> bar(value) }</bold>
4 val <bold>v1 = p.let { value -> bar(value) }</bold>
6 val v2 = p.<bold>let { it }</bold>
6 val <bold>v2 = p.let { it }</bold>
8 val v3 = p.<bold>let {</bold>
8 val <bold>v3 = p.let {</bold>
6 [LAMBDA ARGUMENT IN] val v2 = p.let <bold>{ it }</bold>
6 val v2 = p.let { <bold>it</bold> }
6 val v2 = p.let <bold>{ it }</bold>
6 [LAMBDA CALLS] val v2 = p.let <bold>{ it }</bold>
16 [LAMBDA CALLS] DUPLICATE: fun <T, R> T.let(<bold>block: (T) -> R</bold>): R {
8 [LAMBDA ARGUMENT IN] val v3 = p.let <bold>{</bold>
6 val v2 = <bold>p</bold>.let { it }
16 DUPLICATE: fun <T, R> <bold>T</bold>.let(block: (T) -> R): R {
8 val v3 = <bold>p</bold>.let {
16 DUPLICATE: fun <T, R> <bold>T</bold>.let(block: (T) -> R): R {