Data Outflow: Show all reference expressions as separate steps

#KT-19012 Fixed
 #KT-19017 Fixed
 #KT-19036 Fixed
 #KT-19039 Fixed
 #KT-19104 Fixed
 #KT-19106 Fixed
This commit is contained in:
Alexey Sedunov
2017-11-08 16:13:04 +03:00
parent 0fc1c793fe
commit fc307da383
35 changed files with 187 additions and 86 deletions
@@ -359,7 +359,7 @@ class OutflowSlicer(
refExpression.processDereferences()
}
if (!withDereferences || KotlinReadWriteAccessDetector.INSTANCE.getExpressionAccess(refExpression) == Access.Read) {
refExpression.processExpression()
refExpression.passToProcessor()
}
}
}
@@ -2,7 +2,8 @@
8 val x = foo(<bold>fun(n: Int) = n</bold>)
8 [LAMBDA] val x = foo(<bold>fun(n: Int) = n</bold>)
3 [LAMBDA] fun foo(<bold>f: (Int) -> Int</bold>): Int {
4 return <bold>f(1)</bold>
3 fun <bold>foo(f: (Int) -> Int): Int {</bold>
8 val x = <bold>foo(fun(n: Int) = n)</bold>
8 val <bold>x = foo(fun(n: Int) = n)</bold>
4 [LAMBDA] return <bold>f</bold>(1)
4 return <bold>f(1)</bold>
3 fun <bold>foo(f: (Int) -> Int): Int {</bold>
8 val x = <bold>foo(fun(n: Int) = n)</bold>
8 val <bold>x = foo(fun(n: Int) = n)</bold>
@@ -2,7 +2,8 @@
8 val x = foo(<bold>fun(n: Int): Int { return n }</bold>)
8 [LAMBDA] val x = foo(<bold>fun(n: Int): Int { return n }</bold>)
3 [LAMBDA] fun foo(<bold>f: (Int) -> Int</bold>): Int {
4 return <bold>f(1)</bold>
3 fun <bold>foo(f: (Int) -> Int): Int {</bold>
8 val x = <bold>foo(fun(n: Int): Int { return n })</bold>
8 val <bold>x = foo(fun(n: Int): Int { return n })</bold>
4 [LAMBDA] return <bold>f</bold>(1)
4 return <bold>f(1)</bold>
3 fun <bold>foo(f: (Int) -> Int): Int {</bold>
8 val x = <bold>foo(fun(n: Int): Int { return n })</bold>
8 val <bold>x = foo(fun(n: Int): Int { return n })</bold>
+4 -2
View File
@@ -1,4 +1,6 @@
7 val x = <bold>1</bold>
7 val <bold>x = 1</bold>
2 fun foo(<bold>n: Int</bold>) {
3 val <bold>y = n</bold>
9 foo(<bold>x</bold>)
2 fun foo(<bold>n: Int</bold>) {
3 val y = <bold>n</bold>
3 val <bold>y = n</bold>
+6 -4
View File
@@ -1,5 +1,7 @@
3 fun test(<bold>o: Any</bold>) {
4 val x = <bold>o as String</bold>
4 val <bold>x = o as String</bold>
5 val y = <bold>o as? String</bold>
5 val <bold>y = o as? String</bold>
4 val x = <bold>o</bold> as String
4 val x = <bold>o as String</bold>
4 val <bold>x = o as String</bold>
5 val y = <bold>o</bold> as? String
5 val y = <bold>o as? String</bold>
5 val <bold>y = o as? String</bold>
@@ -4,8 +4,9 @@
8 [LAMBDA] val x = foo(1, 2) <bold>{ { it } }</bold>
8 [LAMBDA] [LAMBDA] val x = foo(1, 2) <bold>{ { it } }</bold>
3 [LAMBDA] [LAMBDA] fun foo(a: Int, b: Int, <bold>f: (Int) -> (Int) -> Int</bold>): Int {
4 [LAMBDA] return <bold>f(a)</bold>(b)
4 return <bold>f(a)(b)</bold>
3 fun <bold>foo(a: Int, b: Int, f: (Int) -> (Int) -> Int): Int {</bold>
8 val x = <bold>foo(1, 2) { { it } }</bold>
8 val <bold>x = foo(1, 2) { { it } }</bold>
4 [LAMBDA] [LAMBDA] return <bold>f</bold>(a)(b)
4 [LAMBDA] return <bold>f(a)</bold>(b)
4 return <bold>f(a)(b)</bold>
3 fun <bold>foo(a: Int, b: Int, f: (Int) -> (Int) -> Int): Int {</bold>
8 val x = <bold>foo(1, 2) { { it } }</bold>
8 val <bold>x = foo(1, 2) { { it } }</bold>
@@ -2,7 +2,8 @@
8 val x = foo <bold>{</bold>
8 [LAMBDA] val x = foo <bold>{</bold>
3 [LAMBDA] fun foo(<bold>f: (Int) -> Int</bold>): Int {
4 return <bold>f(1)</bold>
3 fun <bold>foo(f: (Int) -> Int): Int {</bold>
8 val x = <bold>foo {</bold>
8 val <bold>x = foo {</bold>
4 [LAMBDA] return <bold>f</bold>(1)
4 return <bold>f(1)</bold>
3 fun <bold>foo(f: (Int) -> Int): Int {</bold>
8 val x = <bold>foo {</bold>
8 val <bold>x = foo {</bold>
@@ -1 +1,6 @@
13 val <bold>x = A()</bold>
16 <bold>x</bold>[1]
17 <bold>x</bold>[1] = y
18 <bold>x</bold>[1] += y
19 <bold>x</bold>[1] *= y
20 <bold>x</bold>[1]++
@@ -1,4 +1,7 @@
3 fun foo(<bold>n: Int</bold>) {
4 val <bold>x = n</bold>
6 val <bold>y: Int</bold>
12 fun bar(<bold>m: Int</bold>) {
4 val x = <bold>n</bold>
4 val <bold>x = n</bold>
7 y = <bold>n</bold>
6 val <bold>y: Int</bold>
9 bar(<bold>n</bold>)
12 fun bar(<bold>m: Int</bold>) {
@@ -2,7 +2,8 @@
8 fun <bold>bar(n: Int) = n</bold>
9 [LAMBDA] val x = foo(<bold>::bar</bold>)
3 [LAMBDA] fun foo(<bold>f: (Int) -> Int</bold>): Int {
4 return <bold>f(1)</bold>
3 fun <bold>foo(f: (Int) -> Int): Int {</bold>
9 val x = <bold>foo(::bar)</bold>
9 val <bold>x = foo(::bar)</bold>
4 [LAMBDA] return <bold>f</bold>(1)
4 return <bold>f(1)</bold>
3 fun <bold>foo(f: (Int) -> Int): Int {</bold>
9 val x = <bold>foo(::bar)</bold>
9 val <bold>x = foo(::bar)</bold>
@@ -2,8 +2,10 @@
8 fun <bold>bar(n: Int) = n</bold>
9 [LAMBDA] val f = <bold>::bar</bold>
9 [LAMBDA] val <bold>f = ::bar</bold>
3 [LAMBDA] fun foo(<bold>f: (Int) -> Int</bold>): Int {
4 return <bold>f(1)</bold>
3 fun <bold>foo(f: (Int) -> Int): Int {</bold>
10 val x = <bold>foo(f)</bold>
10 val <bold>x = foo(f)</bold>
10 [LAMBDA] val x = foo(<bold>f</bold>)
3 [LAMBDA] fun foo(<bold>f: (Int) -> Int</bold>): Int {
4 [LAMBDA] return <bold>f</bold>(1)
4 return <bold>f(1)</bold>
3 fun <bold>foo(f: (Int) -> Int): Int {</bold>
10 val x = <bold>foo(f)</bold>
10 val <bold>x = foo(f)</bold>
@@ -1,3 +1,4 @@
4 get() = <bold>0</bold>
4 <bold>get() = 0</bold>
7 val <bold>x = foo</bold>
7 val x = <bold>foo</bold>
7 val <bold>x = foo</bold>
@@ -1,3 +1,4 @@
5 return <bold>0</bold>
4 <bold>get(): Int {</bold>
9 val <bold>x = foo</bold>
9 val x = <bold>foo</bold>
9 val <bold>x = foo</bold>
+2 -1
View File
@@ -1,2 +1,3 @@
3 fun test(m: Int, <bold>n: Int</bold>) {
4 val <bold>x = if (m > 1) n else 1</bold>
4 val x = if (m > 1) <bold>n</bold> else 1
4 val <bold>x = if (m > 1) n else 1</bold>
+5 -4
View File
@@ -2,7 +2,8 @@
8 val x = foo <bold>{ it }</bold>
8 [LAMBDA] val x = foo <bold>{ it }</bold>
3 [LAMBDA] fun foo(<bold>f: (Int) -> Int</bold>): Int {
4 return <bold>f(1)</bold>
3 fun <bold>foo(f: (Int) -> Int): Int {</bold>
8 val x = <bold>foo { it }</bold>
8 val <bold>x = foo { it }</bold>
4 [LAMBDA] return <bold>f</bold>(1)
4 return <bold>f(1)</bold>
3 fun <bold>foo(f: (Int) -> Int): Int {</bold>
8 val x = <bold>foo { it }</bold>
8 val <bold>x = foo { it }</bold>
@@ -2,8 +2,10 @@
9 val y = foo <bold>{ it }</bold>
9 [LAMBDA] val y = foo <bold>{ it }</bold>
3 [LAMBDA] fun foo(<bold>f: (Int) -> Int</bold>): Int {
4 [LAMBDA] val <bold>x = f</bold>
5 return <bold>x(1)</bold>
3 fun <bold>foo(f: (Int) -> Int): Int {</bold>
9 val y = <bold>foo { it }</bold>
9 val <bold>y = foo { it }</bold>
4 [LAMBDA] val x = <bold>f</bold>
4 [LAMBDA] val <bold>x = f</bold>
5 [LAMBDA] return <bold>x</bold>(1)
5 return <bold>x(1)</bold>
3 fun <bold>foo(f: (Int) -> Int): Int {</bold>
9 val y = <bold>foo { it }</bold>
9 val <bold>y = foo { it }</bold>
@@ -2,5 +2,6 @@
4 val f = <bold>{ 1 }</bold>
4 [LAMBDA] val f = <bold>{ 1 }</bold>
4 [LAMBDA] val <bold>f = { 1 }</bold>
5 val x = <bold>f()</bold>
5 val <bold>x = f()</bold>
5 [LAMBDA] val x = <bold>f</bold>()
5 val x = <bold>f()</bold>
5 val <bold>x = f()</bold>
@@ -1,4 +1,7 @@
6 val <bold>x = 1</bold>
8 val <bold>y = x</bold>
10 val <bold>z: Int</bold>
2 fun foo(<bold>n: Int</bold>) {
8 val y = <bold>x</bold>
8 val <bold>y = x</bold>
11 z = <bold>x</bold>
10 val <bold>z: Int</bold>
13 foo(<bold>x</bold>)
2 fun foo(<bold>n: Int</bold>) {
@@ -1,4 +1,7 @@
4 val <bold>x = 1</bold>
6 val <bold>y = x</bold>
8 val <bold>z: Int</bold>
16 fun bar(<bold>m: Int</bold>) {
6 val y = <bold>x</bold>
6 val <bold>y = x</bold>
11 z = <bold>x</bold>
8 val <bold>z: Int</bold>
13 bar(<bold>x</bold>)
16 fun bar(<bold>m: Int</bold>) {
+3 -2
View File
@@ -1,3 +1,4 @@
3 fun test(<bold>s: String?</bold>) {
4 val x = <bold>s!!</bold>
4 val <bold>x = s!!</bold>
4 val x = <bold>s</bold>!!
4 val x = <bold>s!!</bold>
4 val <bold>x = s!!</bold>
@@ -4,3 +4,6 @@
21 DEREFERENCE: <bold>x</bold>++
22 DEREFERENCE: <bold>x</bold> += 1
23 DEREFERENCE: <bold>x</bold> *= 1
25 -<bold>x</bold>
26 <bold>x</bold> - 1
29 <bold>x</bold> /= 1
@@ -1,5 +1,8 @@
10 override val foo = <bold>3</bold>
10 override val <bold>foo = 3</bold>
16 val <bold>z = c.foo</bold>
14 val <bold>x = a.foo</bold>
15 val <bold>y = b.foo</bold>
16 val z = c.<bold>foo</bold>
16 val <bold>z = c.foo</bold>
14 val x = a.<bold>foo</bold>
14 val <bold>x = a.foo</bold>
15 val y = b.<bold>foo</bold>
15 val <bold>y = b.foo</bold>
@@ -1,4 +1,6 @@
10 get() = <bold>2</bold>
10 <bold>get() = 2</bold>
20 val <bold>y = b.foo</bold>
19 val <bold>x = a.foo</bold>
20 val y = b.<bold>foo</bold>
20 val <bold>y = b.foo</bold>
19 val x = a.<bold>foo</bold>
19 val <bold>x = a.foo</bold>
@@ -1,4 +1,6 @@
8 override val foo = <bold>2</bold>
8 override val <bold>foo = 2</bold>
17 val <bold>y = b.foo</bold>
16 val <bold>x = a.foo</bold>
17 val y = b.<bold>foo</bold>
17 val <bold>y = b.foo</bold>
16 val x = a.<bold>foo</bold>
16 val <bold>x = a.foo</bold>
@@ -1,4 +1,7 @@
3 class A(<bold>n: Int</bold>) {
4 val <bold>x = n</bold>
6 val <bold>y: Int</bold>
14 fun bar(<bold>m: Int</bold>) {
4 val x = <bold>n</bold>
4 val <bold>x = n</bold>
9 y = <bold>n</bold>
6 val <bold>y: Int</bold>
11 bar(<bold>n</bold>)
14 fun bar(<bold>m: Int</bold>) {
@@ -1,6 +1,11 @@
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
17 <bold>x</bold>.fooExt()
18 <bold>x</bold>.barExt
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()
25 <bold>y</bold>?.barExt
@@ -1,5 +1,9 @@
3 val <bold>x = 1</bold>
5 val <bold>y = x</bold>
8 val <bold>y = x</bold>
10 val <bold>z: Int</bold>
19 fun bar(<bold>m: Int</bold>) {
5 val y = <bold>x</bold>
5 val <bold>y = x</bold>
8 val y = <bold>x</bold>
8 val <bold>y = x</bold>
13 z = <bold>x</bold>
10 val <bold>z: Int</bold>
15 bar(<bold>x</bold>)
19 fun bar(<bold>m: Int</bold>) {
+5
View File
@@ -0,0 +1,5 @@
// FLOW: OUT
fun f(<caret>list: List<String>){
for(s in list){}
}
@@ -0,0 +1,2 @@
3 fun f(<bold>list: List<String></bold>){
4 for(s in <bold>list</bold>){}
+11
View File
@@ -0,0 +1,11 @@
// FLOW: OUT
fun f1(param: String){
val a = "param = $param"
}
fun main(args: Array<String>) {
val <caret>hello = "Hello"
println("hello = $hello")
f1(hello)
}
@@ -0,0 +1,5 @@
8 val <bold>hello = "Hello"</bold>
9 println("hello = $<bold>hello</bold>")
10 f1(<bold>hello</bold>)
3 fun f1(<bold>param: String</bold>){
4 val a = "param = $<bold>param</bold>"
+10 -5
View File
@@ -1,6 +1,11 @@
3 class A(val <bold>n: Int</bold>) {
4 val <bold>x = n</bold>
6 val <bold>y: Int</bold>
14 fun bar(<bold>m: Int</bold>) {
15 val <bold>z = n</bold>
20 val <bold>z = A(1).n</bold>
4 val x = <bold>n</bold>
4 val <bold>x = n</bold>
9 y = <bold>n</bold>
6 val <bold>y: Int</bold>
11 bar(<bold>n</bold>)
14 fun bar(<bold>m: Int</bold>) {
15 val z = <bold>n</bold>
15 val <bold>z = n</bold>
20 val z = A(1).<bold>n</bold>
20 val <bold>z = A(1).n</bold>
+10 -5
View File
@@ -1,6 +1,11 @@
3 class A(var <bold>n: Int</bold>) {
4 val <bold>x = n</bold>
6 val <bold>y: Int</bold>
14 fun bar(<bold>m: Int</bold>) {
15 val <bold>z = n</bold>
21 val <bold>z = A(1).n</bold>
4 val x = <bold>n</bold>
4 val <bold>x = n</bold>
9 y = <bold>n</bold>
6 val <bold>y: Int</bold>
11 bar(<bold>n</bold>)
14 fun bar(<bold>m: Int</bold>) {
15 val z = <bold>n</bold>
15 val <bold>z = n</bold>
21 val z = A(1).<bold>n</bold>
21 val <bold>z = A(1).n</bold>
+2 -1
View File
@@ -1,2 +1,3 @@
3 fun test(m: Int, <bold>n: Int</bold>) {
4 val <bold>x = when (m) {</bold>
6 2 -> <bold>n</bold>
4 val <bold>x = when (m) {</bold>
@@ -581,4 +581,16 @@ public class SlicerTestGenerated extends AbstractSlicerTest {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/outflow/whenExpression.kt");
doTest(fileName);
}
@TestMetadata("outflow/usagesInTemplates.kt")
public void testOutflow_UsagesInTemplates() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/outflow/usagesInTemplates.kt");
doTest(fileName);
}
@TestMetadata("outflow/usagesInLoopRange.kt")
public void testOutflow_UsagesInLoopRange() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/slicer/outflow/usagesInLoopRange.kt");
doTest(fileName);
}
}