From f8a412aea05ab2e6458d3c86767d623ad0f47027 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 26 Jun 2014 15:19:59 +0400 Subject: [PATCH] Java to Kotlin converter: do not generate default field initializer when it's incorrect anyway --- j2k/src/org/jetbrains/jet/j2k/ConstructorConverter.kt | 7 +++---- j2k/src/org/jetbrains/jet/j2k/Utils.kt | 6 +++--- j2k/src/org/jetbrains/jet/j2k/ast/Field.kt | 2 +- j2k/tests/testData/ast/anonymousBlock/oneAnonBlock.kt | 2 +- .../testData/ast/anonymousBlock/oneStaticAnonBlock.kt | 2 +- .../testData/ast/callChainExpression/libraryFieldCall.kt | 2 +- .../ast/callChainExpression/libraryStringFieldCall.kt | 2 +- j2k/tests/testData/ast/class/abstractClassShape.kt | 2 +- j2k/tests/testData/ast/class/classWithMultiplyFields.kt | 4 ++-- .../ast/constructors/fieldsInitializedFromParams6.kt | 2 +- .../ast/constructors/fieldsInitializedFromParams7.kt | 2 +- .../testData/ast/constructors/withManyDefaultParams.kt | 2 +- j2k/tests/testData/ast/field/internalField.kt | 2 +- j2k/tests/testData/ast/field/protectedField.kt | 2 +- j2k/tests/testData/ast/field/publicField.kt | 2 +- j2k/tests/testData/ast/field/varWithoutInit.kt | 2 +- 16 files changed, 21 insertions(+), 22 deletions(-) diff --git a/j2k/src/org/jetbrains/jet/j2k/ConstructorConverter.kt b/j2k/src/org/jetbrains/jet/j2k/ConstructorConverter.kt index 6c0580a20b4..add7f65de02 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ConstructorConverter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ConstructorConverter.kt @@ -169,7 +169,7 @@ class ConstructorConverter(private val converter: Converter) { assert(classBody.primaryConstructorSignature == null) val finalOrWithEmptyInitializerFields = classBody.members.filterIsInstance(javaClass()).filter { it.isVal || it.initializer.isEmpty } - val initializers = HashMap() + val initializers = HashMap() for (factoryFunction in classBody.factoryFunctions()) { for (field in finalOrWithEmptyInitializerFields) { initializers.put(field, getDefaultInitializer(field)) @@ -198,9 +198,8 @@ class ConstructorConverter(private val converter: Converter) { } } - val initializer = MethodCallExpression.buildNotNull(null, - className.name, - finalOrWithEmptyInitializerFields.map { initializers[it]!! }).assignNoPrototype() + val arguments = finalOrWithEmptyInitializerFields.map { initializers[it] ?: LiteralExpression("null").assignNoPrototype() } + val initializer = MethodCallExpression.buildNotNull(null, className.name, arguments).assignNoPrototype() if (statements.isNotEmpty()) { val localVar = LocalVariable(tempValIdentifier(), Annotations.Empty, diff --git a/j2k/src/org/jetbrains/jet/j2k/Utils.kt b/j2k/src/org/jetbrains/jet/j2k/Utils.kt index ed18f606af5..6570b940239 100644 --- a/j2k/src/org/jetbrains/jet/j2k/Utils.kt +++ b/j2k/src/org/jetbrains/jet/j2k/Utils.kt @@ -49,7 +49,7 @@ fun PsiVariable.countWriteAccesses(scope: PsiElement?): Int fun PsiVariable.hasWriteAccesses(scope: PsiElement?): Boolean = if (scope != null) findVariableUsages(this, scope).any { PsiUtil.isAccessedForWriting(it) } else false -fun getDefaultInitializer(field: Field): Expression { +fun getDefaultInitializer(field: Field): Expression? { val t = field.`type` val result = if (t.isNullable) { LiteralExpression("null") @@ -64,9 +64,9 @@ fun getDefaultInitializer(field: Field): Expression { } } else { - LiteralExpression("0") + null } - return result.assignNoPrototype() + return result?.assignNoPrototype() } fun isVal(field: PsiField): Boolean { diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Field.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Field.kt index e3e5acecca2..4cb8768bf52 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Field.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Field.kt @@ -41,7 +41,7 @@ class Field( var initializerToUse = initializer if (initializerToUse.isEmpty && defaultInitializer) { - initializerToUse = getDefaultInitializer(this) + initializerToUse = getDefaultInitializer(this) ?: Expression.Empty } if (!initializerToUse.isEmpty) { builder append " = " append initializerToUse diff --git a/j2k/tests/testData/ast/anonymousBlock/oneAnonBlock.kt b/j2k/tests/testData/ast/anonymousBlock/oneAnonBlock.kt index 7da388fa5ab..e8ceb4740b6 100644 --- a/j2k/tests/testData/ast/anonymousBlock/oneAnonBlock.kt +++ b/j2k/tests/testData/ast/anonymousBlock/oneAnonBlock.kt @@ -1,5 +1,5 @@ class Test { - var str: String = 0 + var str: String { str = "Ola" } diff --git a/j2k/tests/testData/ast/anonymousBlock/oneStaticAnonBlock.kt b/j2k/tests/testData/ast/anonymousBlock/oneStaticAnonBlock.kt index 21526e6bb67..25613503183 100644 --- a/j2k/tests/testData/ast/anonymousBlock/oneStaticAnonBlock.kt +++ b/j2k/tests/testData/ast/anonymousBlock/oneStaticAnonBlock.kt @@ -1,5 +1,5 @@ class Test { - var str: String = 0 + var str: String class object { { diff --git a/j2k/tests/testData/ast/callChainExpression/libraryFieldCall.kt b/j2k/tests/testData/ast/callChainExpression/libraryFieldCall.kt index 49e97445436..5ba0c1e951f 100644 --- a/j2k/tests/testData/ast/callChainExpression/libraryFieldCall.kt +++ b/j2k/tests/testData/ast/callChainExpression/libraryFieldCall.kt @@ -1,6 +1,6 @@ class Library { class object { - val ourOut: java.io.PrintStream = 0 + val ourOut: java.io.PrintStream } } diff --git a/j2k/tests/testData/ast/callChainExpression/libraryStringFieldCall.kt b/j2k/tests/testData/ast/callChainExpression/libraryStringFieldCall.kt index 84a4b411fc8..07f72f3e985 100644 --- a/j2k/tests/testData/ast/callChainExpression/libraryStringFieldCall.kt +++ b/j2k/tests/testData/ast/callChainExpression/libraryStringFieldCall.kt @@ -1,5 +1,5 @@ class Library { - public val myString: String = 0 + public val myString: String } class User { diff --git a/j2k/tests/testData/ast/class/abstractClassShape.kt b/j2k/tests/testData/ast/class/abstractClassShape.kt index e512bca4f76..493d71845fa 100644 --- a/j2k/tests/testData/ast/class/abstractClassShape.kt +++ b/j2k/tests/testData/ast/class/abstractClassShape.kt @@ -1,5 +1,5 @@ abstract class Shape { - public var color: String = 0 + public var color: String public fun setColor(c: String) { color = c } diff --git a/j2k/tests/testData/ast/class/classWithMultiplyFields.kt b/j2k/tests/testData/ast/class/classWithMultiplyFields.kt index a4cd8c89920..e7a76502a02 100644 --- a/j2k/tests/testData/ast/class/classWithMultiplyFields.kt +++ b/j2k/tests/testData/ast/class/classWithMultiplyFields.kt @@ -1,5 +1,5 @@ class T { - var a: String = 0 - var b: String = 0 + var a: String + var b: String var c = "abc" } \ No newline at end of file diff --git a/j2k/tests/testData/ast/constructors/fieldsInitializedFromParams6.kt b/j2k/tests/testData/ast/constructors/fieldsInitializedFromParams6.kt index a508dab0751..9ecfa31aab1 100644 --- a/j2k/tests/testData/ast/constructors/fieldsInitializedFromParams6.kt +++ b/j2k/tests/testData/ast/constructors/fieldsInitializedFromParams6.kt @@ -1,5 +1,5 @@ class C(x: String) { - public var x: Any = 0 + public var x: Any { this.x = x diff --git a/j2k/tests/testData/ast/constructors/fieldsInitializedFromParams7.kt b/j2k/tests/testData/ast/constructors/fieldsInitializedFromParams7.kt index 325673da894..85a8853919b 100644 --- a/j2k/tests/testData/ast/constructors/fieldsInitializedFromParams7.kt +++ b/j2k/tests/testData/ast/constructors/fieldsInitializedFromParams7.kt @@ -1,5 +1,5 @@ class C(x: Any, b: Boolean) { - public var x: Any = 0 + public var x: Any { if (b) { diff --git a/j2k/tests/testData/ast/constructors/withManyDefaultParams.kt b/j2k/tests/testData/ast/constructors/withManyDefaultParams.kt index 91b9fed7541..97ee6880d68 100644 --- a/j2k/tests/testData/ast/constructors/withManyDefaultParams.kt +++ b/j2k/tests/testData/ast/constructors/withManyDefaultParams.kt @@ -2,7 +2,7 @@ public class Test private(private val myName: String, var a: Boolean, var b: Dou class object { public fun create(): Test { - return Test(0, false, 0.toDouble(), 0.toFloat(), 0, 0, 0, ' ') + return Test(null, false, 0.toDouble(), 0.toFloat(), 0, 0, 0, ' ') } public fun create(name: String): Test { diff --git a/j2k/tests/testData/ast/field/internalField.kt b/j2k/tests/testData/ast/field/internalField.kt index c709cdfe4fa..98ee5f59012 100644 --- a/j2k/tests/testData/ast/field/internalField.kt +++ b/j2k/tests/testData/ast/field/internalField.kt @@ -1,3 +1,3 @@ class C { - var f: Foo = 0 + var f: Foo } \ No newline at end of file diff --git a/j2k/tests/testData/ast/field/protectedField.kt b/j2k/tests/testData/ast/field/protectedField.kt index be7b40f6d0d..da883e70d43 100644 --- a/j2k/tests/testData/ast/field/protectedField.kt +++ b/j2k/tests/testData/ast/field/protectedField.kt @@ -1,3 +1,3 @@ class C { - protected var f: Foo = 0 + protected var f: Foo } \ No newline at end of file diff --git a/j2k/tests/testData/ast/field/publicField.kt b/j2k/tests/testData/ast/field/publicField.kt index 31f46499ee0..f68aa9f15cd 100644 --- a/j2k/tests/testData/ast/field/publicField.kt +++ b/j2k/tests/testData/ast/field/publicField.kt @@ -1,3 +1,3 @@ class C { - public var f: Foo = 0 + public var f: Foo } \ No newline at end of file diff --git a/j2k/tests/testData/ast/field/varWithoutInit.kt b/j2k/tests/testData/ast/field/varWithoutInit.kt index c709cdfe4fa..98ee5f59012 100644 --- a/j2k/tests/testData/ast/field/varWithoutInit.kt +++ b/j2k/tests/testData/ast/field/varWithoutInit.kt @@ -1,3 +1,3 @@ class C { - var f: Foo = 0 + var f: Foo } \ No newline at end of file