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.findUsages.handlers.KotlinFindClassUsagesHandler
import org.jetbrains.kotlin.idea.highlighter.markers.hasActualsFor import org.jetbrains.kotlin.idea.highlighter.markers.hasActualsFor
import org.jetbrains.kotlin.idea.imports.importableFqName 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.mainReference
import org.jetbrains.kotlin.idea.references.resolveMainReferenceToDescriptors import org.jetbrains.kotlin.idea.references.resolveMainReferenceToDescriptors
import org.jetbrains.kotlin.idea.search.usagesSearch.dataClassComponentFunction import org.jetbrains.kotlin.idea.search.usagesSearch.dataClassComponentFunction
@@ -386,9 +387,14 @@ class SafeDeleteFix(declaration: KtDeclaration) : LocalQuickFix {
override fun applyFix(project: Project, descriptor: ProblemDescriptor) { override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
val declaration = descriptor.psiElement.getStrictParentOfType<KtDeclaration>() ?: return val declaration = descriptor.psiElement.getStrictParentOfType<KtDeclaration>() ?: return
if (!FileModificationService.getInstance().prepareFileForWrite(declaration.containingFile)) return if (!FileModificationService.getInstance().prepareFileForWrite(declaration.containingFile)) return
ApplicationManager.getApplication().invokeLater( if (declaration is KtParameter && declaration.parent is KtParameterList && declaration.parent?.parent is KtFunction) {
{ SafeDeleteHandler.invoke(project, arrayOf(declaration), false) }, RemoveUnusedFunctionParameterFix(declaration).invoke(project, declaration.findExistingEditor(), declaration.containingKtFile)
ModalityState.NON_MODAL }
) 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.editor.Editor
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.descriptors.MemberDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Diagnostic
import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.psi.KtFunctionLiteral import org.jetbrains.kotlin.idea.util.application.runWriteAction
import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.psiUtil.startOffset
import org.jetbrains.kotlin.resolve.BindingContext
class RemoveUnusedFunctionParameterFix(parameter: KtParameter) : KotlinQuickFixAction<KtParameter>(parameter) { class RemoveUnusedFunctionParameterFix(parameter: KtParameter) : KotlinQuickFixAction<KtParameter>(parameter) {
override fun getFamilyName() = ChangeFunctionSignatureFix.FAMILY_NAME override fun getFamilyName() = ChangeFunctionSignatureFix.FAMILY_NAME
@@ -36,8 +38,23 @@ class RemoveUnusedFunctionParameterFix(parameter: KtParameter) : KotlinQuickFixA
override fun invoke(project: Project, editor: Editor?, file: KtFile) { override fun invoke(project: Project, editor: Editor?, file: KtFile) {
val element = element ?: return val element = element ?: return
val parameterDescriptor = element.unsafeResolveToDescriptor() as ValueParameterDescriptor val primaryConstructor = element.parent?.parent as? KtPrimaryConstructor
ChangeFunctionSignatureFix.runRemoveParameter(parameterDescriptor, element) 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() { 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" // "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"); String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/changeSignature/removeUnusedParameter.kt");
doTest(fileName); 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") @TestMetadata("idea/testData/quickfix/changeToLabeledReturn")
@@ -9071,6 +9083,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
doTest(fileName); 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") @TestMetadata("unusedTypeParameter.kt")
public void testUnusedTypeParameter() throws Exception { public void testUnusedTypeParameter() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/removeUnused/unusedTypeParameter.kt"); String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/removeUnused/unusedTypeParameter.kt");