From 3fa6882c8ce74e7b90acb628998eb49af47d7ad3 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 16 Jan 2012 15:05:31 +0400 Subject: [PATCH] KT-1016 Add initializers for fields more correctly --- src/org/jetbrains/jet/j2k/Converter.java | 14 +++++++------ .../jetbrains/jet/j2k/ast/EnumConstant.java | 2 +- src/org/jetbrains/jet/j2k/ast/Field.java | 21 ++++++++++--------- .../ast/annotations/file/jetbrainsNotNull.kt | 6 +++--- .../ast/constructors/file/allCallsPrimary2.kt | 6 +++--- .../ast/constructors/file/customerBuilder.kt | 16 +++++++------- .../constructors/file/genericIdentifier.kt | 8 +++---- testData/ast/constructors/file/identifier.kt | 8 +++---- .../file/withManyDefaultParams.kt | 16 +++++++------- testData/ast/enum/class/colorEnum.kt | 8 +++---- .../fieldsWithPrimaryPrivateConstructor.kt | 6 +++--- .../enum/class/primaryPrivateConstructor.kt | 6 +++--- .../identifier/file/finalFieldReference.kt | 8 +++---- .../file/classOneExtendsBaseGeneric.kt | 2 +- ...dsBaseWithZeroParamsNonEmptyConstructor.kt | 2 +- testData/ast/issues/file/kt-1016.jav | 8 +++++++ testData/ast/issues/file/kt-1016.kt | 7 +++++++ testData/ast/issues/file/kt-638.kt | 8 +++---- testData/ast/issues/file/kt-836.kt | 6 +++--- testData/ast/issues/file/kt-837.kt | 6 +++--- testData/ast/issues/file/kt-963.kt | 7 +++++++ 21 files changed, 98 insertions(+), 73 deletions(-) create mode 100644 testData/ast/issues/file/kt-1016.jav create mode 100644 testData/ast/issues/file/kt-1016.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 3e59e0f47df..4ed80d216c5 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -12,6 +12,7 @@ import org.jetbrains.jet.j2k.visitors.*; import java.util.*; +import static org.jetbrains.jet.j2k.ConverterUtil.countWritingAccesses; import static org.jetbrains.jet.j2k.ConverterUtil.createMainFunction; import static org.jetbrains.jet.j2k.visitors.TypeVisitor.*; @@ -99,7 +100,7 @@ public class Converter { List members = new LinkedList(); for (PsiElement e : psiClass.getChildren()) { if (e instanceof PsiMethod) members.add(methodToFunction((PsiMethod) e, true)); - else if (e instanceof PsiField) members.add(fieldToField((PsiField) e)); + else if (e instanceof PsiField) members.add(fieldToField((PsiField) e, psiClass)); else if (e instanceof PsiClass) members.add(classToClass((PsiClass) e)); else if (e instanceof PsiClassInitializer) members.add(initializerToInitializer((PsiClassInitializer) e)); else if (e instanceof PsiMember) System.out.println(e.getClass() + " " + e.getText()); @@ -147,7 +148,7 @@ public class Converter { @NotNull private static Class classToClass(@NotNull PsiClass psiClass) { final Set modifiers = modifiersListToModifiersSet(psiClass.getModifierList()); - final List fields = fieldsToFieldList(psiClass.getFields()); + final List fields = fieldsToFieldList(psiClass.getFields(), psiClass); final List typeParameters = elementsToElementList(psiClass.getTypeParameters()); final List implementsTypes = typesToNotNullableTypeList(psiClass.getImplementsListTypes()); final List extendsTypes = typesToNotNullableTypeList(psiClass.getExtendsListTypes()); @@ -260,14 +261,14 @@ public class Converter { } @NotNull - private static List fieldsToFieldList(@NotNull PsiField[] fields) { + private static List fieldsToFieldList(@NotNull PsiField[] fields, PsiClass psiClass) { List result = new LinkedList(); - for (PsiField f : fields) result.add(fieldToField(f)); + for (PsiField f : fields) result.add(fieldToField(f, psiClass)); return result; } @NotNull - private static Field fieldToField(@NotNull PsiField field) { + private static Field fieldToField(@NotNull PsiField field, PsiClass psiClass) { Set modifiers = modifiersListToModifiersSet(field.getModifierList()); if (field instanceof PsiEnumConstant) // TODO: remove instanceof return new EnumConstant( @@ -280,7 +281,8 @@ public class Converter { new IdentifierImpl(field.getName()), // TODO modifiers, typeToType(field.getType()), - createSureCallOnlyForChain(field.getInitializer(), field.getType()) // TODO: add modifiers + createSureCallOnlyForChain(field.getInitializer(), field.getType()), // TODO: add modifiers + countWritingAccesses(field, psiClass) ); } diff --git a/src/org/jetbrains/jet/j2k/ast/EnumConstant.java b/src/org/jetbrains/jet/j2k/ast/EnumConstant.java index d80ffd3b1eb..d9aba8ef463 100644 --- a/src/org/jetbrains/jet/j2k/ast/EnumConstant.java +++ b/src/org/jetbrains/jet/j2k/ast/EnumConstant.java @@ -9,7 +9,7 @@ import java.util.Set; */ public class EnumConstant extends Field { public EnumConstant(Identifier identifier, Set modifiers, @NotNull Type type, Element params) { - super(identifier, modifiers, type.convertedToNotNull(), params); + super(identifier, modifiers, type.convertedToNotNull(), params, 0); } @NotNull diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index 8c2bbde5b94..35e364aa09f 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -14,11 +14,13 @@ import static org.jetbrains.jet.j2k.Converter.getDefaultInitializer; */ public class Field extends Member { final Identifier myIdentifier; + private final int myWritingAccesses; final Type myType; final Element myInitializer; - public Field(Identifier identifier, Set modifiers, Type type, Element initializer) { + public Field(Identifier identifier, Set modifiers, Type type, Element initializer, int writingAccesses) { myIdentifier = identifier; + myWritingAccesses = writingAccesses; myModifiers = modifiers; myType = type; myInitializer = initializer; @@ -45,7 +47,7 @@ public class Field extends Member { modifierList.add(accessModifier()); - modifierList.add(myModifiers.contains(Modifier.FINAL) ? "val" : "var"); + modifierList.add(isVal() ? "val" : "var"); if (modifierList.size() > 0) return AstUtil.join(modifierList, SPACE) + SPACE; @@ -53,24 +55,23 @@ public class Field extends Member { return EMPTY; } + public boolean isVal() { + return myModifiers.contains(Modifier.FINAL); + } + @Override public boolean isStatic() { return myModifiers.contains(Modifier.STATIC); } - public boolean isFinal() { - return myModifiers.contains(Modifier.FINAL); - } - @NotNull @Override public String toKotlin() { - String modifier = modifiersToKotlin(); + final String declaration = modifiersToKotlin() + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); if (myInitializer.isEmpty()) - return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + EQUAL + SPACE + getDefaultInitializer(this); + return declaration + (isVal() && !isStatic() && myWritingAccesses == 1 ? EMPTY : SPACE + EQUAL + SPACE + getDefaultInitializer(this)); - return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + - EQUAL + SPACE + myInitializer.toKotlin(); + return declaration + SPACE + EQUAL + SPACE + myInitializer.toKotlin(); } } \ No newline at end of file diff --git a/testData/ast/annotations/file/jetbrainsNotNull.kt b/testData/ast/annotations/file/jetbrainsNotNull.kt index 9213f5f8e4f..0e30c303511 100644 --- a/testData/ast/annotations/file/jetbrainsNotNull.kt +++ b/testData/ast/annotations/file/jetbrainsNotNull.kt @@ -1,8 +1,5 @@ package test public open class Test(str : String) { -{ -myStr = str -} var myStr : String? = "String2" open public fun sout(str : String) : Unit { System.out?.println(str) @@ -17,4 +14,7 @@ sout(test) sout(dummy(test)) Test(test) } +{ +myStr = str +} } \ No newline at end of file diff --git a/testData/ast/constructors/file/allCallsPrimary2.kt b/testData/ast/constructors/file/allCallsPrimary2.kt index 31a0f698398..312f31d82f6 100644 --- a/testData/ast/constructors/file/allCallsPrimary2.kt +++ b/testData/ast/constructors/file/allCallsPrimary2.kt @@ -1,12 +1,12 @@ open class C(arg1 : Int) { +val myArg1 : Int +var myArg2 : Int = 0 +var myArg3 : Int = 0 { myArg1 = arg1 myArg2 = 0 myArg3 = 0 } -val myArg1 : Int = 0 -var myArg2 : Int = 0 -var myArg3 : Int = 0 class object { open fun init(arg1 : Int, arg2 : Int, arg3 : Int) : C { val __ = C(arg1) diff --git a/testData/ast/constructors/file/customerBuilder.kt b/testData/ast/constructors/file/customerBuilder.kt index efad343539a..1c0cd6a13e4 100644 --- a/testData/ast/constructors/file/customerBuilder.kt +++ b/testData/ast/constructors/file/customerBuilder.kt @@ -1,13 +1,7 @@ package org.test.customer open class Customer(first : String?, last : String?) { -{ -doSmthBefore() -_firstName = first -_lastName = last -doSmthAfter() -} -public val _firstName : String? = null -public val _lastName : String? = null +public val _firstName : String? +public val _lastName : String? open public fun getFirstName() : String? { return _firstName } @@ -18,6 +12,12 @@ open private fun doSmthBefore() : Unit { } open private fun doSmthAfter() : Unit { } +{ +doSmthBefore() +_firstName = first +_lastName = last +doSmthAfter() +} } open class CustomerBuilder() { public var _firstName : String? = "Homer" diff --git a/testData/ast/constructors/file/genericIdentifier.kt b/testData/ast/constructors/file/genericIdentifier.kt index ed47317c8d5..d4bbdd791bd 100644 --- a/testData/ast/constructors/file/genericIdentifier.kt +++ b/testData/ast/constructors/file/genericIdentifier.kt @@ -1,14 +1,14 @@ public open class Identifier(_myName : T?, _myHasDollar : Boolean) { -{ -myName = _myName -myHasDollar = _myHasDollar -} private val myName : T? = null private var myHasDollar : Boolean = false private var myNullable : Boolean = true open public fun getName() : T? { return myName } +{ +myName = _myName +myHasDollar = _myHasDollar +} class object { open public fun init(name : T?) : Identifier { val __ = Identifier(name, false) diff --git a/testData/ast/constructors/file/identifier.kt b/testData/ast/constructors/file/identifier.kt index 4c296879705..ba304bedf86 100644 --- a/testData/ast/constructors/file/identifier.kt +++ b/testData/ast/constructors/file/identifier.kt @@ -1,14 +1,14 @@ public open class Identifier(_myName : String?, _myHasDollar : Boolean) { -{ -myName = _myName -myHasDollar = _myHasDollar -} private val myName : String? = null private var myHasDollar : Boolean = false private var myNullable : Boolean = true open public fun getName() : String? { return myName } +{ +myName = _myName +myHasDollar = _myHasDollar +} class object { open public fun init(name : String?) : Identifier { val __ = Identifier(name, false) diff --git a/testData/ast/constructors/file/withManyDefaultParams.kt b/testData/ast/constructors/file/withManyDefaultParams.kt index c18bb2aeeaf..276b6d398b4 100644 --- a/testData/ast/constructors/file/withManyDefaultParams.kt +++ b/testData/ast/constructors/file/withManyDefaultParams.kt @@ -1,4 +1,12 @@ public open class Test(_myName : String?, _a : Boolean, _b : Double, _c : Float, _d : Long, _e : Int, _f : Short, _g : Char) { +private val myName : String? +private var a : Boolean = false +private var b : Double = 0.dbl +private var c : Float = 0.flt +private var d : Long = 0 +private var e : Int = 0 +private var f : Short = 0 +private var g : Char = ' ' { myName = _myName a = _a @@ -9,14 +17,6 @@ e = _e f = _f g = _g } -private val myName : String? = null -private var a : Boolean = false -private var b : Double = 0.dbl -private var c : Float = 0.flt -private var d : Long = 0 -private var e : Int = 0 -private var f : Short = 0 -private var g : Char = ' ' class object { open public fun init() : Test { val __ = Test(null, false, 0.dbl, 0.flt, 0, 0, 0, ' ') diff --git a/testData/ast/enum/class/colorEnum.kt b/testData/ast/enum/class/colorEnum.kt index af42b240e68..3f4198497a5 100644 --- a/testData/ast/enum/class/colorEnum.kt +++ b/testData/ast/enum/class/colorEnum.kt @@ -1,14 +1,14 @@ package demo enum class MyEnum(_color : Int) { -{ -color = _color -} RED : MyEnum(10) BLUE : MyEnum(20) -private val color : Int = 0 +private val color : Int public fun getColor() : Int { return color } +{ +color = _color +} public fun name() : String { return "" } public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt index 1795c0b93c4..fa05a558601 100644 --- a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt +++ b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt @@ -1,7 +1,4 @@ enum class Color(c : Int) { -{ -code = c -} WHITE : Color(21) BLACK : Color(22) RED : Color(23) @@ -11,6 +8,9 @@ private var code : Int = 0 public fun getCode() : Int { return code } +{ +code = c +} public fun name() : String { return "" } public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/enum/class/primaryPrivateConstructor.kt b/testData/ast/enum/class/primaryPrivateConstructor.kt index 37be650dc19..7d0338d9a78 100644 --- a/testData/ast/enum/class/primaryPrivateConstructor.kt +++ b/testData/ast/enum/class/primaryPrivateConstructor.kt @@ -1,12 +1,12 @@ package demo enum class Color(c : Int) { -{ -code = c -} private var code : Int = 0 public fun getCode() : Int { return code } +{ +code = c +} public fun name() : String { return "" } public fun order() : Int { return 0 } } \ No newline at end of file diff --git a/testData/ast/identifier/file/finalFieldReference.kt b/testData/ast/identifier/file/finalFieldReference.kt index 1d7011e3e3b..9eca4f6c449 100644 --- a/testData/ast/identifier/file/finalFieldReference.kt +++ b/testData/ast/identifier/file/finalFieldReference.kt @@ -3,11 +3,11 @@ open class `$$$$$`() { open class `$`() { } open class `$$`(`$$$$` : `$$$$$`?) : `$`() { -{ -`$$$` = `$$$$` -} -val `$$$` : `$$$$$`? = null +val `$$$` : `$$$$$`? open public fun `$$$$$$`() : `$$$$$`? { return `$$$` } +{ +`$$$` = `$$$$` +} } \ No newline at end of file diff --git a/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt b/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt index 51aa2aaea5e..a324e8503b5 100644 --- a/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt +++ b/testData/ast/inheritance/file/classOneExtendsBaseGeneric.kt @@ -1,8 +1,8 @@ open class Base(name : T?) { } open class One(name : T?, second : K?) : Base(name) { +private var mySecond : K? = null { mySecond = second } -private var mySecond : K? = null } \ No newline at end of file diff --git a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt index 34975018246..cd9b7f3b8e9 100644 --- a/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt +++ b/testData/ast/inheritance/file/classOneExtendsBaseWithZeroParamsNonEmptyConstructor.kt @@ -1,8 +1,8 @@ open class Base(name : String?) { } open class One(name : String?, second : String?) : Base(name) { +private var mySecond : String? = null { mySecond = second } -private var mySecond : String? = null } \ No newline at end of file diff --git a/testData/ast/issues/file/kt-1016.jav b/testData/ast/issues/file/kt-1016.jav new file mode 100644 index 00000000000..2e7b3a85644 --- /dev/null +++ b/testData/ast/issues/file/kt-1016.jav @@ -0,0 +1,8 @@ +package demo; + +class C { + private final int i; + public C(int i) { + this.i = i; + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-1016.kt b/testData/ast/issues/file/kt-1016.kt new file mode 100644 index 00000000000..801abcf6e5a --- /dev/null +++ b/testData/ast/issues/file/kt-1016.kt @@ -0,0 +1,7 @@ +package demo +open class C(i : Int) { +private val i : Int +{ +this.i = i +} +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-638.kt b/testData/ast/issues/file/kt-638.kt index 9b67dfd15bd..bb436c18cb7 100644 --- a/testData/ast/issues/file/kt-638.kt +++ b/testData/ast/issues/file/kt-638.kt @@ -1,14 +1,14 @@ public open class Identifier(_myName : T?, _myHasDollar : Boolean) { -{ -myName = _myName -myHasDollar = _myHasDollar -} private val myName : T? = null private var myHasDollar : Boolean = false private var myNullable : Boolean = true open public fun getName() : T? { return myName } +{ +myName = _myName +myHasDollar = _myHasDollar +} class object { open public fun init(name : T?) : Identifier { val __ = Identifier(name, false) diff --git a/testData/ast/issues/file/kt-836.kt b/testData/ast/issues/file/kt-836.kt index 8b761878378..d7ab78c24fd 100644 --- a/testData/ast/issues/file/kt-836.kt +++ b/testData/ast/issues/file/kt-836.kt @@ -1,13 +1,13 @@ package com.voltvoodoo.saplo4j.model import java.io.Serializable public open class Language(code : String?) : Serializable { -{ -this.code = code -} protected var code : String? = null override public fun toString() : String? { return this.code } +{ +this.code = code +} } open class Base() { open fun test() : Unit { diff --git a/testData/ast/issues/file/kt-837.kt b/testData/ast/issues/file/kt-837.kt index 7f6e2e5c63b..7aabbfc9c55 100644 --- a/testData/ast/issues/file/kt-837.kt +++ b/testData/ast/issues/file/kt-837.kt @@ -1,13 +1,13 @@ package com.voltvoodoo.saplo4j.model import java.io.Serializable public open class Language(code : String?) : Serializable { -{ -this.code = code -} protected var code : String? = null open public fun equals(other : Language?) : Boolean { return other?.toString()?.equals(this.toString()).sure() } +{ +this.code = code +} class object { public var ENGLISH : Language? = Language("en") public var SWEDISH : Language? = Language("sv") diff --git a/testData/ast/issues/file/kt-963.kt b/testData/ast/issues/file/kt-963.kt index e69de29bb2d..3b22ff9d391 100644 --- a/testData/ast/issues/file/kt-963.kt +++ b/testData/ast/issues/file/kt-963.kt @@ -0,0 +1,7 @@ +package demo +open class C(a : Int) { +var abc : Int = 0 +{ +abc = (a * 2) +} +} \ No newline at end of file