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 1fc0c36df79..dc8b369b8f8 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 @@ -24,9 +24,8 @@ import org.jetbrains.kotlin.idea.resolve.frontendService import org.jetbrains.kotlin.idea.util.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.psi.KtSimpleNameExpression -import org.jetbrains.kotlin.psi.KtTypeReference +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager @@ -85,6 +84,8 @@ class ReferenceVariantsHelper( variants = filterOutJavaGettersAndSetters(variants) } + variants = variants.excludeNonInitializedVariable(contextElement) + return variants } @@ -100,6 +101,19 @@ class ReferenceVariantsHelper( return variants.filter { it !is FunctionDescriptor || it.original !in accessorMethodsToRemove } } + // filters out variable inside its initializer + private fun Collection.excludeNonInitializedVariable(contextElement: PsiElement): Collection { + for (element in contextElement.parentsWithSelf) { + val parent = element.parent + if (parent is KtVariableDeclaration && element == parent.initializer) { + val descriptor = bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, parent] + return this.filter { it != descriptor } + } + if (element is KtDeclaration) break // we can use variable inside lambda or anonymous object located in its initializer + } + return this + } + private fun getReferenceVariantsNoVisibilityFilter( contextElement: PsiElement, kindFilter: DescriptorKindFilter, 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 dce8667ade5..25bf15b84ca 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 @@ -284,8 +284,6 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC filterOutShadowed = false, useReceiverType = runtimeReceiver?.type) - variants = variants.excludeNonInitializedVariable(nameExpression) - val shadowedDeclarationsFilter = if (runtimeReceiver != null) ShadowedDeclarationsFilter(bindingContext, resolutionFacade, position, runtimeReceiver) else @@ -316,19 +314,6 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC return ReferenceVariants(variants, notImportedExtensions) } - // filters out variable inside its initializer - private fun Collection.excludeNonInitializedVariable(expression: KtExpression): Collection { - for (element in expression.parentsWithSelf) { - val parent = element.getParent() - if (parent is KtVariableDeclaration && element == parent.getInitializer()) { - val descriptor = bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, parent] - return this.filter { it != descriptor } - } - if (element is KtDeclaration) break // we can use variable inside lambda or anonymous object located in its initializer - } - return this - } - protected fun getRuntimeReceiverTypeReferenceVariants(): Pair? { val explicitReceiver = callTypeAndReceiver.receiver as? KtExpression ?: return null val type = bindingContext.getType(explicitReceiver) ?: return null