Java to Kotlin converter: declaring locals as var's in most of cases when needed, dropped forceLocalVariableImmutability setting

This commit is contained in:
Valentin Kipyatkov
2014-06-24 20:04:07 +04:00
parent 63ebfe2c03
commit d3b773c0cd
29 changed files with 31 additions and 52 deletions
@@ -18,7 +18,6 @@ package org.jetbrains.jet.j2k
public data class ConverterSettings( public data class ConverterSettings(
var forceNotNullTypes: Boolean, var forceNotNullTypes: Boolean,
var forceLocalVariableImmutability: Boolean,
var specifyLocalVariableTypeByDefault: Boolean, var specifyLocalVariableTypeByDefault: Boolean,
var specifyFieldTypeByDefault: Boolean, var specifyFieldTypeByDefault: Boolean,
var openByDefault: Boolean) { var openByDefault: Boolean) {
@@ -26,7 +25,6 @@ public data class ConverterSettings(
class object { class object {
public val defaultSettings: ConverterSettings = ConverterSettings( public val defaultSettings: ConverterSettings = ConverterSettings(
forceNotNullTypes = true, forceNotNullTypes = true,
forceLocalVariableImmutability = true,
specifyLocalVariableTypeByDefault = false, specifyLocalVariableTypeByDefault = false,
specifyFieldTypeByDefault = false, specifyFieldTypeByDefault = false,
openByDefault = false openByDefault = false
@@ -27,13 +27,15 @@ class ElementVisitor(private val converter: Converter) : JavaElementVisitor() {
protected set protected set
override fun visitLocalVariable(variable: PsiLocalVariable) { override fun visitLocalVariable(variable: PsiLocalVariable) {
val isVal = variable.hasModifierProperty(PsiModifier.FINAL) || !variable.hasWriteAccesses(variable.getContainingMethod()) val isVal = variable.hasModifierProperty(PsiModifier.FINAL) ||
variable.getInitializer() == null/* we do not know actually and prefer val until we have better analysis*/ ||
!variable.hasWriteAccesses(variable.getContainingMethod())
result = LocalVariable(variable.declarationIdentifier(), result = LocalVariable(variable.declarationIdentifier(),
converter.convertAnnotations(variable), converter.convertAnnotations(variable),
converter.convertModifiers(variable), converter.convertModifiers(variable),
converter.variableTypeToDeclare(variable, converter.settings.specifyLocalVariableTypeByDefault, isVal), converter.variableTypeToDeclare(variable, converter.settings.specifyLocalVariableTypeByDefault, isVal),
converter.convertExpression(variable.getInitializer(), variable.getType()), converter.convertExpression(variable.getInitializer(), variable.getType()),
converter.settings.forceLocalVariableImmutability || isVal) isVal)
} }
override fun visitExpressionList(list: PsiExpressionList) { override fun visitExpressionList(list: PsiExpressionList) {
@@ -76,7 +76,6 @@ abstract class AbstractJavaToKotlinConverterTest() : LightIdeaTestCase() {
for ((name, value) in directives) { for ((name, value) in directives) {
when (name) { when (name) {
"forceNotNullTypes" -> settings.forceNotNullTypes = parseBoolean(value) "forceNotNullTypes" -> settings.forceNotNullTypes = parseBoolean(value)
"forceLocalVariableImmutability" -> settings.forceLocalVariableImmutability = parseBoolean(value)
"specifyLocalVariableTypeByDefault" -> settings.specifyLocalVariableTypeByDefault = parseBoolean(value) "specifyLocalVariableTypeByDefault" -> settings.specifyLocalVariableTypeByDefault = parseBoolean(value)
"specifyFieldTypeByDefault" -> settings.specifyFieldTypeByDefault = parseBoolean(value) "specifyFieldTypeByDefault" -> settings.specifyFieldTypeByDefault = parseBoolean(value)
"openByDefault" -> settings.openByDefault = parseBoolean(value) "openByDefault" -> settings.openByDefault = parseBoolean(value)
@@ -2404,11 +2404,6 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("j2k/tests/testData/ast/settings"), Pattern.compile("^(.+)\\.java$"), true); JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("j2k/tests/testData/ast/settings"), Pattern.compile("^(.+)\\.java$"), true);
} }
@TestMetadata("forceLocalVariableImmutability.java")
public void testForceLocalVariableImmutability() throws Exception {
doTest("j2k/tests/testData/ast/settings/forceLocalVariableImmutability.java");
}
@TestMetadata("openByDefault.java") @TestMetadata("openByDefault.java")
public void testOpenByDefault() throws Exception { public void testOpenByDefault() throws Exception {
doTest("j2k/tests/testData/ast/settings/openByDefault.java"); doTest("j2k/tests/testData/ast/settings/openByDefault.java");
@@ -5,7 +5,7 @@ import java.util.BitSet
class Foo() { class Foo() {
fun foo(o: BitSet?) { fun foo(o: BitSet?) {
val o2: BitSet? = o val o2: BitSet? = o
val foo: Int = 0 var foo: Int = 0
foo = o2!!.size() foo = o2!!.size()
} }
} }
@@ -3,7 +3,7 @@ import java.util.BitSet
class Foo() { class Foo() {
fun foo(o: BitSet) { fun foo(o: BitSet) {
val o2 = o val o2 = o
val foo = 0 var foo = 0
foo = o2.size() foo = o2.size()
} }
} }
+2 -2
View File
@@ -2,10 +2,10 @@ import java.util.ArrayList
class Boxing() { class Boxing() {
fun test() { fun test() {
val i: Int? = 0 var i: Int? = 0
val n = 0.0.toFloat() val n = 0.0.toFloat()
i = 1 i = 1
val j = i!! var j = i!!
val k = i!! + 2 val k = i!! + 2
i = null i = null
j = i!! j = i!!
@@ -1,4 +1,4 @@
do { do {
val i = 1 var i = 1
i = i + 1 i = i + 1
} while (a > b) } while (a > b)
+1 -1
View File
@@ -1,5 +1,5 @@
run { run {
val i = 0 var i = 0
while (i < 10) { while (i < 10) {
System.out.println(i) System.out.println(i)
System.out.println(j) System.out.println(j)
@@ -1,8 +1,8 @@
run { run {
val i = 0 var i = 0
while (i < 0) { while (i < 0) {
run { run {
val i = 1 var i = 1
i++ i++
} }
j++ j++
@@ -1,5 +1,5 @@
run { run {
val i = 0 var i = 0
while (i < 0) { while (i < 0) {
j++ j++
i++ i++
+1 -1
View File
@@ -1,5 +1,5 @@
run { run {
val i = 0 var i = 0
while (i < 0) { while (i < 0) {
return i return i
j++ j++
@@ -1,4 +1,4 @@
for (n in list) { for (n in list) {
val i = 1 var i = 1
i++ i++
} }
+1 -1
View File
@@ -1,6 +1,6 @@
class Test() { class Test() {
fun test() { fun test() {
val res = true var res = true
res = res and false res = res and false
res = res or false res = res or false
res = res xor false res = res xor false
@@ -1,7 +1,7 @@
@test for (i in 0..max) { @test for (i in 0..max) {
val n = substring.length() var n = substring.length()
val j = i var j = i
val k = 0 var k = 0
while (n-- != 0) { while (n-- != 0) {
if (searchMe.charAt(j++) != substring.charAt(k++)) { if (searchMe.charAt(j++) != substring.charAt(k++)) {
continue@test continue@test
@@ -2,7 +2,7 @@ package demo
class Test() { class Test() {
fun test() { fun test() {
val name = "$$$$" var name = "$$$$"
name = name.replaceAll("\\$[0-9]+", "\\$") name = name.replaceAll("\\$[0-9]+", "\\$")
val c = '$' val c = '$'
@@ -1,4 +1,4 @@
fun foo(i: Int) { fun foo(i: Int) {
val i1 = i!! var i1 = i!!
i1++ i1++
} }
@@ -1,4 +1,4 @@
fun foo(b: Byte) { fun foo(b: Byte) {
val i = b.toInt() var i = b.toInt()
if (p) i = 10 if (p) i = 10
} }
@@ -1,4 +1,4 @@
fun foo() { fun foo() {
val i: Long = 1 var i: Long = 1
if (p) i = 10 if (p) i = 10
} }
@@ -1,4 +1,4 @@
fun foo() { fun foo() {
val i: Int? = 1 var i: Int? = 1
if (p) i = null if (p) i = null
} }
@@ -1,4 +1,4 @@
fun foo() { fun foo() {
val o: Any? = "" var o: Any? = ""
if (p) o = null if (p) o = null
} }
@@ -4,7 +4,7 @@ trait I {
class C() { class C() {
fun foo(i: I, b: Boolean) { fun foo(i: I, b: Boolean) {
val result: String? = i.getString() var result: String? = i.getString()
if (b) result = null if (b) result = null
if (result != null) { if (result != null) {
print(result) print(result)
@@ -1,6 +1,6 @@
// !specifyLocalVariableTypeByDefault: true // !specifyLocalVariableTypeByDefault: true
fun foo(b: Boolean) { fun foo(b: Boolean) {
val s: String? = "abc" var s: String? = "abc"
if (b) { if (b) {
s = null s = null
} }
@@ -1,6 +1,6 @@
// !specifyLocalVariableTypeByDefault: true // !specifyLocalVariableTypeByDefault: true
fun foo(b: Boolean) { fun foo(b: Boolean) {
val s: String? = null var s: String? = null
if (b) { if (b) {
s = "abc" s = "abc"
} }
@@ -1,8 +0,0 @@
//method
// !forceLocalVariableImmutability: false
public void foo() {
int i = 1;
i++;
String s = "";
s += "a";
}
@@ -1,7 +0,0 @@
// !forceLocalVariableImmutability: false
public fun foo() {
var i = 1
i++
var s = ""
s += "a"
}
@@ -7,7 +7,7 @@ public class SwitchDemo() {
} }
public fun test(i: Int) { public fun test(i: Int) {
val monthString = "<empty>" var monthString = "<empty>"
when (i) { when (i) {
1 -> { 1 -> {
print(1) print(1)
+1 -1
View File
@@ -3,7 +3,7 @@ public class NonDefault() {
public fun main(args: Array<String>) { public fun main(args: Array<String>) {
val value = 3 val value = 3
val valueString = "" var valueString = ""
when (value) { when (value) {
1 -> { 1 -> {
valueString = "ONE" valueString = "ONE"
@@ -1,4 +1,4 @@
while (a > b) { while (a > b) {
val i = 1 var i = 1
i = i + 1 i = i + 1
} }