Never find overriding parameter usages via old way

This commit is contained in:
Valentin Kipyatkov
2015-07-30 23:19:56 +03:00
parent 1bb8ca6ed5
commit d6f724c55d
@@ -58,18 +58,16 @@ val JetParameter.propertyDescriptor: PropertyDescriptor?
get() = this.analyze().get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, this) get() = this.analyze().get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, this)
fun PsiReference.checkUsageVsOriginalDescriptor( fun PsiReference.checkUsageVsOriginalDescriptor(
target: JetDeclaration, targetDescriptor: DeclarationDescriptor,
declarationToDescriptor: (JetDeclaration) -> DeclarationDescriptor? = {it.descriptor}, declarationToDescriptor: (JetDeclaration) -> DeclarationDescriptor? = {it.descriptor},
checker: (usageDescriptor: DeclarationDescriptor, targetDescriptor: DeclarationDescriptor) -> Boolean checker: (usageDescriptor: DeclarationDescriptor, targetDescriptor: DeclarationDescriptor) -> Boolean
): Boolean { ): Boolean {
return unwrappedTargets.any { return unwrappedTargets
if (it is JetDeclaration) { .filterIsInstance<JetDeclaration>()
val usageDescriptor = declarationToDescriptor(it) .any {
val targetDescriptor = declarationToDescriptor(target) val usageDescriptor = declarationToDescriptor(it)
usageDescriptor != null && targetDescriptor != null && checker(usageDescriptor, targetDescriptor) usageDescriptor != null && checker(usageDescriptor, targetDescriptor)
} }
else false
}
} }
fun PsiReference.isImportUsage(): Boolean = fun PsiReference.isImportUsage(): Boolean =
@@ -170,39 +168,52 @@ private fun processClassDelegationCallsToSpecifiedConstructor(
// Check if reference resolves to extension function whose receiver is the same as declaration's parent (or its superclass) // Check if reference resolves to extension function whose receiver is the same as declaration's parent (or its superclass)
// Used in extension search // Used in extension search
fun PsiReference.isExtensionOfDeclarationClassUsage(declaration: JetNamedDeclaration): Boolean = fun PsiReference.isExtensionOfDeclarationClassUsage(declaration: JetNamedDeclaration): Boolean {
checkUsageVsOriginalDescriptor(declaration) { usageDescriptor, targetDescriptor -> val descriptor = declaration.descriptor ?: return false
when { return checkUsageVsOriginalDescriptor(descriptor) { usageDescriptor, targetDescriptor ->
usageDescriptor == targetDescriptor -> false when {
usageDescriptor !is FunctionDescriptor -> false usageDescriptor == targetDescriptor -> false
else -> { usageDescriptor !is FunctionDescriptor -> false
val receiverDescriptor = else -> {
usageDescriptor.getExtensionReceiverParameter()?.getType()?.getConstructor()?.getDeclarationDescriptor() val receiverDescriptor =
val containingDescriptor = targetDescriptor.getContainingDeclaration() usageDescriptor.getExtensionReceiverParameter()?.getType()?.getConstructor()?.getDeclarationDescriptor()
val containingDescriptor = targetDescriptor.getContainingDeclaration()
containingDescriptor == receiverDescriptor containingDescriptor == receiverDescriptor
|| (containingDescriptor is ClassDescriptor || (containingDescriptor is ClassDescriptor
&& receiverDescriptor is ClassDescriptor && receiverDescriptor is ClassDescriptor
&& DescriptorUtils.isSubclass(containingDescriptor, receiverDescriptor)) && DescriptorUtils.isSubclass(containingDescriptor, receiverDescriptor))
}
} }
} }
}
}
// Check if reference resolves to the declaration with the same parent // Check if reference resolves to the declaration with the same parent
// Used in overload search // Used in overload search
fun PsiReference.isUsageInContainingDeclaration(declaration: JetNamedDeclaration): Boolean = fun PsiReference.isUsageInContainingDeclaration(declaration: JetNamedDeclaration): Boolean {
checkUsageVsOriginalDescriptor(declaration) { usageDescriptor, targetDescriptor -> val descriptor = declaration.descriptor ?: return false
usageDescriptor != targetDescriptor return checkUsageVsOriginalDescriptor(descriptor) { usageDescriptor, targetDescriptor ->
&& usageDescriptor.getContainingDeclaration() == targetDescriptor.getContainingDeclaration() usageDescriptor != targetDescriptor
} && usageDescriptor.getContainingDeclaration() == targetDescriptor.getContainingDeclaration()
}
}
fun PsiReference.isCallableOverrideUsage(declaration: JetNamedDeclaration): Boolean { fun PsiReference.isCallableOverrideUsage(declaration: JetNamedDeclaration): Boolean {
val decl2Desc = { declaration: JetDeclaration -> val toDescriptor: (JetDeclaration) -> DeclarationDescriptor? = { declaration ->
if (declaration is JetParameter && declaration.hasValOrVar()) declaration.propertyDescriptor else declaration.descriptor if (declaration is JetParameter) {
// we don't treat parameters in overriding method as "override" here (overriding parameters usages are searched optionally and via searching of overriding methods first)
if (declaration.hasValOrVar()) declaration.propertyDescriptor else null
}
else {
declaration.descriptor
}
} }
return checkUsageVsOriginalDescriptor(declaration, decl2Desc) { usageDescriptor, targetDescriptor -> val descriptor = toDescriptor(declaration) ?: return false
usageDescriptor is CallableDescriptor && targetDescriptor is CallableDescriptor
return checkUsageVsOriginalDescriptor(descriptor, toDescriptor) { usageDescriptor, targetDescriptor ->
usageDescriptor is CallableDescriptor
&& targetDescriptor is CallableDescriptor
&& OverrideResolver.overrides(usageDescriptor, targetDescriptor) && OverrideResolver.overrides(usageDescriptor, targetDescriptor)
} }
} }