diff --git a/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt b/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt index 5cac0d53ad0..bce7f1f3a54 100644 --- a/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/slicer/Slicer.kt @@ -359,7 +359,7 @@ class OutflowSlicer( refExpression.processDereferences() } if (!withDereferences || KotlinReadWriteAccessDetector.INSTANCE.getExpressionAccess(refExpression) == Access.Read) { - refExpression.processExpression() + refExpression.passToProcessor() } } } diff --git a/idea/testData/slicer/outflow/anonymousFunBodyExpression.results.txt b/idea/testData/slicer/outflow/anonymousFunBodyExpression.results.txt index 0754ab6f7b1..3b6fe004cf1 100644 --- a/idea/testData/slicer/outflow/anonymousFunBodyExpression.results.txt +++ b/idea/testData/slicer/outflow/anonymousFunBodyExpression.results.txt @@ -2,7 +2,8 @@ 8 val x = foo(fun(n: Int) = n) 8 [LAMBDA] val x = foo(fun(n: Int) = n) 3 [LAMBDA] fun foo(f: (Int) -> Int): Int { -4 return f(1) -3 fun foo(f: (Int) -> Int): Int { -8 val x = foo(fun(n: Int) = n) -8 val x = foo(fun(n: Int) = n) +4 [LAMBDA] return f(1) +4 return f(1) +3 fun foo(f: (Int) -> Int): Int { +8 val x = foo(fun(n: Int) = n) +8 val x = foo(fun(n: Int) = n) diff --git a/idea/testData/slicer/outflow/anonymousFunReturnExpression.results.txt b/idea/testData/slicer/outflow/anonymousFunReturnExpression.results.txt index b3c0b1697ca..ea3caabdffe 100644 --- a/idea/testData/slicer/outflow/anonymousFunReturnExpression.results.txt +++ b/idea/testData/slicer/outflow/anonymousFunReturnExpression.results.txt @@ -2,7 +2,8 @@ 8 val x = foo(fun(n: Int): Int { return n }) 8 [LAMBDA] val x = foo(fun(n: Int): Int { return n }) 3 [LAMBDA] fun foo(f: (Int) -> Int): Int { -4 return f(1) -3 fun foo(f: (Int) -> Int): Int { -8 val x = foo(fun(n: Int): Int { return n }) -8 val x = foo(fun(n: Int): Int { return n }) +4 [LAMBDA] return f(1) +4 return f(1) +3 fun foo(f: (Int) -> Int): Int { +8 val x = foo(fun(n: Int): Int { return n }) +8 val x = foo(fun(n: Int): Int { return n }) diff --git a/idea/testData/slicer/outflow/callArgument.results.txt b/idea/testData/slicer/outflow/callArgument.results.txt index beaeb0b4ccd..eafe0030315 100644 --- a/idea/testData/slicer/outflow/callArgument.results.txt +++ b/idea/testData/slicer/outflow/callArgument.results.txt @@ -1,4 +1,6 @@ 7 val x = 1 7 val x = 1 -2 fun foo(n: Int) { -3 val y = n +9 foo(x) +2 fun foo(n: Int) { +3 val y = n +3 val y = n diff --git a/idea/testData/slicer/outflow/cast.results.txt b/idea/testData/slicer/outflow/cast.results.txt index bdd23178117..f0d4a0e6ae6 100644 --- a/idea/testData/slicer/outflow/cast.results.txt +++ b/idea/testData/slicer/outflow/cast.results.txt @@ -1,5 +1,7 @@ 3 fun test(o: Any) { -4 val x = o as String -4 val x = o as String -5 val y = o as? String -5 val y = o as? String +4 val x = o as String +4 val x = o as String +4 val x = o as String +5 val y = o as? String +5 val y = o as? String +5 val y = o as? String diff --git a/idea/testData/slicer/outflow/doubleLambdaResult.results.txt b/idea/testData/slicer/outflow/doubleLambdaResult.results.txt index 2783101725f..de34bf5f150 100644 --- a/idea/testData/slicer/outflow/doubleLambdaResult.results.txt +++ b/idea/testData/slicer/outflow/doubleLambdaResult.results.txt @@ -4,8 +4,9 @@ 8 [LAMBDA] val x = foo(1, 2) { { it } } 8 [LAMBDA] [LAMBDA] val x = foo(1, 2) { { it } } 3 [LAMBDA] [LAMBDA] fun foo(a: Int, b: Int, f: (Int) -> (Int) -> Int): Int { -4 [LAMBDA] return f(a)(b) -4 return f(a)(b) -3 fun foo(a: Int, b: Int, f: (Int) -> (Int) -> Int): Int { -8 val x = foo(1, 2) { { it } } -8 val x = foo(1, 2) { { it } } +4 [LAMBDA] [LAMBDA] return f(a)(b) +4 [LAMBDA] return f(a)(b) +4 return f(a)(b) +3 fun foo(a: Int, b: Int, f: (Int) -> (Int) -> Int): Int { +8 val x = foo(1, 2) { { it } } +8 val x = foo(1, 2) { { it } } diff --git a/idea/testData/slicer/outflow/explicitLambdaReturnExpression.results.txt b/idea/testData/slicer/outflow/explicitLambdaReturnExpression.results.txt index 76aac42dbd6..512210e7144 100644 --- a/idea/testData/slicer/outflow/explicitLambdaReturnExpression.results.txt +++ b/idea/testData/slicer/outflow/explicitLambdaReturnExpression.results.txt @@ -2,7 +2,8 @@ 8 val x = foo { 8 [LAMBDA] val x = foo { 3 [LAMBDA] fun foo(f: (Int) -> Int): Int { -4 return f(1) -3 fun foo(f: (Int) -> Int): Int { -8 val x = foo { -8 val x = foo { +4 [LAMBDA] return f(1) +4 return f(1) +3 fun foo(f: (Int) -> Int): Int { +8 val x = foo { +8 val x = foo { diff --git a/idea/testData/slicer/outflow/extensionIndexingDereferences.results.txt b/idea/testData/slicer/outflow/extensionIndexingDereferences.results.txt index 80d3aa11b0a..9e9963f3e3d 100644 --- a/idea/testData/slicer/outflow/extensionIndexingDereferences.results.txt +++ b/idea/testData/slicer/outflow/extensionIndexingDereferences.results.txt @@ -1 +1,6 @@ 13 val x = A() +16 x[1] +17 x[1] = y +18 x[1] += y +19 x[1] *= y +20 x[1]++ diff --git a/idea/testData/slicer/outflow/funParameterUsages.results.txt b/idea/testData/slicer/outflow/funParameterUsages.results.txt index 1234cc92deb..5b31c3816d0 100644 --- a/idea/testData/slicer/outflow/funParameterUsages.results.txt +++ b/idea/testData/slicer/outflow/funParameterUsages.results.txt @@ -1,4 +1,7 @@ 3 fun foo(n: Int) { -4 val x = n -6 val y: Int -12 fun bar(m: Int) { +4 val x = n +4 val x = n +7 y = n +6 val y: Int +9 bar(n) +12 fun bar(m: Int) { diff --git a/idea/testData/slicer/outflow/funResultViaCallableRef.results.txt b/idea/testData/slicer/outflow/funResultViaCallableRef.results.txt index c41704dc49c..05ed25f8575 100644 --- a/idea/testData/slicer/outflow/funResultViaCallableRef.results.txt +++ b/idea/testData/slicer/outflow/funResultViaCallableRef.results.txt @@ -2,7 +2,8 @@ 8 fun bar(n: Int) = n 9 [LAMBDA] val x = foo(::bar) 3 [LAMBDA] fun foo(f: (Int) -> Int): Int { -4 return f(1) -3 fun foo(f: (Int) -> Int): Int { -9 val x = foo(::bar) -9 val x = foo(::bar) +4 [LAMBDA] return f(1) +4 return f(1) +3 fun foo(f: (Int) -> Int): Int { +9 val x = foo(::bar) +9 val x = foo(::bar) diff --git a/idea/testData/slicer/outflow/funResultViaCallableRefWithAssignment.results.txt b/idea/testData/slicer/outflow/funResultViaCallableRefWithAssignment.results.txt index 36ab1c508e6..b06a176069d 100644 --- a/idea/testData/slicer/outflow/funResultViaCallableRefWithAssignment.results.txt +++ b/idea/testData/slicer/outflow/funResultViaCallableRefWithAssignment.results.txt @@ -2,8 +2,10 @@ 8 fun bar(n: Int) = n 9 [LAMBDA] val f = ::bar 9 [LAMBDA] val f = ::bar -3 [LAMBDA] fun foo(f: (Int) -> Int): Int { -4 return f(1) -3 fun foo(f: (Int) -> Int): Int { -10 val x = foo(f) -10 val x = foo(f) +10 [LAMBDA] val x = foo(f) +3 [LAMBDA] fun foo(f: (Int) -> Int): Int { +4 [LAMBDA] return f(1) +4 return f(1) +3 fun foo(f: (Int) -> Int): Int { +10 val x = foo(f) +10 val x = foo(f) diff --git a/idea/testData/slicer/outflow/getterExpressionBody.results.txt b/idea/testData/slicer/outflow/getterExpressionBody.results.txt index 6a5d4c5187b..bd8b273201f 100644 --- a/idea/testData/slicer/outflow/getterExpressionBody.results.txt +++ b/idea/testData/slicer/outflow/getterExpressionBody.results.txt @@ -1,3 +1,4 @@ 4 get() = 0 4 get() = 0 -7 val x = foo +7 val x = foo +7 val x = foo diff --git a/idea/testData/slicer/outflow/getterReturnExpression.results.txt b/idea/testData/slicer/outflow/getterReturnExpression.results.txt index 30aa9dde0af..83ac2411725 100644 --- a/idea/testData/slicer/outflow/getterReturnExpression.results.txt +++ b/idea/testData/slicer/outflow/getterReturnExpression.results.txt @@ -1,3 +1,4 @@ 5 return 0 4 get(): Int { -9 val x = foo +9 val x = foo +9 val x = foo diff --git a/idea/testData/slicer/outflow/ifExpression.results.txt b/idea/testData/slicer/outflow/ifExpression.results.txt index 5c41ffb9552..2ab3e313974 100644 --- a/idea/testData/slicer/outflow/ifExpression.results.txt +++ b/idea/testData/slicer/outflow/ifExpression.results.txt @@ -1,2 +1,3 @@ 3 fun test(m: Int, n: Int) { -4 val x = if (m > 1) n else 1 +4 val x = if (m > 1) n else 1 +4 val x = if (m > 1) n else 1 diff --git a/idea/testData/slicer/outflow/lambdaResult.results.txt b/idea/testData/slicer/outflow/lambdaResult.results.txt index 5ec5ccae879..59e86c0e949 100644 --- a/idea/testData/slicer/outflow/lambdaResult.results.txt +++ b/idea/testData/slicer/outflow/lambdaResult.results.txt @@ -2,7 +2,8 @@ 8 val x = foo { it } 8 [LAMBDA] val x = foo { it } 3 [LAMBDA] fun foo(f: (Int) -> Int): Int { -4 return f(1) -3 fun foo(f: (Int) -> Int): Int { -8 val x = foo { it } -8 val x = foo { it } +4 [LAMBDA] return f(1) +4 return f(1) +3 fun foo(f: (Int) -> Int): Int { +8 val x = foo { it } +8 val x = foo { it } diff --git a/idea/testData/slicer/outflow/lambdaResultWithAssignments.results.txt b/idea/testData/slicer/outflow/lambdaResultWithAssignments.results.txt index dda6b1052d8..ad2b72a58b7 100644 --- a/idea/testData/slicer/outflow/lambdaResultWithAssignments.results.txt +++ b/idea/testData/slicer/outflow/lambdaResultWithAssignments.results.txt @@ -2,8 +2,10 @@ 9 val y = foo { it } 9 [LAMBDA] val y = foo { it } 3 [LAMBDA] fun foo(f: (Int) -> Int): Int { -4 [LAMBDA] val x = f -5 return x(1) -3 fun foo(f: (Int) -> Int): Int { -9 val y = foo { it } -9 val y = foo { it } +4 [LAMBDA] val x = f +4 [LAMBDA] val x = f +5 [LAMBDA] return x(1) +5 return x(1) +3 fun foo(f: (Int) -> Int): Int { +9 val y = foo { it } +9 val y = foo { it } diff --git a/idea/testData/slicer/outflow/lambdaResultWithDirectCallViaAssignment.results.txt b/idea/testData/slicer/outflow/lambdaResultWithDirectCallViaAssignment.results.txt index 7f091ec8911..9672cf291c1 100644 --- a/idea/testData/slicer/outflow/lambdaResultWithDirectCallViaAssignment.results.txt +++ b/idea/testData/slicer/outflow/lambdaResultWithDirectCallViaAssignment.results.txt @@ -2,5 +2,6 @@ 4 val f = { 1 } 4 [LAMBDA] val f = { 1 } 4 [LAMBDA] val f = { 1 } -5 val x = f() -5 val x = f() +5 [LAMBDA] val x = f() +5 val x = f() +5 val x = f() diff --git a/idea/testData/slicer/outflow/localVariableUsages.results.txt b/idea/testData/slicer/outflow/localVariableUsages.results.txt index 5ce6580cad3..7db2d5e5879 100644 --- a/idea/testData/slicer/outflow/localVariableUsages.results.txt +++ b/idea/testData/slicer/outflow/localVariableUsages.results.txt @@ -1,4 +1,7 @@ 6 val x = 1 -8 val y = x -10 val z: Int -2 fun foo(n: Int) { +8 val y = x +8 val y = x +11 z = x +10 val z: Int +13 foo(x) +2 fun foo(n: Int) { diff --git a/idea/testData/slicer/outflow/memberPropertyUsages.results.txt b/idea/testData/slicer/outflow/memberPropertyUsages.results.txt index c01e151d4b2..0fcfc37d3e2 100644 --- a/idea/testData/slicer/outflow/memberPropertyUsages.results.txt +++ b/idea/testData/slicer/outflow/memberPropertyUsages.results.txt @@ -1,4 +1,7 @@ 4 val x = 1 -6 val y = x -8 val z: Int -16 fun bar(m: Int) { +6 val y = x +6 val y = x +11 z = x +8 val z: Int +13 bar(x) +16 fun bar(m: Int) { diff --git a/idea/testData/slicer/outflow/notNullAssertion.results.txt b/idea/testData/slicer/outflow/notNullAssertion.results.txt index f79d0917c28..755733f317a 100644 --- a/idea/testData/slicer/outflow/notNullAssertion.results.txt +++ b/idea/testData/slicer/outflow/notNullAssertion.results.txt @@ -1,3 +1,4 @@ 3 fun test(s: String?) { -4 val x = s!! -4 val x = s!! +4 val x = s!! +4 val x = s!! +4 val x = s!! diff --git a/idea/testData/slicer/outflow/operatorCallDereferences.results.txt b/idea/testData/slicer/outflow/operatorCallDereferences.results.txt index 4311e539cf3..70f56e4cca9 100644 --- a/idea/testData/slicer/outflow/operatorCallDereferences.results.txt +++ b/idea/testData/slicer/outflow/operatorCallDereferences.results.txt @@ -4,3 +4,6 @@ 21 DEREFERENCE: x++ 22 DEREFERENCE: x += 1 23 DEREFERENCE: x *= 1 +25 -x +26 x - 1 +29 x /= 1 diff --git a/idea/testData/slicer/outflow/overridingParameter.results.txt b/idea/testData/slicer/outflow/overridingParameter.results.txt index 7c8ff133c32..aae9d7c88f7 100644 --- a/idea/testData/slicer/outflow/overridingParameter.results.txt +++ b/idea/testData/slicer/outflow/overridingParameter.results.txt @@ -1,5 +1,8 @@ 10 override val foo = 3 10 override val foo = 3 -16 val z = c.foo -14 val x = a.foo -15 val y = b.foo +16 val z = c.foo +16 val z = c.foo +14 val x = a.foo +14 val x = a.foo +15 val y = b.foo +15 val y = b.foo diff --git a/idea/testData/slicer/outflow/overridingPropertyGetterResult.results.txt b/idea/testData/slicer/outflow/overridingPropertyGetterResult.results.txt index 1c810a60b99..dd4132f00d7 100644 --- a/idea/testData/slicer/outflow/overridingPropertyGetterResult.results.txt +++ b/idea/testData/slicer/outflow/overridingPropertyGetterResult.results.txt @@ -1,4 +1,6 @@ 10 get() = 2 10 get() = 2 -20 val y = b.foo -19 val x = a.foo +20 val y = b.foo +20 val y = b.foo +19 val x = a.foo +19 val x = a.foo diff --git a/idea/testData/slicer/outflow/overridingPropertyResult.results.txt b/idea/testData/slicer/outflow/overridingPropertyResult.results.txt index 67f36298206..34d5b88651d 100644 --- a/idea/testData/slicer/outflow/overridingPropertyResult.results.txt +++ b/idea/testData/slicer/outflow/overridingPropertyResult.results.txt @@ -1,4 +1,6 @@ 8 override val foo = 2 8 override val foo = 2 -17 val y = b.foo -16 val x = a.foo +17 val y = b.foo +17 val y = b.foo +16 val x = a.foo +16 val x = a.foo diff --git a/idea/testData/slicer/outflow/primaryConstructorParameterUsages.results.txt b/idea/testData/slicer/outflow/primaryConstructorParameterUsages.results.txt index 3b09a51ee65..afcf2c1630c 100644 --- a/idea/testData/slicer/outflow/primaryConstructorParameterUsages.results.txt +++ b/idea/testData/slicer/outflow/primaryConstructorParameterUsages.results.txt @@ -1,4 +1,7 @@ 3 class A(n: Int) { -4 val x = n -6 val y: Int -14 fun bar(m: Int) { +4 val x = n +4 val x = n +9 y = n +6 val y: Int +11 bar(n) +14 fun bar(m: Int) { diff --git a/idea/testData/slicer/outflow/simpleCallDereferences.results.txt b/idea/testData/slicer/outflow/simpleCallDereferences.results.txt index 06624e9116b..deeefea173d 100644 --- a/idea/testData/slicer/outflow/simpleCallDereferences.results.txt +++ b/idea/testData/slicer/outflow/simpleCallDereferences.results.txt @@ -1,6 +1,11 @@ 13 val x = A() 15 DEREFERENCE: x.foo() 16 DEREFERENCE: x.bar -20 val y: A? = x -22 DEREFERENCE: y?.foo() -23 DEREFERENCE: y?.bar +17 x.fooExt() +18 x.barExt +20 val y: A? = x +20 val y: A? = x +22 DEREFERENCE: y?.foo() +23 DEREFERENCE: y?.bar +24 y?.fooExt() +25 y?.barExt diff --git a/idea/testData/slicer/outflow/topLevelPropertyUsages.results.txt b/idea/testData/slicer/outflow/topLevelPropertyUsages.results.txt index 87c304cf28a..fc341f680d9 100644 --- a/idea/testData/slicer/outflow/topLevelPropertyUsages.results.txt +++ b/idea/testData/slicer/outflow/topLevelPropertyUsages.results.txt @@ -1,5 +1,9 @@ 3 val x = 1 -5 val y = x -8 val y = x -10 val z: Int -19 fun bar(m: Int) { +5 val y = x +5 val y = x +8 val y = x +8 val y = x +13 z = x +10 val z: Int +15 bar(x) +19 fun bar(m: Int) { diff --git a/idea/testData/slicer/outflow/usagesInLoopRange.kt b/idea/testData/slicer/outflow/usagesInLoopRange.kt new file mode 100644 index 00000000000..e000b195bdf --- /dev/null +++ b/idea/testData/slicer/outflow/usagesInLoopRange.kt @@ -0,0 +1,5 @@ +// FLOW: OUT + +fun f(list: List){ + for(s in list){} +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/usagesInLoopRange.results.txt b/idea/testData/slicer/outflow/usagesInLoopRange.results.txt new file mode 100644 index 00000000000..66cdc62d6f2 --- /dev/null +++ b/idea/testData/slicer/outflow/usagesInLoopRange.results.txt @@ -0,0 +1,2 @@ +3 fun f(list: List){ +4 for(s in list){} diff --git a/idea/testData/slicer/outflow/usagesInTemplates.kt b/idea/testData/slicer/outflow/usagesInTemplates.kt new file mode 100644 index 00000000000..53229fac454 --- /dev/null +++ b/idea/testData/slicer/outflow/usagesInTemplates.kt @@ -0,0 +1,11 @@ +// FLOW: OUT + +fun f1(param: String){ + val a = "param = $param" +} + +fun main(args: Array) { + val hello = "Hello" + println("hello = $hello") + f1(hello) +} \ No newline at end of file diff --git a/idea/testData/slicer/outflow/usagesInTemplates.results.txt b/idea/testData/slicer/outflow/usagesInTemplates.results.txt new file mode 100644 index 00000000000..1065639eacb --- /dev/null +++ b/idea/testData/slicer/outflow/usagesInTemplates.results.txt @@ -0,0 +1,5 @@ +8 val hello = "Hello" +9 println("hello = $hello") +10 f1(hello) +3 fun f1(param: String){ +4 val a = "param = $param" diff --git a/idea/testData/slicer/outflow/valParameter.results.txt b/idea/testData/slicer/outflow/valParameter.results.txt index 5cd4ee882f3..88edf075d7f 100644 --- a/idea/testData/slicer/outflow/valParameter.results.txt +++ b/idea/testData/slicer/outflow/valParameter.results.txt @@ -1,6 +1,11 @@ 3 class A(val n: Int) { -4 val x = n -6 val y: Int -14 fun bar(m: Int) { -15 val z = n -20 val z = A(1).n +4 val x = n +4 val x = n +9 y = n +6 val y: Int +11 bar(n) +14 fun bar(m: Int) { +15 val z = n +15 val z = n +20 val z = A(1).n +20 val z = A(1).n diff --git a/idea/testData/slicer/outflow/varParameter.results.txt b/idea/testData/slicer/outflow/varParameter.results.txt index 2ab1b3cecc4..3776c997ac7 100644 --- a/idea/testData/slicer/outflow/varParameter.results.txt +++ b/idea/testData/slicer/outflow/varParameter.results.txt @@ -1,6 +1,11 @@ 3 class A(var n: Int) { -4 val x = n -6 val y: Int -14 fun bar(m: Int) { -15 val z = n -21 val z = A(1).n +4 val x = n +4 val x = n +9 y = n +6 val y: Int +11 bar(n) +14 fun bar(m: Int) { +15 val z = n +15 val z = n +21 val z = A(1).n +21 val z = A(1).n diff --git a/idea/testData/slicer/outflow/whenExpression.results.txt b/idea/testData/slicer/outflow/whenExpression.results.txt index 53f7c7dada2..37352a5023f 100644 --- a/idea/testData/slicer/outflow/whenExpression.results.txt +++ b/idea/testData/slicer/outflow/whenExpression.results.txt @@ -1,2 +1,3 @@ 3 fun test(m: Int, n: Int) { -4 val x = when (m) { +6 2 -> n +4 val x = when (m) { diff --git a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTestGenerated.java index c795536b65a..96456b6524f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/slicer/SlicerTestGenerated.java @@ -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); + } }