From 5d120e800f04d9f4925722e5450f8c961a1ceb95 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 2 Nov 2011 13:46:39 +0400 Subject: [PATCH] where statement for type parameters supported in functions declaration --- src/org/jetbrains/jet/j2k/ast/Function.java | 23 ++++++++++++++++++- .../jetbrains/jet/j2k/ast/TypeParameter.java | 20 +++++++++++++++- .../jet/j2k/visitors/ElementVisitor.java | 3 ++- .../jet/j2k/visitors/TypeVisitor.java | 2 ++ .../jet/j2k/ast/TypeParametersTest.java | 15 ++++++++++++ 5 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/org/jetbrains/jet/j2k/ast/Function.java b/src/org/jetbrains/jet/j2k/ast/Function.java index d9aaac3e45c..93912cdf6f5 100644 --- a/src/org/jetbrains/jet/j2k/ast/Function.java +++ b/src/org/jetbrains/jet/j2k/ast/Function.java @@ -3,6 +3,7 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.util.AstUtil; +import java.util.LinkedList; import java.util.List; /** @@ -27,10 +28,30 @@ public class Function extends Node { return myTypeParameters.size() > 0 ? "<" + AstUtil.joinNodes(myTypeParameters, COMMA_WITH_SPACE) + ">" : EMPTY; } + private boolean hasWhere() { + for (Element t : myTypeParameters) + if (t instanceof TypeParameter && ((TypeParameter)t).hasWhere()) + return true; + return false; + } + + String typeParameterWhereToKotlin() { + if (hasWhere()) { + List wheres = new LinkedList(); + for (Element t : myTypeParameters) + if (t instanceof TypeParameter) + wheres.add(((TypeParameter)t).getWhereToKotlin()); + return SPACE + "where" + SPACE + AstUtil.join(wheres, COMMA_WITH_SPACE) + SPACE; + } + return EMPTY; + } + @NotNull @Override public String toKotlin() { return "fun" + SPACE + myName.toKotlin() + typeParametersToKotlin() + "(" + myParams.toKotlin() + ")" + SPACE + COLON + - SPACE + myType.toKotlin() + SPACE + myBlock.toKotlin(); + SPACE + myType.toKotlin() + SPACE + + typeParameterWhereToKotlin() + + myBlock.toKotlin(); } } diff --git a/src/org/jetbrains/jet/j2k/ast/TypeParameter.java b/src/org/jetbrains/jet/j2k/ast/TypeParameter.java index e38515be010..6e67cba5b25 100644 --- a/src/org/jetbrains/jet/j2k/ast/TypeParameter.java +++ b/src/org/jetbrains/jet/j2k/ast/TypeParameter.java @@ -1,20 +1,38 @@ 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 TypeParameter extends Element { private Identifier myName; + private List myExtendsTypes; - public TypeParameter(Identifier name) { + public TypeParameter(Identifier name, List extendsTypes) { myName = name; + myExtendsTypes = extendsTypes; + } + + public boolean hasWhere() { + return myExtendsTypes.size() > 1; + } + + @NotNull + public String getWhereToKotlin() { + if (hasWhere()) + return myName.toKotlin() + SPACE + COLON + SPACE + myExtendsTypes.get(1).toKotlin(); + return EMPTY; } @NotNull @Override public String toKotlin() { + if (myExtendsTypes.size() > 0) + return myName.toKotlin() + SPACE + COLON + SPACE + myExtendsTypes.get(0).toKotlin(); return myName.toKotlin(); } } \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index a90fcc8ea1e..51816c245a3 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -48,7 +48,8 @@ public class ElementVisitor extends JavaElementVisitor implements Visitor { public void visitTypeParameter(PsiTypeParameter classParameter) { super.visitTypeParameter(classParameter); myResult = new TypeParameter( - new IdentifierImpl(classParameter.getName()) + new IdentifierImpl(classParameter.getName()), // TODO + typesToTypeList(classParameter.getExtendsListTypes()) ); } diff --git a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java index 9a96d88671b..b1e3c62d81b 100644 --- a/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/TypeVisitor.java @@ -22,6 +22,8 @@ public class TypeVisitor extends PsiTypeVisitor implements Visitor { @Override public Type visitType(PsiType type) { System.out.println(type.getClass()); // TODO: remove + if (type instanceof PsiIntersectionType) + System.out.println("&"); return super.visitType(type); } diff --git a/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java b/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java index 085cd875f07..56576185a51 100644 --- a/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java +++ b/test/org/jetbrains/jet/j2k/ast/TypeParametersTest.java @@ -21,4 +21,19 @@ public class TypeParametersTest extends JetTestCaseBase { ); } + public void testWhere() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin( + "> T max(Collection coll) {}"), + "fun max(coll : Collection?) : T? where T : Comparable? { }" + ); + } + + public void testMethodDoubleParametrizationWithTwoBounds() throws Exception { + Assert.assertEquals( + methodToSingleLineKotlin( + ", K extends Node & Collection> T max(Collection coll) {}"), + "fun max(coll : Collection?) : T? where T : Comparable?, K : Collection? { }" + ); + } }