J2K: generating "!is" instead of !(.. is ..)
This commit is contained in:
+5
-1
@@ -69,6 +69,10 @@ public class SimplifyNegatedBinaryExpressionIntention : JetSelfTargetingIntentio
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun applyTo(element: JetPrefixExpression, editor: Editor) {
|
override fun applyTo(element: JetPrefixExpression, editor: Editor) {
|
||||||
|
applyTo(element)
|
||||||
|
}
|
||||||
|
|
||||||
|
public fun applyTo(element: JetPrefixExpression) {
|
||||||
// Guaranteed to succeed (by isApplicableTo)
|
// Guaranteed to succeed (by isApplicableTo)
|
||||||
val expression = element.unparenthesize()!!
|
val expression = element.unparenthesize()!!
|
||||||
val invertedOperation = JetPsiUtil.getOperationToken(expression as JetOperationExpression)!!.negate()!!
|
val invertedOperation = JetPsiUtil.getOperationToken(expression as JetOperationExpression)!!.negate()!!
|
||||||
@@ -87,7 +91,7 @@ public class SimplifyNegatedBinaryExpressionIntention : JetSelfTargetingIntentio
|
|||||||
expression.getRight()
|
expression.getRight()
|
||||||
)
|
)
|
||||||
else -> throw IllegalStateException(
|
else -> throw IllegalStateException(
|
||||||
"Expression is neither a JetIsExpression or JetBinaryExpression (checked by isApplicableTo): ${expression.getText()}"
|
"Expression is neither a JetIsExpression or JetBinaryExpression (checked by isApplicableTo): ${expression.getText()}"
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -16,13 +16,17 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.j2k
|
package org.jetbrains.kotlin.idea.j2k
|
||||||
|
|
||||||
import org.jetbrains.kotlin.j2k.PostProcessor
|
|
||||||
import org.jetbrains.kotlin.psi.*
|
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
|
||||||
import org.jetbrains.kotlin.idea.intentions.RemoveExplicitTypeArguments
|
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult
|
|
||||||
import java.util.ArrayList
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
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.j2k.PostProcessor
|
||||||
|
import org.jetbrains.kotlin.psi.JetFile
|
||||||
|
import org.jetbrains.kotlin.psi.JetPrefixExpression
|
||||||
|
import org.jetbrains.kotlin.psi.JetTreeVisitorVoid
|
||||||
|
import org.jetbrains.kotlin.psi.JetTypeArgumentList
|
||||||
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
import java.util.ArrayList
|
||||||
|
|
||||||
public class J2kPostProcessor(override val contextToAnalyzeIn: PsiElement) : PostProcessor {
|
public class J2kPostProcessor(override val contextToAnalyzeIn: PsiElement) : PostProcessor {
|
||||||
override fun analyzeFile(file: JetFile): BindingContext {
|
override fun analyzeFile(file: JetFile): BindingContext {
|
||||||
@@ -40,6 +44,15 @@ public class J2kPostProcessor(override val contextToAnalyzeIn: PsiElement) : Pos
|
|||||||
|
|
||||||
super.visitTypeArgumentList(typeArgumentList)
|
super.visitTypeArgumentList(typeArgumentList)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun visitPrefixExpression(expression: JetPrefixExpression) {
|
||||||
|
super.visitPrefixExpression(expression)
|
||||||
|
|
||||||
|
val intention = SimplifyNegatedBinaryExpressionIntention()
|
||||||
|
if (intention.isApplicableTo(expression)) {
|
||||||
|
intention.applyTo(expression)
|
||||||
|
}
|
||||||
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
for (typeArgs in redundantTypeArgs) {
|
for (typeArgs in redundantTypeArgs) {
|
||||||
|
|||||||
@@ -50,13 +50,13 @@ class AfterConversionPass(val project: Project, val postProcessor: PostProcessor
|
|||||||
private fun fixForProblem(problem: Diagnostic): (() -> Unit)? {
|
private fun fixForProblem(problem: Diagnostic): (() -> Unit)? {
|
||||||
val psiElement = problem.getPsiElement()
|
val psiElement = problem.getPsiElement()
|
||||||
return when (problem.getFactory()) {
|
return when (problem.getFactory()) {
|
||||||
Errors.UNNECESSARY_NOT_NULL_ASSERTION -> { () ->
|
Errors.UNNECESSARY_NOT_NULL_ASSERTION -> { ->
|
||||||
val exclExclOp = psiElement as JetSimpleNameExpression
|
val exclExclOp = psiElement as JetSimpleNameExpression
|
||||||
val exclExclExpr = exclExclOp.getParent() as JetUnaryExpression
|
val exclExclExpr = exclExclOp.getParent() as JetUnaryExpression
|
||||||
exclExclExpr.replace(exclExclExpr.getBaseExpression()!!)
|
exclExclExpr.replace(exclExclExpr.getBaseExpression()!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
Errors.VAL_REASSIGNMENT -> { () ->
|
Errors.VAL_REASSIGNMENT -> { ->
|
||||||
val property = (psiElement as? JetSimpleNameExpression)?.getReference()?.resolve() as? JetProperty
|
val property = (psiElement as? JetSimpleNameExpression)?.getReference()?.resolve() as? JetProperty
|
||||||
if (property != null && !property.isVar()) {
|
if (property != null && !property.isVar()) {
|
||||||
property.getValOrVarNode().getPsi()!!.replace(JetPsiFactory(project).createVarNode().getPsi()!!)
|
property.getValOrVarNode().getPsi()!!.replace(JetPsiFactory(project).createVarNode().getPsi()!!)
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
class C {
|
||||||
|
void foo(Object o) {
|
||||||
|
if (!(o instanceof String)) return;
|
||||||
|
System.out.println("String");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
class C {
|
||||||
|
fun foo(o: Any) {
|
||||||
|
if (o !is String) return
|
||||||
|
System.out.println("String")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -45,6 +45,7 @@ import java.util.regex.Pattern;
|
|||||||
JavaToKotlinConverterForWebDemoTestGenerated.CallChainExpression.class,
|
JavaToKotlinConverterForWebDemoTestGenerated.CallChainExpression.class,
|
||||||
JavaToKotlinConverterForWebDemoTestGenerated.Class.class,
|
JavaToKotlinConverterForWebDemoTestGenerated.Class.class,
|
||||||
JavaToKotlinConverterForWebDemoTestGenerated.ClassExpression.class,
|
JavaToKotlinConverterForWebDemoTestGenerated.ClassExpression.class,
|
||||||
|
JavaToKotlinConverterForWebDemoTestGenerated.CodeSimplifications.class,
|
||||||
JavaToKotlinConverterForWebDemoTestGenerated.Comments.class,
|
JavaToKotlinConverterForWebDemoTestGenerated.Comments.class,
|
||||||
JavaToKotlinConverterForWebDemoTestGenerated.ConditionalExpression.class,
|
JavaToKotlinConverterForWebDemoTestGenerated.ConditionalExpression.class,
|
||||||
JavaToKotlinConverterForWebDemoTestGenerated.Constructors.class,
|
JavaToKotlinConverterForWebDemoTestGenerated.Constructors.class,
|
||||||
@@ -973,6 +974,21 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("j2k/testData/fileOrElement/codeSimplifications")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class CodeSimplifications extends AbstractJavaToKotlinConverterForWebDemoTest {
|
||||||
|
public void testAllFilesPresentInCodeSimplifications() throws Exception {
|
||||||
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/codeSimplifications"), Pattern.compile("^(.+)\\.java$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("NotIs.java")
|
||||||
|
public void testNotIs() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/NotIs.java");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("j2k/testData/fileOrElement/comments")
|
@TestMetadata("j2k/testData/fileOrElement/comments")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ import java.util.regex.Pattern;
|
|||||||
JavaToKotlinConverterSingleFileTestGenerated.CallChainExpression.class,
|
JavaToKotlinConverterSingleFileTestGenerated.CallChainExpression.class,
|
||||||
JavaToKotlinConverterSingleFileTestGenerated.Class.class,
|
JavaToKotlinConverterSingleFileTestGenerated.Class.class,
|
||||||
JavaToKotlinConverterSingleFileTestGenerated.ClassExpression.class,
|
JavaToKotlinConverterSingleFileTestGenerated.ClassExpression.class,
|
||||||
|
JavaToKotlinConverterSingleFileTestGenerated.CodeSimplifications.class,
|
||||||
JavaToKotlinConverterSingleFileTestGenerated.Comments.class,
|
JavaToKotlinConverterSingleFileTestGenerated.Comments.class,
|
||||||
JavaToKotlinConverterSingleFileTestGenerated.ConditionalExpression.class,
|
JavaToKotlinConverterSingleFileTestGenerated.ConditionalExpression.class,
|
||||||
JavaToKotlinConverterSingleFileTestGenerated.Constructors.class,
|
JavaToKotlinConverterSingleFileTestGenerated.Constructors.class,
|
||||||
@@ -973,6 +974,21 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("j2k/testData/fileOrElement/codeSimplifications")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class CodeSimplifications extends AbstractJavaToKotlinConverterSingleFileTest {
|
||||||
|
public void testAllFilesPresentInCodeSimplifications() throws Exception {
|
||||||
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/testData/fileOrElement/codeSimplifications"), Pattern.compile("^(.+)\\.java$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("NotIs.java")
|
||||||
|
public void testNotIs() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/NotIs.java");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("j2k/testData/fileOrElement/comments")
|
@TestMetadata("j2k/testData/fileOrElement/comments")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
Reference in New Issue
Block a user