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.SAFE -> 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()
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)
// TODO: split into INFIX and OPERATOR (+ support other convention calls like [] etc)
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)
@@ -66,10 +65,9 @@ public sealed class CallType<TReceiver : JetElement?>(val descriptorKindFilter:
get() = 0
}
private object NonUnaryExclude : DescriptorKindExclude {
//TODO: check 'operator' modifier
private object NonOperatorExclude : DescriptorKindExclude {
override fun excludes(descriptor: DeclarationDescriptor) =
!(descriptor is SimpleFunctionDescriptor && descriptor.valueParameters.isEmpty())
!(descriptor is SimpleFunctionDescriptor && descriptor.isOperator)
override val fullyExcludedDescriptorKinds: Int
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 SAFE(receiver: JetExpression) : CallTypeAndReceiver<JetExpression, CallType.SAFE>(CallType.SAFE, 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 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)
@@ -128,11 +126,13 @@ public sealed class CallTypeAndReceiver<TReceiver : JetElement?, TCallType : Cal
}
return when (parent) {
is JetBinaryExpression -> {
//TODO: operator vs infix
CallTypeAndReceiver.INFIX(receiverExpression)
if (parent.operationToken == JetTokens.IDENTIFIER)
CallTypeAndReceiver.INFIX(receiverExpression)
else
CallTypeAndReceiver.OPERATOR(receiverExpression)
}
is JetUnaryExpression -> CallTypeAndReceiver.UNARY(receiverExpression)
is JetUnaryExpression -> CallTypeAndReceiver.OPERATOR(receiverExpression)
else -> error("Unknown parent for JetOperationReferenceExpression: $parent")
}
@@ -184,7 +184,7 @@ public fun CallTypeAndReceiver<*, *>.receiverTypes(
is CallTypeAndReceiver.DOT -> receiverExpression = receiver
is CallTypeAndReceiver.SAFE -> receiverExpression = receiver
is CallTypeAndReceiver.INFIX -> receiverExpression = receiver
is CallTypeAndReceiver.UNARY -> receiverExpression = receiver
is CallTypeAndReceiver.OPERATOR -> receiverExpression = receiver
is CallTypeAndReceiver.IMPORT_DIRECTIVE,
is CallTypeAndReceiver.PACKAGE_DIRECTIVE,
@@ -1,3 +1,3 @@
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
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
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 {
}