Refactored
This commit is contained in:
@@ -284,7 +284,7 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected fun getTopLevelExtensions(): Collection<CallableDescriptor> {
|
protected fun getTopLevelExtensions(): Collection<CallableDescriptor> {
|
||||||
return indicesHelper.getCallableTopLevelExtensions({ prefixMatcher.prefixMatches(it) }, nameExpression!!, bindingContext)
|
return indicesHelper.getCallableTopLevelExtensions({ prefixMatcher.prefixMatches(it) }, callTypeAndReceiver, expression!!, bindingContext)
|
||||||
.filterShadowedNonImported()
|
.filterShadowedNonImported()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,9 +31,9 @@ import org.jetbrains.kotlin.idea.util.receiverTypes
|
|||||||
import org.jetbrains.kotlin.idea.util.substituteExtensionIfCallable
|
import org.jetbrains.kotlin.idea.util.substituteExtensionIfCallable
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.psi.JetCallableDeclaration
|
import org.jetbrains.kotlin.psi.JetCallableDeclaration
|
||||||
|
import org.jetbrains.kotlin.psi.JetExpression
|
||||||
import org.jetbrains.kotlin.psi.JetFile
|
import org.jetbrains.kotlin.psi.JetFile
|
||||||
import org.jetbrains.kotlin.psi.JetNamedDeclaration
|
import org.jetbrains.kotlin.psi.JetNamedDeclaration
|
||||||
import org.jetbrains.kotlin.psi.JetSimpleNameExpression
|
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isAnnotatedAsHidden
|
import org.jetbrains.kotlin.resolve.descriptorUtil.isAnnotatedAsHidden
|
||||||
import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils
|
import org.jetbrains.kotlin.resolve.lazy.ResolveSessionUtils
|
||||||
@@ -89,9 +89,13 @@ public class KotlinIndicesHelper(
|
|||||||
.flatMap { findTopLevelCallables(it).filter(descriptorFilter) }
|
.flatMap { findTopLevelCallables(it).filter(descriptorFilter) }
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun getCallableTopLevelExtensions(nameFilter: (String) -> Boolean, expression: JetSimpleNameExpression, bindingContext: BindingContext): Collection<CallableDescriptor> {
|
public fun getCallableTopLevelExtensions(
|
||||||
val callTypeAndReceiver = CallTypeAndReceiver.detect(expression)
|
nameFilter: (String) -> Boolean,
|
||||||
val receiverTypes = callTypeAndReceiver.receiverTypes(bindingContext, expression, moduleDescriptor, predictableSmartCastsOnly = false)
|
callTypeAndReceiver: CallTypeAndReceiver<*, *>,
|
||||||
|
position: JetExpression,
|
||||||
|
bindingContext: BindingContext
|
||||||
|
): Collection<CallableDescriptor> {
|
||||||
|
val receiverTypes = callTypeAndReceiver.receiverTypes(bindingContext, position, moduleDescriptor, predictableSmartCastsOnly = false)
|
||||||
if (receiverTypes == null || receiverTypes.isEmpty()) return emptyList()
|
if (receiverTypes == null || receiverTypes.isEmpty()) return emptyList()
|
||||||
|
|
||||||
val receiverTypeNames = HashSet<String>()
|
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.getResolutionScope
|
||||||
import org.jetbrains.kotlin.idea.core.isVisible
|
import org.jetbrains.kotlin.idea.core.isVisible
|
||||||
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
|
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.idea.util.CallTypeAndReceiver
|
||||||
import org.jetbrains.kotlin.psi.JetFile
|
import org.jetbrains.kotlin.psi.JetFile
|
||||||
import org.jetbrains.kotlin.psi.JetPsiUtil
|
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 file = element.getContainingFile() as? JetFile ?: return emptyList()
|
||||||
|
|
||||||
val callType = CallTypeAndReceiver.detect(element).callType
|
val callTypeAndReceiver = CallTypeAndReceiver.detect(element)
|
||||||
if (callType is CallType.UNKNOWN) return emptyList()
|
if (callTypeAndReceiver is CallTypeAndReceiver.UNKNOWN) return emptyList()
|
||||||
|
|
||||||
|
fun filterByCallType(descriptor: DeclarationDescriptor)
|
||||||
|
= callTypeAndReceiver.callType.descriptorKindFilter.accepts(descriptor)
|
||||||
|
|
||||||
var referenceName = element.getReferencedName()
|
var referenceName = element.getReferencedName()
|
||||||
if (element.getIdentifier() == null) {
|
if (element.getIdentifier() == null) {
|
||||||
@@ -144,8 +146,6 @@ public class AutoImportFix(element: JetSimpleNameExpression) : JetHintAction<Jet
|
|||||||
val containingDescriptor = resolutionScope.ownerDescriptor
|
val containingDescriptor = resolutionScope.ownerDescriptor
|
||||||
|
|
||||||
fun isVisible(descriptor: DeclarationDescriptor): Boolean {
|
fun isVisible(descriptor: DeclarationDescriptor): Boolean {
|
||||||
if (!callType.descriptorKindFilter.accepts(descriptor)) return false
|
|
||||||
|
|
||||||
if (descriptor is DeclarationDescriptorWithVisibility) {
|
if (descriptor is DeclarationDescriptorWithVisibility) {
|
||||||
return descriptor.isVisible(containingDescriptor, bindingContext, element)
|
return descriptor.isVisible(containingDescriptor, bindingContext, element)
|
||||||
}
|
}
|
||||||
@@ -159,15 +159,17 @@ public class AutoImportFix(element: JetSimpleNameExpression) : JetHintAction<Jet
|
|||||||
|
|
||||||
if (!element.isImportDirectiveExpression() && !JetPsiUtil.isSelectorInQualified(element)) {
|
if (!element.isImportDirectiveExpression() && !JetPsiUtil.isSelectorInQualified(element)) {
|
||||||
if (ProjectStructureUtil.isJsKotlinModule(file)) {
|
if (ProjectStructureUtil.isJsKotlinModule(file)) {
|
||||||
result.addAll(indicesHelper.getKotlinClasses({ it == referenceName }, { true }))
|
indicesHelper.getKotlinClasses({ it == referenceName }, { true }).filterTo(result, ::filterByCallType)
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
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)
|
return if (result.size() > 1)
|
||||||
reduceCandidatesBasedOnDependencyRuleViolation(result, file)
|
reduceCandidatesBasedOnDependencyRuleViolation(result, file)
|
||||||
|
|||||||
Reference in New Issue
Block a user