J2K: auto-replacing of if's with safe access

This commit is contained in:
Valentin Kipyatkov
2015-03-25 20:14:34 +03:00
parent 555ae1ebd3
commit 0932cb4606
6 changed files with 44 additions and 3 deletions
@@ -58,6 +58,11 @@ public class IfThenToSafeAccessIntention : JetSelfTargetingIntention<JetIfExpres
}
override fun applyTo(element: JetIfExpression, editor: Editor) {
val safeAccessExpr = applyTo(element)
safeAccessExpr.inlineReceiverIfApplicableWithPrompt(editor)
}
public fun applyTo(element: JetIfExpression): JetSafeQualifiedExpression {
val condition = element.getCondition() as JetBinaryExpression
val receiverExpression = checkNotNull(condition.getNonNullExpression(), "The receiver expression cannot be null")
@@ -79,8 +84,7 @@ public class IfThenToSafeAccessIntention : JetSelfTargetingIntention<JetIfExpres
}
val resultingExprString = "${receiverExpression.getText()}?.${selectorExpression?.getText()}"
val safeAccessExpr = element.replace(resultingExprString) as JetSafeQualifiedExpression
safeAccessExpr.inlineReceiverIfApplicableWithPrompt(editor)
return element.replace(resultingExprString) as JetSafeQualifiedExpression
}
fun clauseContainsAppropriateDotQualifiedExpression(clause: JetExpression, receiverExpression: JetExpression): Boolean =
@@ -22,11 +22,11 @@ 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.IfThenToSafeAccessIntention
import org.jetbrains.kotlin.idea.quickfix.RemoveRightPartOfBinaryExpressionFix
import org.jetbrains.kotlin.j2k.PostProcessor
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.utils.printAndReturn
import java.util.ArrayList
public class J2kPostProcessor(override val contextToAnalyzeIn: PsiElement) : PostProcessor {
@@ -65,6 +65,15 @@ public class J2kPostProcessor(override val contextToAnalyzeIn: PsiElement) : Pos
intention.applyTo(expression)
}
}
override fun visitIfExpression(expression: JetIfExpression) {
super.visitIfExpression(expression)
val intention = IfThenToSafeAccessIntention()
if (intention.isApplicableTo(expression)) {
intention.applyTo(expression)
}
}
})
for (typeArgs in redundantTypeArgs) {
@@ -0,0 +1,9 @@
import java.io.File;
class C {
void foo(File file) {
if (file != null) {
file.delete();
}
}
}
@@ -0,0 +1,7 @@
import java.io.File
class C {
fun foo(file: File?) {
file?.delete()
}
}
@@ -982,6 +982,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/codeSimplifications"), Pattern.compile("^(.+)\\.java$"), true);
}
@TestMetadata("IfToSafeCall.java")
public void testIfToSafeCall() throws Exception {
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/IfToSafeCall.java");
doTest(fileName);
}
@TestMetadata("NotIs.java")
public void testNotIs() throws Exception {
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/NotIs.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("IfToSafeCall.java")
public void testIfToSafeCall() throws Exception {
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/IfToSafeCall.java");
doTest(fileName);
}
@TestMetadata("NotIs.java")
public void testNotIs() throws Exception {
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/NotIs.java");