J2K: auto-replacing of if's with safe access
This commit is contained in:
+6
-2
@@ -58,6 +58,11 @@ public class IfThenToSafeAccessIntention : JetSelfTargetingIntention<JetIfExpres
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun applyTo(element: JetIfExpression, editor: Editor) {
|
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 condition = element.getCondition() as JetBinaryExpression
|
||||||
val receiverExpression = checkNotNull(condition.getNonNullExpression(), "The receiver expression cannot be null")
|
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 resultingExprString = "${receiverExpression.getText()}?.${selectorExpression?.getText()}"
|
||||||
val safeAccessExpr = element.replace(resultingExprString) as JetSafeQualifiedExpression
|
return element.replace(resultingExprString) as JetSafeQualifiedExpression
|
||||||
safeAccessExpr.inlineReceiverIfApplicableWithPrompt(editor)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun clauseContainsAppropriateDotQualifiedExpression(clause: JetExpression, receiverExpression: JetExpression): Boolean =
|
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.caches.resolve.analyzeFullyAndGetResult
|
||||||
import org.jetbrains.kotlin.idea.intentions.RemoveExplicitTypeArguments
|
import org.jetbrains.kotlin.idea.intentions.RemoveExplicitTypeArguments
|
||||||
import org.jetbrains.kotlin.idea.intentions.SimplifyNegatedBinaryExpressionIntention
|
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.idea.quickfix.RemoveRightPartOfBinaryExpressionFix
|
||||||
import org.jetbrains.kotlin.j2k.PostProcessor
|
import org.jetbrains.kotlin.j2k.PostProcessor
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.utils.printAndReturn
|
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
|
|
||||||
public class J2kPostProcessor(override val contextToAnalyzeIn: PsiElement) : PostProcessor {
|
public class J2kPostProcessor(override val contextToAnalyzeIn: PsiElement) : PostProcessor {
|
||||||
@@ -65,6 +65,15 @@ public class J2kPostProcessor(override val contextToAnalyzeIn: PsiElement) : Pos
|
|||||||
intention.applyTo(expression)
|
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) {
|
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);
|
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")
|
@TestMetadata("NotIs.java")
|
||||||
public void testNotIs() throws Exception {
|
public void testNotIs() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/NotIs.java");
|
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);
|
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")
|
@TestMetadata("NotIs.java")
|
||||||
public void testNotIs() throws Exception {
|
public void testNotIs() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/NotIs.java");
|
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/NotIs.java");
|
||||||
|
|||||||
Reference in New Issue
Block a user