From 85825e0ab11a49ed61ad1a4218a29a7353d73cc0 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 26 Nov 2014 21:42:15 +0300 Subject: [PATCH] Smart completion includes object's from scope before searching for inheritors #KT-6123 Fixed --- .../jet/plugin/completion/smart/SmartCompletion.kt | 11 +++++++++-- .../plugin/completion/smart/TypesWithSmartCasts.kt | 2 +- idea/testData/completion/smart/Object.kt | 10 ++++++++++ .../NoObjectDuplication/Declarations.kt | 5 +++++ .../NoObjectDuplication/NoObjectDuplication.kt | 6 ++++++ .../completion/JvmSmartCompletionTestGenerated.java | 7 ++++++- .../MultiFileSmartCompletionTestGenerated.java | 6 ++++++ .../handlers/SmartCompletionHandlerTestGenerated.java | 1 + 8 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 idea/testData/completion/smart/Object.kt create mode 100644 idea/testData/completion/smartMultiFile/NoObjectDuplication/Declarations.kt create mode 100644 idea/testData/completion/smartMultiFile/NoObjectDuplication/NoObjectDuplication.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 b7525ed8768..eb2daed6868 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/smart/SmartCompletion.kt @@ -79,11 +79,18 @@ class SmartCompletion(val expression: JetSimpleNameExpression, val result = executeInternal() ?: return null // TODO: code could be more simple, see KT-5726 val additionalItems = result.additionalItems.map(::postProcess) + val inheritanceSearcher = result.inheritanceSearcher?.let { + object : InheritanceItemsSearcher { + override fun search(nameFilter: (String) -> Boolean, consumer: (LookupElement) -> Unit) { + it.search(nameFilter, { consumer(postProcess(it)) }) + } + } + } val filter = result.declarationFilter return if (filter != null) - Result({ filter(it).map(::postProcess) }, additionalItems, result.inheritanceSearcher) + Result({ filter(it).map(::postProcess) }, additionalItems, inheritanceSearcher) else - Result(null, additionalItems, result.inheritanceSearcher) + Result(null, additionalItems, inheritanceSearcher) } private fun executeInternal(): Result? { diff --git a/idea/src/org/jetbrains/jet/plugin/completion/smart/TypesWithSmartCasts.kt b/idea/src/org/jetbrains/jet/plugin/completion/smart/TypesWithSmartCasts.kt index e8831c3fc26..d7d9557026c 100644 --- a/idea/src/org/jetbrains/jet/plugin/completion/smart/TypesWithSmartCasts.kt +++ b/idea/src/org/jetbrains/jet/plugin/completion/smart/TypesWithSmartCasts.kt @@ -62,7 +62,7 @@ class TypesWithSmartCasts(val bindingContext: BindingContext) { } return returnType.toList() } - else if (descriptor is ClassDescriptor && descriptor.getKind() == ClassKind.ENUM_ENTRY) { + else if (descriptor is ClassDescriptor && descriptor.getKind().isSingleton()) { return listOf(descriptor.getDefaultType()) } else { diff --git a/idea/testData/completion/smart/Object.kt b/idea/testData/completion/smart/Object.kt new file mode 100644 index 00000000000..69c72141341 --- /dev/null +++ b/idea/testData/completion/smart/Object.kt @@ -0,0 +1,10 @@ +trait I + +object O : I + +fun foo(): I = + +// EXIST: { lookupString: "O", itemText: "O", tailText: " ()" } +// EXIST: foo +// EXIST: object +// NUMBER: 3 diff --git a/idea/testData/completion/smartMultiFile/NoObjectDuplication/Declarations.kt b/idea/testData/completion/smartMultiFile/NoObjectDuplication/Declarations.kt new file mode 100644 index 00000000000..53c1a36d892 --- /dev/null +++ b/idea/testData/completion/smartMultiFile/NoObjectDuplication/Declarations.kt @@ -0,0 +1,5 @@ +trait T + +object OO : T + +// ALLOW_AST_ACCESS diff --git a/idea/testData/completion/smartMultiFile/NoObjectDuplication/NoObjectDuplication.kt b/idea/testData/completion/smartMultiFile/NoObjectDuplication/NoObjectDuplication.kt new file mode 100644 index 00000000000..82c1077b2ec --- /dev/null +++ b/idea/testData/completion/smartMultiFile/NoObjectDuplication/NoObjectDuplication.kt @@ -0,0 +1,6 @@ +fun foo(): T = + +// EXIST: foo +// EXIST: { lookupString: "object", itemText: "object: T{...}" } +// EXIST: { lookupString: "OO", itemText: "OO", tailText: " ()" } +// NUMBER: 3 diff --git a/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java index 82a867cdbdc..d733b94dfd3 100644 --- a/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/JvmSmartCompletionTestGenerated.java @@ -19,7 +19,6 @@ package org.jetbrains.jet.completion; import com.intellij.testFramework.TestDataPath; import org.jetbrains.jet.JUnit3RunnerWithInners; import org.jetbrains.jet.JetTestUtils; -import org.jetbrains.jet.test.InnerTestClasses; import org.jetbrains.jet.test.TestMetadata; import org.junit.runner.RunWith; @@ -624,6 +623,12 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT doTest(fileName); } + @TestMetadata("Object.kt") + public void testObject() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/Object.kt"); + doTest(fileName); + } + @TestMetadata("ObjectsFromType.kt") public void testObjectsFromType() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/ObjectsFromType.kt"); diff --git a/idea/tests/org/jetbrains/jet/completion/MultiFileSmartCompletionTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/MultiFileSmartCompletionTestGenerated.java index ddb3b5ea691..1c7594976d4 100644 --- a/idea/tests/org/jetbrains/jet/completion/MultiFileSmartCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/MultiFileSmartCompletionTestGenerated.java @@ -77,4 +77,10 @@ public class MultiFileSmartCompletionTestGenerated extends AbstractMultiFileSmar String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smartMultiFile/JavaStaticMethodArgument/"); doTest(fileName); } + + @TestMetadata("NoObjectDuplication") + public void testNoObjectDuplication() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smartMultiFile/NoObjectDuplication/"); + doTest(fileName); + } } diff --git a/idea/tests/org/jetbrains/jet/completion/handlers/SmartCompletionHandlerTestGenerated.java b/idea/tests/org/jetbrains/jet/completion/handlers/SmartCompletionHandlerTestGenerated.java index 1fd6cab621c..4457accb184 100644 --- a/idea/tests/org/jetbrains/jet/completion/handlers/SmartCompletionHandlerTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/completion/handlers/SmartCompletionHandlerTestGenerated.java @@ -19,6 +19,7 @@ package org.jetbrains.jet.completion.handlers; import com.intellij.testFramework.TestDataPath; import org.jetbrains.jet.JUnit3RunnerWithInners; import org.jetbrains.jet.JetTestUtils; +import org.jetbrains.jet.test.InnerTestClasses; import org.jetbrains.jet.test.TestMetadata; import org.junit.runner.RunWith;