From b983a0eaa0ca73c6d9b9d74735eb2bbedadecabb Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 10 Jul 2014 15:42:24 +0400 Subject: [PATCH] Fixed KT-5204 Converter from java could generate var's for locals when needed #KT-5204 Fixed --- j2k/src/org/jetbrains/jet/j2k/AfterConversionPass.kt | 11 ++++++++++- .../j2k/test/JavaToKotlinConverterTestGenerated.java | 5 +++++ .../ast/localVariable/varWithNoInitializer.java | 11 +++++++++++ .../ast/localVariable/varWithNoInitializer.kt | 10 ++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 j2k/tests/testData/ast/localVariable/varWithNoInitializer.java create mode 100644 j2k/tests/testData/ast/localVariable/varWithNoInitializer.kt diff --git a/j2k/src/org/jetbrains/jet/j2k/AfterConversionPass.kt b/j2k/src/org/jetbrains/jet/j2k/AfterConversionPass.kt index 452892ad535..ee74092ecd0 100644 --- a/j2k/src/org/jetbrains/jet/j2k/AfterConversionPass.kt +++ b/j2k/src/org/jetbrains/jet/j2k/AfterConversionPass.kt @@ -27,6 +27,7 @@ import org.jetbrains.jet.lang.diagnostics.Diagnostic import org.jetbrains.jet.lang.diagnostics.Errors import org.jetbrains.jet.lang.psi.JetSimpleNameExpression import org.jetbrains.jet.lang.psi.JetUnaryExpression +import org.jetbrains.jet.lang.psi.JetProperty class AfterConversionPass(val project: Project) { public fun run(kotlinCode: String): String { @@ -58,13 +59,21 @@ class AfterConversionPass(val project: Project) { } private fun fixForProblem(problem: Diagnostic): (() -> Unit)? { + val psiElement = problem.getPsiElement() return when (problem.getFactory()) { Errors.UNNECESSARY_NOT_NULL_ASSERTION -> { () -> - val exclExclOp = problem.getPsiElement() as JetSimpleNameExpression + val exclExclOp = psiElement as JetSimpleNameExpression val exclExclExpr = exclExclOp.getParent() as JetUnaryExpression exclExclExpr.replace(exclExclExpr.getBaseExpression()!!) } + Errors.VAL_REASSIGNMENT -> { () -> + val property = (psiElement as? JetSimpleNameExpression)?.getReference()?.resolve() as? JetProperty + if (property != null && !property.isVar()) { + property.getValOrVarNode().getPsi()!!.replace(JetPsiFactory.createVarNode(project).getPsi()!!) + } + } + else -> null } } diff --git a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java index 3bc6b7ea6e2..39256499c4e 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java @@ -2037,6 +2037,11 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv doTest("j2k/tests/testData/ast/localVariable/varTypeDoNotMatch.java"); } + @TestMetadata("varWithNoInitializer.java") + public void testVarWithNoInitializer() throws Exception { + doTest("j2k/tests/testData/ast/localVariable/varWithNoInitializer.java"); + } + } @TestMetadata("j2k/tests/testData/ast/methodCallExpression") diff --git a/j2k/tests/testData/ast/localVariable/varWithNoInitializer.java b/j2k/tests/testData/ast/localVariable/varWithNoInitializer.java new file mode 100644 index 00000000000..e687e761acf --- /dev/null +++ b/j2k/tests/testData/ast/localVariable/varWithNoInitializer.java @@ -0,0 +1,11 @@ +//file +class C { + int foo(boolean p) { + int a; + int b; + a = 10; + b = 5; + if (p) a = 5; else b = 10; + return a + b; + } +} diff --git a/j2k/tests/testData/ast/localVariable/varWithNoInitializer.kt b/j2k/tests/testData/ast/localVariable/varWithNoInitializer.kt new file mode 100644 index 00000000000..5f3791281bb --- /dev/null +++ b/j2k/tests/testData/ast/localVariable/varWithNoInitializer.kt @@ -0,0 +1,10 @@ +class C { + fun foo(p: Boolean): Int { + var a: Int + var b: Int + a = 10 + b = 5 + if (p) a = 5 else b = 10 + return a + b + } +}