Skip to content

Commit 0932cb4

Browse files
committed
J2K: auto-replacing of if's with safe access
1 parent 555ae1e commit 0932cb4

File tree

6 files changed

+44
-3
lines changed

6 files changed

+44
-3
lines changed

idea/src/org/jetbrains/kotlin/idea/intentions/branchedTransformations/intentions/IfThenToSafeAccessIntention.kt

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ public class IfThenToSafeAccessIntention : JetSelfTargetingIntention<JetIfExpres
5858
}
5959

6060
override fun applyTo(element: JetIfExpression, editor: Editor) {
61+
val safeAccessExpr = applyTo(element)
62+
safeAccessExpr.inlineReceiverIfApplicableWithPrompt(editor)
63+
}
64+
65+
public fun applyTo(element: JetIfExpression): JetSafeQualifiedExpression {
6166
val condition = element.getCondition() as JetBinaryExpression
6267
val receiverExpression = checkNotNull(condition.getNonNullExpression(), "The receiver expression cannot be null")
6368

@@ -79,8 +84,7 @@ public class IfThenToSafeAccessIntention : JetSelfTargetingIntention<JetIfExpres
7984
}
8085

8186
val resultingExprString = "${receiverExpression.getText()}?.${selectorExpression?.getText()}"
82-
val safeAccessExpr = element.replace(resultingExprString) as JetSafeQualifiedExpression
83-
safeAccessExpr.inlineReceiverIfApplicableWithPrompt(editor)
87+
return element.replace(resultingExprString) as JetSafeQualifiedExpression
8488
}
8589

8690
fun clauseContainsAppropriateDotQualifiedExpression(clause: JetExpression, receiverExpression: JetExpression): Boolean =

idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ import org.jetbrains.kotlin.diagnostics.Errors
2222
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult
2323
import org.jetbrains.kotlin.idea.intentions.RemoveExplicitTypeArguments
2424
import org.jetbrains.kotlin.idea.intentions.SimplifyNegatedBinaryExpressionIntention
25+
import org.jetbrains.kotlin.idea.intentions.branchedTransformations.intentions.IfThenToSafeAccessIntention
2526
import org.jetbrains.kotlin.idea.quickfix.RemoveRightPartOfBinaryExpressionFix
2627
import org.jetbrains.kotlin.j2k.PostProcessor
2728
import org.jetbrains.kotlin.psi.*
2829
import org.jetbrains.kotlin.resolve.BindingContext
29-
import org.jetbrains.kotlin.utils.printAndReturn
3030
import java.util.ArrayList
3131

3232
public class J2kPostProcessor(override val contextToAnalyzeIn: PsiElement) : PostProcessor {
@@ -65,6 +65,15 @@ public class J2kPostProcessor(override val contextToAnalyzeIn: PsiElement) : Pos
6565
intention.applyTo(expression)
6666
}
6767
}
68+
69+
override fun visitIfExpression(expression: JetIfExpression) {
70+
super.visitIfExpression(expression)
71+
72+
val intention = IfThenToSafeAccessIntention()
73+
if (intention.isApplicableTo(expression)) {
74+
intention.applyTo(expression)
75+
}
76+
}
6877
})
6978

7079
for (typeArgs in redundantTypeArgs) {
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import java.io.File;
2+
3+
class C {
4+
void foo(File file) {
5+
if (file != null) {
6+
file.delete();
7+
}
8+
}
9+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import java.io.File
2+
3+
class C {
4+
fun foo(file: File?) {
5+
file?.delete()
6+
}
7+
}

j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -982,6 +982,12 @@ public void testAllFilesPresentInCodeSimplifications() throws Exception {
982982
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/codeSimplifications"), Pattern.compile("^(.+)\\.java$"), true);
983983
}
984984

985+
@TestMetadata("IfToSafeCall.java")
986+
public void testIfToSafeCall() throws Exception {
987+
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/IfToSafeCall.java");
988+
doTest(fileName);
989+
}
990+
985991
@TestMetadata("NotIs.java")
986992
public void testNotIs() throws Exception {
987993
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/NotIs.java");

j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -982,6 +982,12 @@ public void testAllFilesPresentInCodeSimplifications() throws Exception {
982982
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/codeSimplifications"), Pattern.compile("^(.+)\\.java$"), true);
983983
}
984984

985+
@TestMetadata("IfToSafeCall.java")
986+
public void testIfToSafeCall() throws Exception {
987+
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/IfToSafeCall.java");
988+
doTest(fileName);
989+
}
990+
985991
@TestMetadata("NotIs.java")
986992
public void testNotIs() throws Exception {
987993
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/NotIs.java");

0 commit comments

Comments
 (0)