class initializers supported

This commit is contained in:
Sergey Ignatov
2011-11-16 18:10:44 +04:00
parent 532142d12a
commit 947a5bf5d8
10 changed files with 84 additions and 13 deletions
+21 -4
View File
@@ -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<Class> innerClasses = classesToClassList(psiClass.getAllInnerClasses());
final List<Function> methods = methodsToFunctionList(psiClass.getMethods());
final List<Field> fields = fieldsToFieldList(psiClass.getFields());
final List<Initializer> anonymousInitializers = initializersToInitializerList(psiClass.getInitializers());
final List<Element> typeParameters = elementsToElementList(psiClass.getTypeParameters());
final List<Type> implementsTypes = typesToNotNullableTypeList(psiClass.getImplementsListTypes());
final List<Type> extendsTypes = typesToNotNullableTypeList(psiClass.getExtendsListTypes());
@@ -161,11 +163,26 @@ public class Converter {
}
if (psiClass.isInterface())
return new Trait(name, modifiers, typeParameters, extendsTypes, Collections.<Expression>emptyList(), implementsTypes, innerClasses, methods, fields);
return new Trait(name, modifiers, typeParameters, extendsTypes, Collections.<Expression>emptyList(), implementsTypes, innerClasses, methods, fields, anonymousInitializers);
if (psiClass.isEnum())
return new Enum(name, modifiers, typeParameters, Collections.<Type>emptyList(), Collections.<Expression>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<Initializer> initializersToInitializerList(PsiClassInitializer[] initializers) {
List<Initializer> result = new LinkedList<Initializer>();
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) {
@@ -9,7 +9,7 @@ import java.util.List;
* @author ignatov
*/
public class AnonymousClass extends Class {
public AnonymousClass(List<Class> innerClasses, List<Function> methods, List<Field> fields) {
public AnonymousClass(List<Class> innerClasses, List<Function> methods, List<Field> fields, List<Initializer> initializers) {
super(new IdentifierImpl("anonClass"),
Collections.<String>emptySet(),
Collections.<Element>emptyList(),
@@ -18,7 +18,8 @@ public class AnonymousClass extends Class {
Collections.<Type>emptyList(),
innerClasses,
methods,
fields);
fields,
initializers);
}
@NotNull
+7 -2
View File
@@ -18,6 +18,7 @@ public class Class extends Member {
String TYPE = "class";
final Identifier myName;
private final List<Expression> myBaseClassParams;
private List<Initializer> myInitializers;
private final List<Element> myTypeParameters;
private final List<Type> myExtendsTypes;
private final List<Type> myImplementsTypes;
@@ -26,7 +27,7 @@ public class Class extends Member {
final List<Field> myFields;
public Class(Identifier name, Set<String> modifiers, List<Element> typeParameters, List<Type> extendsTypes,
List<Expression> baseClassParams, List<Type> implementsTypes, List<Class> innerClasses, List<Function> methods, List<Field> fields) {
List<Expression> baseClassParams, List<Type> implementsTypes, List<Class> innerClasses, List<Function> methods, List<Field> fields, List<Initializer> 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<Member> staticMethods = new LinkedList<Member>(secondaryConstructorsAsStaticInitFunction());
staticMethods.addAll(getStatic(methodsExceptConstructors()));
final List<Member> staticFields = getStatic(myFields);
final List<Member> staticInitializers = getStatic(myInitializers);
final List<Member> 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 +
"}";
+2 -3
View File
@@ -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<String> modifiers, List<Element> typeParameters, List<Type> extendsTypes, List<Expression> baseClassParams, List<Type> implementsTypes, List<Class> innerClasses, List<Function> methods, List<Field> fields) {
super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields);
public Enum(Identifier name, Set<String> modifiers, List<Element> typeParameters, List<Type> extendsTypes, List<Expression> baseClassParams, List<Type> implementsTypes, List<Class> innerClasses, List<Function> methods, List<Field> fields, List<Initializer> initializers) {
super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields, initializers);
}
String primaryConstructorSignatureToKotlin() {
@@ -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<String> modifiers) {
myBlock = block;
myModifiers = modifiers;
}
@NotNull
@Override
public String toKotlin() {
return myBlock.toKotlin();
}
}
+2 -2
View File
@@ -7,8 +7,8 @@ import java.util.Set;
* @author ignatov
*/
public class Trait extends Class {
public Trait(Identifier name, Set<String> modifiers, List<Element> typeParameters, List<Type> extendsTypes, List<Expression> baseClassParams, List<Type> implementsTypes, List<Class> innerClasses, List<Function> methods, List<Field> fields) {
super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields);
public Trait(Identifier name, Set<String> modifiers, List<Element> typeParameters, List<Type> extendsTypes, List<Expression> baseClassParams, List<Type> implementsTypes, List<Class> innerClasses, List<Function> methods, List<Field> fields, List<Initializer> initializers) {
super(name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, innerClasses, methods, fields, initializers);
TYPE = "trait";
}
@@ -0,0 +1,6 @@
class Test {
String str;
{
str = "Ola";
}
}
@@ -0,0 +1,6 @@
open class Test() {
var str : String?
{
str = "Ola"
}
}
@@ -0,0 +1,6 @@
class Test {
String str;
static {
str = "Ola";
}
}
@@ -0,0 +1,8 @@
open class Test() {
var str : String?
class object {
{
str = "Ola"
}
}
}