Refactoring to add CallType.IMPORT_DIRECTIVE and CallType.PACKAGE_DIRECTIVE

This commit is contained in:
Valentin Kipyatkov
2015-09-30 13:55:12 +03:00
parent d38ceb50b6
commit 56bb8adfd0
7 changed files with 102 additions and 93 deletions
@@ -29,6 +29,7 @@ import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade
import org.jetbrains.kotlin.idea.caches.resolve.getResolveScope
import org.jetbrains.kotlin.idea.codeInsight.CallTypeAndReceiver
import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde
import org.jetbrains.kotlin.idea.codeInsight.ReferenceVariantsHelper
import org.jetbrains.kotlin.idea.core.*
@@ -284,8 +285,9 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC
}
private fun Collection<CallableDescriptor>.filterShadowedNonImported(): Collection<CallableDescriptor> {
val explicitReceiverData = ReferenceVariantsHelper.getExplicitReceiverData(nameExpression!!)
return ShadowedDeclarationsFilter(bindingContext, resolutionFacade, nameExpression, explicitReceiverData).filterNonImported(this, referenceVariants)
val callTypeAndReceiver = CallTypeAndReceiver.detect(nameExpression!!)
return ShadowedDeclarationsFilter(bindingContext, resolutionFacade, nameExpression, callTypeAndReceiver)
.filterNonImported(this, referenceVariants)
}
protected fun addAllClasses(kindFilter: (ClassKind) -> Boolean) {
@@ -301,7 +303,7 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC
val contextVariablesProvider = {
nameExpression?.let {
referenceVariantsHelper.getReferenceVariants(it, DescriptorKindFilter.VARIABLES, { true }, explicitReceiverData = null)
referenceVariantsHelper.getReferenceVariants(it, DescriptorKindFilter.VARIABLES, { true }, CallTypeAndReceiver(CallType.NORMAL, null))
.map { it as VariableDescriptor }
} ?: emptyList()
}
@@ -317,11 +319,9 @@ abstract class CompletionSession(protected val configuration: CompletionSessionC
return CallType.NORMAL to emptyList()
}
val explicitReceiverData = ReferenceVariantsHelper.getExplicitReceiverData(nameExpression)
val receiverElement = explicitReceiverData?.element
val callType = explicitReceiverData?.callType ?: CallType.NORMAL
val (callType, receiverElement) = CallTypeAndReceiver.detect(nameExpression)
if (explicitReceiverData != null && callType == CallType.CALLABLE_REFERENCE && receiverElement != null) {
if (callType == CallType.CALLABLE_REFERENCE && receiverElement != null) {
val type = bindingContext[BindingContext.TYPE, receiverElement as JetTypeReference]
return callType to type.singletonOrEmptyList()
}
@@ -28,10 +28,8 @@ import com.intellij.psi.codeStyle.CodeStyleSettingsManager
import org.jetbrains.kotlin.idea.core.formatter.JetCodeStyleSettings
import org.jetbrains.kotlin.idea.util.CallType
import org.jetbrains.kotlin.lexer.JetTokens
import org.jetbrains.kotlin.psi.JetImportDirective
import org.jetbrains.kotlin.psi.JetTypeArgumentList
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.types.JetType
class GenerateLambdaInfo(val lambdaType: JetType, val explicitParameters: Boolean)
@@ -60,11 +58,10 @@ class KotlinFunctionInsertHandler(
val startOffset = context.getStartOffset()
val element = context.getFile().findElementAt(startOffset) ?: return
when {
//TODO: replace with CallType
element.getStrictParentOfType<JetImportDirective>() != null || callType == CallType.CALLABLE_REFERENCE -> return
when (callType) {
CallType.PACKAGE_DIRECTIVE, CallType.IMPORT_DIRECTIVE, CallType.CALLABLE_REFERENCE -> return
callType == CallType.INFIX -> {
CallType.INFIX -> {
if (context.getCompletionChar() == ' ') {
context.setAddCompletionChar(false)
}
@@ -21,7 +21,7 @@ import com.intellij.codeInsight.completion.CompletionResultSet
import com.intellij.codeInsight.completion.CompletionSorter
import com.intellij.psi.impl.source.tree.LeafPsiElement
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.idea.codeInsight.ReferenceVariantsHelper
import org.jetbrains.kotlin.idea.codeInsight.CallTypeAndReceiver
import org.jetbrains.kotlin.idea.completion.*
import org.jetbrains.kotlin.idea.util.CallType
import org.jetbrains.kotlin.load.java.descriptors.SamConstructorDescriptorKindExclude
@@ -91,7 +91,7 @@ class SmartCompletionSession(configuration: CompletionSessionConfiguration, para
// special completion for outside parenthesis lambda argument
private fun addFunctionLiteralArgumentCompletions() {
if (nameExpression != null) {
val (receiverElement, callType) = ReferenceVariantsHelper.getExplicitReceiverData(nameExpression) ?: return
val (callType, receiverElement) = CallTypeAndReceiver.detect(nameExpression)
if (callType == CallType.INFIX) {
val call = (receiverElement as JetExpression).getCall(bindingContext)
if (call != null && call.getFunctionLiteralArguments().isEmpty()) {