Refactored

This commit is contained in:
Valentin Kipyatkov
2015-10-02 19:31:03 +03:00
parent a75b3e6cf1
commit da7c62e788
3 changed files with 20 additions and 14 deletions
@@ -284,7 +284,7 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC
}
protected fun getTopLevelExtensions(): Collection<CallableDescriptor> {
return indicesHelper.getCallableTopLevelExtensions({ prefixMatcher.prefixMatches(it) }, nameExpression!!, bindingContext)
return indicesHelper.getCallableTopLevelExtensions({ prefixMatcher.prefixMatches(it) }, callTypeAndReceiver, expression!!, bindingContext)
.filterShadowedNonImported()
}
@@ -31,9 +31,9 @@ import org.jetbrains.kotlin.idea.util.receiverTypes
import org.jetbrains.kotlin.idea.util.substituteExtensionIfCallable
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.JetCallableDeclaration
import org.jetbrains.kotlin.psi.JetExpression
import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.psi.JetNamedDeclaration
import org.jetbrains.kotlin.psi.JetSimpleNameExpression
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.descriptorUtil.isAnnotatedAsHidden
import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils
@@ -89,9 +89,13 @@ public class KotlinIndicesHelper(
.flatMap { findTopLevelCallables(it).filter(descriptorFilter) }
}
public fun getCallableTopLevelExtensions(nameFilter: (String) -> Boolean, expression: JetSimpleNameExpression, bindingContext: BindingContext): Collection<CallableDescriptor> {
val callTypeAndReceiver = CallTypeAndReceiver.detect(expression)
val receiverTypes = callTypeAndReceiver.receiverTypes(bindingContext, expression, moduleDescriptor, predictableSmartCastsOnly = false)
public fun getCallableTopLevelExtensions(
nameFilter: (String) -> Boolean,
callTypeAndReceiver: CallTypeAndReceiver<*, *>,
position: JetExpression,
bindingContext: BindingContext
): Collection<CallableDescriptor> {
val receiverTypes = callTypeAndReceiver.receiverTypes(bindingContext, position, moduleDescriptor, predictableSmartCastsOnly = false)
if (receiverTypes == null || receiverTypes.isEmpty()) return emptyList()
val receiverTypeNames = HashSet<String>()
@@ -40,7 +40,6 @@ import org.jetbrains.kotlin.idea.core.KotlinIndicesHelper
import org.jetbrains.kotlin.idea.core.getResolutionScope
import org.jetbrains.kotlin.idea.core.isVisible
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
import org.jetbrains.kotlin.idea.util.CallType
import org.jetbrains.kotlin.idea.util.CallTypeAndReceiver
import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.psi.JetPsiUtil
@@ -121,8 +120,11 @@ public class AutoImportFix(element: JetSimpleNameExpression) : JetHintAction<Jet
val file = element.getContainingFile() as? JetFile ?: return emptyList()
val callType = CallTypeAndReceiver.detect(element).callType
if (callType is CallType.UNKNOWN) return emptyList()
val callTypeAndReceiver = CallTypeAndReceiver.detect(element)
if (callTypeAndReceiver is CallTypeAndReceiver.UNKNOWN) return emptyList()
fun filterByCallType(descriptor: DeclarationDescriptor)
= callTypeAndReceiver.callType.descriptorKindFilter.accepts(descriptor)
var referenceName = element.getReferencedName()
if (element.getIdentifier() == null) {
@@ -144,8 +146,6 @@ public class AutoImportFix(element: JetSimpleNameExpression) : JetHintAction<Jet
val containingDescriptor = resolutionScope.ownerDescriptor
fun isVisible(descriptor: DeclarationDescriptor): Boolean {
if (!callType.descriptorKindFilter.accepts(descriptor)) return false
if (descriptor is DeclarationDescriptorWithVisibility) {
return descriptor.isVisible(containingDescriptor, bindingContext, element)
}
@@ -159,15 +159,17 @@ public class AutoImportFix(element: JetSimpleNameExpression) : JetHintAction<Jet
if (!element.isImportDirectiveExpression() && !JetPsiUtil.isSelectorInQualified(element)) {
if (ProjectStructureUtil.isJsKotlinModule(file)) {
result.addAll(indicesHelper.getKotlinClasses({ it == referenceName }, { true }))
indicesHelper.getKotlinClasses({ it == referenceName }, { true }).filterTo(result, ::filterByCallType)
}
else {
result.addAll(indicesHelper.getJvmClassesByName(referenceName))
indicesHelper.getJvmClassesByName(referenceName).filterTo(result, ::filterByCallType)
}
result.addAll(indicesHelper.getTopLevelCallablesByName(referenceName))
indicesHelper.getTopLevelCallablesByName(referenceName).filterTo(result, ::filterByCallType)
}
result.addAll(indicesHelper.getCallableTopLevelExtensions({ it == referenceName }, element, bindingContext))
result.addAll(indicesHelper.getCallableTopLevelExtensions({ it == referenceName }, callTypeAndReceiver, element, bindingContext))
return if (result.size() > 1)
reduceCandidatesBasedOnDependencyRuleViolation(result, file)