From 92b0c852dd7539fa407a9314bc24d7d282e6fbae Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 17 Aug 2016 13:03:53 +0300 Subject: [PATCH] Remove Unused Receiver: update function/property usages #KT-8903 Fixed --- ChangeLog.md | 1 + .../UnusedReceiverParameterInspection.kt | 17 +++++++++++++++-- .../quickfix/removeUnusedReceiver/inFunction.kt | 4 ++++ .../removeUnusedReceiver/inFunction.kt.after | 4 ++++ .../quickfix/removeUnusedReceiver/inProperty.kt | 4 ++++ .../removeUnusedReceiver/inProperty.kt.after | 4 ++++ 6 files changed, 32 insertions(+), 2 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index abc73a38f4f..82ac4f75353 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -219,6 +219,7 @@ These artifacts include extensions for the types available in the latter JDKs, s - [`KT-13364`](https://youtrack.jetbrains.com/issue/KT-13364) Do not suggest creating annotations/enum classes for unresolved type parameter bounds - [`KT-12627`](https://youtrack.jetbrains.com/issue/KT-12627) Allow warnings suppression for secondary constructor - [`KT-13365`](https://youtrack.jetbrains.com/issue/KT-13365) Disable "Create property" (non-abstract) in interfaces. Make "Create function" (non-abstract) generate function body in interfaces +- [`KT-8903`](https://youtrack.jetbrains.com/issue/KT-8903) Remove Unused Receiver: update function/property usages ##### New features diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt index 9a1e96fbfb1..8906a232060 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/UnusedReceiverParameterInspection.kt @@ -18,16 +18,21 @@ package org.jetbrains.kotlin.idea.inspections import com.intellij.codeInspection.* import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementVisitor +import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinChangeSignatureConfiguration +import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinMethodDescriptor +import org.jetbrains.kotlin.idea.refactoring.changeSignature.modify +import org.jetbrains.kotlin.idea.refactoring.changeSignature.runChangeSignature import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor import org.jetbrains.kotlin.idea.util.getThisReceiverOwner import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.isOverridable -import org.jetbrains.kotlin.psi.typeRefHelpers.setReceiverTypeReference import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall @@ -104,8 +109,16 @@ class UnusedReceiverParameterInspection : AbstractKotlinInspection() { return KotlinBundle.message("unused.receiver.parameter.remove") } + private fun configureChangeSignature() = object : KotlinChangeSignatureConfiguration { + override fun performSilently(affectedFunctions: Collection) = true + override fun configure(originalDescriptor: KotlinMethodDescriptor) = originalDescriptor.modify { it.removeParameter(0) } + } + override fun applyFix(project: Project, descriptor: ProblemDescriptor) { - declaration.setReceiverTypeReference(null) + val element = descriptor.psiElement + val function = element.parent as? KtCallableDeclaration ?: return + val callableDescriptor = function.analyze()[BindingContext.DECLARATION_TO_DESCRIPTOR, function] as? CallableDescriptor ?: return + runChangeSignature(project, callableDescriptor, configureChangeSignature(), element, name) } override fun getFamilyName(): String = name diff --git a/idea/testData/quickfix/removeUnusedReceiver/inFunction.kt b/idea/testData/quickfix/removeUnusedReceiver/inFunction.kt index 449b9391b76..4d1ab4d0757 100644 --- a/idea/testData/quickfix/removeUnusedReceiver/inFunction.kt +++ b/idea/testData/quickfix/removeUnusedReceiver/inFunction.kt @@ -2,3 +2,7 @@ fun Any.foo() { } + +fun test() { + 1.foo() +} \ No newline at end of file diff --git a/idea/testData/quickfix/removeUnusedReceiver/inFunction.kt.after b/idea/testData/quickfix/removeUnusedReceiver/inFunction.kt.after index c60bc4fb6fa..d67e7bf97be 100644 --- a/idea/testData/quickfix/removeUnusedReceiver/inFunction.kt.after +++ b/idea/testData/quickfix/removeUnusedReceiver/inFunction.kt.after @@ -2,3 +2,7 @@ fun foo() { } + +fun test() { + foo() +} \ No newline at end of file diff --git a/idea/testData/quickfix/removeUnusedReceiver/inProperty.kt b/idea/testData/quickfix/removeUnusedReceiver/inProperty.kt index 19784d24f1d..0bd8c3b7191 100644 --- a/idea/testData/quickfix/removeUnusedReceiver/inProperty.kt +++ b/idea/testData/quickfix/removeUnusedReceiver/inProperty.kt @@ -1,3 +1,7 @@ // "Remove redundant receiver parameter" "true" val Any.v: Int get() = 123 + +fun test() { + "".v +} \ No newline at end of file diff --git a/idea/testData/quickfix/removeUnusedReceiver/inProperty.kt.after b/idea/testData/quickfix/removeUnusedReceiver/inProperty.kt.after index 7664929571a..49bb67dfa8f 100644 --- a/idea/testData/quickfix/removeUnusedReceiver/inProperty.kt.after +++ b/idea/testData/quickfix/removeUnusedReceiver/inProperty.kt.after @@ -1,3 +1,7 @@ // "Remove redundant receiver parameter" "true" val v: Int get() = 123 + +fun test() { + v +} \ No newline at end of file