From fb4075cc2fc246245a6c0320b72d9197b8ba6219 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 26 Mar 2015 14:17:52 +0300 Subject: [PATCH] J2K: inlining intermediate variable after removing type cast --- .../jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt | 14 +++++++++++++- .../RemoveRightPartOfBinaryExpressionFix.java | 15 +++++++++------ .../RedundantTypeCastAndInline.java | 11 +++++++++++ .../RedundantTypeCastAndInline.kt | 8 ++++++++ ...aToKotlinConverterForWebDemoTestGenerated.java | 6 ++++++ ...aToKotlinConverterSingleFileTestGenerated.java | 6 ++++++ 6 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 j2k/testData/fileOrElement/codeSimplifications/RedundantTypeCastAndInline.java create mode 100644 j2k/testData/fileOrElement/codeSimplifications/RedundantTypeCastAndInline.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt index 8bf4ed3a671..53a2d15b504 100644 --- a/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessor.kt @@ -17,6 +17,8 @@ package org.jetbrains.kotlin.idea.j2k import com.intellij.psi.PsiElement +import com.intellij.psi.search.LocalSearchScope +import com.intellij.psi.search.searches.ReferencesSearch import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.idea.caches.resolve.analyzeFullyAndGetResult @@ -39,7 +41,17 @@ public class J2kPostProcessor(override val contextToAnalyzeIn: PsiElement) : Pos val psiElement = problem.getPsiElement() return when (problem.getFactory()) { Errors.USELESS_CAST, Errors.USELESS_CAST_STATIC_ASSERT_IS_FINE -> { -> - RemoveRightPartOfBinaryExpressionFix(psiElement as JetBinaryExpressionWithTypeRHS, "").invoke() + val expression = RemoveRightPartOfBinaryExpressionFix(psiElement as JetBinaryExpressionWithTypeRHS, "").invoke() + + val variable = expression.getParent() as? JetProperty + if (variable != null && expression == variable.getInitializer() && variable.isLocal()) { + val refs = ReferencesSearch.search(variable, LocalSearchScope(variable.getContainingFile())).findAll() + for (ref in refs) { + val usage = ref.getElement() as? JetSimpleNameExpression ?: continue + usage.replace(expression) + } + variable.delete() + } } else -> super.fixForProblem(problem) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveRightPartOfBinaryExpressionFix.java b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveRightPartOfBinaryExpressionFix.java index b70ca089bc0..6689e9dd481 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveRightPartOfBinaryExpressionFix.java +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/RemoveRightPartOfBinaryExpressionFix.java @@ -48,21 +48,24 @@ public class RemoveRightPartOfBinaryExpressionFix exten invoke(); } - public void invoke() throws IncorrectOperationException { - PsiElement newElement = null; + @NotNull + public JetExpression invoke() throws IncorrectOperationException { + JetExpression newExpression = null; if (element instanceof JetBinaryExpression) { //noinspection ConstantConditions - newElement = element.replace(((JetBinaryExpression) element.copy()).getLeft()); + newExpression = (JetExpression) element.replace(((JetBinaryExpression) element.copy()).getLeft()); } else if (element instanceof JetBinaryExpressionWithTypeRHS) { - newElement = element.replace(((JetBinaryExpressionWithTypeRHS) element.copy()).getLeft()); + newExpression = (JetExpression) element.replace(((JetBinaryExpressionWithTypeRHS) element.copy()).getLeft()); } - PsiElement parent = newElement != null ? newElement.getParent() : null; + PsiElement parent = newExpression != null ? newExpression.getParent() : null; if (parent instanceof JetParenthesizedExpression && JetPsiUtil.areParenthesesUseless((JetParenthesizedExpression) parent)) { - parent.replace(newElement); + newExpression = (JetExpression) parent.replace(newExpression); } + + return newExpression; } public static JetSingleIntentionActionFactory createRemoveCastFactory() { diff --git a/j2k/testData/fileOrElement/codeSimplifications/RedundantTypeCastAndInline.java b/j2k/testData/fileOrElement/codeSimplifications/RedundantTypeCastAndInline.java new file mode 100644 index 00000000000..43313a0fa54 --- /dev/null +++ b/j2k/testData/fileOrElement/codeSimplifications/RedundantTypeCastAndInline.java @@ -0,0 +1,11 @@ +import java.lang.String; + +class C { + void foo(Object o) { + if (o instanceof String) { + String s = (String) o; + int l = s.length(); + String substring = s.substring(l - 2); + } + } +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/codeSimplifications/RedundantTypeCastAndInline.kt b/j2k/testData/fileOrElement/codeSimplifications/RedundantTypeCastAndInline.kt new file mode 100644 index 00000000000..0ca5725938a --- /dev/null +++ b/j2k/testData/fileOrElement/codeSimplifications/RedundantTypeCastAndInline.kt @@ -0,0 +1,8 @@ +class C { + fun foo(o: Any) { + if (o is String) { + val l = o.length() + val substring = o.substring(l - 2) + } + } +} diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java index 95d9ba2f2b0..68deea955a3 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -1005,6 +1005,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/RedundantTypeCast.java"); doTest(fileName); } + + @TestMetadata("RedundantTypeCastAndInline.java") + public void testRedundantTypeCastAndInline() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/RedundantTypeCastAndInline.java"); + doTest(fileName); + } } @TestMetadata("j2k/testData/fileOrElement/comments") diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index e9afe4d670a..08926da476a 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -1005,6 +1005,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/RedundantTypeCast.java"); doTest(fileName); } + + @TestMetadata("RedundantTypeCastAndInline.java") + public void testRedundantTypeCastAndInline() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/testData/fileOrElement/codeSimplifications/RedundantTypeCastAndInline.java"); + doTest(fileName); + } } @TestMetadata("j2k/testData/fileOrElement/comments")