Minor refactoring: excludeNonInitializedVariable() moved into ReferenceVariantsHelper

This commit is contained in:
Valentin Kipyatkov
2015-10-28 22:13:48 +03:00
parent 2e80a7194c
commit 4c6f6c2a2e
2 changed files with 17 additions and 18 deletions
@@ -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<DeclarationDescriptor>.excludeNonInitializedVariable(contextElement: PsiElement): Collection<DeclarationDescriptor> {
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,
@@ -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<DeclarationDescriptor>.excludeNonInitializedVariable(expression: KtExpression): Collection<DeclarationDescriptor> {
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<ReferenceVariants, LookupElementFactory>? {
val explicitReceiver = callTypeAndReceiver.receiver as? KtExpression ?: return null
val type = bindingContext.getType(explicitReceiver) ?: return null