From 82a70283b57948af430dd3f18c802931aa35c0e2 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Thu, 19 Jan 2017 17:45:08 +0300 Subject: [PATCH] KT-15789 Kotlin plugin incorrectly converts for-loops from Java to Kotlin #KT-15789 fixed --- .../kotlin/idea/j2k/J2kPostProcessings.kt | 9 ++++---- .../RedundantTypeCastAndInline.kt | 7 ++++--- .../RedunduntTypeCastAndProhibitedInline.java | 21 +++++++++++++++++++ .../RedunduntTypeCastAndProhibitedInline.kt | 19 +++++++++++++++++ ...otlinConverterForWebDemoTestGenerated.java | 7 +++++++ ...otlinConverterSingleFileTestGenerated.java | 6 ++++++ 6 files changed, 61 insertions(+), 8 deletions(-) create mode 100644 j2k/testData/fileOrElement/postProcessing/RedunduntTypeCastAndProhibitedInline.java create mode 100644 j2k/testData/fileOrElement/postProcessing/RedunduntTypeCastAndProhibitedInline.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessings.kt b/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessings.kt index 6b14a3c9545..ca7703f668f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessings.kt +++ b/idea/src/org/jetbrains/kotlin/idea/j2k/J2kPostProcessings.kt @@ -86,12 +86,11 @@ object J2KPostProcessingRegistrar { val variable = expression.parent as? KtProperty if (variable != null && expression == variable.initializer && variable.isLocal) { - val refs = ReferencesSearch.search(variable, LocalSearchScope(variable.containingFile)).findAll() - for (ref in refs) { - val usage = ref.element as? KtSimpleNameExpression ?: continue - usage.replace(expression) + val ref = ReferencesSearch.search(variable, LocalSearchScope(variable.containingFile)).findAll().singleOrNull() + if (ref != null && ref.element is KtSimpleNameExpression) { + ref.element.replace(expression) + variable.delete() } - variable.delete() } } diff --git a/j2k/testData/fileOrElement/postProcessing/RedundantTypeCastAndInline.kt b/j2k/testData/fileOrElement/postProcessing/RedundantTypeCastAndInline.kt index a893f69ea92..a998433e7e6 100644 --- a/j2k/testData/fileOrElement/postProcessing/RedundantTypeCastAndInline.kt +++ b/j2k/testData/fileOrElement/postProcessing/RedundantTypeCastAndInline.kt @@ -1,8 +1,9 @@ internal class C { fun foo(o: Any) { if (o is String) { - val l = o.length - val substring = o.substring(l - 2) + val s = o + val l = s.length + val substring = s.substring(l - 2) } } -} +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/postProcessing/RedunduntTypeCastAndProhibitedInline.java b/j2k/testData/fileOrElement/postProcessing/RedunduntTypeCastAndProhibitedInline.java new file mode 100644 index 00000000000..c3b949c5dbb --- /dev/null +++ b/j2k/testData/fileOrElement/postProcessing/RedunduntTypeCastAndProhibitedInline.java @@ -0,0 +1,21 @@ +import java.util.Iterator; +import java.util.List; + +public class C { + + public static void consume1(C c) { + + } + + public static void consume2(C c) { + + } + + public static void foo(List cList) { + for (Iterator iter = cList.iterator(); iter.hasNext();) { + C c = (C) iter.next(); + consume1(c); + consume2(c); + } + } +} \ No newline at end of file diff --git a/j2k/testData/fileOrElement/postProcessing/RedunduntTypeCastAndProhibitedInline.kt b/j2k/testData/fileOrElement/postProcessing/RedunduntTypeCastAndProhibitedInline.kt new file mode 100644 index 00000000000..55d08edaf42 --- /dev/null +++ b/j2k/testData/fileOrElement/postProcessing/RedunduntTypeCastAndProhibitedInline.kt @@ -0,0 +1,19 @@ +object C { + + fun consume1(c: C) { + + } + + fun consume2(c: C) { + + } + + fun foo(cList: List) { + val iter = cList.iterator() + while (iter.hasNext()) { + val c = iter.next() + consume1(c) + consume2(c) + } + } +} \ No newline at end of file diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java index 35613e57f32..b168f4dff2c 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -4115,6 +4115,13 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("RedunduntTypeCastAndProhibitedInline.java") + public void testRedunduntTypeCastAndProhibitedInline() throws Exception { + String fileName = KotlinTestUtils + .navigationMetadata("j2k/testData/fileOrElement/postProcessing/RedunduntTypeCastAndProhibitedInline.java"); + doTest(fileName); + } + @TestMetadata("SyntheticExtensionPropertyAccess.java") public void testSyntheticExtensionPropertyAccess() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/postProcessing/SyntheticExtensionPropertyAccess.java"); diff --git a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java index 8db28df59b3..294c464e4e3 100644 --- a/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/org/jetbrains/kotlin/j2k/JavaToKotlinConverterSingleFileTestGenerated.java @@ -4115,6 +4115,12 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("RedunduntTypeCastAndProhibitedInline.java") + public void testRedunduntTypeCastAndProhibitedInline() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/postProcessing/RedunduntTypeCastAndProhibitedInline.java"); + doTest(fileName); + } + @TestMetadata("SyntheticExtensionPropertyAccess.java") public void testSyntheticExtensionPropertyAccess() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("j2k/testData/fileOrElement/postProcessing/SyntheticExtensionPropertyAccess.java");