Auto-import popup does not suggest to import non-operator functions when operator required

This commit is contained in:
Valentin Kipyatkov
2015-10-02 21:51:32 +03:00
parent b03a297ed0
commit a75b3e6cf1
8 changed files with 24 additions and 14 deletions
@@ -119,7 +119,7 @@ public class ReferenceVariantsHelper(
is CallTypeAndReceiver.DOT -> receiverExpression = callTypeAndReceiver.receiver is CallTypeAndReceiver.DOT -> receiverExpression = callTypeAndReceiver.receiver
is CallTypeAndReceiver.SAFE -> receiverExpression = callTypeAndReceiver.receiver is CallTypeAndReceiver.SAFE -> receiverExpression = callTypeAndReceiver.receiver
is CallTypeAndReceiver.INFIX -> receiverExpression = callTypeAndReceiver.receiver is CallTypeAndReceiver.INFIX -> receiverExpression = callTypeAndReceiver.receiver
is CallTypeAndReceiver.UNARY -> receiverExpression = null // can it happen at all? is CallTypeAndReceiver.OPERATOR -> return emptyList()
is CallTypeAndReceiver.UNKNOWN -> return emptyList() is CallTypeAndReceiver.UNKNOWN -> return emptyList()
else -> throw RuntimeException() //TODO: see KT-9394 else -> throw RuntimeException() //TODO: see KT-9394
} }
@@ -44,10 +44,9 @@ public sealed class CallType<TReceiver : JetElement?>(val descriptorKindFilter:
object SAFE : CallType<JetExpression>(DescriptorKindFilter.ALL) object SAFE : CallType<JetExpression>(DescriptorKindFilter.ALL)
// TODO: split into INFIX and OPERATOR (+ support other convention calls like [] etc)
object INFIX : CallType<JetExpression>(DescriptorKindFilter.FUNCTIONS exclude NonInfixExclude) object INFIX : CallType<JetExpression>(DescriptorKindFilter.FUNCTIONS exclude NonInfixExclude)
object UNARY : CallType<JetExpression>(DescriptorKindFilter.FUNCTIONS exclude NonUnaryExclude) object OPERATOR : CallType<JetExpression>(DescriptorKindFilter.FUNCTIONS exclude NonOperatorExclude)
object CALLABLE_REFERENCE : CallType<JetTypeReference?>(DescriptorKindFilter.CALLABLES exclude CallableReferenceExclude) object CALLABLE_REFERENCE : CallType<JetTypeReference?>(DescriptorKindFilter.CALLABLES exclude CallableReferenceExclude)
@@ -66,10 +65,9 @@ public sealed class CallType<TReceiver : JetElement?>(val descriptorKindFilter:
get() = 0 get() = 0
} }
private object NonUnaryExclude : DescriptorKindExclude { private object NonOperatorExclude : DescriptorKindExclude {
//TODO: check 'operator' modifier
override fun excludes(descriptor: DeclarationDescriptor) = override fun excludes(descriptor: DeclarationDescriptor) =
!(descriptor is SimpleFunctionDescriptor && descriptor.valueParameters.isEmpty()) !(descriptor is SimpleFunctionDescriptor && descriptor.isOperator)
override val fullyExcludedDescriptorKinds: Int override val fullyExcludedDescriptorKinds: Int
get() = 0 get() = 0
@@ -94,7 +92,7 @@ public sealed class CallTypeAndReceiver<TReceiver : JetElement?, TCallType : Cal
class DOT(receiver: JetExpression) : CallTypeAndReceiver<JetExpression, CallType.DOT>(CallType.DOT, receiver) class DOT(receiver: JetExpression) : CallTypeAndReceiver<JetExpression, CallType.DOT>(CallType.DOT, receiver)
class SAFE(receiver: JetExpression) : CallTypeAndReceiver<JetExpression, CallType.SAFE>(CallType.SAFE, receiver) class SAFE(receiver: JetExpression) : CallTypeAndReceiver<JetExpression, CallType.SAFE>(CallType.SAFE, receiver)
class INFIX(receiver: JetExpression) : CallTypeAndReceiver<JetExpression, CallType.INFIX>(CallType.INFIX, receiver) class INFIX(receiver: JetExpression) : CallTypeAndReceiver<JetExpression, CallType.INFIX>(CallType.INFIX, receiver)
class UNARY(receiver: JetExpression) : CallTypeAndReceiver<JetExpression, CallType.UNARY>(CallType.UNARY, receiver) class OPERATOR(receiver: JetExpression) : CallTypeAndReceiver<JetExpression, CallType.OPERATOR>(CallType.OPERATOR, receiver)
class CALLABLE_REFERENCE(receiver: JetTypeReference?) : CallTypeAndReceiver<JetTypeReference?, CallType.CALLABLE_REFERENCE>(CallType.CALLABLE_REFERENCE, receiver) class CALLABLE_REFERENCE(receiver: JetTypeReference?) : CallTypeAndReceiver<JetTypeReference?, CallType.CALLABLE_REFERENCE>(CallType.CALLABLE_REFERENCE, receiver)
class IMPORT_DIRECTIVE(receiver: JetExpression?) : CallTypeAndReceiver<JetExpression?, CallType.IMPORT_DIRECTIVE>(CallType.IMPORT_DIRECTIVE, receiver) class IMPORT_DIRECTIVE(receiver: JetExpression?) : CallTypeAndReceiver<JetExpression?, CallType.IMPORT_DIRECTIVE>(CallType.IMPORT_DIRECTIVE, receiver)
class PACKAGE_DIRECTIVE(receiver: JetExpression?) : CallTypeAndReceiver<JetExpression?, CallType.PACKAGE_DIRECTIVE>(CallType.PACKAGE_DIRECTIVE, receiver) class PACKAGE_DIRECTIVE(receiver: JetExpression?) : CallTypeAndReceiver<JetExpression?, CallType.PACKAGE_DIRECTIVE>(CallType.PACKAGE_DIRECTIVE, receiver)
@@ -128,11 +126,13 @@ public sealed class CallTypeAndReceiver<TReceiver : JetElement?, TCallType : Cal
} }
return when (parent) { return when (parent) {
is JetBinaryExpression -> { is JetBinaryExpression -> {
//TODO: operator vs infix if (parent.operationToken == JetTokens.IDENTIFIER)
CallTypeAndReceiver.INFIX(receiverExpression) CallTypeAndReceiver.INFIX(receiverExpression)
else
CallTypeAndReceiver.OPERATOR(receiverExpression)
} }
is JetUnaryExpression -> CallTypeAndReceiver.UNARY(receiverExpression) is JetUnaryExpression -> CallTypeAndReceiver.OPERATOR(receiverExpression)
else -> error("Unknown parent for JetOperationReferenceExpression: $parent") else -> error("Unknown parent for JetOperationReferenceExpression: $parent")
} }
@@ -184,7 +184,7 @@ public fun CallTypeAndReceiver<*, *>.receiverTypes(
is CallTypeAndReceiver.DOT -> receiverExpression = receiver is CallTypeAndReceiver.DOT -> receiverExpression = receiver
is CallTypeAndReceiver.SAFE -> receiverExpression = receiver is CallTypeAndReceiver.SAFE -> receiverExpression = receiver
is CallTypeAndReceiver.INFIX -> receiverExpression = receiver is CallTypeAndReceiver.INFIX -> receiverExpression = receiver
is CallTypeAndReceiver.UNARY -> receiverExpression = receiver is CallTypeAndReceiver.OPERATOR -> receiverExpression = receiver
is CallTypeAndReceiver.IMPORT_DIRECTIVE, is CallTypeAndReceiver.IMPORT_DIRECTIVE,
is CallTypeAndReceiver.PACKAGE_DIRECTIVE, is CallTypeAndReceiver.PACKAGE_DIRECTIVE,
@@ -1,3 +1,3 @@
package util package util
fun h.H.div(i: Int) = 3 operator fun h.H.div(i: Int) = 3
@@ -0,0 +1,3 @@
package aaa
fun h.H.div(i: Int) = 3
@@ -1,3 +1,3 @@
package util package util
fun h.H?.minus(s: String) = "" operator fun h.H?.minus(s: String) = ""
@@ -0,0 +1,3 @@
package aaa
fun h.H?.minus(s: String) = ""
@@ -1,4 +1,4 @@
package util package util
fun h.H.inc(): h.H { operator fun h.H.inc(): h.H {
} }
@@ -0,0 +1,4 @@
package aaa
fun h.H.inc(): h.H {
}