diff --git a/idea/resources/intentionDescriptions/RemoveArgumentNameIntention/after.kt.template b/idea/resources/intentionDescriptions/RemoveArgumentNameIntention/after.kt.template
new file mode 100644
index 00000000000..0db4c3c434f
--- /dev/null
+++ b/idea/resources/intentionDescriptions/RemoveArgumentNameIntention/after.kt.template
@@ -0,0 +1 @@
+list.joinToString("\n")
\ No newline at end of file
diff --git a/idea/resources/intentionDescriptions/RemoveArgumentNameIntention/before.kt.template b/idea/resources/intentionDescriptions/RemoveArgumentNameIntention/before.kt.template
new file mode 100644
index 00000000000..849c0707e19
--- /dev/null
+++ b/idea/resources/intentionDescriptions/RemoveArgumentNameIntention/before.kt.template
@@ -0,0 +1 @@
+list.joinToString(separator = "\n")
\ No newline at end of file
diff --git a/idea/resources/intentionDescriptions/RemoveArgumentNameIntention/description.html b/idea/resources/intentionDescriptions/RemoveArgumentNameIntention/description.html
new file mode 100644
index 00000000000..029122296c5
--- /dev/null
+++ b/idea/resources/intentionDescriptions/RemoveArgumentNameIntention/description.html
@@ -0,0 +1,5 @@
+
+
+This intention removes name from a named argument to use positional argument syntax.
+
+
\ No newline at end of file
diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml
index 79124537eaf..24fa29733d3 100644
--- a/idea/src/META-INF/plugin.xml
+++ b/idea/src/META-INF/plugin.xml
@@ -928,6 +928,11 @@
Kotlin
+
+ org.jetbrains.kotlin.idea.intentions.RemoveArgumentNameIntention
+ Kotlin
+
+
(javaClass(), "Remove argument name") {
+
+ override fun applicabilityRange(element: JetValueArgument): TextRange? {
+ if (!element.isNamed()) return null
+
+ val argumentList = element.getParent() as? JetValueArgumentList ?: return null
+ val arguments = argumentList.getArguments()
+ if (arguments.takeWhile { it != element }.any { it.isNamed() }) return null
+
+ val callExpr = argumentList.getParent() as? JetExpression ?: return null
+ val resolvedCall = callExpr.getResolvedCall(callExpr.analyze(BodyResolveMode.PARTIAL)) ?: return null
+ val argumentMatch = resolvedCall.getArgumentMapping(element) as? ArgumentMatch ?: return null
+ if (argumentMatch.valueParameter.getIndex() != arguments.indexOf(element)) return null
+
+ val expression = element.getArgumentExpression() ?: return null
+ return TextRange(element.startOffset, expression.startOffset)
+ }
+
+ override fun applyTo(element: JetValueArgument, editor: Editor) {
+ val newArgument = JetPsiFactory(element).createArgument(element.getArgumentExpression()!!, null, element.getSpreadElement() != null)
+ element.replace(newArgument)
+ }
+}
\ No newline at end of file
diff --git a/idea/testData/intentions/removeArgumentName/.intention b/idea/testData/intentions/removeArgumentName/.intention
new file mode 100644
index 00000000000..1429e611d68
--- /dev/null
+++ b/idea/testData/intentions/removeArgumentName/.intention
@@ -0,0 +1 @@
+org.jetbrains.kotlin.idea.intentions.RemoveArgumentNameIntention
diff --git a/idea/testData/intentions/removeArgumentName/namedArgumentBefore.kt b/idea/testData/intentions/removeArgumentName/namedArgumentBefore.kt
new file mode 100644
index 00000000000..62a354eeb57
--- /dev/null
+++ b/idea/testData/intentions/removeArgumentName/namedArgumentBefore.kt
@@ -0,0 +1,6 @@
+// IS_APPLICABLE: false
+fun foo(s: String, b: Boolean){}
+
+fun bar() {
+ foo(s = "", b = true)
+}
\ No newline at end of file
diff --git a/idea/testData/intentions/removeArgumentName/noExpression.kt b/idea/testData/intentions/removeArgumentName/noExpression.kt
new file mode 100644
index 00000000000..b83b8ae0edf
--- /dev/null
+++ b/idea/testData/intentions/removeArgumentName/noExpression.kt
@@ -0,0 +1,6 @@
+// IS_APPLICABLE: false
+fun foo(s: String, b: Boolean){}
+
+fun bar() {
+ foo("", b = )
+}
\ No newline at end of file
diff --git a/idea/testData/intentions/removeArgumentName/notInPosition.kt b/idea/testData/intentions/removeArgumentName/notInPosition.kt
new file mode 100644
index 00000000000..f7f924bef4f
--- /dev/null
+++ b/idea/testData/intentions/removeArgumentName/notInPosition.kt
@@ -0,0 +1,6 @@
+// IS_APPLICABLE: false
+fun foo(s: String = "", b: Boolean){}
+
+fun bar() {
+ foo(b = true)
+}
\ No newline at end of file
diff --git a/idea/testData/intentions/removeArgumentName/notInRange.kt b/idea/testData/intentions/removeArgumentName/notInRange.kt
new file mode 100644
index 00000000000..5dab1adf118
--- /dev/null
+++ b/idea/testData/intentions/removeArgumentName/notInRange.kt
@@ -0,0 +1,6 @@
+// IS_APPLICABLE: false
+fun foo(s: String, b: Boolean){}
+
+fun bar() {
+ foo("", b = true)
+}
\ No newline at end of file
diff --git a/idea/testData/intentions/removeArgumentName/notNamed.kt b/idea/testData/intentions/removeArgumentName/notNamed.kt
new file mode 100644
index 00000000000..d177faabc50
--- /dev/null
+++ b/idea/testData/intentions/removeArgumentName/notNamed.kt
@@ -0,0 +1,6 @@
+// IS_APPLICABLE: false
+fun foo(s: String, b: Boolean){}
+
+fun bar() {
+ foo("", true)
+}
\ No newline at end of file
diff --git a/idea/testData/intentions/removeArgumentName/notResolved.kt b/idea/testData/intentions/removeArgumentName/notResolved.kt
new file mode 100644
index 00000000000..5684eab7e2b
--- /dev/null
+++ b/idea/testData/intentions/removeArgumentName/notResolved.kt
@@ -0,0 +1,5 @@
+// IS_APPLICABLE: false
+// ERROR: Unresolved reference: foo
+fun bar() {
+ foo(b = true)
+}
\ No newline at end of file
diff --git a/idea/testData/intentions/removeArgumentName/range.kt b/idea/testData/intentions/removeArgumentName/range.kt
new file mode 100644
index 00000000000..ca028a6b4b1
--- /dev/null
+++ b/idea/testData/intentions/removeArgumentName/range.kt
@@ -0,0 +1,5 @@
+fun foo(s: String, b: Boolean){}
+
+fun bar() {
+ foo("", b = true)
+}
\ No newline at end of file
diff --git a/idea/testData/intentions/removeArgumentName/range.kt.after b/idea/testData/intentions/removeArgumentName/range.kt.after
new file mode 100644
index 00000000000..2ef0b53307b
--- /dev/null
+++ b/idea/testData/intentions/removeArgumentName/range.kt.after
@@ -0,0 +1,5 @@
+fun foo(s: String, b: Boolean){}
+
+fun bar() {
+ foo("", true)
+}
\ No newline at end of file
diff --git a/idea/testData/intentions/removeArgumentName/simple.kt b/idea/testData/intentions/removeArgumentName/simple.kt
new file mode 100644
index 00000000000..23629b80a25
--- /dev/null
+++ b/idea/testData/intentions/removeArgumentName/simple.kt
@@ -0,0 +1,5 @@
+fun foo(s: String, b: Boolean){}
+
+fun bar() {
+ foo("", b = true)
+}
\ No newline at end of file
diff --git a/idea/testData/intentions/removeArgumentName/simple.kt.after b/idea/testData/intentions/removeArgumentName/simple.kt.after
new file mode 100644
index 00000000000..2ef0b53307b
--- /dev/null
+++ b/idea/testData/intentions/removeArgumentName/simple.kt.after
@@ -0,0 +1,5 @@
+fun foo(s: String, b: Boolean){}
+
+fun bar() {
+ foo("", true)
+}
\ No newline at end of file
diff --git a/idea/testData/intentions/removeArgumentName/star.kt b/idea/testData/intentions/removeArgumentName/star.kt
new file mode 100644
index 00000000000..823cb27db63
--- /dev/null
+++ b/idea/testData/intentions/removeArgumentName/star.kt
@@ -0,0 +1,5 @@
+fun foo(vararg s: String){}
+
+fun bar(array: Array) {
+ foo(s = *array)
+}
\ No newline at end of file
diff --git a/idea/testData/intentions/removeArgumentName/star.kt.after b/idea/testData/intentions/removeArgumentName/star.kt.after
new file mode 100644
index 00000000000..88e3158faa8
--- /dev/null
+++ b/idea/testData/intentions/removeArgumentName/star.kt.after
@@ -0,0 +1,5 @@
+fun foo(vararg s: String){}
+
+fun bar(array: Array) {
+ foo(*array)
+}
\ No newline at end of file
diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java
index e905b23ebbd..d9e5a4cbf84 100644
--- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java
+++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java
@@ -5605,6 +5605,69 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
}
}
+ @TestMetadata("idea/testData/intentions/removeArgumentName")
+ @TestDataPath("$PROJECT_ROOT")
+ @RunWith(JUnit3RunnerWithInners.class)
+ public static class RemoveArgumentName extends AbstractIntentionTest {
+ public void testAllFilesPresentInRemoveArgumentName() throws Exception {
+ JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/removeArgumentName"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true);
+ }
+
+ @TestMetadata("namedArgumentBefore.kt")
+ public void testNamedArgumentBefore() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/removeArgumentName/namedArgumentBefore.kt");
+ doTest(fileName);
+ }
+
+ @TestMetadata("noExpression.kt")
+ public void testNoExpression() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/removeArgumentName/noExpression.kt");
+ doTest(fileName);
+ }
+
+ @TestMetadata("notInPosition.kt")
+ public void testNotInPosition() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/removeArgumentName/notInPosition.kt");
+ doTest(fileName);
+ }
+
+ @TestMetadata("notInRange.kt")
+ public void testNotInRange() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/removeArgumentName/notInRange.kt");
+ doTest(fileName);
+ }
+
+ @TestMetadata("notNamed.kt")
+ public void testNotNamed() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/removeArgumentName/notNamed.kt");
+ doTest(fileName);
+ }
+
+ @TestMetadata("notResolved.kt")
+ public void testNotResolved() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/removeArgumentName/notResolved.kt");
+ doTest(fileName);
+ }
+
+ @TestMetadata("range.kt")
+ public void testRange() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/removeArgumentName/range.kt");
+ doTest(fileName);
+ }
+
+ @TestMetadata("simple.kt")
+ public void testSimple() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/removeArgumentName/simple.kt");
+ doTest(fileName);
+ }
+
+ @TestMetadata("star.kt")
+ public void testStar() throws Exception {
+ String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/removeArgumentName/star.kt");
+ doTest(fileName);
+ }
+ }
+
@TestMetadata("idea/testData/intentions/removeBraces")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)