From 6cc8caa1ebbd199f1f6ef29610e9587233b8201c Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 6 Dec 2011 14:20:14 +0400 Subject: [PATCH] KT-546 Enum constructor invocations --- src/org/jetbrains/jet/j2k/Converter.java | 20 ++++++++++++------- .../jetbrains/jet/j2k/ast/EnumConstant.java | 4 ++-- src/org/jetbrains/jet/j2k/ast/Field.java | 2 +- src/org/jetbrains/jet/j2k/ast/Type.java | 3 ++- testData/ast/enum/class/colorEnum.jav | 16 +++++++++++++++ testData/ast/enum/class/colorEnum.kt | 14 +++++++++++++ ...> fieldsWithPrimaryPrivateConstructor.jav} | 0 .../fieldsWithPrimaryPrivateConstructor.kt | 14 +++++++------ .../enum/class/primaryPrivateConstructor.jav | 2 ++ .../enum/class/primaryPrivateConstructor.kt | 3 ++- 10 files changed, 60 insertions(+), 18 deletions(-) create mode 100644 testData/ast/enum/class/colorEnum.jav create mode 100644 testData/ast/enum/class/colorEnum.kt rename testData/ast/enum/class/{fieldsWithPrimaryPrivateConstructor.java => fieldsWithPrimaryPrivateConstructor.jav} (100%) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 4be21db1074..5abe58a6a52 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -305,11 +305,8 @@ public class Converter { modifiers.add(Modifier.OVERRIDE); if (method.getParent() instanceof PsiClass && ((PsiClass) method.getParent()).isInterface()) modifiers.remove(Modifier.ABSTRACT); - if (method.getParent() instanceof PsiClass) { - final PsiModifierList parentModifierList = ((PsiClass) method.getParent()).getModifierList(); - if (parentModifierList != null && parentModifierList.hasExplicitModifier(Modifier.FINAL)) - modifiers.add(Modifier.NOT_OPEN); - } + if (isNotOpenMethod(method)) + modifiers.add(Modifier.NOT_OPEN); if (method.isConstructor()) { // TODO: simplify boolean isPrimary = isConstructorPrimary(method); @@ -333,6 +330,15 @@ public class Converter { ); } + private static boolean isNotOpenMethod(final PsiMethod method) { + if (method.getParent() instanceof PsiClass) { + final PsiModifierList parentModifierList = ((PsiClass) method.getParent()).getModifierList(); + if ((parentModifierList != null && parentModifierList.hasExplicitModifier(Modifier.FINAL)) || ((PsiClass) method.getParent()).isEnum()) + return true; + } + return false; + } + private static boolean isOverrideAnyMethodExceptMethodsFromObject(@NotNull PsiMethod method) { int counter = 0; for (HierarchicalMethodSignature s : method.getHierarchicalMethodSignature().getSuperSignatures()) { @@ -418,14 +424,14 @@ public class Converter { public static Type typeToType(PsiType type, boolean notNull) { Type result = typeToType(type); if (notNull) - result.convertToNotNull(); + result.convertedToNotNull(); return result; } @NotNull private static List typesToNotNullableTypeList(@NotNull PsiType[] types) { List result = new LinkedList(typesToTypeList(types)); - for (Type p : result) p.convertToNotNull(); + for (Type p : result) p.convertedToNotNull(); return result; } diff --git a/src/org/jetbrains/jet/j2k/ast/EnumConstant.java b/src/org/jetbrains/jet/j2k/ast/EnumConstant.java index a55a1d09abe..d83b2e5c85b 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, Type type, Element params) { - super(identifier, modifiers, type, params); + super(identifier, modifiers, type.convertedToNotNull(), params); } @NotNull @@ -17,6 +17,6 @@ public class EnumConstant extends Field { public String toKotlin() { if (myInitializer.toKotlin().isEmpty()) return myIdentifier.toKotlin(); - return myIdentifier.toKotlin() + "(" + myInitializer.toKotlin() + ")"; + return myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + "(" + myInitializer.toKotlin() + ")"; } } diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index d7afea9cddb..94fa1596b56 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -14,7 +14,7 @@ import static org.jetbrains.jet.j2k.Converter.getDefaultInitializer; */ public class Field extends Member { final Identifier myIdentifier; - private final Type myType; + final Type myType; final Element myInitializer; public Field(Identifier identifier, Set modifiers, Type type, Element initializer) { diff --git a/src/org/jetbrains/jet/j2k/ast/Type.java b/src/org/jetbrains/jet/j2k/ast/Type.java index baf4c23f7ae..901a7b52fd5 100644 --- a/src/org/jetbrains/jet/j2k/ast/Type.java +++ b/src/org/jetbrains/jet/j2k/ast/Type.java @@ -15,8 +15,9 @@ public abstract class Type extends Element { return Kind.TYPE; } - public void convertToNotNull() { + public Type convertedToNotNull() { myNullable = false; + return this; } public boolean isNullable() { diff --git a/testData/ast/enum/class/colorEnum.jav b/testData/ast/enum/class/colorEnum.jav new file mode 100644 index 00000000000..d59c8198ccd --- /dev/null +++ b/testData/ast/enum/class/colorEnum.jav @@ -0,0 +1,16 @@ +package demo; + +enum MyEnum { + RED(10), + BLUE(20); + + private final int color; + + private MyEnum(int _color) { + color = _color; + } + + public int getColor() { + return color; + } +} \ No newline at end of file diff --git a/testData/ast/enum/class/colorEnum.kt b/testData/ast/enum/class/colorEnum.kt new file mode 100644 index 00000000000..15a5f6f6892 --- /dev/null +++ b/testData/ast/enum/class/colorEnum.kt @@ -0,0 +1,14 @@ +namespace demo +enum class MyEnum(_color : Int) { +{ +$color = _color +} +RED : MyEnum(10) +BLUE : MyEnum(20) +private val color : Int = 0 +public fun getColor() : Int { +return 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.java b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.jav similarity index 100% rename from testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.java rename to testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.jav diff --git a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt index cc200c15751..91a687dd847 100644 --- a/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt +++ b/testData/ast/enum/class/fieldsWithPrimaryPrivateConstructor.kt @@ -1,14 +1,16 @@ -enum Color(c: Int) { +enum class Color(c : Int) { +{ +$code = c +} WHITE : Color(21) BLACK : Color(22) RED : Color(23) YELLOW : Color(24) BLUE : Color(25) -private var code : Int -{ -$code = c -} -open public fun getCode() : Int { +private var code : Int = 0 +public fun getCode() : Int { return code } +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.jav b/testData/ast/enum/class/primaryPrivateConstructor.jav index dee69b30e80..7dad6bb265e 100644 --- a/testData/ast/enum/class/primaryPrivateConstructor.jav +++ b/testData/ast/enum/class/primaryPrivateConstructor.jav @@ -1,3 +1,5 @@ +package demo; + enum Color { private int code; diff --git a/testData/ast/enum/class/primaryPrivateConstructor.kt b/testData/ast/enum/class/primaryPrivateConstructor.kt index 6b631b4a643..37889843d8b 100644 --- a/testData/ast/enum/class/primaryPrivateConstructor.kt +++ b/testData/ast/enum/class/primaryPrivateConstructor.kt @@ -1,9 +1,10 @@ +namespace demo enum class Color(c : Int) { { $code = c } private var code : Int = 0 -open public fun getCode() : Int { +public fun getCode() : Int { return code } public fun name() : String { return "" }