Safe Delete: Add support of default and by-name parameters

This commit is contained in:
Alexey Sedunov
2014-01-29 14:49:06 +04:00
parent 775baf1faf
commit fbb1c2921b
14 changed files with 141 additions and 20 deletions
@@ -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<JetCallExpression>())
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))
}
}
}
@@ -0,0 +1,7 @@
fun foo(a: Int, <caret>b: Int = 0) {
}
fun bar() {
foo(1)
}
@@ -0,0 +1,7 @@
fun foo(a: Int) {
}
fun bar() {
foo(1)
}
@@ -0,0 +1,7 @@
fun foo(a: Int, b: Int = 0, <caret>c: Int = 0) {
}
fun bar() {
foo(1)
}
@@ -0,0 +1,7 @@
fun foo(a: Int, b: Int = 0) {
}
fun bar() {
foo(1)
}
@@ -0,0 +1,7 @@
fun Int.foo(<caret>a: Int, b: Int) {
}
fun bar() {
10.foo(a = 1, b = 2)
}
@@ -0,0 +1,7 @@
fun Int.foo(b: Int) {
}
fun bar() {
10.foo(b = 2)
}
@@ -0,0 +1,7 @@
fun Int.foo(<caret>a: Int, b: Int) {
}
fun bar() {
10.foo(b = 1, a = 2)
}
@@ -0,0 +1,7 @@
fun Int.foo(b: Int) {
}
fun bar() {
10.foo(b = 1)
}
@@ -0,0 +1,7 @@
fun foo(<caret>a: Int, b: Int) {
}
fun bar() {
foo(a = 1, b = 2)
}
@@ -0,0 +1,7 @@
fun foo(b: Int) {
}
fun bar() {
foo(b = 2)
}
@@ -0,0 +1,7 @@
fun foo(<caret>a: Int, b: Int) {
}
fun bar() {
foo(b = 1, a = 2)
}
@@ -0,0 +1,7 @@
fun foo(b: Int) {
}
fun bar() {
foo(b = 1)
}
@@ -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");