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:
@@ -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
@@ -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
@@ -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>
|
||||
|
||||
+7
-5
@@ -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
@@ -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
@@ -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>
|
||||
|
||||
+3
-2
@@ -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>) {
|
||||
|
||||
@@ -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>) {
|
||||
|
||||
@@ -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>){}
|
||||
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user