From 947a5bf5d876203dea08b6912548f2f1e0b3e6c9 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 16 Nov 2011 18:10:44 +0400 Subject: [PATCH] class initializers supported --- src/org/jetbrains/jet/j2k/Converter.java | 25 ++++++++++++++++--- .../jetbrains/jet/j2k/ast/AnonymousClass.java | 5 ++-- src/org/jetbrains/jet/j2k/ast/Class.java | 9 +++++-- src/org/jetbrains/jet/j2k/ast/Enum.java | 5 ++-- .../jetbrains/jet/j2k/ast/Initializer.java | 23 +++++++++++++++++ src/org/jetbrains/jet/j2k/ast/Trait.java | 4 +-- .../ast/anonymousBlock/file/oneAnonBlock.jav | 6 +++++ .../ast/anonymousBlock/file/oneAnonBlock.kt | 6 +++++ .../file/oneStaticAnonBlock.jav | 6 +++++ .../anonymousBlock/file/oneStaticAnonBlock.kt | 8 ++++++ 10 files changed, 84 insertions(+), 13 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/Initializer.java create mode 100644 testData/ast/anonymousBlock/file/oneAnonBlock.jav create mode 100644 testData/ast/anonymousBlock/file/oneAnonBlock.kt create mode 100644 testData/ast/anonymousBlock/file/oneStaticAnonBlock.jav create mode 100644 testData/ast/anonymousBlock/file/oneStaticAnonBlock.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 0b8c079de5f..27bb01f3681 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -42,7 +42,8 @@ public class Converter { return new AnonymousClass( classesToClassList(anonymousClass.getAllInnerClasses()), methodsToFunctionList(anonymousClass.getMethods()), - fieldsToFieldList(anonymousClass.getAllFields()) + fieldsToFieldList(anonymousClass.getAllFields()), + initializersToInitializerList(anonymousClass.getInitializers()) ); } @@ -83,6 +84,7 @@ public class Converter { final List innerClasses = classesToClassList(psiClass.getAllInnerClasses()); final List methods = methodsToFunctionList(psiClass.getMethods()); final List fields = fieldsToFieldList(psiClass.getFields()); + final List anonymousInitializers = initializersToInitializerList(psiClass.getInitializers()); final List typeParameters = elementsToElementList(psiClass.getTypeParameters()); final List implementsTypes = typesToNotNullableTypeList(psiClass.getImplementsListTypes()); final List extendsTypes = typesToNotNullableTypeList(psiClass.getExtendsListTypes()); @@ -161,11 +163,26 @@ public class Converter { } if (psiClass.isInterface()) - return new Trait(name, modifiers, typeParameters, extendsTypes, Collections.emptyList(), implementsTypes, innerClasses, methods, fields); + return new Trait(name, modifiers, typeParameters, extendsTypes, Collections.emptyList(), implementsTypes, innerClasses, methods, fields, anonymousInitializers); if (psiClass.isEnum()) return new Enum(name, modifiers, typeParameters, Collections.emptyList(), Collections.emptyList(), implementsTypes, - innerClasses, methods, fieldsToFieldListForEnums(psiClass.getAllFields())); - return new Class(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields); + innerClasses, methods, fieldsToFieldListForEnums(psiClass.getAllFields()), anonymousInitializers); + return new Class(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields, anonymousInitializers); + } + + @NotNull + private static List initializersToInitializerList(PsiClassInitializer[] initializers) { + List result = new LinkedList(); + for (PsiClassInitializer i : initializers) result.add(initializerToInitializer(i)); + return result; + } + + @NotNull + private static Initializer initializerToInitializer(PsiClassInitializer i) { + return new Initializer( + blockToBlock(i.getBody(), true), + modifiersListToModifiersSet(i.getModifierList()) + ); } private static String getDefaultInitializer(Field f) { diff --git a/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java b/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java index 66bc42d0340..45fd78b622b 100644 --- a/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java +++ b/src/org/jetbrains/jet/j2k/ast/AnonymousClass.java @@ -9,7 +9,7 @@ import java.util.List; * @author ignatov */ public class AnonymousClass extends Class { - public AnonymousClass(List innerClasses, List methods, List fields) { + public AnonymousClass(List innerClasses, List methods, List fields, List initializers) { super(new IdentifierImpl("anonClass"), Collections.emptySet(), Collections.emptyList(), @@ -18,7 +18,8 @@ public class AnonymousClass extends Class { Collections.emptyList(), innerClasses, methods, - fields); + fields, + initializers); } @NotNull diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index f16e94522fd..519b20bdf80 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -18,6 +18,7 @@ public class Class extends Member { String TYPE = "class"; final Identifier myName; private final List myBaseClassParams; + private List myInitializers; private final List myTypeParameters; private final List myExtendsTypes; private final List myImplementsTypes; @@ -26,7 +27,7 @@ public class Class extends Member { final List myFields; public Class(Identifier name, Set modifiers, List typeParameters, List extendsTypes, - List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields) { + List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields, List initializers) { myName = name; myBaseClassParams = baseClassParams; myModifiers = modifiers; @@ -36,6 +37,7 @@ public class Class extends Member { myInnerClasses = innerClasses; myMethods = methods; myFields = fields; + myInitializers = initializers; } @Nullable @@ -163,6 +165,7 @@ public class Class extends Member { String bodyToKotlin() { return SPACE + "{" + N + AstUtil.joinNodes(getNonStatic(myFields), N) + N + + AstUtil.joinNodes(getNonStatic(myInitializers), N) + N + classObjectToKotlin() + N + AstUtil.joinNodes(getNonStatic(methodsExceptConstructors()), N) + N + AstUtil.joinNodes(getNonStatic(myInnerClasses), N) + N + @@ -190,10 +193,12 @@ public class Class extends Member { final List staticMethods = new LinkedList(secondaryConstructorsAsStaticInitFunction()); staticMethods.addAll(getStatic(methodsExceptConstructors())); final List staticFields = getStatic(myFields); + final List staticInitializers = getStatic(myInitializers); final List staticInnerClasses = getStatic(myInnerClasses); - if (staticFields.size() + staticMethods.size() + staticInnerClasses.size() > 0) { + if (staticFields.size() + staticMethods.size() + staticInnerClasses.size() + staticInitializers.size() > 0) { return "class" + SPACE + "object" + SPACE + "{" + N + AstUtil.joinNodes(staticFields, N) + N + + AstUtil.joinNodes(staticInitializers, N) + N + AstUtil.joinNodes(staticMethods, N) + N + AstUtil.joinNodes(staticInnerClasses, N) + N + "}"; diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index f09b8a4a101..d781e944196 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -1,7 +1,6 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.util.AstUtil; import java.util.List; @@ -11,8 +10,8 @@ import java.util.Set; * @author ignatov */ public class Enum extends Class { - public Enum(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields) { - super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields); + public Enum(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields, List initializers) { + super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields, initializers); } String primaryConstructorSignatureToKotlin() { diff --git a/src/org/jetbrains/jet/j2k/ast/Initializer.java b/src/org/jetbrains/jet/j2k/ast/Initializer.java new file mode 100644 index 00000000000..ef590c25f83 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/Initializer.java @@ -0,0 +1,23 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +import java.util.Set; + +/** + * @author ignatov + */ +public class Initializer extends Member { + private Block myBlock; + + public Initializer(Block block, Set modifiers) { + myBlock = block; + myModifiers = modifiers; + } + + @NotNull + @Override + public String toKotlin() { + return myBlock.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index efc17f38466..8f39b8d9193 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -7,8 +7,8 @@ import java.util.Set; * @author ignatov */ public class Trait extends Class { - public Trait(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields) { - super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields); + public Trait(Identifier name, Set modifiers, List typeParameters, List extendsTypes, List baseClassParams, List implementsTypes, List innerClasses, List methods, List fields, List initializers) { + super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields, initializers); TYPE = "trait"; } diff --git a/testData/ast/anonymousBlock/file/oneAnonBlock.jav b/testData/ast/anonymousBlock/file/oneAnonBlock.jav new file mode 100644 index 00000000000..fba735a5ff0 --- /dev/null +++ b/testData/ast/anonymousBlock/file/oneAnonBlock.jav @@ -0,0 +1,6 @@ +class Test { + String str; + { + str = "Ola"; + } +} \ No newline at end of file diff --git a/testData/ast/anonymousBlock/file/oneAnonBlock.kt b/testData/ast/anonymousBlock/file/oneAnonBlock.kt new file mode 100644 index 00000000000..01212e6bfa9 --- /dev/null +++ b/testData/ast/anonymousBlock/file/oneAnonBlock.kt @@ -0,0 +1,6 @@ +open class Test() { +var str : String? +{ +str = "Ola" +} +} \ No newline at end of file diff --git a/testData/ast/anonymousBlock/file/oneStaticAnonBlock.jav b/testData/ast/anonymousBlock/file/oneStaticAnonBlock.jav new file mode 100644 index 00000000000..c86774f1642 --- /dev/null +++ b/testData/ast/anonymousBlock/file/oneStaticAnonBlock.jav @@ -0,0 +1,6 @@ +class Test { + String str; + static { + str = "Ola"; + } +} \ No newline at end of file diff --git a/testData/ast/anonymousBlock/file/oneStaticAnonBlock.kt b/testData/ast/anonymousBlock/file/oneStaticAnonBlock.kt new file mode 100644 index 00000000000..db002ff151b --- /dev/null +++ b/testData/ast/anonymousBlock/file/oneStaticAnonBlock.kt @@ -0,0 +1,8 @@ +open class Test() { +var str : String? +class object { +{ +str = "Ola" +} +} +} \ No newline at end of file