From 2d4055e92188955597c53e48f941435be862d500 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 25 Mar 2015 20:35:34 +0300 Subject: [PATCH] J2K: generating of elvis operators instead of if's --- .../intentions/IfThenToElvisIntention.kt | 8 ++++++-- .../kotlin/idea/j2k/J2kPostProcessor.kt | 18 +++++++++++++++--- .../codeSimplifications/IfToElvis.java | 5 +++++ .../codeSimplifications/IfToElvis.kt | 5 +++++ ...KotlinConverterForWebDemoTestGenerated.java | 6 ++++++ ...KotlinConverterSingleFileTestGenerated.java | 6 ++++++ 6 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 j2k/testData/fileOrElement/codeSimplifications/IfToElvis.java create mode 100644 j2k/testData/fileOrElement/codeSimplifications/IfToElvis.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/intentions/IfThenToElvisIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/intentions/IfThenToElvisIntention.kt index 4d1094650c7..505e94aeffa 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/intentions/IfThenToElvisIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/intentions/IfThenToElvisIntention.kt @@ -60,6 +60,11 @@ public class IfThenToElvisIntention : JetSelfTargetingIntention } override fun applyTo(element: JetIfExpression, editor: Editor) { + val elvis = applyTo(element) + elvis.inlineLeftSideIfApplicableWithPrompt(editor) + } + + public fun applyTo(element: JetIfExpression): JetBinaryExpression { val condition = element.getCondition() as JetBinaryExpression val thenClause = checkNotNull(element.getThen(), "The then clause cannot be null") @@ -80,7 +85,6 @@ public class IfThenToElvisIntention : JetSelfTargetingIntention assert(resultingExpression is JetBinaryExpression, "Unexpected expression type: ${resultingExpression?.javaClass}, expected JetBinaryExpression, element = '${element.getText()}'") - val elvis = resultingExpression as JetBinaryExpression - elvis.inlineLeftSideIfApplicableWithPrompt(editor) + return resultingExpression as JetBinaryExpression } } diff --git a/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt index e395178be5e..8bf4ed3a671 100644 --- a/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult import org.jetbrains.kotlin.idea.intentions.RemoveExplicitTypeArguments import org.jetbrains.kotlin.idea.intentions.SimplifyNegatedBinaryExpressionIntention +import org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions.IfThenToElvisIntention import org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions.IfThenToSafeAccessIntention import org.jetbrains.kotlin.idea.quickfix.RemoveRightPartOfBinaryExpressionFix import org.jetbrains.kotlin.j2k.PostProcessor @@ -69,9 +70,20 @@ public class J2kPostProcessor(override val contextToAnalyzeIn: PsiElement) : Pos override fun visitIfExpression(expression: JetIfExpression) { super.visitIfExpression(expression) - val intention = IfThenToSafeAccessIntention() - if (intention.isApplicableTo(expression)) { - intention.applyTo(expression) + run { + val intention = IfThenToSafeAccessIntention() + if (intention.isApplicableTo(expression)) { + intention.applyTo(expression) + return + } + } + + run { + val intention = IfThenToElvisIntention() + if (intention.isApplicableTo(expression)) { + intention.applyTo(expression) + return + } } } }) diff --git a/j2k/testData/fileOrElement/codeSimplifications/IfToElvis.java b/j2k/testData/fileOrElement/codeSimplifications/IfToElvis.java new file mode 100644 index 00000000000..9fd7ee5d6a3 --- /dev/null +++ b/j2k/testData/fileOrElement/codeSimplifications/IfToElvis.java @@ -0,0 +1,5 @@ +class C { + String foo(String s) { + return s != null ? s : ""; + } +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/codeSimplifications/IfToElvis.kt b/j2k/testData/fileOrElement/codeSimplifications/IfToElvis.kt new file mode 100644 index 00000000000..5472b8dc6fb --- /dev/null +++ b/j2k/testData/fileOrElement/codeSimplifications/IfToElvis.kt @@ -0,0 +1,5 @@ +class C { + fun foo(s: String?): String { + return s ?: "" + } +} diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java index bfaf0335095..40866525c98 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -982,6 +982,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/codeSimplifications"), Pattern.compile("^(.+)\\.java$"), true); } + @TestMetadata("IfToElvis.java") + public void testIfToElvis() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/IfToElvis.java"); + doTest(fileName); + } + @TestMetadata("IfToSafeCall.java") public void testIfToSafeCall() throws Exception { String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/IfToSafeCall.java"); diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index 2933f178107..2ef7638e339 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -982,6 +982,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/codeSimplifications"), Pattern.compile("^(.+)\\.java$"), true); } + @TestMetadata("IfToElvis.java") + public void testIfToElvis() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/IfToElvis.java"); + doTest(fileName); + } + @TestMetadata("IfToSafeCall.java") public void testIfToSafeCall() throws Exception { String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/IfToSafeCall.java");