From 3e3d86aebbbf72316a25d787fb249ffb30bdece5 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 28 Oct 2015 19:59:03 +0300 Subject: [PATCH] A little bit more correct filtering --- .../idea/util/ShadowedDeclarationsFilter.kt | 2 +- .../kotlin/idea/completion/CompletionSession.kt | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt index 883dab1236d..3767e3c8b54 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt @@ -38,7 +38,7 @@ import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.util.descriptorsEqualWithSubstitution import java.util.* -public class ShadowedDeclarationsFilter private constructor( +public class ShadowedDeclarationsFilter( private val bindingContext: BindingContext, private val resolutionFacade: ResolutionFacade, private val context: PsiElement, diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt index b6b5c0422aa..432b98b7e8e 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionSession.kt @@ -48,6 +48,7 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.DescriptorKindExclude import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter +import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.checker.KotlinTypeChecker @@ -273,24 +274,27 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC descriptorKindFilter?.let { collectReferenceVariants(it) } } - private fun collectReferenceVariants(descriptorKindFilter: DescriptorKindFilter, runtimeReceiverType: KotlinType? = null): ReferenceVariants { + private fun collectReferenceVariants(descriptorKindFilter: DescriptorKindFilter, runtimeReceiver: ExpressionReceiver? = null): ReferenceVariants { var variants = referenceVariantsHelper.getReferenceVariants( nameExpression!!, descriptorKindFilter, descriptorNameFilter, filterOutJavaGettersAndSetters = false, filterOutShadowed = false, - useReceiverType = runtimeReceiverType) + useReceiverType = runtimeReceiver?.type) variants = variants.excludeNonInitializedVariable(nameExpression) - val shadowedDeclarationsFilter = ShadowedDeclarationsFilter.create(bindingContext, resolutionFacade, position, callTypeAndReceiver) + val shadowedDeclarationsFilter = if (runtimeReceiver != null) + ShadowedDeclarationsFilter(bindingContext, resolutionFacade, position, runtimeReceiver) + else + ShadowedDeclarationsFilter.create(bindingContext, resolutionFacade, position, callTypeAndReceiver) var notImportedExtensions: Collection = emptyList() if (callTypeAndReceiver.shouldCompleteCallableExtensions()) { val nameFilter: (String) -> Boolean = { prefixMatcher.prefixMatches(it) } - val extensions = if (runtimeReceiverType != null) - indicesHelper.getCallableTopLevelExtensions(callTypeAndReceiver, listOf(runtimeReceiverType), nameFilter) + val extensions = if (runtimeReceiver != null) + indicesHelper.getCallableTopLevelExtensions(callTypeAndReceiver, listOf(runtimeReceiver.type), nameFilter) else indicesHelper.getCallableTopLevelExtensions(callTypeAndReceiver, expression!!, bindingContext, nameFilter) @@ -332,7 +336,7 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC val runtimeType = evaluator(explicitReceiver) if (runtimeType == null || runtimeType == type) return null - val (variants, notImportedExtensions) = collectReferenceVariants(descriptorKindFilter!!, runtimeType) + val (variants, notImportedExtensions) = collectReferenceVariants(descriptorKindFilter!!, ExpressionReceiver(explicitReceiver, runtimeType)) val normalVariants = referenceVariants!!.imported + referenceVariants!!.notImportedExtensions val filteredVariants = variants.filter { descriptor -> normalVariants.none { compareDescriptors(project, it, descriptor) } } val filteredNotImportedExtensions = notImportedExtensions.filter { descriptor -> normalVariants.none { compareDescriptors(project, it, descriptor) } }