diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeFunctionSignatureFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeFunctionSignatureFix.kt index a4f48df9ebf..c4f5c1c73c3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeFunctionSignatureFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ChangeFunctionSignatureFix.kt @@ -37,9 +37,7 @@ import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinChangeSignatu 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.psi.KtCallElement -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.ValueArgument +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType import org.jetbrains.kotlin.resolve.calls.callUtil.getCall import org.jetbrains.kotlin.resolve.calls.callUtil.getType @@ -60,14 +58,16 @@ abstract class ChangeFunctionSignatureFix( } protected fun getNewArgumentName(argument: ValueArgument, validator: Function1): String { - val argumentName = argument.getArgumentName() - val expression = argument.getArgumentExpression() + val expression = KtPsiUtil.deparenthesize(argument.getArgumentExpression()) + val argumentName = argument.getArgumentName()?.asName?.asString() + ?: (expression as? KtNameReferenceExpression)?.getReferencedName()?.takeIf { it != "it" && it != "field" } return when { - argumentName != null -> KotlinNameSuggester.suggestNameByName(argumentName.asName.asString(), validator) + argumentName != null -> KotlinNameSuggester.suggestNameByName(argumentName, validator) expression != null -> { val bindingContext = expression.analyze(BodyResolveMode.PARTIAL) - if (expression.text == "it") { + val expressionText = expression.text + if (expressionText == "it" || expressionText == "field") { val type = expression.getType(bindingContext) if (type != null) { return KotlinNameSuggester.suggestNamesByType(type, validator, "param").first() diff --git a/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument.kt b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument.kt new file mode 100644 index 00000000000..0c25123363d --- /dev/null +++ b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument.kt @@ -0,0 +1,7 @@ +// "Add parameter to function 'foo'" "true" +// DISABLE-ERRORS +fun foo() {} + +fun test(isObject: Boolean) { + foo(isObject) +} \ No newline at end of file diff --git a/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument.kt.after b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument.kt.after new file mode 100644 index 00000000000..d8b08a69fb1 --- /dev/null +++ b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument.kt.after @@ -0,0 +1,7 @@ +// "Add parameter to function 'foo'" "true" +// DISABLE-ERRORS +fun foo(isObject: Boolean) {} + +fun test(isObject: Boolean) { + foo(isObject) +} \ No newline at end of file diff --git a/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument2.kt b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument2.kt new file mode 100644 index 00000000000..b3da5f2020f --- /dev/null +++ b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument2.kt @@ -0,0 +1,7 @@ +// "Add parameter to function 'bar'" "true" +// DISABLE-ERRORS +fun bar(isObject: Boolean) {} + +fun test(isObject: Boolean) { + bar(true, isObject) +} \ No newline at end of file diff --git a/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument2.kt.after b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument2.kt.after new file mode 100644 index 00000000000..1035828dd05 --- /dev/null +++ b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument2.kt.after @@ -0,0 +1,7 @@ +// "Add parameter to function 'bar'" "true" +// DISABLE-ERRORS +fun bar(isObject: Boolean, isObject1: Boolean) {} + +fun test(isObject: Boolean) { + bar(true, isObject) +} \ No newline at end of file diff --git a/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument3.kt b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument3.kt new file mode 100644 index 00000000000..83e3c4c50a4 --- /dev/null +++ b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument3.kt @@ -0,0 +1,7 @@ +// "Add parameter to function 'foo'" "true" +// DISABLE-ERRORS +fun foo() {} + +fun test(isObject: Boolean) { + foo((isObject)) +} \ No newline at end of file diff --git a/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument3.kt.after b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument3.kt.after new file mode 100644 index 00000000000..abf10b4f399 --- /dev/null +++ b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument3.kt.after @@ -0,0 +1,7 @@ +// "Add parameter to function 'foo'" "true" +// DISABLE-ERRORS +fun foo(isObject: Boolean) {} + +fun test(isObject: Boolean) { + foo((isObject)) +} \ No newline at end of file diff --git a/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument4.kt b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument4.kt new file mode 100644 index 00000000000..e5750dff29e --- /dev/null +++ b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument4.kt @@ -0,0 +1,12 @@ +// "Add parameter to function 'foo'" "true" +// DISABLE-ERRORS +fun foo() {} + +fun bar(f: (String) -> Unit) {} + +fun test() { + bar { + foo(it) + } +} + diff --git a/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument4.kt.after b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument4.kt.after new file mode 100644 index 00000000000..8c0f756790c --- /dev/null +++ b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument4.kt.after @@ -0,0 +1,12 @@ +// "Add parameter to function 'foo'" "true" +// DISABLE-ERRORS +fun foo(s: String) {} + +fun bar(f: (String) -> Unit) {} + +fun test() { + bar { + foo(it) + } +} + diff --git a/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument5.kt b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument5.kt new file mode 100644 index 00000000000..a13510ad9f1 --- /dev/null +++ b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument5.kt @@ -0,0 +1,11 @@ +// "Add parameter to function 'foo'" "true" +// DISABLE-ERRORS +fun foo() {} + +class Test { + val x: String = "" + get() { + foo(field) + return field + } +} \ No newline at end of file diff --git a/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument5.kt.after b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument5.kt.after new file mode 100644 index 00000000000..b45d7ea1357 --- /dev/null +++ b/idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument5.kt.after @@ -0,0 +1,11 @@ +// "Add parameter to function 'foo'" "true" +// DISABLE-ERRORS +fun foo(s: String) {} + +class Test { + val x: String = "" + get() { + foo(field) + return field + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index a6a57a9be60..8971048e6b1 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -2253,6 +2253,31 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/changeSignature/addFunctionParameterAndChangeTypes.kt"); } + @TestMetadata("addFunctionParameterForReferencedArgument.kt") + public void testAddFunctionParameterForReferencedArgument() throws Exception { + runTest("idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument.kt"); + } + + @TestMetadata("addFunctionParameterForReferencedArgument2.kt") + public void testAddFunctionParameterForReferencedArgument2() throws Exception { + runTest("idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument2.kt"); + } + + @TestMetadata("addFunctionParameterForReferencedArgument3.kt") + public void testAddFunctionParameterForReferencedArgument3() throws Exception { + runTest("idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument3.kt"); + } + + @TestMetadata("addFunctionParameterForReferencedArgument4.kt") + public void testAddFunctionParameterForReferencedArgument4() throws Exception { + runTest("idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument4.kt"); + } + + @TestMetadata("addFunctionParameterForReferencedArgument5.kt") + public void testAddFunctionParameterForReferencedArgument5() throws Exception { + runTest("idea/testData/quickfix/changeSignature/addFunctionParameterForReferencedArgument5.kt"); + } + @TestMetadata("addFunctionParameterForTypeMismatch1.kt") public void testAddFunctionParameterForTypeMismatch1() throws Exception { runTest("idea/testData/quickfix/changeSignature/addFunctionParameterForTypeMismatch1.kt");