DeprecatedSymbolUsageFix: can drop more arguments when function literal argument exist
This commit is contained in:
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.psi.psiUtil.copied
|
|||||||
import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType
|
import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.calls.callUtil.getParameterForArgument
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getParameterForArgument
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.callUtil.getValueArgumentsInParentheses
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ExpressionValueArgument
|
import org.jetbrains.kotlin.resolve.calls.model.ExpressionValueArgument
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
@@ -50,11 +51,10 @@ public object OptionalParametersHelper {
|
|||||||
.toMap()
|
.toMap()
|
||||||
if (parameterToDefaultValue.isEmpty()) return emptyList()
|
if (parameterToDefaultValue.isEmpty()) return emptyList()
|
||||||
|
|
||||||
val arguments = resolvedCall.getCall().getValueArguments()
|
//TODO: drop functional literal out of parenthesis too
|
||||||
|
|
||||||
|
val arguments = resolvedCall.getCall().getValueArgumentsInParentheses()
|
||||||
val argumentsToDrop = ArrayList<ValueArgument>()
|
val argumentsToDrop = ArrayList<ValueArgument>()
|
||||||
|
|
||||||
//TODO: can drop arguments leaving last functional literal one (outside of parenthesis)
|
|
||||||
|
|
||||||
for (argument in arguments.reverse()) {
|
for (argument in arguments.reverse()) {
|
||||||
if (!canDrop(argument) || !argument.matchesDefault(resolvedCall, parameterToDefaultValue)) {
|
if (!canDrop(argument) || !argument.matchesDefault(resolvedCall, parameterToDefaultValue)) {
|
||||||
if (!argument.isNamed()) break else continue // for a named argument we can try to drop arguments before it as well
|
if (!argument.isNamed()) break else continue // for a named argument we can try to drop arguments before it as well
|
||||||
|
|||||||
@@ -230,6 +230,9 @@ public abstract class DeprecatedSymbolUsageFixBase(
|
|||||||
// TODO: process introduced variables too
|
// TODO: process introduced variables too
|
||||||
introduceNamedArguments(result)
|
introduceNamedArguments(result)
|
||||||
|
|
||||||
|
// TODO: process introduced variables too
|
||||||
|
restoreFunctionLiteralArguments(result)
|
||||||
|
|
||||||
//TODO: do this earlier
|
//TODO: do this earlier
|
||||||
dropArgumentsForDefaultValues(result)
|
dropArgumentsForDefaultValues(result)
|
||||||
|
|
||||||
@@ -250,9 +253,6 @@ public abstract class DeprecatedSymbolUsageFixBase(
|
|||||||
// TODO: process introduced variables too
|
// TODO: process introduced variables too
|
||||||
simplifySpreadArrayOfArguments(result)
|
simplifySpreadArrayOfArguments(result)
|
||||||
|
|
||||||
// TODO: process introduced variables too
|
|
||||||
restoreFunctionLiteralArguments(result)
|
|
||||||
|
|
||||||
// clean up user data
|
// clean up user data
|
||||||
//TODO: not correct - we do not process introduced declarations before!!!
|
//TODO: not correct - we do not process introduced declarations before!!!
|
||||||
result.forEachDescendantOfType<JetExpression> {
|
result.forEachDescendantOfType<JetExpression> {
|
||||||
@@ -541,6 +541,12 @@ public abstract class DeprecatedSymbolUsageFixBase(
|
|||||||
argument as JetValueArgument
|
argument as JetValueArgument
|
||||||
val argumentList = argument.getParent() as JetValueArgumentList
|
val argumentList = argument.getParent() as JetValueArgumentList
|
||||||
argumentList.removeArgument(argument)
|
argumentList.removeArgument(argument)
|
||||||
|
if (argumentList.getArguments().isEmpty()) {
|
||||||
|
val callExpression = argumentList.getParent() as JetCallExpression
|
||||||
|
if (callExpression.getFunctionLiteralArguments().isNotEmpty()) {
|
||||||
|
argumentList.delete()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
// "Replace with 'newFun(p1, p2)'" "true"
|
||||||
|
|
||||||
|
interface I {
|
||||||
|
@deprecated("", ReplaceWith("newFun(p1, p2)"))
|
||||||
|
fun oldFun(p1: String = "", p2: Int = 0)
|
||||||
|
|
||||||
|
fun newFun(p1: String = "", p2: Int = 0, p3: Int = -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(i: I) {
|
||||||
|
i.<caret>oldFun()
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
// "Replace with 'newFun(p1, p2)'" "true"
|
||||||
|
|
||||||
|
interface I {
|
||||||
|
@deprecated("", ReplaceWith("newFun(p1, p2)"))
|
||||||
|
fun oldFun(p1: String = "", p2: Int = 0)
|
||||||
|
|
||||||
|
fun newFun(p1: String = "", p2: Int = 0, p3: Int = -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(i: I) {
|
||||||
|
i.<caret>newFun()
|
||||||
|
}
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
// "Replace with 'newFun(p2, p1, handler)'" "true"
|
||||||
|
|
||||||
|
interface I {
|
||||||
|
@deprecated("", ReplaceWith("newFun(p2, p1, handler)"))
|
||||||
|
fun oldFun(p1: String = "", p2: Int = 0, handler: () -> Unit)
|
||||||
|
|
||||||
|
fun newFun(a: Int = 0, b: String = "", handler: () -> Unit)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(i: I) {
|
||||||
|
i.<caret>oldFun { }
|
||||||
|
}
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
// "Replace with 'newFun(p2, p1, handler)'" "true"
|
||||||
|
|
||||||
|
interface I {
|
||||||
|
@deprecated("", ReplaceWith("newFun(p2, p1, handler)"))
|
||||||
|
fun oldFun(p1: String = "", p2: Int = 0, handler: () -> Unit)
|
||||||
|
|
||||||
|
fun newFun(a: Int = 0, b: String = "", handler: () -> Unit)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(i: I) {
|
||||||
|
i.<caret>newFun { }
|
||||||
|
}
|
||||||
@@ -3219,6 +3219,18 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
|
|||||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/deprecatedSymbolUsage/optionalParameters"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true);
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/deprecatedSymbolUsage/optionalParameters"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("dropAll.kt")
|
||||||
|
public void testDropAll() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/deprecatedSymbolUsage/optionalParameters/dropAll.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("functionalLiteralArgument.kt")
|
||||||
|
public void testFunctionalLiteralArgument() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/deprecatedSymbolUsage/optionalParameters/functionalLiteralArgument.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("namedArgument.kt")
|
@TestMetadata("namedArgument.kt")
|
||||||
public void testNamedArgument() throws Exception {
|
public void testNamedArgument() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/deprecatedSymbolUsage/optionalParameters/namedArgument.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/deprecatedSymbolUsage/optionalParameters/namedArgument.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user