diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/safeDelete/KotlinJavaSafeDeleteDelegate.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/safeDelete/KotlinJavaSafeDeleteDelegate.kt index 3a5b8777761..1184d98c3a6 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/safeDelete/KotlinJavaSafeDeleteDelegate.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/safeDelete/KotlinJavaSafeDeleteDelegate.kt @@ -43,15 +43,6 @@ public class KotlinJavaSafeDeleteDelegate : JavaSafeDeleteDelegate { val element = reference.getElement() as JetElement - val originalDeclaration = method.unwrapped - if (originalDeclaration !is PsiMethod && originalDeclaration !is JetDeclaration) return - - val originalParameter = parameter.unwrapped - if (originalParameter == null) return - - val parameterIndex = originalParameter.parameterIndex() - if (parameterIndex < 0) return - val callExpression = element.getParentByType(javaClass()) if (callExpression == null) return @@ -63,17 +54,33 @@ public class KotlinJavaSafeDeleteDelegate : JavaSafeDeleteDelegate { val descriptor = bindingContext.get(BindingContext.REFERENCE_TARGET, calleeExpression) if (descriptor == null) return - if (originalDeclaration == BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor)) { - val args = callExpression.getValueArguments() - val argCount = args.size() - if (parameterIndex < argCount) { - usages.add(SafeDeleteValueArgumentListUsageInfo((args.get(parameterIndex) as JetValueArgument), parameter)) - } else { - val lambdaArgs = callExpression.getFunctionLiteralArguments() - val lambdaIndex = parameterIndex - argCount - if (lambdaIndex < lambdaArgs.size()) { - usages.add(SafeDeleteReferenceSimpleDeleteUsageInfo(lambdaArgs.get(lambdaIndex), parameter, true)) - } + val originalDeclaration = method.unwrapped + if (originalDeclaration !is PsiMethod && originalDeclaration !is JetDeclaration) return + + if (originalDeclaration != BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor)) return + + val args = callExpression.getValueArguments() + + val namedArguments = args.filter { arg -> arg is JetValueArgument && arg.getArgumentName()?.getText() == parameter.getName() } + if (!namedArguments.empty) { + usages.add(SafeDeleteValueArgumentListUsageInfo(namedArguments.first as JetValueArgument, parameter)) + return + } + + val originalParameter = parameter.unwrapped + if (originalParameter == null) return + + val parameterIndex = originalParameter.parameterIndex() + if (parameterIndex < 0) return + + val argCount = args.size() + if (parameterIndex < argCount) { + usages.add(SafeDeleteValueArgumentListUsageInfo((args.get(parameterIndex) as JetValueArgument), parameter)) + } else { + val lambdaArgs = callExpression.getFunctionLiteralArguments() + val lambdaIndex = parameterIndex - argCount + if (lambdaIndex < lambdaArgs.size()) { + usages.add(SafeDeleteReferenceSimpleDeleteUsageInfo(lambdaArgs.get(lambdaIndex), parameter, true)) } } } diff --git a/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/defaultParam1.kt b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/defaultParam1.kt new file mode 100644 index 00000000000..b15c37eda68 --- /dev/null +++ b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/defaultParam1.kt @@ -0,0 +1,7 @@ +fun foo(a: Int, b: Int = 0) { + +} + +fun bar() { + foo(1) +} \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/defaultParam1.kt.after b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/defaultParam1.kt.after new file mode 100644 index 00000000000..c2bf25e651a --- /dev/null +++ b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/defaultParam1.kt.after @@ -0,0 +1,7 @@ +fun foo(a: Int) { + +} + +fun bar() { + foo(1) +} \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/defaultParam2.kt b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/defaultParam2.kt new file mode 100644 index 00000000000..b8cada6dd38 --- /dev/null +++ b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/defaultParam2.kt @@ -0,0 +1,7 @@ +fun foo(a: Int, b: Int = 0, c: Int = 0) { + +} + +fun bar() { + foo(1) +} \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/defaultParam2.kt.after b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/defaultParam2.kt.after new file mode 100644 index 00000000000..bb0da66a66e --- /dev/null +++ b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/defaultParam2.kt.after @@ -0,0 +1,7 @@ +fun foo(a: Int, b: Int = 0) { + +} + +fun bar() { + foo(1) +} \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/extNamedParam1.kt b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/extNamedParam1.kt new file mode 100644 index 00000000000..bf813b48747 --- /dev/null +++ b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/extNamedParam1.kt @@ -0,0 +1,7 @@ +fun Int.foo(a: Int, b: Int) { + +} + +fun bar() { + 10.foo(a = 1, b = 2) +} \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/extNamedParam1.kt.after b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/extNamedParam1.kt.after new file mode 100644 index 00000000000..5c80fee5ce8 --- /dev/null +++ b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/extNamedParam1.kt.after @@ -0,0 +1,7 @@ +fun Int.foo(b: Int) { + +} + +fun bar() { + 10.foo(b = 2) +} \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/extNamedParam2.kt b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/extNamedParam2.kt new file mode 100644 index 00000000000..a91408e83ea --- /dev/null +++ b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/extNamedParam2.kt @@ -0,0 +1,7 @@ +fun Int.foo(a: Int, b: Int) { + +} + +fun bar() { + 10.foo(b = 1, a = 2) +} \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/extNamedParam2.kt.after b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/extNamedParam2.kt.after new file mode 100644 index 00000000000..6511884c06d --- /dev/null +++ b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/extNamedParam2.kt.after @@ -0,0 +1,7 @@ +fun Int.foo(b: Int) { + +} + +fun bar() { + 10.foo(b = 1) +} \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/namedParam1.kt b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/namedParam1.kt new file mode 100644 index 00000000000..2225f0403cb --- /dev/null +++ b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/namedParam1.kt @@ -0,0 +1,7 @@ +fun foo(a: Int, b: Int) { + +} + +fun bar() { + foo(a = 1, b = 2) +} \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/namedParam1.kt.after b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/namedParam1.kt.after new file mode 100644 index 00000000000..869d22870b7 --- /dev/null +++ b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/namedParam1.kt.after @@ -0,0 +1,7 @@ +fun foo(b: Int) { + +} + +fun bar() { + foo(b = 2) +} \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/namedParam2.kt b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/namedParam2.kt new file mode 100644 index 00000000000..607cfefb1d0 --- /dev/null +++ b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/namedParam2.kt @@ -0,0 +1,7 @@ +fun foo(a: Int, b: Int) { + +} + +fun bar() { + foo(b = 1, a = 2) +} \ No newline at end of file diff --git a/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/namedParam2.kt.after b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/namedParam2.kt.after new file mode 100644 index 00000000000..7866025844e --- /dev/null +++ b/idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/namedParam2.kt.after @@ -0,0 +1,7 @@ +fun foo(b: Int) { + +} + +fun bar() { + foo(b = 1) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/safeDelete/JetSafeDeleteTestGenerated.java b/idea/tests/org/jetbrains/jet/safeDelete/JetSafeDeleteTestGenerated.java index a36229483d5..b7957758206 100644 --- a/idea/tests/org/jetbrains/jet/safeDelete/JetSafeDeleteTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/safeDelete/JetSafeDeleteTestGenerated.java @@ -723,6 +723,26 @@ public class JetSafeDeleteTestGenerated extends AbstractJetSafeDeleteTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter"), Pattern.compile("^(.+)\\.kt$"), true); } + @TestMetadata("defaultParam1.kt") + public void testDefaultParam1() throws Exception { + doValueParameterTest("idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/defaultParam1.kt"); + } + + @TestMetadata("defaultParam2.kt") + public void testDefaultParam2() throws Exception { + doValueParameterTest("idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/defaultParam2.kt"); + } + + @TestMetadata("extNamedParam1.kt") + public void testExtNamedParam1() throws Exception { + doValueParameterTest("idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/extNamedParam1.kt"); + } + + @TestMetadata("extNamedParam2.kt") + public void testExtNamedParam2() throws Exception { + doValueParameterTest("idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/extNamedParam2.kt"); + } + @TestMetadata("hierarchyWithSafeUsages1.kt") public void testHierarchyWithSafeUsages1() throws Exception { doValueParameterTest("idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/hierarchyWithSafeUsages1.kt"); @@ -808,6 +828,16 @@ public class JetSafeDeleteTestGenerated extends AbstractJetSafeDeleteTest { doValueParameterTest("idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/lambdaArgExt.kt"); } + @TestMetadata("namedParam1.kt") + public void testNamedParam1() throws Exception { + doValueParameterTest("idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/namedParam1.kt"); + } + + @TestMetadata("namedParam2.kt") + public void testNamedParam2() throws Exception { + doValueParameterTest("idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/namedParam2.kt"); + } + @TestMetadata("propertyParam1.kt") public void testPropertyParam1() throws Exception { doValueParameterTest("idea/testData/safeDelete/deleteValueParameter/kotlinValueParameter/propertyParam1.kt");