Minor: reformat ReferenceVariantsHelper.kt

This commit is contained in:
Dmitry Savvinov
2019-05-29 14:00:23 +03:00
parent 00f8f09274
commit eda975d317
@@ -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(