From 184d59a645b7d4987f98c6c5725bc76c290af93d Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 2 Oct 2015 13:44:13 +0300 Subject: [PATCH] No shadowed declaration filtering for callable references (as well as imports) --- .../codeInsight/ReferenceVariantsHelper.kt | 5 ++- .../idea/util/ShadowedDeclarationsFilter.kt | 32 +++++++++++++++---- .../idea/completion/CompletionSession.kt | 4 +-- 3 files changed, 31 insertions(+), 10 deletions(-) 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 b03108d161a..3da570a431b 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 @@ -64,7 +64,10 @@ public class ReferenceVariantsHelper( = getReferenceVariantsNoVisibilityFilter(expression, kindFilter, nameFilter, callTypeAndReceiver, useRuntimeReceiverType) .filter { !it.isAnnotatedAsHidden() && visibilityFilter(it) } - variants = ShadowedDeclarationsFilter(context, resolutionFacade, expression, callTypeAndReceiver).filter(variants) + ShadowedDeclarationsFilter.create(context, resolutionFacade, expression, callTypeAndReceiver)?.let { + variants = it.filter(variants) + } + if (filterOutJavaGettersAndSetters) { val accessorMethodsToRemove = HashSet() 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 45730954c06..313f4582a4f 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 @@ -36,20 +36,38 @@ import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.util.descriptorsEqualWithSubstitution import java.util.* -public class ShadowedDeclarationsFilter( +public class ShadowedDeclarationsFilter private constructor( private val bindingContext: BindingContext, private val resolutionFacade: ResolutionFacade, private val context: JetExpression, - callTypeAndReceiver: CallTypeAndReceiver<*, *> + private val explicitReceiverValue: ReceiverValue ) { + companion object { + fun create( + bindingContext: BindingContext, + resolutionFacade: ResolutionFacade, + context: JetExpression, + callTypeAndReceiver: CallTypeAndReceiver<*, *> + ): ShadowedDeclarationsFilter? { + val receiverExpression = when (callTypeAndReceiver) { + is CallTypeAndReceiver.DEFAULT -> null + is CallTypeAndReceiver.DOT -> callTypeAndReceiver.receiver + is CallTypeAndReceiver.SAFE -> callTypeAndReceiver.receiver + is CallTypeAndReceiver.INFIX -> callTypeAndReceiver.receiver + else -> return null // TODO: support shadowed declarations filtering for callable references + } + + val explicitReceiverValue = receiverExpression?.let { + val type = bindingContext.getType(it) ?: return null + ExpressionReceiver(it, type) + } ?: ReceiverValue.NO_RECEIVER + return ShadowedDeclarationsFilter(bindingContext, resolutionFacade, context, explicitReceiverValue) + } + } + private val psiFactory = JetPsiFactory(resolutionFacade.project) private val dummyExpressionFactory = DummyExpressionFactory(psiFactory) - private val explicitReceiverValue = (callTypeAndReceiver.receiver as? JetExpression)?.let { - val type = bindingContext.getType(it) ?: return@let null - ExpressionReceiver(it, type) - } ?: ReceiverValue.NO_RECEIVER - public fun filter(declarations: Collection): Collection { return declarations .groupBy { signature(it) } 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 4b577ba2bb6..25f8d5ececb 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 @@ -289,8 +289,8 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC } private fun Collection.filterShadowedNonImported(): Collection { - return ShadowedDeclarationsFilter(bindingContext, resolutionFacade, nameExpression!!, callTypeAndReceiver) - .filterNonImported(this, referenceVariants) + val filter = ShadowedDeclarationsFilter.create(bindingContext, resolutionFacade, nameExpression!!, callTypeAndReceiver) + return if (filter != null) filter.filterNonImported(this, referenceVariants) else this } protected fun addAllClasses(kindFilter: (ClassKind) -> Boolean) {