From fa2483ccfb260fda4646b867698c6d46c8ababe7 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 1 Nov 2011 14:52:25 +0400 Subject: [PATCH] first type parameters implementation for classes added --- src/org/jetbrains/jet/j2k/Converter.java | 9 ++++----- src/org/jetbrains/jet/j2k/ast/Class.java | 10 ++++++++-- src/org/jetbrains/jet/j2k/ast/Enum.java | 6 +++--- src/org/jetbrains/jet/j2k/ast/Trait.java | 4 ++-- .../jetbrains/jet/j2k/ast/TypeParameter.java | 20 +++++++++++++++++++ .../jet/j2k/visitors/ElementVisitor.java | 10 +++++++++- test/org/jetbrains/jet/j2k/ast/ClassTest.java | 7 +++++++ 7 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/TypeParameter.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 25a780351de..d6b909a1903 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -38,17 +38,16 @@ public class Converter { private static Class classToClass(PsiClass psiClass) { final List methods = methodsToFunctionList(psiClass.getMethods(), true); - final List innerClasses = classesToClassList(psiClass.getAllInnerClasses()); - final List fields = fieldsToFieldList(psiClass.getAllFields()); + final List typeParameters = elementsToElementList(psiClass.getTypeParameters()); final IdentifierImpl name = new IdentifierImpl(psiClass.getName()); if (psiClass.isInterface()) - return new Trait(name, innerClasses, methods, fields); + return new Trait(name, typeParameters, innerClasses, methods, fields); if (psiClass.isEnum()) - return new Enum(name, innerClasses, methods, fields); - return new Class(name, innerClasses, methods, fields); + return new Enum(name, typeParameters, innerClasses, methods, fields); + return new Class(name, typeParameters, innerClasses, methods, fields); } private static List fieldsToFieldList(PsiField[] fields) { diff --git a/src/org/jetbrains/jet/j2k/ast/Class.java b/src/org/jetbrains/jet/j2k/ast/Class.java index f67972163bc..0bd640e0868 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -12,12 +12,14 @@ import java.util.List; public class Class extends Node { String TYPE = "class"; final Identifier myName; + final List myTypeParameters; final List myInnerClasses; final List myMethods; final List myFields; - public Class(Identifier name, List innerClasses, List methods, List fields) { + public Class(Identifier name, List typeParameters, List innerClasses, List methods, List fields) { myName = name; + myTypeParameters = typeParameters; myInnerClasses = innerClasses; myMethods = methods; myFields = fields; @@ -32,10 +34,14 @@ public class Class extends Node { return result; } + String typeParametersToKotlin() { + return myTypeParameters.size() > 0 ? "<" + AstUtil.joinNodes(myTypeParameters, COMMA_WITH_SPACE) + ">" : EMPTY; + } + @NotNull @Override public String toKotlin() { - return TYPE + SPACE + myName.toKotlin() + SPACE + "{" + N + + return TYPE + SPACE + myName.toKotlin() + typeParametersToKotlin() + SPACE + "{" + N + AstUtil.joinNodes(myFields, N) + N + AstUtil.joinNodes(methodsExceptConstructors(), N) + N + AstUtil.joinNodes(myInnerClasses, N) + N + diff --git a/src/org/jetbrains/jet/j2k/ast/Enum.java b/src/org/jetbrains/jet/j2k/ast/Enum.java index 3b9ec1e2573..c2fe7466d54 100644 --- a/src/org/jetbrains/jet/j2k/ast/Enum.java +++ b/src/org/jetbrains/jet/j2k/ast/Enum.java @@ -10,8 +10,8 @@ import java.util.List; * @author ignatov */ public class Enum extends Class { - public Enum(Identifier name, List innerClasses, List methods, List fields) { - super(name, innerClasses, methods, fields); + public Enum(Identifier name, List typeParameters, List innerClasses, List methods, List fields) { + super(name, typeParameters, innerClasses, methods, fields); } @Nullable @@ -33,7 +33,7 @@ public class Enum extends Class { @NotNull @Override public String toKotlin() { - return "enum" + SPACE + myName.toKotlin() + primaryConstructorToKotlin() + SPACE + "{" + N + + return "enum" + SPACE + myName.toKotlin() + typeParametersToKotlin() + primaryConstructorToKotlin() + SPACE + "{" + N + AstUtil.joinNodes(myFields, N) + N + AstUtil.joinNodes(methodsExceptConstructors(), N) + N + AstUtil.joinNodes(myInnerClasses, N) + N + diff --git a/src/org/jetbrains/jet/j2k/ast/Trait.java b/src/org/jetbrains/jet/j2k/ast/Trait.java index 90356dccda5..4ae02ccf569 100644 --- a/src/org/jetbrains/jet/j2k/ast/Trait.java +++ b/src/org/jetbrains/jet/j2k/ast/Trait.java @@ -6,8 +6,8 @@ import java.util.List; * @author ignatov */ public class Trait extends Class { - public Trait(Identifier name, List innerClasses, List methods, List fields) { - super(name, innerClasses, methods, fields); + public Trait(Identifier name, List typeParameters, List innerClasses, List methods, List fields) { + super(name, typeParameters, innerClasses, methods, fields); TYPE = "trait"; } } diff --git a/src/org/jetbrains/jet/j2k/ast/TypeParameter.java b/src/org/jetbrains/jet/j2k/ast/TypeParameter.java new file mode 100644 index 00000000000..561e2fa0d78 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/TypeParameter.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class TypeParameter extends Element { + private Identifier myName; + + public TypeParameter(Identifier name) { + myName = name; + } + + @NotNull + @Override + public String toKotlin() { + return myName.toKotlin() + QUESTION; + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index 634696bc6a6..a90fcc8ea1e 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -44,6 +44,14 @@ public class ElementVisitor extends JavaElementVisitor implements Visitor { myResult = new IdentifierImpl(reference.getQualifiedName()); // TODO } + @Override + public void visitTypeParameter(PsiTypeParameter classParameter) { + super.visitTypeParameter(classParameter); + myResult = new TypeParameter( + new IdentifierImpl(classParameter.getName()) + ); + } + @Override public void visitParameterList(PsiParameterList list) { super.visitParameterList(list); @@ -51,4 +59,4 @@ public class ElementVisitor extends JavaElementVisitor implements Visitor { Converter.parametersToParameterList(list.getParameters()) ); } -} +} \ No newline at end of file diff --git a/test/org/jetbrains/jet/j2k/ast/ClassTest.java b/test/org/jetbrains/jet/j2k/ast/ClassTest.java index 67397afe71d..d2a918ed333 100644 --- a/test/org/jetbrains/jet/j2k/ast/ClassTest.java +++ b/test/org/jetbrains/jet/j2k/ast/ClassTest.java @@ -62,4 +62,11 @@ public class ClassTest extends JetTestCaseBase { "}\n" + "}"); } + + public void testGenericClass() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class Entry {}"), + "class Entry { }" + ); + } }