Remove parentheses after deleting the last unused constructor parameter

So #KT-16636 Fixed
This commit is contained in:
Toshiaki Kameyama
2017-09-29 04:09:22 +03:00
committed by Mikhail Glukhikh
parent 7ade2bb708
commit c5b7d0f0df
10 changed files with 69 additions and 12 deletions
@@ -58,6 +58,7 @@ import org.jetbrains.kotlin.idea.findUsages.KotlinFindUsagesHandlerFactory
import org.jetbrains.kotlin.idea.findUsages.handlers.KotlinFindClassUsagesHandler
import org.jetbrains.kotlin.idea.highlighter.markers.hasActualsFor
import org.jetbrains.kotlin.idea.imports.importableFqName
import org.jetbrains.kotlin.idea.quickfix.RemoveUnusedFunctionParameterFix
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.idea.references.resolveMainReferenceToDescriptors
import org.jetbrains.kotlin.idea.search.usagesSearch.dataClassComponentFunction
@@ -386,9 +387,14 @@ class SafeDeleteFix(declaration: KtDeclaration) : LocalQuickFix {
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
val declaration = descriptor.psiElement.getStrictParentOfType<KtDeclaration>() ?: return
if (!FileModificationService.getInstance().prepareFileForWrite(declaration.containingFile)) return
ApplicationManager.getApplication().invokeLater(
{ SafeDeleteHandler.invoke(project, arrayOf(declaration), false) },
ModalityState.NON_MODAL
)
if (declaration is KtParameter && declaration.parent is KtParameterList && declaration.parent?.parent is KtFunction) {
RemoveUnusedFunctionParameterFix(declaration).invoke(project, declaration.findExistingEditor(), declaration.containingKtFile)
}
else {
ApplicationManager.getApplication().invokeLater(
{ SafeDeleteHandler.invoke(project, arrayOf(declaration), false) },
ModalityState.NON_MODAL
)
}
}
}
@@ -18,14 +18,16 @@ package org.jetbrains.kotlin.idea.quickfix
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.descriptors.MemberDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtFunctionLiteral
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.KtParameter
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.resolve.BindingContext
class RemoveUnusedFunctionParameterFix(parameter: KtParameter) : KotlinQuickFixAction<KtParameter>(parameter) {
override fun getFamilyName() = ChangeFunctionSignatureFix.FAMILY_NAME
@@ -36,8 +38,23 @@ class RemoveUnusedFunctionParameterFix(parameter: KtParameter) : KotlinQuickFixA
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
val element = element ?: return
val parameterDescriptor = element.unsafeResolveToDescriptor() as ValueParameterDescriptor
ChangeFunctionSignatureFix.runRemoveParameter(parameterDescriptor, element)
val primaryConstructor = element.parent?.parent as? KtPrimaryConstructor
val parameterList = element.parent as? KtParameterList
if (primaryConstructor != null && parameterList?.parameters?.size == 1 &&
(primaryConstructor.getContainingClassOrObject().resolveToDescriptorIfAny() as? MemberDescriptor)?.isExpect == false) {
runWriteAction {
parameterList.delete()
}
}
else {
val context = element.analyze()
val parameterDescriptor = context[BindingContext.VALUE_PARAMETER, element] as? ValueParameterDescriptor ?: return
ChangeFunctionSignatureFix.runRemoveParameter(parameterDescriptor, element)
val nextParameter = parameterList?.parameters?.getOrNull(parameterDescriptor.index)
if (editor != null && nextParameter != null) {
editor.caretModel.moveToOffset(nextParameter.startOffset)
}
}
}
companion object : KotlinSingleIntentionActionFactory() {
@@ -0,0 +1,3 @@
// "Remove parameter 'a'" "true"
class Foo(<caret>a: String)
@@ -0,0 +1,3 @@
// "Remove parameter 'a'" "true"
class Foo<caret>
@@ -0,0 +1,3 @@
// "Remove parameter 'a'" "true"
class Foo(<caret>a: String, b: String)
@@ -0,0 +1,3 @@
// "Remove parameter 'a'" "true"
class Foo(<caret>b: String)
@@ -1,2 +1,2 @@
// "Safe delete 'property'" "true"
class UnusedPropertyAsConstructorParameter()
class UnusedPropertyAsConstructorParameter<caret>
@@ -0,0 +1,2 @@
// "Safe delete 'property'" "true"
class UnusedPropertyAsConstructorParameter(val <caret>property: String, val foo: String)
@@ -0,0 +1,2 @@
// "Safe delete 'property'" "true"
class UnusedPropertyAsConstructorParameter(<caret>val foo: String)
@@ -1423,6 +1423,18 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/changeSignature/removeUnusedParameter.kt");
doTest(fileName);
}
@TestMetadata("removeUnusedPrimaryConstructorParameter.kt")
public void testRemoveUnusedPrimaryConstructorParameter() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/changeSignature/removeUnusedPrimaryConstructorParameter.kt");
doTest(fileName);
}
@TestMetadata("removeUnusedPrimaryConstructorParameter2.kt")
public void testRemoveUnusedPrimaryConstructorParameter2() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/changeSignature/removeUnusedPrimaryConstructorParameter2.kt");
doTest(fileName);
}
}
@TestMetadata("idea/testData/quickfix/changeToLabeledReturn")
@@ -9071,6 +9083,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
doTest(fileName);
}
@TestMetadata("unusedPropertyAsConstructorParameter2.kt")
public void testUnusedPropertyAsConstructorParameter2() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/removeUnused/unusedPropertyAsConstructorParameter2.kt");
doTest(fileName);
}
@TestMetadata("unusedTypeParameter.kt")
public void testUnusedTypeParameter() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/removeUnused/unusedTypeParameter.kt");