From b7ea5b73d15a1501bdbeeb02b313278f53bb4a72 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Tue, 1 Nov 2011 17:38:58 +0400 Subject: [PATCH] simple inheritance added for classes, traits and enums --- src/org/jetbrains/jet/j2k/Converter.java | 12 ++++++++--- src/org/jetbrains/jet/j2k/ast/Class.java | 18 ++++++++++++++-- src/org/jetbrains/jet/j2k/ast/Enum.java | 6 +++--- src/org/jetbrains/jet/j2k/ast/Trait.java | 4 ++-- test/org/jetbrains/jet/j2k/ast/ClassTest.java | 21 +++++++++++++++++++ test/org/jetbrains/jet/j2k/ast/EnumTest.java | 14 +++++++++++++ test/org/jetbrains/jet/j2k/ast/TraitTest.java | 16 +++++++++++++- 7 files changed, 80 insertions(+), 11 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 8c991f8a8b0..4d2e986fa80 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -41,13 +41,19 @@ public class Converter { final List innerClasses = classesToClassList(psiClass.getAllInnerClasses()); final List fields = fieldsToFieldList(psiClass.getAllFields()); final List typeParameters = elementsToElementList(psiClass.getTypeParameters()); + final List implementsTypes = typesToNotNullableTypeList(psiClass.getImplementsListTypes()); + final List extendsListTypes = new LinkedList(); + for (PsiClassType e : psiClass.getExtendsListTypes()) + if (!e.getCanonicalText().equals("java.lang.Enum")) + extendsListTypes.add(e); + final List extendsTypes = typesToNotNullableTypeList(extendsListTypes.toArray(new PsiType[extendsListTypes.size()])); final IdentifierImpl name = new IdentifierImpl(psiClass.getName()); if (psiClass.isInterface()) - return new Trait(name, typeParameters, innerClasses, methods, fields); + return new Trait(name, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); if (psiClass.isEnum()) - return new Enum(name, typeParameters, innerClasses, methods, fields); - return new Class(name, typeParameters, innerClasses, methods, fields); + return new Enum(name, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); + return new Class(name, typeParameters, extendsTypes, implementsTypes, 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 0bd640e0868..90255375311 100644 --- a/src/org/jetbrains/jet/j2k/ast/Class.java +++ b/src/org/jetbrains/jet/j2k/ast/Class.java @@ -13,13 +13,17 @@ public class Class extends Node { String TYPE = "class"; final Identifier myName; final List myTypeParameters; + final List myExtendsTypes; + final List myImplementsTypes; final List myInnerClasses; final List myMethods; final List myFields; - public Class(Identifier name, List typeParameters, List innerClasses, List methods, List fields) { + public Class(Identifier name, List typeParameters, List extendsTypes, List implementsTypes, List innerClasses, List methods, List fields) { myName = name; myTypeParameters = typeParameters; + myExtendsTypes = extendsTypes; + myImplementsTypes = implementsTypes; myInnerClasses = innerClasses; myMethods = methods; myFields = fields; @@ -38,10 +42,20 @@ public class Class extends Node { return myTypeParameters.size() > 0 ? "<" + AstUtil.joinNodes(myTypeParameters, COMMA_WITH_SPACE) + ">" : EMPTY; } + String implementTypesToKotlin() { + List allTypes = new LinkedList() { + { + addAll(myExtendsTypes); + addAll(myImplementsTypes); + } + }; + return allTypes.size() == 0 ? EMPTY : SPACE + COLON + SPACE + AstUtil.joinNodes(allTypes, COMMA_WITH_SPACE); + } + @NotNull @Override public String toKotlin() { - return TYPE + SPACE + myName.toKotlin() + typeParametersToKotlin() + SPACE + "{" + N + + return TYPE + SPACE + myName.toKotlin() + typeParametersToKotlin() + implementTypesToKotlin() + 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 c2fe7466d54..dd6db4da722 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 typeParameters, List innerClasses, List methods, List fields) { - super(name, typeParameters, innerClasses, methods, fields); + public Enum(Identifier name, List typeParameters, List extendsTypes, List implementsTypes, List innerClasses, List methods, List fields) { + super(name, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); } @Nullable @@ -33,7 +33,7 @@ public class Enum extends Class { @NotNull @Override public String toKotlin() { - return "enum" + SPACE + myName.toKotlin() + typeParametersToKotlin() + primaryConstructorToKotlin() + SPACE + "{" + N + + return "enum" + SPACE + myName.toKotlin() + typeParametersToKotlin() + primaryConstructorToKotlin() + implementTypesToKotlin() + 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 4ae02ccf569..484f5dcbc93 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 typeParameters, List innerClasses, List methods, List fields) { - super(name, typeParameters, innerClasses, methods, fields); + public Trait(Identifier name, List typeParameters, List extendsTypes, List implementsTypes, List innerClasses, List methods, List fields) { + super(name, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields); TYPE = "trait"; } } diff --git a/test/org/jetbrains/jet/j2k/ast/ClassTest.java b/test/org/jetbrains/jet/j2k/ast/ClassTest.java index 17d78863d7e..61f49eae934 100644 --- a/test/org/jetbrains/jet/j2k/ast/ClassTest.java +++ b/test/org/jetbrains/jet/j2k/ast/ClassTest.java @@ -69,4 +69,25 @@ public class ClassTest extends JetTestCaseBase { "class Entry { }" ); } + + public void testSimpleInheritance() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class A extends Base {}"), + "class A : Base { }" + ); + } + + public void testExtendsOneClassAndImplementsOneInterface() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class A extends Base implements I {}"), + "class A : Base, I { }" + ); + } + + public void testExtendsOneClassAndImplementsSeveralInterfaces() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("final class A extends Base implements I0, I1, I2 {}"), + "class A : Base, I0, I1, I2 { }" + ); + } } diff --git a/test/org/jetbrains/jet/j2k/ast/EnumTest.java b/test/org/jetbrains/jet/j2k/ast/EnumTest.java index ed53280a28f..a701ac1081f 100644 --- a/test/org/jetbrains/jet/j2k/ast/EnumTest.java +++ b/test/org/jetbrains/jet/j2k/ast/EnumTest.java @@ -77,6 +77,20 @@ public class EnumTest extends JetTestCaseBase { ); } + public void testEnumImplementsOneInterface() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("enum A implements I {}"), + "enum A : I { }" + ); + } + + public void testEnumImplementsSeveralInterfaces() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("enum A implements I0, I1, I2 {}"), + "enum A : I0, I1, I2 { }" + ); + } + // public void testTwoConstructors() throws Exception { // Assert.assertEquals( // classToKotlin( diff --git a/test/org/jetbrains/jet/j2k/ast/TraitTest.java b/test/org/jetbrains/jet/j2k/ast/TraitTest.java index f638681b49c..88191af26fe 100644 --- a/test/org/jetbrains/jet/j2k/ast/TraitTest.java +++ b/test/org/jetbrains/jet/j2k/ast/TraitTest.java @@ -42,4 +42,18 @@ public class TraitTest extends JetTestCaseBase { "}" ); } -} \ No newline at end of file + + public void testExtendsOneInterface() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("interface A extends I {}"), + "trait A : I { }" + ); + } + + public void testExtendsOneClassAndImplementsSeveralInterfaces() throws Exception { + Assert.assertEquals( + classToSingleLineKotlin("interface A extends I0, I1, I2 {}"), + "trait A : I0, I1, I2 { }" + ); + } +}