Minor: reformat ReferenceVariantsHelper.kt
This commit is contained in:
+63
-31
@@ -65,9 +65,10 @@ class ReferenceVariantsHelper(
|
|||||||
filterOutShadowed: Boolean = true,
|
filterOutShadowed: Boolean = true,
|
||||||
excludeNonInitializedVariable: Boolean = true,
|
excludeNonInitializedVariable: Boolean = true,
|
||||||
useReceiverType: KotlinType? = null
|
useReceiverType: KotlinType? = null
|
||||||
): Collection<DeclarationDescriptor>
|
): Collection<DeclarationDescriptor> = getReferenceVariants(
|
||||||
= getReferenceVariants(expression, CallTypeAndReceiver.detect(expression),
|
expression, CallTypeAndReceiver.detect(expression),
|
||||||
kindFilter, nameFilter, filterOutJavaGettersAndSetters, filterOutShadowed, excludeNonInitializedVariable, useReceiverType)
|
kindFilter, nameFilter, filterOutJavaGettersAndSetters, filterOutShadowed, excludeNonInitializedVariable, useReceiverType
|
||||||
|
)
|
||||||
|
|
||||||
fun getReferenceVariants(
|
fun getReferenceVariants(
|
||||||
contextElement: PsiElement,
|
contextElement: PsiElement,
|
||||||
@@ -79,8 +80,8 @@ class ReferenceVariantsHelper(
|
|||||||
excludeNonInitializedVariable: Boolean = true,
|
excludeNonInitializedVariable: Boolean = true,
|
||||||
useReceiverType: KotlinType? = null
|
useReceiverType: KotlinType? = null
|
||||||
): Collection<DeclarationDescriptor> {
|
): Collection<DeclarationDescriptor> {
|
||||||
var variants: Collection<DeclarationDescriptor>
|
var variants: Collection<DeclarationDescriptor> =
|
||||||
= getReferenceVariantsNoVisibilityFilter(contextElement, kindFilter, nameFilter, callTypeAndReceiver, useReceiverType)
|
getReferenceVariantsNoVisibilityFilter(contextElement, kindFilter, nameFilter, callTypeAndReceiver, useReceiverType)
|
||||||
.filter { !resolutionFacade.frontendService<DeprecationResolver>().isHiddenInResolution(it) && visibilityFilter(it) }
|
.filter { !resolutionFacade.frontendService<DeprecationResolver>().isHiddenInResolution(it) && visibilityFilter(it) }
|
||||||
|
|
||||||
if (filterOutShadowed) {
|
if (filterOutShadowed) {
|
||||||
@@ -119,7 +120,10 @@ class ReferenceVariantsHelper(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// filters out variable inside its initializer
|
// filters out variable inside its initializer
|
||||||
fun excludeNonInitializedVariable(variants: Collection<DeclarationDescriptor>, contextElement: PsiElement): Collection<DeclarationDescriptor> {
|
fun excludeNonInitializedVariable(
|
||||||
|
variants: Collection<DeclarationDescriptor>,
|
||||||
|
contextElement: PsiElement
|
||||||
|
): Collection<DeclarationDescriptor> {
|
||||||
for (element in contextElement.parentsWithSelf) {
|
for (element in contextElement.parentsWithSelf) {
|
||||||
val parent = element.parent
|
val parent = element.parent
|
||||||
if (parent is KtVariableDeclaration && element == parent.initializer) {
|
if (parent is KtVariableDeclaration && element == parent.initializer) {
|
||||||
@@ -205,20 +209,30 @@ class ReferenceVariantsHelper(
|
|||||||
|
|
||||||
val explicitReceiverTypes = if (useReceiverType != null) {
|
val explicitReceiverTypes = if (useReceiverType != null) {
|
||||||
listOf(useReceiverType)
|
listOf(useReceiverType)
|
||||||
}
|
} else {
|
||||||
else {
|
callTypeAndReceiver.receiverTypes(
|
||||||
callTypeAndReceiver.receiverTypes(bindingContext, contextElement, moduleDescriptor, resolutionFacade, stableSmartCastsOnly = false)!!
|
bindingContext,
|
||||||
|
contextElement,
|
||||||
|
moduleDescriptor,
|
||||||
|
resolutionFacade,
|
||||||
|
stableSmartCastsOnly = false
|
||||||
|
)!!
|
||||||
}
|
}
|
||||||
|
|
||||||
descriptors.processAll(implicitReceiverTypes, explicitReceiverTypes, resolutionScope, callType, kindFilter, nameFilter)
|
descriptors.processAll(implicitReceiverTypes, explicitReceiverTypes, resolutionScope, callType, kindFilter, nameFilter)
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
assert(useReceiverType == null) { "'useReceiverType' parameter is not supported for implicit receiver" }
|
assert(useReceiverType == null) { "'useReceiverType' parameter is not supported for implicit receiver" }
|
||||||
|
|
||||||
descriptors.processAll(implicitReceiverTypes, implicitReceiverTypes, resolutionScope, callType, kindFilter, nameFilter)
|
descriptors.processAll(implicitReceiverTypes, implicitReceiverTypes, resolutionScope, callType, kindFilter, nameFilter)
|
||||||
|
|
||||||
// add non-instance members
|
// add non-instance members
|
||||||
descriptors.addAll(resolutionScope.collectDescriptorsFiltered(filterWithoutExtensions, nameFilter, changeNamesForAliased = true))
|
descriptors.addAll(
|
||||||
|
resolutionScope.collectDescriptorsFiltered(
|
||||||
|
filterWithoutExtensions,
|
||||||
|
nameFilter,
|
||||||
|
changeNamesForAliased = true
|
||||||
|
)
|
||||||
|
)
|
||||||
descriptors.addAll(resolutionScope.collectAllFromMeAndParent { scope ->
|
descriptors.addAll(resolutionScope.collectAllFromMeAndParent { scope ->
|
||||||
scope.collectSyntheticStaticMembersAndConstructors(resolutionFacade, kindFilter, nameFilter)
|
scope.collectSyntheticStaticMembersAndConstructors(resolutionFacade, kindFilter, nameFilter)
|
||||||
})
|
})
|
||||||
@@ -226,7 +240,9 @@ class ReferenceVariantsHelper(
|
|||||||
|
|
||||||
if (callType == CallType.SUPER_MEMBERS) { // we need to unwrap fake overrides in case of "super." because ShadowedDeclarationsFilter does not work correctly
|
if (callType == CallType.SUPER_MEMBERS) { // we need to unwrap fake overrides in case of "super." because ShadowedDeclarationsFilter does not work correctly
|
||||||
return descriptors.flatMapTo(LinkedHashSet<DeclarationDescriptor>()) {
|
return descriptors.flatMapTo(LinkedHashSet<DeclarationDescriptor>()) {
|
||||||
if (it is CallableMemberDescriptor && it.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) it.overriddenDescriptors else listOf(it)
|
if (it is CallableMemberDescriptor && it.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) it.overriddenDescriptors else listOf(
|
||||||
|
it
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -242,8 +258,7 @@ class ReferenceVariantsHelper(
|
|||||||
if (receiverExpression != null) {
|
if (receiverExpression != null) {
|
||||||
val qualifier = bindingContext[BindingContext.QUALIFIER, receiverExpression] ?: return emptyList()
|
val qualifier = bindingContext[BindingContext.QUALIFIER, receiverExpression] ?: return emptyList()
|
||||||
return qualifier.staticScope.collectStaticMembers(resolutionFacade, kindFilter, nameFilter)
|
return qualifier.staticScope.collectStaticMembers(resolutionFacade, kindFilter, nameFilter)
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
val scope = contextElement.getResolutionScope(bindingContext, resolutionFacade)
|
val scope = contextElement.getResolutionScope(bindingContext, resolutionFacade)
|
||||||
return scope.collectDescriptorsFiltered(kindFilter, nameFilter, changeNamesForAliased = true)
|
return scope.collectDescriptorsFiltered(kindFilter, nameFilter, changeNamesForAliased = true)
|
||||||
}
|
}
|
||||||
@@ -266,23 +281,33 @@ class ReferenceVariantsHelper(
|
|||||||
|
|
||||||
val explicitReceiverTypes = if (useReceiverType != null) {
|
val explicitReceiverTypes = if (useReceiverType != null) {
|
||||||
listOf(useReceiverType)
|
listOf(useReceiverType)
|
||||||
}
|
} else {
|
||||||
else {
|
callTypeAndReceiver.receiverTypes(
|
||||||
callTypeAndReceiver.receiverTypes(bindingContext, contextElement, moduleDescriptor, resolutionFacade, stableSmartCastsOnly = false)!!
|
bindingContext,
|
||||||
|
contextElement,
|
||||||
|
moduleDescriptor,
|
||||||
|
resolutionFacade,
|
||||||
|
stableSmartCastsOnly = false
|
||||||
|
)!!
|
||||||
}
|
}
|
||||||
|
|
||||||
val constructorFilter = { descriptor: ClassDescriptor -> if (isStatic) true else descriptor.isInner }
|
val constructorFilter = { descriptor: ClassDescriptor -> if (isStatic) true else descriptor.isInner }
|
||||||
descriptors.addNonExtensionMembers(explicitReceiverTypes, kindFilter, nameFilter, constructorFilter)
|
descriptors.addNonExtensionMembers(explicitReceiverTypes, kindFilter, nameFilter, constructorFilter)
|
||||||
|
|
||||||
descriptors.addScopeAndSyntheticExtensions(resolutionScope, explicitReceiverTypes, CallType.CALLABLE_REFERENCE, kindFilter, nameFilter)
|
descriptors.addScopeAndSyntheticExtensions(
|
||||||
|
resolutionScope,
|
||||||
|
explicitReceiverTypes,
|
||||||
|
CallType.CALLABLE_REFERENCE,
|
||||||
|
kindFilter,
|
||||||
|
nameFilter
|
||||||
|
)
|
||||||
|
|
||||||
if (isStatic) {
|
if (isStatic) {
|
||||||
explicitReceiverTypes
|
explicitReceiverTypes
|
||||||
.mapNotNull { (it.constructor.declarationDescriptor as? ClassDescriptor)?.staticScope }
|
.mapNotNull { (it.constructor.declarationDescriptor as? ClassDescriptor)?.staticScope }
|
||||||
.flatMapTo(descriptors) { it.collectStaticMembers(resolutionFacade, kindFilter, nameFilter) }
|
.flatMapTo(descriptors) { it.collectStaticMembers(resolutionFacade, kindFilter, nameFilter) }
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
// process non-instance members and class constructors
|
// process non-instance members and class constructors
|
||||||
descriptors.addNonExtensionCallablesAndConstructors(
|
descriptors.addNonExtensionCallablesAndConstructors(
|
||||||
resolutionScope,
|
resolutionScope,
|
||||||
@@ -302,11 +327,11 @@ class ReferenceVariantsHelper(
|
|||||||
val qualifier = bindingContext[BindingContext.QUALIFIER, receiverExpression] ?: return emptyList()
|
val qualifier = bindingContext[BindingContext.QUALIFIER, receiverExpression] ?: return emptyList()
|
||||||
val staticDescriptors = qualifier.staticScope.collectStaticMembers(resolutionFacade, kindFilter, nameFilter)
|
val staticDescriptors = qualifier.staticScope.collectStaticMembers(resolutionFacade, kindFilter, nameFilter)
|
||||||
|
|
||||||
val objectDescriptor = (qualifier as? ClassQualifier)?.descriptor?.takeIf { it.kind == ClassKind.OBJECT } ?: return staticDescriptors
|
val objectDescriptor =
|
||||||
|
(qualifier as? ClassQualifier)?.descriptor?.takeIf { it.kind == ClassKind.OBJECT } ?: return staticDescriptors
|
||||||
|
|
||||||
return staticDescriptors + objectDescriptor.defaultType.memberScope.getDescriptorsFiltered(kindFilter, nameFilter)
|
return staticDescriptors + objectDescriptor.defaultType.memberScope.getDescriptorsFiltered(kindFilter, nameFilter)
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
val rootPackage = resolutionFacade.moduleDescriptor.getPackage(FqName.ROOT)
|
val rootPackage = resolutionFacade.moduleDescriptor.getPackage(FqName.ROOT)
|
||||||
return rootPackage.memberScope.getDescriptorsFiltered(kindFilter, nameFilter)
|
return rootPackage.memberScope.getDescriptorsFiltered(kindFilter, nameFilter)
|
||||||
}
|
}
|
||||||
@@ -369,7 +394,8 @@ class ReferenceVariantsHelper(
|
|||||||
constructorFilter: (ClassDescriptor) -> Boolean,
|
constructorFilter: (ClassDescriptor) -> Boolean,
|
||||||
classesOnly: Boolean
|
classesOnly: Boolean
|
||||||
) {
|
) {
|
||||||
var filterToUse = DescriptorKindFilter(kindFilter.kindMask and DescriptorKindFilter.CALLABLES.kindMask).exclude(DescriptorKindExclude.Extensions)
|
var filterToUse =
|
||||||
|
DescriptorKindFilter(kindFilter.kindMask and DescriptorKindFilter.CALLABLES.kindMask).exclude(DescriptorKindExclude.Extensions)
|
||||||
|
|
||||||
// should process classes if we need constructors
|
// should process classes if we need constructors
|
||||||
if (filterToUse.acceptsKinds(DescriptorKindFilter.FUNCTIONS_MASK)) {
|
if (filterToUse.acceptsKinds(DescriptorKindFilter.FUNCTIONS_MASK)) {
|
||||||
@@ -381,8 +407,7 @@ class ReferenceVariantsHelper(
|
|||||||
if (descriptor.modality == Modality.ABSTRACT || descriptor.modality == Modality.SEALED) continue
|
if (descriptor.modality == Modality.ABSTRACT || descriptor.modality == Modality.SEALED) continue
|
||||||
if (!constructorFilter(descriptor)) continue
|
if (!constructorFilter(descriptor)) continue
|
||||||
descriptor.constructors.filterTo(this) { kindFilter.accepts(it) }
|
descriptor.constructors.filterTo(this) { kindFilter.accepts(it) }
|
||||||
}
|
} else if (!classesOnly && kindFilter.accepts(descriptor)) {
|
||||||
else if (!classesOnly && kindFilter.accepts(descriptor)) {
|
|
||||||
this.add(descriptor)
|
this.add(descriptor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -402,14 +427,17 @@ class ReferenceVariantsHelper(
|
|||||||
if (kindFilter.accepts(extensionOrSyntheticMember) && nameFilter(extensionOrSyntheticMember.name)) {
|
if (kindFilter.accepts(extensionOrSyntheticMember) && nameFilter(extensionOrSyntheticMember.name)) {
|
||||||
if (extensionOrSyntheticMember.isExtension) {
|
if (extensionOrSyntheticMember.isExtension) {
|
||||||
addAll(extensionOrSyntheticMember.substituteExtensionIfCallable(receiverTypes, callType))
|
addAll(extensionOrSyntheticMember.substituteExtensionIfCallable(receiverTypes, callType))
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
add(extensionOrSyntheticMember)
|
add(extensionOrSyntheticMember)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (descriptor in scope.collectDescriptorsFiltered(kindFilter exclude DescriptorKindExclude.NonExtensions, nameFilter, changeNamesForAliased = true)) {
|
for (descriptor in scope.collectDescriptorsFiltered(
|
||||||
|
kindFilter exclude DescriptorKindExclude.NonExtensions,
|
||||||
|
nameFilter,
|
||||||
|
changeNamesForAliased = true
|
||||||
|
)) {
|
||||||
// todo: sometimes resolution scope here is LazyJavaClassMemberScope. see ea.jetbrains.com/browser/ea_problems/72572
|
// todo: sometimes resolution scope here is LazyJavaClassMemberScope. see ea.jetbrains.com/browser/ea_problems/72572
|
||||||
process(descriptor as CallableDescriptor)
|
process(descriptor as CallableDescriptor)
|
||||||
}
|
}
|
||||||
@@ -437,7 +465,11 @@ private fun MemberScope.collectStaticMembers(
|
|||||||
kindFilter: DescriptorKindFilter,
|
kindFilter: DescriptorKindFilter,
|
||||||
nameFilter: (Name) -> Boolean
|
nameFilter: (Name) -> Boolean
|
||||||
): Collection<DeclarationDescriptor> {
|
): Collection<DeclarationDescriptor> {
|
||||||
return getDescriptorsFiltered(kindFilter, nameFilter) + collectSyntheticStaticMembersAndConstructors(resolutionFacade, kindFilter, nameFilter)
|
return getDescriptorsFiltered(kindFilter, nameFilter) + collectSyntheticStaticMembersAndConstructors(
|
||||||
|
resolutionFacade,
|
||||||
|
kindFilter,
|
||||||
|
nameFilter
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun ResolutionScope.collectSyntheticStaticMembersAndConstructors(
|
fun ResolutionScope.collectSyntheticStaticMembersAndConstructors(
|
||||||
|
|||||||
Reference in New Issue
Block a user