diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 7f639708fc3..25a780351de 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -189,6 +189,21 @@ public class Converter { return result; } + @NotNull + public static List typesToNotNullableTypeList(PsiType[] types) { + List result = new LinkedList(typesToTypeList(types)); + for (Type p : result) + p.setNullable(false); + return result; + } + + @NotNull + public static Type typeToNotNullableType(@Nullable PsiType type) { + Type result = typeToType(type); + result.setNullable(false); + return result; + } + @NotNull private static List importsToImportList(PsiImportStatementBase[] imports) { List result = new LinkedList(); diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayType.java b/src/org/jetbrains/jet/j2k/ast/ArrayType.java index d3574c4c0f3..293d9037d6e 100644 --- a/src/org/jetbrains/jet/j2k/ast/ArrayType.java +++ b/src/org/jetbrains/jet/j2k/ast/ArrayType.java @@ -15,8 +15,9 @@ public class ArrayType extends Type { @NotNull @Override public String toKotlin() { + String nullable = isNullableStr(); if (PRIMITIVE_TYPES.contains(myType.toKotlin().toLowerCase())) - return myType.toKotlin() + "Array" + QUESTION; // TODO - return "Array" + "<" + myType.toKotlin() + ">" + QUESTION; + return myType.toKotlin() + "Array" + nullable; // TODO + return "Array" + "<" + myType.toKotlin() + ">" + nullable; } } diff --git a/src/org/jetbrains/jet/j2k/ast/ClassType.java b/src/org/jetbrains/jet/j2k/ast/ClassType.java index 7020e7c2c44..bb0cdebe4b2 100644 --- a/src/org/jetbrains/jet/j2k/ast/ClassType.java +++ b/src/org/jetbrains/jet/j2k/ast/ClassType.java @@ -1,20 +1,26 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.util.AstUtil; + +import java.util.List; /** * @author ignatov */ public class ClassType extends Type { private final Identifier myType; + private List myParameters; - public ClassType(Identifier type) { + public ClassType(Identifier type, List parameters) { myType = type; + myParameters = parameters; } @NotNull @Override public String toKotlin() { - return myType.toKotlin() + QUESTION; + String params = myParameters.size() == 0 ? EMPTY : "<" + AstUtil.joinNodes(myParameters, COMMA_WITH_SPACE) + ">"; + return myType.toKotlin() + params + isNullableStr(); } } diff --git a/src/org/jetbrains/jet/j2k/ast/InProjectionType.java b/src/org/jetbrains/jet/j2k/ast/InProjectionType.java new file mode 100644 index 00000000000..17d2b63cc04 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/InProjectionType.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class InProjectionType extends Type { + private final Type myBound; + + public InProjectionType(Type bound) { + myBound = bound; + } + + @NotNull + @Override + public String toKotlin() { + return "in" + SPACE + myBound.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Node.java b/src/org/jetbrains/jet/j2k/ast/Node.java index 0c063354d7f..af64555154d 100644 --- a/src/org/jetbrains/jet/j2k/ast/Node.java +++ b/src/org/jetbrains/jet/j2k/ast/Node.java @@ -10,6 +10,8 @@ import java.util.Set; * @author ignatov */ public abstract class Node implements INode { + public static final String STAR = "*"; + @NotNull @Override public Kind getKind() { diff --git a/src/org/jetbrains/jet/j2k/ast/OutProjectionType.java b/src/org/jetbrains/jet/j2k/ast/OutProjectionType.java new file mode 100644 index 00000000000..dbe75210fb7 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/OutProjectionType.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class OutProjectionType extends Type { + private final Type myBound; + + public OutProjectionType(Type bound) { + myBound = bound; + } + + @NotNull + @Override + public String toKotlin() { + return "out" + SPACE + myBound.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/StarProjectionType.java b/src/org/jetbrains/jet/j2k/ast/StarProjectionType.java new file mode 100644 index 00000000000..c409b98da49 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/StarProjectionType.java @@ -0,0 +1,14 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class StarProjectionType extends Type { + @NotNull + @Override + public String toKotlin() { + return STAR; + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Type.java b/src/org/jetbrains/jet/j2k/ast/Type.java index 7f040f92002..0665cc606da 100644 --- a/src/org/jetbrains/jet/j2k/ast/Type.java +++ b/src/org/jetbrains/jet/j2k/ast/Type.java @@ -6,9 +6,23 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public abstract class Type extends Element { + protected boolean myNullable = true; + @NotNull @Override public Kind getKind() { return Kind.TYPE; } + + public void setNullable(boolean nullable) { + myNullable = nullable; + } + + public boolean isNullable() { + return myNullable; + } + + protected String isNullableStr() { + return isNullable() ? QUESTION : EMPTY; + } } diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index c222a774124..ba0508424a4 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -2,10 +2,12 @@ package org.jetbrains.jet.j2k.visitors; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.j2k.Converter; import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.j2k.util.AstUtil; +import static org.jetbrains.jet.j2k.Converter.typeToType; +import static org.jetbrains.jet.j2k.Converter.typesToTypeList; + /** * @author ignatov */ @@ -19,6 +21,7 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @Override public Type visitType(PsiType type) { + System.out.println(type.getClass()); // TODO: remove return super.visitType(type); } @@ -37,13 +40,16 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @Override public Type visitArrayType(PsiArrayType arrayType) { - myResult = new ArrayType(Converter.typeToType(arrayType.getComponentType())); + myResult = new ArrayType(typeToType(arrayType.getComponentType())); return super.visitArrayType(arrayType); } @Override public Type visitClassType(PsiClassType classType) { - myResult = new ClassType(new IdentifierImpl(classType.getClassName())); + myResult = new ClassType( + new IdentifierImpl(classType.getClassName()), + typesToTypeList(classType.getParameters()) + ); return super.visitClassType(classType); } @@ -54,6 +60,12 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @Override public Type visitWildcardType(PsiWildcardType wildcardType) { + if (wildcardType.isExtends()) + myResult = new OutProjectionType(typeToType(wildcardType.getExtendsBound())); + else if (wildcardType.isSuper()) + myResult = new InProjectionType(typeToType(wildcardType.getSuperBound())); + else + myResult = new StarProjectionType(); return super.visitWildcardType(wildcardType); } diff --git a/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java b/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java index 1666233febe..eed80e25e26 100644 --- a/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java +++ b/test/org/jetbrains/jet/j2k/ast/ArrayTypeTest.java @@ -34,4 +34,11 @@ public class ArrayTypeTest extends JetTestCaseBase { "var a : LongArray? = array(1, 2, 3)" ); } + + public void testMethodArrayArgs() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("void fromArrayToCollection(Foo[] a) {}"), + "fun fromArrayToCollection(a : Array?) : Unit { }" + ); + } } diff --git a/test/org/jetbrains/jet/j2k/ast/InProjectionTypeTest.java b/test/org/jetbrains/jet/j2k/ast/InProjectionTypeTest.java new file mode 100644 index 00000000000..e5bf07095f6 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/InProjectionTypeTest.java @@ -0,0 +1,16 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class InProjectionTypeTest extends JetTestCaseBase { + public void testMethodParams() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("void popAll(Collection dst) {}"), + "fun popAll(dst : Collection?) : Unit { }" + ); + } +} diff --git a/test/org/jetbrains/jet/j2k/ast/OutProjectionTypeTest.java b/test/org/jetbrains/jet/j2k/ast/OutProjectionTypeTest.java new file mode 100644 index 00000000000..2475d11c506 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/OutProjectionTypeTest.java @@ -0,0 +1,16 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class OutProjectionTypeTest extends JetTestCaseBase { + public void testMethodParams() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("void pushAll(Collection src) {}"), + "fun pushAll(src : Collection?) : Unit { }" + ); + } +} diff --git a/test/org/jetbrains/jet/j2k/ast/StarProjectionTypeTest.java b/test/org/jetbrains/jet/j2k/ast/StarProjectionTypeTest.java new file mode 100644 index 00000000000..bd4ac8cae14 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/StarProjectionTypeTest.java @@ -0,0 +1,16 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class StarProjectionTypeTest extends JetTestCaseBase { + public void testMethodParams() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("void wtf(Collection w) {}"), + "fun wtf(w : Collection<*>?) : Unit { }" + ); + } +} diff --git a/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java b/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java new file mode 100644 index 00000000000..085cd875f07 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java @@ -0,0 +1,24 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class TypeParametersTest extends JetTestCaseBase { + public void testGenericParam() throws Exception { + Assert.assertEquals( + statementToKotlin("List l;"), + "var l : List?" + ); + } + + public void testManyGenericParams() throws Exception { + Assert.assertEquals( + statementToKotlin("List l;"), + "var l : List?" + ); + } + +}