From bddb01888a3ec970dcc5dcbde830b74ab3593ff8 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 22 Jul 2014 18:41:54 +0400 Subject: [PATCH] Fixed KT-5158 Smart completion for when selector: do not include subject variable #KT-5158 Fixed --- .../plugin/completion/smart/SmartCompletion.kt | 16 +++++++++++++--- .../testData/completion/smart/WhenEntryValue8.kt | 1 + .../testData/completion/smart/WhenEntryValue9.kt | 8 ++++++++ .../JvmSmartCompletionTestGenerated.java | 5 +++++ 4 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 idea/testData/completion/smart/WhenEntryValue9.kt diff --git a/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt b/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt index c0b783ab41e..cdee3d140be 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt @@ -151,10 +151,19 @@ class SmartCompletion(val expression: JetSimpleNameExpression, val entry = parent.getParent() as JetWhenEntry val whenExpression = entry.getParent() as JetWhenExpression val subject = whenExpression.getSubjectExpression() ?: return setOf() + + val itemsToSkip = HashSet() + + if (subject is JetSimpleNameExpression) { + val variable = bindingContext[BindingContext.REFERENCE_TARGET, subject] as? VariableDescriptor + if (variable != null) { + itemsToSkip.add(variable) + } + } + val subjectType = bindingContext[BindingContext.EXPRESSION_TYPE, subject] ?: return setOf() val classDescriptor = TypeUtils.getClassDescriptor(subjectType) if (classDescriptor != null && DescriptorUtils.isEnumClass(classDescriptor)) { - val usedEnumEntries = HashSet() val conditions = whenExpression.getEntries() .flatMap { it.getConditions().toList() } .filterIsInstance(javaClass()) @@ -163,11 +172,12 @@ class SmartCompletion(val expression: JetSimpleNameExpression, ?.getSelectorExpression() as? JetReferenceExpression ?: continue val target = bindingContext[BindingContext.REFERENCE_TARGET, selectorExpr] as? ClassDescriptor ?: continue if (DescriptorUtils.isEnumEntry(target)) { - usedEnumEntries.add(target) + itemsToSkip.add(target) } } - return usedEnumEntries } + + return itemsToSkip } } return setOf() diff --git a/idea/testData/completion/smart/WhenEntryValue8.kt b/idea/testData/completion/smart/WhenEntryValue8.kt index 88a4b40ce07..114a8636857 100644 --- a/idea/testData/completion/smart/WhenEntryValue8.kt +++ b/idea/testData/completion/smart/WhenEntryValue8.kt @@ -9,3 +9,4 @@ fun foo(e: ElementType) { // ABSENT: ElementType.FIELD // EXIST: ElementType.TYPE +// ABSENT: e diff --git a/idea/testData/completion/smart/WhenEntryValue9.kt b/idea/testData/completion/smart/WhenEntryValue9.kt new file mode 100644 index 00000000000..139bdbad33b --- /dev/null +++ b/idea/testData/completion/smart/WhenEntryValue9.kt @@ -0,0 +1,8 @@ +fun foo(p1: String, p2: String) { + when (p1) { + + } +} + +// ABSENT: p1 +// EXIST: p2 diff --git a/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java index f84504b47cd..21b42b79137 100644 --- a/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java @@ -516,6 +516,11 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT doTest("idea/testData/completion/smart/WhenEntryValue8.kt"); } + @TestMetadata("WhenEntryValue9.kt") + public void testWhenEntryValue9() throws Exception { + doTest("idea/testData/completion/smart/WhenEntryValue9.kt"); + } + @TestMetadata("WhenWithNoSubjectEntryValue1.kt") public void testWhenWithNoSubjectEntryValue1() throws Exception { doTest("idea/testData/completion/smart/WhenWithNoSubjectEntryValue1.kt");