Added CallType.ANNOTATION
This commit is contained in:
@@ -110,6 +110,10 @@ public class ReferenceVariantsHelper(
|
|||||||
return getVariantsForUserType(callTypeAndReceiver.receiver, expression, kindFilter, nameFilter)
|
return getVariantsForUserType(callTypeAndReceiver.receiver, expression, kindFilter, nameFilter)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is CallTypeAndReceiver.ANNOTATION -> {
|
||||||
|
return getVariantsForUserType(callTypeAndReceiver.receiver, expression, kindFilter, nameFilter)
|
||||||
|
}
|
||||||
|
|
||||||
is CallTypeAndReceiver.CALLABLE_REFERENCE -> {
|
is CallTypeAndReceiver.CALLABLE_REFERENCE -> {
|
||||||
val resolutionScope = context[BindingContext.RESOLUTION_SCOPE, expression.parent as JetExpression] ?: return emptyList()
|
val resolutionScope = context[BindingContext.RESOLUTION_SCOPE, expression.parent as JetExpression] ?: return emptyList()
|
||||||
return getVariantsForCallableReference(callTypeAndReceiver.receiver, resolutionScope, kindFilter, nameFilter)
|
return getVariantsForCallableReference(callTypeAndReceiver.receiver, resolutionScope, kindFilter, nameFilter)
|
||||||
|
|||||||
@@ -16,10 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.util
|
package org.jetbrains.kotlin.idea.util
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor
|
|
||||||
import org.jetbrains.kotlin.lexer.JetTokens
|
import org.jetbrains.kotlin.lexer.JetTokens
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression
|
import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression
|
||||||
@@ -56,6 +53,8 @@ public sealed class CallType<TReceiver : JetElement?>(val descriptorKindFilter:
|
|||||||
|
|
||||||
object TYPE : CallType<JetExpression?>(DescriptorKindFilter(DescriptorKindFilter.CLASSIFIERS_MASK or DescriptorKindFilter.PACKAGES_MASK))
|
object TYPE : CallType<JetExpression?>(DescriptorKindFilter(DescriptorKindFilter.CLASSIFIERS_MASK or DescriptorKindFilter.PACKAGES_MASK))
|
||||||
|
|
||||||
|
object ANNOTATION : CallType<JetExpression?>(DescriptorKindFilter(DescriptorKindFilter.CLASSIFIERS_MASK or DescriptorKindFilter.PACKAGES_MASK) exclude NonAnnotationClassifierExclude)
|
||||||
|
|
||||||
private object NonInfixExclude : DescriptorKindExclude() {
|
private object NonInfixExclude : DescriptorKindExclude() {
|
||||||
override fun excludes(descriptor: DeclarationDescriptor) =
|
override fun excludes(descriptor: DeclarationDescriptor) =
|
||||||
!(descriptor is SimpleFunctionDescriptor && descriptor.isInfix)
|
!(descriptor is SimpleFunctionDescriptor && descriptor.isInfix)
|
||||||
@@ -80,6 +79,14 @@ public sealed class CallType<TReceiver : JetElement?>(val descriptorKindFilter:
|
|||||||
get() = 0
|
get() = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private object NonAnnotationClassifierExclude : DescriptorKindExclude() {
|
||||||
|
override fun excludes(descriptor: DeclarationDescriptor): Boolean {
|
||||||
|
if (descriptor !is ClassifierDescriptor) return false
|
||||||
|
return descriptor !is ClassDescriptor || descriptor.getKind() != ClassKind.ANNOTATION_CLASS
|
||||||
|
}
|
||||||
|
|
||||||
|
override val fullyExcludedDescriptorKinds: Int get() = 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class CallTypeAndReceiver<TReceiver : JetElement?, TCallType : CallType<TReceiver>>(
|
public sealed class CallTypeAndReceiver<TReceiver : JetElement?, TCallType : CallType<TReceiver>>(
|
||||||
@@ -96,6 +103,7 @@ public sealed class CallTypeAndReceiver<TReceiver : JetElement?, TCallType : Cal
|
|||||||
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)
|
||||||
class TYPE(receiver: JetExpression?) : CallTypeAndReceiver<JetExpression?, CallType.TYPE>(CallType.TYPE, receiver)
|
class TYPE(receiver: JetExpression?) : CallTypeAndReceiver<JetExpression?, CallType.TYPE>(CallType.TYPE, receiver)
|
||||||
|
class ANNOTATION(receiver: JetExpression?) : CallTypeAndReceiver<JetExpression?, CallType.ANNOTATION>(CallType.ANNOTATION, receiver)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
public fun detect(expression: JetSimpleNameExpression): CallTypeAndReceiver<*, *> {
|
public fun detect(expression: JetSimpleNameExpression): CallTypeAndReceiver<*, *> {
|
||||||
@@ -115,6 +123,11 @@ public sealed class CallTypeAndReceiver<TReceiver : JetElement?, TCallType : Cal
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (parent is JetUserType) {
|
if (parent is JetUserType) {
|
||||||
|
val constructorCallee = (parent.parent as? JetTypeReference)?.parent as? JetConstructorCalleeExpression
|
||||||
|
if (constructorCallee != null && constructorCallee.parent is JetAnnotationEntry) {
|
||||||
|
return CallTypeAndReceiver.ANNOTATION(receiverExpression)
|
||||||
|
}
|
||||||
|
|
||||||
return CallTypeAndReceiver.TYPE(receiverExpression)
|
return CallTypeAndReceiver.TYPE(receiverExpression)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,6 +201,7 @@ public fun CallTypeAndReceiver<*, *>.receiverTypes(
|
|||||||
is CallTypeAndReceiver.IMPORT_DIRECTIVE,
|
is CallTypeAndReceiver.IMPORT_DIRECTIVE,
|
||||||
is CallTypeAndReceiver.PACKAGE_DIRECTIVE,
|
is CallTypeAndReceiver.PACKAGE_DIRECTIVE,
|
||||||
is CallTypeAndReceiver.TYPE,
|
is CallTypeAndReceiver.TYPE,
|
||||||
|
is CallTypeAndReceiver.ANNOTATION,
|
||||||
is CallTypeAndReceiver.UNKNOWN ->
|
is CallTypeAndReceiver.UNKNOWN ->
|
||||||
return null
|
return null
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ public class ShadowedDeclarationsFilter private constructor(
|
|||||||
is CallTypeAndReceiver.DOT -> callTypeAndReceiver.receiver
|
is CallTypeAndReceiver.DOT -> callTypeAndReceiver.receiver
|
||||||
is CallTypeAndReceiver.SAFE -> callTypeAndReceiver.receiver
|
is CallTypeAndReceiver.SAFE -> callTypeAndReceiver.receiver
|
||||||
is CallTypeAndReceiver.INFIX -> callTypeAndReceiver.receiver
|
is CallTypeAndReceiver.INFIX -> callTypeAndReceiver.receiver
|
||||||
is CallTypeAndReceiver.TYPE -> null // need filtering of classes with the same FQ-name
|
is CallTypeAndReceiver.TYPE, is CallTypeAndReceiver.ANNOTATION -> null // need filtering of classes with the same FQ-name
|
||||||
else -> return null // TODO: support shadowed declarations filtering for callable references
|
else -> return null // TODO: support shadowed declarations filtering for callable references
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user