J2K: generating "!is" instead of !(.. is ..)

This commit is contained in:
Valentin Kipyatkov
2015-03-25 19:41:25 +03:00
parent 108a1f872c
commit 7d92559d13
7 changed files with 70 additions and 9 deletions
@@ -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()}"
)
}
)
@@ -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) {
@@ -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()!!)
@@ -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.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)
@@ -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)