Minor refactoring: excludeNonInitializedVariable() moved into ReferenceVariantsHelper
This commit is contained in:
+17
-3
@@ -24,9 +24,8 @@ import org.jetbrains.kotlin.idea.resolve.frontendService
|
|||||||
import org.jetbrains.kotlin.idea.util.*
|
import org.jetbrains.kotlin.idea.util.*
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.KtExpression
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
|
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
||||||
import org.jetbrains.kotlin.psi.KtTypeReference
|
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo
|
import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager
|
||||||
@@ -85,6 +84,8 @@ class ReferenceVariantsHelper(
|
|||||||
variants = filterOutJavaGettersAndSetters(variants)
|
variants = filterOutJavaGettersAndSetters(variants)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variants = variants.excludeNonInitializedVariable(contextElement)
|
||||||
|
|
||||||
return variants
|
return variants
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,6 +101,19 @@ class ReferenceVariantsHelper(
|
|||||||
return variants.filter { it !is FunctionDescriptor || it.original !in accessorMethodsToRemove }
|
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(
|
private fun getReferenceVariantsNoVisibilityFilter(
|
||||||
contextElement: PsiElement,
|
contextElement: PsiElement,
|
||||||
kindFilter: DescriptorKindFilter,
|
kindFilter: DescriptorKindFilter,
|
||||||
|
|||||||
@@ -284,8 +284,6 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC
|
|||||||
filterOutShadowed = false,
|
filterOutShadowed = false,
|
||||||
useReceiverType = runtimeReceiver?.type)
|
useReceiverType = runtimeReceiver?.type)
|
||||||
|
|
||||||
variants = variants.excludeNonInitializedVariable(nameExpression)
|
|
||||||
|
|
||||||
val shadowedDeclarationsFilter = if (runtimeReceiver != null)
|
val shadowedDeclarationsFilter = if (runtimeReceiver != null)
|
||||||
ShadowedDeclarationsFilter(bindingContext, resolutionFacade, position, runtimeReceiver)
|
ShadowedDeclarationsFilter(bindingContext, resolutionFacade, position, runtimeReceiver)
|
||||||
else
|
else
|
||||||
@@ -316,19 +314,6 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC
|
|||||||
return ReferenceVariants(variants, notImportedExtensions)
|
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>? {
|
protected fun getRuntimeReceiverTypeReferenceVariants(): Pair<ReferenceVariants, LookupElementFactory>? {
|
||||||
val explicitReceiver = callTypeAndReceiver.receiver as? KtExpression ?: return null
|
val explicitReceiver = callTypeAndReceiver.receiver as? KtExpression ?: return null
|
||||||
val type = bindingContext.getType(explicitReceiver) ?: return null
|
val type = bindingContext.getType(explicitReceiver) ?: return null
|
||||||
|
|||||||
Reference in New Issue
Block a user