From 4c315b621968a44c69559dcc533527a73785cacb Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 6 May 2015 16:01:40 +0300 Subject: [PATCH] KT-7452 Code completion does not honor smart casts for 'this' #KT-7452 Fixed --- .../codeInsight/ReferenceVariantsHelper.kt | 12 ++++++----- .../testData/basic/common/SmartCastThis.kt | 21 +++++++++++++++++++ .../test/JSBasicCompletionTestGenerated.java | 6 ++++++ .../test/JvmBasicCompletionTestGenerated.java | 6 ++++++ 4 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 idea/idea-completion/testData/basic/common/SmartCastThis.kt diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt index d7e6927f485..05da65e1e45 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt @@ -111,16 +111,18 @@ public class ReferenceVariantsHelper( return descriptors } else { + val dataFlowInfo = context.getDataFlowInfo(expression) + val descriptorsSet = HashSet() // process instance members that can be called via implicit receiver's instances val receivers = resolutionScope.getImplicitReceiversWithInstance() - for (receiver in receivers) { - descriptorsSet.addMembersFromReceiver(receiver.getType(), CallType.NORMAL, kindFilter, nameFilter) - } - - val dataFlowInfo = context.getDataFlowInfo(expression) val receiverValues = receivers.map { it.getValue() } + for (receiverValue in receiverValues) { + for (variant in SmartCastUtils.getSmartCastVariantsWithLessSpecificExcluded(receiverValue, context, containingDeclaration, dataFlowInfo)) { + descriptorsSet.addMembersFromReceiver(variant, CallType.NORMAL, kindFilter, nameFilter) + } + } // process extensions and non-instance members for (descriptor in resolutionScope.getDescriptorsFiltered(kindFilter, nameFilter)) { diff --git a/idea/idea-completion/testData/basic/common/SmartCastThis.kt b/idea/idea-completion/testData/basic/common/SmartCastThis.kt new file mode 100644 index 00000000000..9e1b945770e --- /dev/null +++ b/idea/idea-completion/testData/basic/common/SmartCastThis.kt @@ -0,0 +1,21 @@ +class C { + fun bar(){} +} + +open class X { + fun Any.foo() { + if (this is C && this@X is Y) { + + } + } +} + +class Y : X() { + fun y() +} + +fun C.extFun(){} + +// EXIST: bar +// EXIST: y +// EXIST: extFun diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java index 0eab069d649..4a0c2cb1182 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java @@ -931,6 +931,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } + @TestMetadata("SmartCastThis.kt") + public void testSmartCastThis() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/SmartCastThis.kt"); + doTest(fileName); + } + @TestMetadata("StandardJetArrayFirst.kt") public void testStandardJetArrayFirst() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/StandardJetArrayFirst.kt"); diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java index e984aebb372..40a51f37281 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java @@ -931,6 +931,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } + @TestMetadata("SmartCastThis.kt") + public void testSmartCastThis() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/SmartCastThis.kt"); + doTest(fileName); + } + @TestMetadata("StandardJetArrayFirst.kt") public void testStandardJetArrayFirst() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/StandardJetArrayFirst.kt");