Java to Kotlin converter: declare private field with no writes as val

This commit is contained in:
Valentin Kipyatkov
2014-06-23 19:28:37 +04:00
parent 07bbab3ea0
commit 5a8ab41948
20 changed files with 59 additions and 41 deletions
+1 -1
View File
@@ -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)) ||
@@ -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
}
}
}
+10 -1
View File
@@ -92,4 +92,13 @@ fun PsiElement.isInSingleLine(): Boolean {
child = child!!.getNextSibling()
}
return true
}
}
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
}
}
@@ -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");
@@ -9,10 +9,10 @@ Anon6(array("x", "y"))
Anon7(javaClass<String>(), javaClass<StringBuilder>())
Anon8(classes = *array(javaClass<String>(), javaClass<StringBuilder>()))
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
+1 -1
View File
@@ -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 {
}
@@ -1,3 +1,3 @@
class A() {
private var isOpen = true // ideally should be atomic boolean
private val isOpen = true // ideally should be atomic boolean
}
@@ -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() {}
@@ -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 {
@@ -1,4 +1,4 @@
enum class E {
I
private var name: String = 0
private val name: String = 0
}
@@ -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
}
+1 -1
View File
@@ -1,3 +1,3 @@
class C() {
private var f: Foo = 0
private val f: Foo = 0
}
@@ -20,6 +20,7 @@ class A {
String foo() { return "x"; }
void bar() {
field5 = new ArrayList<String>();
field7++;
field8++;
field9 = null;
@@ -21,6 +21,7 @@ class A() {
}
fun bar() {
field5 = ArrayList<String>()
field7++
field8++
field9 = null
@@ -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;
}
}
+11
View File
@@ -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
}
}
+1 -1
View File
@@ -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.
@@ -1,5 +1,5 @@
class C() {
private var s: String? = x()
private val s = x()
fun foo() {
if (s == null) {
@@ -8,10 +8,4 @@ class A {
final List<String> field2 = new ArrayList<String>();
public final int field3 = 0;
protected final int field4 = 0;
private List<String> field5 = new ArrayList<String>();
List<String> field6 = new ArrayList<String>();
private int field7 = 0;
int field8 = 0;
}
@@ -7,10 +7,4 @@ class A() {
val field2: List<String> = ArrayList<String>()
public val field3: Int = 0
protected val field4: Int = 0
private var field5: List<String> = ArrayList<String>()
var field6: List<String> = ArrayList<String>()
private var field7: Int = 0
var field8: Int = 0
}