From e00c8d6e05827b6f750098b46f40b4a4fc3de8bf Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 26 Aug 2016 19:10:36 +0300 Subject: [PATCH] "!is" in when case --- .../usagesSearch/destructuringDeclarationUsages.kt | 11 +++++++++-- .../kotlin/conventions/components/dataClass.2.kt | 12 +++++++++++- .../conventions/components/dataClass.results.txt | 1 + 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/destructuringDeclarationUsages.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/destructuringDeclarationUsages.kt index 7b7c008762a..c87de24e13c 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/destructuringDeclarationUsages.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/usagesSearch/destructuringDeclarationUsages.kt @@ -254,8 +254,15 @@ private class Processor( } is KtWhenConditionIsPattern -> { - //TODO: smart cast is possible outside of when or inside other branches! - usePlainSearch(typeRefParent.parent as KtWhenEntry) + val whenEntry = typeRefParent.parent as KtWhenEntry + if (typeRefParent.isNegated) { + val whenExpression = whenEntry.parent as KtWhenExpression + val entriesAfter = whenExpression.entries.dropWhile { it != whenEntry }.drop(1) + entriesAfter.forEach { usePlainSearch(it) } + } + else { + usePlainSearch(whenEntry) + } return true } diff --git a/idea/testData/findUsages/kotlin/conventions/components/dataClass.2.kt b/idea/testData/findUsages/kotlin/conventions/components/dataClass.2.kt index ca264aa0766..a567bbab441 100644 --- a/idea/testData/findUsages/kotlin/conventions/components/dataClass.2.kt +++ b/idea/testData/findUsages/kotlin/conventions/components/dataClass.2.kt @@ -33,7 +33,7 @@ fun y(o: Any) { val (x, y) = list[0] } -fun z(o: Any) { +fun when1(o: Any) { when (o) { is A -> { val (x, y) = o @@ -44,3 +44,13 @@ fun z(o: Any) { else -> return } } + +fun when2(o: Any) { + when (o) { + !is A -> { } + + else -> { + val (x, y) = o + } + } +} diff --git a/idea/testData/findUsages/kotlin/conventions/components/dataClass.results.txt b/idea/testData/findUsages/kotlin/conventions/components/dataClass.results.txt index 7bfd35e73c9..2937248a406 100644 --- a/idea/testData/findUsages/kotlin/conventions/components/dataClass.results.txt +++ b/idea/testData/findUsages/kotlin/conventions/components/dataClass.results.txt @@ -12,6 +12,7 @@ [dataClass.2.kt] Value read 33 val (x, y) = list[0] [dataClass.2.kt] Value read 39 val (x, y) = o [dataClass.2.kt] Value read 5 a.n +[dataClass.2.kt] Value read 53 val (x, y) = o [dataClass.2.kt] Value read 8 val (x, y, z) = a [dataClass.2.kt] Value read 9 val (x1, y1, z1) = f() [dataClass.3.kt] Value read 12 val (x, y, z) = a