From 46ad1b8573a4885a6a7c683b290fa7f71e4968d6 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 23 Jun 2015 21:32:20 +0300 Subject: [PATCH] "Remove argument name" intention --- .../after.kt.template | 1 + .../before.kt.template | 1 + .../description.html | 5 ++ idea/src/META-INF/plugin.xml | 5 ++ .../intentions/RemoveArgumentNameIntention.kt | 54 ++++++++++++++++ .../intentions/removeArgumentName/.intention | 1 + .../removeArgumentName/namedArgumentBefore.kt | 6 ++ .../removeArgumentName/noExpression.kt | 6 ++ .../removeArgumentName/notInPosition.kt | 6 ++ .../removeArgumentName/notInRange.kt | 6 ++ .../intentions/removeArgumentName/notNamed.kt | 6 ++ .../removeArgumentName/notResolved.kt | 5 ++ .../intentions/removeArgumentName/range.kt | 5 ++ .../removeArgumentName/range.kt.after | 5 ++ .../intentions/removeArgumentName/simple.kt | 5 ++ .../removeArgumentName/simple.kt.after | 5 ++ .../intentions/removeArgumentName/star.kt | 5 ++ .../removeArgumentName/star.kt.after | 5 ++ .../intentions/IntentionTestGenerated.java | 63 +++++++++++++++++++ 19 files changed, 195 insertions(+) create mode 100644 idea/resources/intentionDescriptions/RemoveArgumentNameIntention/after.kt.template create mode 100644 idea/resources/intentionDescriptions/RemoveArgumentNameIntention/before.kt.template create mode 100644 idea/resources/intentionDescriptions/RemoveArgumentNameIntention/description.html create mode 100644 idea/src/org/jetbrains/kotlin/idea/intentions/RemoveArgumentNameIntention.kt create mode 100644 idea/testData/intentions/removeArgumentName/.intention create mode 100644 idea/testData/intentions/removeArgumentName/namedArgumentBefore.kt create mode 100644 idea/testData/intentions/removeArgumentName/noExpression.kt create mode 100644 idea/testData/intentions/removeArgumentName/notInPosition.kt create mode 100644 idea/testData/intentions/removeArgumentName/notInRange.kt create mode 100644 idea/testData/intentions/removeArgumentName/notNamed.kt create mode 100644 idea/testData/intentions/removeArgumentName/notResolved.kt create mode 100644 idea/testData/intentions/removeArgumentName/range.kt create mode 100644 idea/testData/intentions/removeArgumentName/range.kt.after create mode 100644 idea/testData/intentions/removeArgumentName/simple.kt create mode 100644 idea/testData/intentions/removeArgumentName/simple.kt.after create mode 100644 idea/testData/intentions/removeArgumentName/star.kt create mode 100644 idea/testData/intentions/removeArgumentName/star.kt.after 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)