From b87dd07dd1cd97086f4335775514992c28b8f3cb Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 19 Jun 2018 11:30:07 +0300 Subject: [PATCH] Redundant companion reference: minor refactoring --- .../jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt | 4 ++++ .../RedundantCompanionReferenceInspection.kt | 16 +++++++--------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt index 3b06b5d9896..158424c8d73 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt @@ -480,6 +480,10 @@ fun KtClassOrObject.findPropertyByName(name: String): KtNamedDeclaration? { ?: primaryConstructorParameters.firstOrNull { it.hasValOrVar() && it.name == name } } +fun KtClassOrObject.findFunctionByName(name: String): KtNamedDeclaration? { + return declarations.firstOrNull { it is KtNamedFunction && it.name == name } as KtNamedDeclaration? +} + fun isTypeConstructorReference(e: PsiElement): Boolean { val parent = e.parent return parent is KtUserType && parent.referenceExpression == e diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantCompanionReferenceInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantCompanionReferenceInspection.kt index 8a307591858..a7fcd20d5ae 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantCompanionReferenceInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantCompanionReferenceInspection.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClass +import org.jetbrains.kotlin.psi.psiUtil.findFunctionByName import org.jetbrains.kotlin.psi.psiUtil.findPropertyByName import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject @@ -39,19 +40,20 @@ class RedundantCompanionReferenceInspection : AbstractKotlinInspection() { if (expression.text != objectDeclaration.name) return val containingClass = objectDeclaration.containingClass() ?: return + val containingClassDescriptor = containingClass.descriptor as? ClassDescriptor ?: return val selectorDescriptor = selectorExpression?.getCallableDescriptor() when (selectorDescriptor) { is PropertyDescriptor -> { val name = selectorDescriptor.name if (containingClass.findPropertyByName(name.asString()) != null) return val variable = expression.getResolutionScope().findVariable(name, NoLookupLocation.FROM_IDE) - if (variable.isLocalOrExtension(containingClass)) return + if (variable != null && variable.isLocalOrExtension(containingClassDescriptor)) return } is FunctionDescriptor -> { val name = selectorDescriptor.name val function = containingClass.findFunctionByName(name.asString())?.descriptor ?: expression.getResolutionScope().findFunction(name, NoLookupLocation.FROM_IDE)?.takeIf { - it.isLocalOrExtension(containingClass) + it.isLocalOrExtension(containingClassDescriptor) } if (function is FunctionDescriptor) { val functionParams = function.valueParameters @@ -80,13 +82,9 @@ class RedundantCompanionReferenceInspection : AbstractKotlinInspection() { } } -private fun KtClass.findFunctionByName(name: String): KtDeclaration? { - return declarations.firstOrNull { it is KtNamedFunction && it.name == name } -} - -private fun CallableDescriptor?.isLocalOrExtension(extensionClass: KtClass): Boolean { - return this?.visibility == Visibilities.LOCAL - || this?.extensionReceiverParameter?.type?.constructor?.declarationDescriptor == extensionClass.descriptor +private fun CallableDescriptor.isLocalOrExtension(extensionClassDescriptor: ClassDescriptor): Boolean { + return visibility == Visibilities.LOCAL || + extensionReceiverParameter?.type?.constructor?.declarationDescriptor == extensionClassDescriptor } private class RemoveRedundantCompanionReferenceFix : LocalQuickFix {