simple inheritance added for classes, traits and enums

This commit is contained in:
Sergey Ignatov
2011-11-01 17:38:58 +04:00
parent 69b9100890
commit b7ea5b73d1
7 changed files with 80 additions and 11 deletions
+9 -3
View File
@@ -41,13 +41,19 @@ public class Converter {
final List<Class> innerClasses = classesToClassList(psiClass.getAllInnerClasses());
final List<Field> fields = fieldsToFieldList(psiClass.getAllFields());
final List<Element> typeParameters = elementsToElementList(psiClass.getTypeParameters());
final List<Type> implementsTypes = typesToNotNullableTypeList(psiClass.getImplementsListTypes());
final List<PsiClassType> extendsListTypes = new LinkedList<PsiClassType>();
for (PsiClassType e : psiClass.getExtendsListTypes())
if (!e.getCanonicalText().equals("java.lang.Enum"))
extendsListTypes.add(e);
final List<Type> 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<Field> fieldsToFieldList(PsiField[] fields) {
+16 -2
View File
@@ -13,13 +13,17 @@ public class Class extends Node {
String TYPE = "class";
final Identifier myName;
final List<Element> myTypeParameters;
final List<Type> myExtendsTypes;
final List<Type> myImplementsTypes;
final List<Class> myInnerClasses;
final List<Function> myMethods;
final List<Field> myFields;
public Class(Identifier name, List<Element> typeParameters, List<Class> innerClasses, List<Function> methods, List<Field> fields) {
public Class(Identifier name, List<Element> typeParameters, List<Type> extendsTypes, List<Type> implementsTypes, List<Class> innerClasses, List<Function> methods, List<Field> 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<Type> allTypes = new LinkedList<Type>() {
{
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 +
+3 -3
View File
@@ -10,8 +10,8 @@ import java.util.List;
* @author ignatov
*/
public class Enum extends Class {
public Enum(Identifier name, List<Element> typeParameters, List<Class> innerClasses, List<Function> methods, List<Field> fields) {
super(name, typeParameters, innerClasses, methods, fields);
public Enum(Identifier name, List<Element> typeParameters, List<Type> extendsTypes, List<Type> implementsTypes, List<Class> innerClasses, List<Function> methods, List<Field> 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 +
+2 -2
View File
@@ -6,8 +6,8 @@ import java.util.List;
* @author ignatov
*/
public class Trait extends Class {
public Trait(Identifier name, List<Element> typeParameters, List<Class> innerClasses, List<Function> methods, List<Field> fields) {
super(name, typeParameters, innerClasses, methods, fields);
public Trait(Identifier name, List<Element> typeParameters, List<Type> extendsTypes, List<Type> implementsTypes, List<Class> innerClasses, List<Function> methods, List<Field> fields) {
super(name, typeParameters, extendsTypes, implementsTypes, innerClasses, methods, fields);
TYPE = "trait";
}
}
@@ -69,4 +69,25 @@ public class ClassTest extends JetTestCaseBase {
"class Entry<K, V> { }"
);
}
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 { }"
);
}
}
@@ -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(
+15 -1
View File
@@ -42,4 +42,18 @@ public class TraitTest extends JetTestCaseBase {
"}"
);
}
}
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 { }"
);
}
}