From 341aed521eebf9c05dbae0f7ee152a73ecf977a7 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 2 Nov 2011 12:35:05 +0400 Subject: [PATCH] varagrs supported --- src/org/jetbrains/jet/j2k/Converter.java | 2 +- src/org/jetbrains/jet/j2k/ast/EmptyType.java | 14 --------- src/org/jetbrains/jet/j2k/ast/INode.java | 2 +- src/org/jetbrains/jet/j2k/ast/Parameter.java | 3 +- src/org/jetbrains/jet/j2k/ast/Type.java | 12 +++++++ src/org/jetbrains/jet/j2k/ast/VarArg.java | 31 +++++++++++++++++++ .../jet/j2k/visitors/TypeVisitor.java | 6 ++-- .../org/jetbrains/jet/j2k/ast/VarArgTest.java | 23 ++++++++++++++ 8 files changed, 74 insertions(+), 19 deletions(-) delete mode 100644 src/org/jetbrains/jet/j2k/ast/EmptyType.java create mode 100644 src/org/jetbrains/jet/j2k/ast/VarArg.java create mode 100644 test/org/jetbrains/jet/j2k/ast/VarArgTest.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 4d2e986fa80..7ec847bc90d 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -182,7 +182,7 @@ public class Converter { @NotNull public static Type typeToType(@Nullable PsiType type) { if (type == null) - return new EmptyType(); // TODO + return Type.EMPTY_TYPE; // TODO TypeVisitor typeVisitor = new TypeVisitor(); type.accept(typeVisitor); return typeVisitor.getResult(); diff --git a/src/org/jetbrains/jet/j2k/ast/EmptyType.java b/src/org/jetbrains/jet/j2k/ast/EmptyType.java deleted file mode 100644 index 8bd6add7ec1..00000000000 --- a/src/org/jetbrains/jet/j2k/ast/EmptyType.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.jetbrains.jet.j2k.ast; - -import org.jetbrains.annotations.NotNull; - -/** - * @author ignatov - */ -public class EmptyType extends Type { - @NotNull - @Override - public String toKotlin() { - return "UNRESOLVED_TYPE"; - } -} diff --git a/src/org/jetbrains/jet/j2k/ast/INode.java b/src/org/jetbrains/jet/j2k/ast/INode.java index 3a861da7f37..e0f8323f77f 100644 --- a/src/org/jetbrains/jet/j2k/ast/INode.java +++ b/src/org/jetbrains/jet/j2k/ast/INode.java @@ -13,6 +13,6 @@ public interface INode { public Kind getKind(); public enum Kind { - UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, + UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, VARARG, } } diff --git a/src/org/jetbrains/jet/j2k/ast/Parameter.java b/src/org/jetbrains/jet/j2k/ast/Parameter.java index 625b78e7351..7dfa86eaed1 100644 --- a/src/org/jetbrains/jet/j2k/ast/Parameter.java +++ b/src/org/jetbrains/jet/j2k/ast/Parameter.java @@ -17,6 +17,7 @@ public class Parameter extends Expression { @NotNull @Override public String toKotlin() { - return myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); + String vararg = myType.getKind() == Kind.VARARG ? "vararg" + SPACE : EMPTY; + return vararg + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); } } diff --git a/src/org/jetbrains/jet/j2k/ast/Type.java b/src/org/jetbrains/jet/j2k/ast/Type.java index 0665cc606da..b8d93d52fe7 100644 --- a/src/org/jetbrains/jet/j2k/ast/Type.java +++ b/src/org/jetbrains/jet/j2k/ast/Type.java @@ -6,6 +6,7 @@ import org.jetbrains.annotations.NotNull; * @author ignatov */ public abstract class Type extends Element { + public static Type EMPTY_TYPE = new EmptyType(); protected boolean myNullable = true; @NotNull @@ -25,4 +26,15 @@ public abstract class Type extends Element { protected String isNullableStr() { return isNullable() ? QUESTION : EMPTY; } + + /** + * @author ignatov + */ + private static class EmptyType extends Type { + @NotNull + @Override + public String toKotlin() { + return "UNRESOLVED_TYPE"; + } + } } diff --git a/src/org/jetbrains/jet/j2k/ast/VarArg.java b/src/org/jetbrains/jet/j2k/ast/VarArg.java new file mode 100644 index 00000000000..2685b24556e --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/VarArg.java @@ -0,0 +1,31 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class VarArg extends Type { + private Type myType; + + public VarArg(Type type) { + myType = type; + } + + @NotNull + public Type getType() { + return myType; + } + + @NotNull + @Override + public Kind getKind() { + return Kind.VARARG; + } + + @NotNull + @Override + public String toKotlin() { + return myType.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index ba0508424a4..9a96d88671b 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -12,7 +12,7 @@ import static org.jetbrains.jet.j2k.Converter.typesToTypeList; * @author ignatov */ public class TypeVisitor extends PsiTypeVisitor implements Visitor { - private Type myResult = new EmptyType(); + private Type myResult = Type.EMPTY_TYPE; @NotNull public Type getResult() { @@ -40,7 +40,8 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @Override public Type visitArrayType(PsiArrayType arrayType) { - myResult = new ArrayType(typeToType(arrayType.getComponentType())); + if (myResult == Type.EMPTY_TYPE) + myResult = new ArrayType(typeToType(arrayType.getComponentType())); return super.visitArrayType(arrayType); } @@ -71,6 +72,7 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @Override public Type visitEllipsisType(PsiEllipsisType ellipsisType) { + myResult = new VarArg(typeToType(ellipsisType.getComponentType())); return super.visitEllipsisType(ellipsisType); } diff --git a/test/org/jetbrains/jet/j2k/ast/VarArgTest.java b/test/org/jetbrains/jet/j2k/ast/VarArgTest.java new file mode 100644 index 00000000000..a54c4a78abf --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/VarArgTest.java @@ -0,0 +1,23 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class VarArgTest extends JetTestCaseBase { + public void testEllipsisTypeSingleParams() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("void pushAll(Object... objs) {}"), + "fun pushAll(vararg objs : Object?) : Unit { }" + ); + } + + public void testEllipsisTypeSeveralParams() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin("String format(String pattern, Object... arguments);"), + "fun format(pattern : String?, vararg arguments : Object?) : String?" + ); + } +}