Java to Kotlin converter: do not generate default field initializer when it's incorrect anyway
This commit is contained in:
@@ -169,7 +169,7 @@ class ConstructorConverter(private val converter: Converter) {
|
|||||||
assert(classBody.primaryConstructorSignature == null)
|
assert(classBody.primaryConstructorSignature == null)
|
||||||
|
|
||||||
val finalOrWithEmptyInitializerFields = classBody.members.filterIsInstance(javaClass<Field>()).filter { it.isVal || it.initializer.isEmpty }
|
val finalOrWithEmptyInitializerFields = classBody.members.filterIsInstance(javaClass<Field>()).filter { it.isVal || it.initializer.isEmpty }
|
||||||
val initializers = HashMap<Field, Expression>()
|
val initializers = HashMap<Field, Expression?>()
|
||||||
for (factoryFunction in classBody.factoryFunctions()) {
|
for (factoryFunction in classBody.factoryFunctions()) {
|
||||||
for (field in finalOrWithEmptyInitializerFields) {
|
for (field in finalOrWithEmptyInitializerFields) {
|
||||||
initializers.put(field, getDefaultInitializer(field))
|
initializers.put(field, getDefaultInitializer(field))
|
||||||
@@ -198,9 +198,8 @@ class ConstructorConverter(private val converter: Converter) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val initializer = MethodCallExpression.buildNotNull(null,
|
val arguments = finalOrWithEmptyInitializerFields.map { initializers[it] ?: LiteralExpression("null").assignNoPrototype() }
|
||||||
className.name,
|
val initializer = MethodCallExpression.buildNotNull(null, className.name, arguments).assignNoPrototype()
|
||||||
finalOrWithEmptyInitializerFields.map { initializers[it]!! }).assignNoPrototype()
|
|
||||||
if (statements.isNotEmpty()) {
|
if (statements.isNotEmpty()) {
|
||||||
val localVar = LocalVariable(tempValIdentifier(),
|
val localVar = LocalVariable(tempValIdentifier(),
|
||||||
Annotations.Empty,
|
Annotations.Empty,
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ fun PsiVariable.countWriteAccesses(scope: PsiElement?): Int
|
|||||||
fun PsiVariable.hasWriteAccesses(scope: PsiElement?): Boolean
|
fun PsiVariable.hasWriteAccesses(scope: PsiElement?): Boolean
|
||||||
= if (scope != null) findVariableUsages(this, scope).any { PsiUtil.isAccessedForWriting(it) } else false
|
= 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 t = field.`type`
|
||||||
val result = if (t.isNullable) {
|
val result = if (t.isNullable) {
|
||||||
LiteralExpression("null")
|
LiteralExpression("null")
|
||||||
@@ -64,9 +64,9 @@ fun getDefaultInitializer(field: Field): Expression {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
LiteralExpression("0")
|
null
|
||||||
}
|
}
|
||||||
return result.assignNoPrototype()
|
return result?.assignNoPrototype()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun isVal(field: PsiField): Boolean {
|
fun isVal(field: PsiField): Boolean {
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ class Field(
|
|||||||
|
|
||||||
var initializerToUse = initializer
|
var initializerToUse = initializer
|
||||||
if (initializerToUse.isEmpty && defaultInitializer) {
|
if (initializerToUse.isEmpty && defaultInitializer) {
|
||||||
initializerToUse = getDefaultInitializer(this)
|
initializerToUse = getDefaultInitializer(this) ?: Expression.Empty
|
||||||
}
|
}
|
||||||
if (!initializerToUse.isEmpty) {
|
if (!initializerToUse.isEmpty) {
|
||||||
builder append " = " append initializerToUse
|
builder append " = " append initializerToUse
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
class Test {
|
class Test {
|
||||||
var str: String = 0
|
var str: String
|
||||||
{
|
{
|
||||||
str = "Ola"
|
str = "Ola"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
class Test {
|
class Test {
|
||||||
var str: String = 0
|
var str: String
|
||||||
|
|
||||||
class object {
|
class object {
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
class Library {
|
class Library {
|
||||||
class object {
|
class object {
|
||||||
val ourOut: java.io.PrintStream = 0
|
val ourOut: java.io.PrintStream
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
class Library {
|
class Library {
|
||||||
public val myString: String = 0
|
public val myString: String
|
||||||
}
|
}
|
||||||
|
|
||||||
class User {
|
class User {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
abstract class Shape {
|
abstract class Shape {
|
||||||
public var color: String = 0
|
public var color: String
|
||||||
public fun setColor(c: String) {
|
public fun setColor(c: String) {
|
||||||
color = c
|
color = c
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
class T {
|
class T {
|
||||||
var a: String = 0
|
var a: String
|
||||||
var b: String = 0
|
var b: String
|
||||||
var c = "abc"
|
var c = "abc"
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
class C(x: String) {
|
class C(x: String) {
|
||||||
public var x: Any = 0
|
public var x: Any
|
||||||
|
|
||||||
{
|
{
|
||||||
this.x = x
|
this.x = x
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
class C(x: Any, b: Boolean) {
|
class C(x: Any, b: Boolean) {
|
||||||
public var x: Any = 0
|
public var x: Any
|
||||||
|
|
||||||
{
|
{
|
||||||
if (b) {
|
if (b) {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ public class Test private(private val myName: String, var a: Boolean, var b: Dou
|
|||||||
class object {
|
class object {
|
||||||
|
|
||||||
public fun create(): Test {
|
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 {
|
public fun create(name: String): Test {
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
class C {
|
class C {
|
||||||
var f: Foo = 0
|
var f: Foo
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
class C {
|
class C {
|
||||||
protected var f: Foo = 0
|
protected var f: Foo
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
class C {
|
class C {
|
||||||
public var f: Foo = 0
|
public var f: Foo
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
class C {
|
class C {
|
||||||
var f: Foo = 0
|
var f: Foo
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user