From 5a8ab4194833c627de7d23ec4df87d5f269bdd08 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 23 Jun 2014 19:28:37 +0400 Subject: [PATCH] Java to Kotlin converter: declare private field with no writes as val --- j2k/src/org/jetbrains/jet/j2k/Converter.kt | 2 +- j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt | 9 --------- j2k/src/org/jetbrains/jet/j2k/Utils.kt | 11 ++++++++++- .../test/JavaToKotlinConverterTestGenerated.java | 5 +++++ .../testData/ast/annotations/annotationUsages.kt | 4 ++-- j2k/tests/testData/ast/comments/comments2.kt | 2 +- .../ast/comments/fieldWithEndOfLineComment.kt | 2 +- .../ast/constructors/withManyDefaultParams.java | 14 +++++++------- .../ast/constructors/withManyDefaultParams.kt | 2 +- j2k/tests/testData/ast/enum/enumWithNameField.kt | 2 +- .../testData/ast/field/classChildExtendsBase.kt | 4 ++-- j2k/tests/testData/ast/field/privateField.kt | 2 +- j2k/tests/testData/ast/field/specifyType.java | 1 + j2k/tests/testData/ast/field/specifyType.kt | 1 + j2k/tests/testData/ast/field/valOrVar.java | 12 ++++++++++++ j2k/tests/testData/ast/field/valOrVar.kt | 11 +++++++++++ j2k/tests/testData/ast/issues/comments.kt | 2 +- .../ast/nullability/FieldComparedWithNull.kt | 2 +- .../ast/settings/specifyFieldTypeByDefault.java | 6 ------ .../ast/settings/specifyFieldTypeByDefault.kt | 6 ------ 20 files changed, 59 insertions(+), 41 deletions(-) create mode 100644 j2k/tests/testData/ast/field/valOrVar.java create mode 100644 j2k/tests/testData/ast/field/valOrVar.kt diff --git a/j2k/src/org/jetbrains/jet/j2k/Converter.kt b/j2k/src/org/jetbrains/jet/j2k/Converter.kt index 2005a5fd671..297c7cfbcca 100644 --- a/j2k/src/org/jetbrains/jet/j2k/Converter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/Converter.kt @@ -285,7 +285,7 @@ public class Converter private(val project: Project, val settings: ConverterSett else { val initializer = field.getInitializer() val convertedType = typeConverter.convertVariableType(field) - val isVal = field.hasModifierProperty(PsiModifier.FINAL) + val isVal = field.isEffectivelyFinal() val omitType = !settings.specifyFieldTypeByDefault && initializer != null && (modifiers.isPrivate && (isVal || convertedType == typeConverter.convertExpressionType(initializer)) || diff --git a/j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt b/j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt index 4458f631e5c..5b8b4c8e6c5 100644 --- a/j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt @@ -263,13 +263,4 @@ class TypeConverter(val settings: ConverterSettings, val conversionScope: Conver } return false } - - private fun PsiVariable.isEffectivelyFinal(): Boolean { - if (hasModifierProperty(PsiModifier.FINAL)) return true - return when(this) { - is PsiLocalVariable -> !hasWriteAccesses(getContainingMethod()) - is PsiField -> if (hasModifierProperty(PsiModifier.PRIVATE)) !hasWriteAccesses(getContainingClass()) else false - else -> false - } - } } diff --git a/j2k/src/org/jetbrains/jet/j2k/Utils.kt b/j2k/src/org/jetbrains/jet/j2k/Utils.kt index 13b83b6e1ab..6ab6d8bd4b5 100644 --- a/j2k/src/org/jetbrains/jet/j2k/Utils.kt +++ b/j2k/src/org/jetbrains/jet/j2k/Utils.kt @@ -92,4 +92,13 @@ fun PsiElement.isInSingleLine(): Boolean { child = child!!.getNextSibling() } return true -} \ No newline at end of file +} + +fun PsiVariable.isEffectivelyFinal(): Boolean { + if (hasModifierProperty(PsiModifier.FINAL)) return true + return when(this) { + is PsiLocalVariable -> !hasWriteAccesses(getContainingMethod()) + is PsiField -> if (hasModifierProperty(PsiModifier.PRIVATE)) !hasWriteAccesses(getContainingClass()) else false + else -> false + } +} 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 5c3604760dc..db113760629 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java @@ -1099,6 +1099,11 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv doTest("j2k/tests/testData/ast/field/specifyType.java"); } + @TestMetadata("valOrVar.java") + public void testValOrVar() throws Exception { + doTest("j2k/tests/testData/ast/field/valOrVar.java"); + } + @TestMetadata("valWithInit.java") public void testValWithInit() throws Exception { doTest("j2k/tests/testData/ast/field/valWithInit.java"); diff --git a/j2k/tests/testData/ast/annotations/annotationUsages.kt b/j2k/tests/testData/ast/annotations/annotationUsages.kt index 08497bd912a..93e135f82af 100644 --- a/j2k/tests/testData/ast/annotations/annotationUsages.kt +++ b/j2k/tests/testData/ast/annotations/annotationUsages.kt @@ -9,10 +9,10 @@ Anon6(array("x", "y")) Anon7(javaClass(), javaClass()) Anon8(classes = *array(javaClass(), javaClass())) class C() { - Anon5(1) deprecated("") private var field1 = 0 + Anon5(1) deprecated("") private val field1 = 0 Anon5(1) - private var field2 = 0 + private val field2 = 0 Anon5(1) var field3 = 0 diff --git a/j2k/tests/testData/ast/comments/comments2.kt b/j2k/tests/testData/ast/comments/comments2.kt index fab172ae131..0760fa55820 100644 --- a/j2k/tests/testData/ast/comments/comments2.kt +++ b/j2k/tests/testData/ast/comments/comments2.kt @@ -11,7 +11,7 @@ class A() { /* body is empty */ } - private /*it's private*/ var field = 0 + private /*it's private*/ val field = 0 public /*it's public*/ fun foo(): Char { } diff --git a/j2k/tests/testData/ast/comments/fieldWithEndOfLineComment.kt b/j2k/tests/testData/ast/comments/fieldWithEndOfLineComment.kt index ea603f5e24a..4390146f416 100644 --- a/j2k/tests/testData/ast/comments/fieldWithEndOfLineComment.kt +++ b/j2k/tests/testData/ast/comments/fieldWithEndOfLineComment.kt @@ -1,3 +1,3 @@ class A() { - private var isOpen = true // ideally should be atomic boolean + private val isOpen = true // ideally should be atomic boolean } \ No newline at end of file diff --git a/j2k/tests/testData/ast/constructors/withManyDefaultParams.java b/j2k/tests/testData/ast/constructors/withManyDefaultParams.java index 2940814308f..659c10b522c 100644 --- a/j2k/tests/testData/ast/constructors/withManyDefaultParams.java +++ b/j2k/tests/testData/ast/constructors/withManyDefaultParams.java @@ -1,13 +1,13 @@ //file public class Test { private final String myName; - private boolean a; - private double b; - private float c; - private long d; - private int e; - private short f; - private char g; + boolean a; + double b; + float c; + long d; + int e; + protected short f; + protected char g; public Test() {} diff --git a/j2k/tests/testData/ast/constructors/withManyDefaultParams.kt b/j2k/tests/testData/ast/constructors/withManyDefaultParams.kt index 2e19d45aa08..5afaeb3f3d6 100644 --- a/j2k/tests/testData/ast/constructors/withManyDefaultParams.kt +++ b/j2k/tests/testData/ast/constructors/withManyDefaultParams.kt @@ -1,4 +1,4 @@ -public class Test private(private val myName: String, private var a: Boolean, private var b: Double, private var c: Float, private var d: Long, private var e: Int, private var f: Short, private var g: Char) { +public class Test private(private val myName: String, var a: Boolean, var b: Double, var c: Float, var d: Long, var e: Int, protected var f: Short, protected var g: Char) { class object { public fun create(): Test { diff --git a/j2k/tests/testData/ast/enum/enumWithNameField.kt b/j2k/tests/testData/ast/enum/enumWithNameField.kt index 4dbfe1f26ac..578630d8058 100644 --- a/j2k/tests/testData/ast/enum/enumWithNameField.kt +++ b/j2k/tests/testData/ast/enum/enumWithNameField.kt @@ -1,4 +1,4 @@ enum class E { I - private var name: String = 0 + private val name: String = 0 } \ No newline at end of file diff --git a/j2k/tests/testData/ast/field/classChildExtendsBase.kt b/j2k/tests/testData/ast/field/classChildExtendsBase.kt index 13bc6b8db49..c3cc9fc054a 100644 --- a/j2k/tests/testData/ast/field/classChildExtendsBase.kt +++ b/j2k/tests/testData/ast/field/classChildExtendsBase.kt @@ -1,7 +1,7 @@ class Base() { - private var myFirst: String = 0 + private val myFirst: String = 0 } class Child() : Base() { - private var mySecond: String = 0 + private val mySecond: String = 0 } \ No newline at end of file diff --git a/j2k/tests/testData/ast/field/privateField.kt b/j2k/tests/testData/ast/field/privateField.kt index f321996b3fe..f3e87b44ca0 100644 --- a/j2k/tests/testData/ast/field/privateField.kt +++ b/j2k/tests/testData/ast/field/privateField.kt @@ -1,3 +1,3 @@ class C() { - private var f: Foo = 0 + private val f: Foo = 0 } \ No newline at end of file diff --git a/j2k/tests/testData/ast/field/specifyType.java b/j2k/tests/testData/ast/field/specifyType.java index 47d819aade2..14a0e0cf7db 100644 --- a/j2k/tests/testData/ast/field/specifyType.java +++ b/j2k/tests/testData/ast/field/specifyType.java @@ -20,6 +20,7 @@ class A { String foo() { return "x"; } void bar() { + field5 = new ArrayList(); field7++; field8++; field9 = null; diff --git a/j2k/tests/testData/ast/field/specifyType.kt b/j2k/tests/testData/ast/field/specifyType.kt index 9d149164e07..57d4029693f 100644 --- a/j2k/tests/testData/ast/field/specifyType.kt +++ b/j2k/tests/testData/ast/field/specifyType.kt @@ -21,6 +21,7 @@ class A() { } fun bar() { + field5 = ArrayList() field7++ field8++ field9 = null diff --git a/j2k/tests/testData/ast/field/valOrVar.java b/j2k/tests/testData/ast/field/valOrVar.java new file mode 100644 index 00000000000..1d292dbfc26 --- /dev/null +++ b/j2k/tests/testData/ast/field/valOrVar.java @@ -0,0 +1,12 @@ +//file +class A { + private final int field1 = 0; + private int field2 = 0; + private int field3 = 0; + final int field4 = 0; + int field5 = 0; + + void foo() { + field3 = field2; + } +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/field/valOrVar.kt b/j2k/tests/testData/ast/field/valOrVar.kt new file mode 100644 index 00000000000..68817a0b885 --- /dev/null +++ b/j2k/tests/testData/ast/field/valOrVar.kt @@ -0,0 +1,11 @@ +class A() { + private val field1 = 0 + private val field2 = 0 + private var field3 = 0 + val field4 = 0 + var field5 = 0 + + fun foo() { + field3 = field2 + } +} \ No newline at end of file diff --git a/j2k/tests/testData/ast/issues/comments.kt b/j2k/tests/testData/ast/issues/comments.kt index fc29fd34d76..9ccc6394f66 100644 --- a/j2k/tests/testData/ast/issues/comments.kt +++ b/j2k/tests/testData/ast/issues/comments.kt @@ -15,7 +15,7 @@ class C() { /** * This is a field doc comment. */ - private var i: Int = 0 + private val i: Int = 0 /** * This is a function doc comment. diff --git a/j2k/tests/testData/ast/nullability/FieldComparedWithNull.kt b/j2k/tests/testData/ast/nullability/FieldComparedWithNull.kt index 7b8d014387f..f959711ac1e 100644 --- a/j2k/tests/testData/ast/nullability/FieldComparedWithNull.kt +++ b/j2k/tests/testData/ast/nullability/FieldComparedWithNull.kt @@ -1,5 +1,5 @@ class C() { - private var s: String? = x() + private val s = x() fun foo() { if (s == null) { diff --git a/j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.java b/j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.java index bb34adba462..e8bf96c57d5 100644 --- a/j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.java +++ b/j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.java @@ -8,10 +8,4 @@ class A { final List field2 = new ArrayList(); public final int field3 = 0; protected final int field4 = 0; - - private List field5 = new ArrayList(); - List field6 = new ArrayList(); - - private int field7 = 0; - int field8 = 0; } \ No newline at end of file diff --git a/j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.kt b/j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.kt index fa48c065aa7..72942153033 100644 --- a/j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.kt +++ b/j2k/tests/testData/ast/settings/specifyFieldTypeByDefault.kt @@ -7,10 +7,4 @@ class A() { val field2: List = ArrayList() public val field3: Int = 0 protected val field4: Int = 0 - - private var field5: List = ArrayList() - var field6: List = ArrayList() - - private var field7: Int = 0 - var field8: Int = 0 } \ No newline at end of file