From 7d92559d13065c5b69885a018aed4d65e5ffda79 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 25 Mar 2015 19:41:25 +0300 Subject: [PATCH] J2K: generating "!is" instead of !(.. is ..) --- ...implifyNegatedBinaryExpressionIntention.kt | 6 ++++- .../kotlin/idea/j2k/J2kPostProcessor.kt | 25 ++++++++++++++----- .../kotlin/j2k/AfterConversionPass.kt | 4 +-- .../codeSimplifications/NotIs.java | 6 +++++ .../codeSimplifications/NotIs.kt | 6 +++++ ...otlinConverterForWebDemoTestGenerated.java | 16 ++++++++++++ ...otlinConverterSingleFileTestGenerated.java | 16 ++++++++++++ 7 files changed, 70 insertions(+), 9 deletions(-) create mode 100644 j2k/testData/fileOrElement/codeSimplifications/NotIs.java create mode 100644 j2k/testData/fileOrElement/codeSimplifications/NotIs.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/SimplifyNegatedBinaryExpressionIntention.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/SimplifyNegatedBinaryExpressionIntention.kt index 9e7661b366b..cef3f3b119a 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/SimplifyNegatedBinaryExpressionIntention.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/SimplifyNegatedBinaryExpressionIntention.kt @@ -69,6 +69,10 @@ public class SimplifyNegatedBinaryExpressionIntention : JetSelfTargetingIntentio } override fun applyTo(element: JetPrefixExpression, editor: Editor) { + applyTo(element) + } + + public fun applyTo(element: JetPrefixExpression) { // Guaranteed to succeed (by isApplicableTo) val expression = element.unparenthesize()!! val invertedOperation = JetPsiUtil.getOperationToken(expression as JetOperationExpression)!!.negate()!! @@ -87,7 +91,7 @@ public class SimplifyNegatedBinaryExpressionIntention : JetSelfTargetingIntentio expression.getRight() ) 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()}" ) } ) diff --git a/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt index ba6948048e7..57875080b72 100644 --- a/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt @@ -16,13 +16,17 @@ 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 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 { override fun analyzeFile(file: JetFile): BindingContext { @@ -40,6 +44,15 @@ public class J2kPostProcessor(override val contextToAnalyzeIn: PsiElement) : Pos 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) { diff --git a/j2k/src/org/jetbrains/kotlin/j2k/AfterConversionPass.kt b/j2k/src/org/jetbrains/kotlin/j2k/AfterConversionPass.kt index 10c9b24387e..76bcd89ee00 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/AfterConversionPass.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/AfterConversionPass.kt @@ -50,13 +50,13 @@ class AfterConversionPass(val project: Project, val postProcessor: PostProcessor private fun fixForProblem(problem: Diagnostic): (() -> Unit)? { val psiElement = problem.getPsiElement() return when (problem.getFactory()) { - Errors.UNNECESSARY_NOT_NULL_ASSERTION -> { () -> + Errors.UNNECESSARY_NOT_NULL_ASSERTION -> { -> val exclExclOp = psiElement as JetSimpleNameExpression val exclExclExpr = exclExclOp.getParent() as JetUnaryExpression exclExclExpr.replace(exclExclExpr.getBaseExpression()!!) } - Errors.VAL_REASSIGNMENT -> { () -> + Errors.VAL_REASSIGNMENT -> { -> val property = (psiElement as? JetSimpleNameExpression)?.getReference()?.resolve() as? JetProperty if (property != null && !property.isVar()) { property.getValOrVarNode().getPsi()!!.replace(JetPsiFactory(project).createVarNode().getPsi()!!) diff --git a/j2k/testData/fileOrElement/codeSimplifications/NotIs.java b/j2k/testData/fileOrElement/codeSimplifications/NotIs.java new file mode 100644 index 00000000000..27bad8b58af --- /dev/null +++ b/j2k/testData/fileOrElement/codeSimplifications/NotIs.java @@ -0,0 +1,6 @@ +class C { + void foo(Object o) { + if (!(o instanceof String)) return; + System.out.println("String"); + } +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/codeSimplifications/NotIs.kt b/j2k/testData/fileOrElement/codeSimplifications/NotIs.kt new file mode 100644 index 00000000000..4b0e6821c8b --- /dev/null +++ b/j2k/testData/fileOrElement/codeSimplifications/NotIs.kt @@ -0,0 +1,6 @@ +class C { + fun foo(o: Any) { + if (o !is String) return + System.out.println("String") + } +} diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java index 3acf531d18f..b0a3913592d 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -45,6 +45,7 @@ import java.util.regex.Pattern; JavaToKotlinConverterForWebDemoTestGenerated.CallChainExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.Class.class, JavaToKotlinConverterForWebDemoTestGenerated.ClassExpression.class, + JavaToKotlinConverterForWebDemoTestGenerated.CodeSimplifications.class, JavaToKotlinConverterForWebDemoTestGenerated.Comments.class, JavaToKotlinConverterForWebDemoTestGenerated.ConditionalExpression.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") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index 9e08e575ae5..be577a414c4 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -45,6 +45,7 @@ import java.util.regex.Pattern; JavaToKotlinConverterSingleFileTestGenerated.CallChainExpression.class, JavaToKotlinConverterSingleFileTestGenerated.Class.class, JavaToKotlinConverterSingleFileTestGenerated.ClassExpression.class, + JavaToKotlinConverterSingleFileTestGenerated.CodeSimplifications.class, JavaToKotlinConverterSingleFileTestGenerated.Comments.class, JavaToKotlinConverterSingleFileTestGenerated.ConditionalExpression.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") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)