From 84b9044187be1f2e2d3f920233372414d73e4eb9 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Wed, 16 Oct 2019 15:48:39 +0300 Subject: [PATCH] KT-29926: Get rid of `filterFunctionExpected` - `filterFunctionExpected` does not provide meaningful concept, and will be a problem in the next steps on this issue. - Refactor `SmartCompletionSession::descriptorKindFilter` to more precisely tell why we include references to constructors if we are completion functions --- .../kotlin/idea/completion/smart/LambdaItems.kt | 3 ++- .../completion/smart/SmartCompletionSession.kt | 15 ++++++++++----- .../kotlin/idea/completion/smart/Utils.kt | 3 --- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/LambdaItems.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/LambdaItems.kt index 2321a089c56..d4fd6328deb 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/LambdaItems.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/LambdaItems.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.completion.smart import com.intellij.codeInsight.lookup.LookupElement import com.intellij.codeInsight.lookup.LookupElementBuilder import com.intellij.openapi.util.TextRange +import org.jetbrains.kotlin.builtins.isFunctionType import org.jetbrains.kotlin.idea.completion.LambdaSignatureTemplates import org.jetbrains.kotlin.idea.completion.suppressAutoInsertion import org.jetbrains.kotlin.idea.core.ExpectedInfo @@ -35,7 +36,7 @@ object LambdaItems { } fun addToCollection(collection: MutableCollection, expectedInfos: Collection) { - val functionExpectedInfos = expectedInfos.filterFunctionExpected() + val functionExpectedInfos = expectedInfos.filter { it.fuzzyType?.type?.isFunctionType == true } if (functionExpectedInfos.isEmpty()) return val functionTypes = functionExpectedInfos diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletionSession.kt index 0db359dfc87..ffb58972d29 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletionSession.kt @@ -21,12 +21,14 @@ import com.intellij.codeInsight.completion.CompletionResultSet import com.intellij.codeInsight.completion.CompletionSorter import com.intellij.codeInsight.lookup.LookupElement import com.intellij.psi.impl.source.tree.LeafPsiElement +import org.jetbrains.kotlin.builtins.isFunctionType import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.idea.completion.* import org.jetbrains.kotlin.idea.core.ExpectedInfo import org.jetbrains.kotlin.idea.core.ExpectedInfos import org.jetbrains.kotlin.idea.core.completion.DeclarationLookupObject +import org.jetbrains.kotlin.idea.core.fuzzyType import org.jetbrains.kotlin.idea.util.CallTypeAndReceiver import org.jetbrains.kotlin.load.java.sam.SamConstructorDescriptorKindExclude import org.jetbrains.kotlin.psi.LambdaArgument @@ -45,14 +47,17 @@ class SmartCompletionSession( override val descriptorKindFilter: DescriptorKindFilter by lazy { // we do not include SAM-constructors because they are handled separately and adding them requires iterating of java classes - var filter = DescriptorKindFilter.VALUES exclude SamConstructorDescriptorKindExclude + val filter = DescriptorKindFilter.VALUES exclude SamConstructorDescriptorKindExclude - if (smartCompletion?.expectedInfos?.filterFunctionExpected()?.isNotEmpty() ?: false) { - // if function type is expected we need classes to obtain their constructors - filter = filter.withKinds(DescriptorKindFilter.NON_SINGLETON_CLASSIFIERS_MASK) + val referenceToConstructorIsApplicable = smartCompletion?.expectedInfos.orEmpty().any { + it.fuzzyType?.type?.isFunctionType == true } - filter + if (referenceToConstructorIsApplicable) { + filter.withKinds(DescriptorKindFilter.NON_SINGLETON_CLASSIFIERS_MASK) + } else { + filter + } } private val smartCompletion by lazy(LazyThreadSafetyMode.NONE) { diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/Utils.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/Utils.kt index 3f825fc500d..dc939b08185 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/Utils.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/Utils.kt @@ -335,8 +335,5 @@ fun DeclarationDescriptor.fuzzyTypesForSmartCompletion( } } -fun Collection.filterFunctionExpected() - = filter { it.fuzzyType != null && it.fuzzyType!!.type.isFunctionType } - fun Collection.filterCallableExpected() = filter { it.fuzzyType != null && ReflectionTypes.isCallableType(it.fuzzyType!!.type) }