From 80134b9b2be37c26e9cd0cdf3e04450a6913f3c8 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 6 Apr 2015 15:44:08 +0300 Subject: [PATCH] Introduce Parameter: Support parameters without default values --- .../KotlinInplaceParameterIntroducer.kt | 14 +++++++++++++- .../KotlinIntroduceParameterHandler.kt | 17 ++++++++++------- .../introduceParameter/valueAtCallSite.kt | 9 +++++++++ .../introduceParameter/valueAtCallSite.kt.after | 9 +++++++++ .../valueAtCallSiteMultipleUsages.kt | 9 +++++++++ .../valueAtCallSiteMultipleUsages.kt.after | 9 +++++++++ .../introduce/AbstractJetExtractionTest.kt | 4 +++- .../introduce/JetExtractionTestGenerated.java | 12 ++++++++++++ 8 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 idea/testData/refactoring/introduceParameter/valueAtCallSite.kt create mode 100644 idea/testData/refactoring/introduceParameter/valueAtCallSite.kt.after create mode 100644 idea/testData/refactoring/introduceParameter/valueAtCallSiteMultipleUsages.kt create mode 100644 idea/testData/refactoring/introduceParameter/valueAtCallSiteMultipleUsages.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinInplaceParameterIntroducer.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinInplaceParameterIntroducer.kt index 0b4f5a62c65..5ec4ed24a29 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinInplaceParameterIntroducer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinInplaceParameterIntroducer.kt @@ -135,8 +135,9 @@ public class KotlinInplaceParameterIntroducer( val parameterName = currentName ?: parameter.getName() val parameterType = currentType ?: parameter.getTypeReference()!!.getText() val modifier = if (valVar != JetValVar.None) "${valVar.name} " else "" + val defaultValue = if (withDefaultValue) " = ${originalExpression.getText()}" else "" - "$modifier$parameterName: $parameterType" + "$modifier$parameterName: $parameterType$defaultValue" } else parameter.getText() @@ -210,6 +211,17 @@ public class KotlinInplaceParameterIntroducer( previewerPanel } + addPanelControl { + val defaultValueCheckBox = NonFocusableCheckBox("Introduce default value") + defaultValueCheckBox.setSelected(descriptor.withDefaultValue) + defaultValueCheckBox.setMnemonic('d') + defaultValueCheckBox.addActionListener { + descriptor = descriptor.copy(withDefaultValue = defaultValueCheckBox.isSelected()) + updatePreview(null, null) + } + defaultValueCheckBox + } + val occurrenceCount = descriptor.occurrencesToReplace.size() if (occurrenceCount > 1) { addPanelControl { diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt index 7e9a03b7cc4..e6cdb0547d7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceParameter/KotlinIntroduceParameterHandler.kt @@ -65,6 +65,7 @@ public data class IntroduceParameterDescriptor( val callableDescriptor: FunctionDescriptor, val addedParameter: JetParameter, val parameterType: JetType, + val withDefaultValue: Boolean, val parametersUsages: Map>, val occurrencesToReplace: List ) { @@ -114,7 +115,8 @@ fun IntroduceParameterDescriptor.performRefactoring() { val parameterInfo = JetParameterInfo(name = addedParameter.getName()!!, type = parameterType, - defaultValueForParameter = JetPsiUtil.deparenthesize(originalExpression), + defaultValueForCall = if (withDefaultValue) "" else originalExpression.getText(), + defaultValueForParameter = if (withDefaultValue) originalExpression else null, valOrVar = valVar) parameterInfo.currentTypeText = addedParameter.getTypeReference()?.getText() ?: "Any" addParameter(parameterInfo) @@ -209,12 +211,13 @@ public open class KotlinIntroduceParameterHandler: KotlinIntroduceHandlerBase() val introduceParameterDescriptor = configure(IntroduceParameterDescriptor(JetPsiUtil.deparenthesize(expression)!!, - targetParent, - functionDescriptor, - addedParameter, - parameterType, - parametersUsages, - occurrencesToReplace)) + targetParent, + functionDescriptor, + addedParameter, + parameterType, + false, + parametersUsages, + occurrencesToReplace)) if (editor.getSettings().isVariableInplaceRenameEnabled() && !ApplicationManager.getApplication().isUnitTestMode()) { with(PsiDocumentManager.getInstance(project)) { commitDocument(editor.getDocument()) diff --git a/idea/testData/refactoring/introduceParameter/valueAtCallSite.kt b/idea/testData/refactoring/introduceParameter/valueAtCallSite.kt new file mode 100644 index 00000000000..83588c65b4d --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/valueAtCallSite.kt @@ -0,0 +1,9 @@ +// WITH_DEFAULT_VALUE: false +fun foo(a: Int): Int { + val b = (a + 1) * 2 + return a + b +} + +fun test() { + foo(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/valueAtCallSite.kt.after b/idea/testData/refactoring/introduceParameter/valueAtCallSite.kt.after new file mode 100644 index 00000000000..e488d2d880b --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/valueAtCallSite.kt.after @@ -0,0 +1,9 @@ +// WITH_DEFAULT_VALUE: false +fun foo(a: Int, i: Int): Int { + val b = i * 2 + return a + b +} + +fun test() { + foo(1, a + 1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/valueAtCallSiteMultipleUsages.kt b/idea/testData/refactoring/introduceParameter/valueAtCallSiteMultipleUsages.kt new file mode 100644 index 00000000000..1cd9330d2d7 --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/valueAtCallSiteMultipleUsages.kt @@ -0,0 +1,9 @@ +// WITH_DEFAULT_VALUE: false +fun foo(a: Int): Int { + val b = (a + 1) * 2 + return a + 1 +} + +fun test() { + foo(1) +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceParameter/valueAtCallSiteMultipleUsages.kt.after b/idea/testData/refactoring/introduceParameter/valueAtCallSiteMultipleUsages.kt.after new file mode 100644 index 00000000000..59d2566ab1b --- /dev/null +++ b/idea/testData/refactoring/introduceParameter/valueAtCallSiteMultipleUsages.kt.after @@ -0,0 +1,9 @@ +// WITH_DEFAULT_VALUE: false +fun foo(i: Int): Int { + val b = i * 2 + return i +} + +fun test() { + foo(a + 1) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractJetExtractionTest.kt b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractJetExtractionTest.kt index 7dd4948eca4..230a225268e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractJetExtractionTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractJetExtractionTest.kt @@ -70,8 +70,10 @@ public abstract class AbstractJetExtractionTest() : JetLightCodeInsightFixtureTe override fun configure(descriptor: IntroduceParameterDescriptor): IntroduceParameterDescriptor { val fileText = file.getText() val singleReplace = InTextDirectivesUtils.isDirectiveDefined(fileText, "// SINGLE_REPLACE") + val withDefaultValue = InTextDirectivesUtils.getPrefixedBoolean(fileText, "// WITH_DEFAULT_VALUE:") ?: true return with (descriptor) { - copy(occurrencesToReplace = if (singleReplace) Collections.singletonList(originalOccurrence) else occurrencesToReplace) + copy(occurrencesToReplace = if (singleReplace) Collections.singletonList(originalOccurrence) else occurrencesToReplace, + withDefaultValue = withDefaultValue) } } } diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java index f9ebafffc4f..1ebc6c2daa2 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java @@ -2322,5 +2322,17 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/secondaryConstructorWithDefaultValue.kt"); doIntroduceParameterTest(fileName); } + + @TestMetadata("valueAtCallSite.kt") + public void testValueAtCallSite() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/valueAtCallSite.kt"); + doIntroduceParameterTest(fileName); + } + + @TestMetadata("valueAtCallSiteMultipleUsages.kt") + public void testValueAtCallSiteMultipleUsages() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceParameter/valueAtCallSiteMultipleUsages.kt"); + doIntroduceParameterTest(fileName); + } } }