diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java b/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java index f455e18d12f..e3071dc87f1 100644 --- a/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java @@ -3,7 +3,7 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.j2k.util.AstUtil; -import java.util.List; +import java.util.*; /** * @author ignatov @@ -15,20 +15,55 @@ public class ArrayInitializerExpression extends Expression { public ArrayInitializerExpression(final Type type, List initializers) { myType = type; myInitializers = initializers; - } @NotNull private static String createArrayFunction(@NotNull final Type type) { - String sType = type.convertedToNotNull().toKotlin().replace("Array", "").toLowerCase(); + String sType = innerTypeStr(type); if (!sType.equals("any") && PRIMITIVE_TYPES.contains(sType)) return sType + "Array"; return AstUtil.lowerFirstCharacter(type.convertedToNotNull().toKotlin()); } + private static String innerTypeStr(final Type type) { + return type.convertedToNotNull().toKotlin().replace("Array", "").toLowerCase(); + } + + @NotNull + private static String createInitializers(@NotNull final Type type, @NotNull final List initializers) { + List arguments = new LinkedList(); + for (Expression i : initializers) + arguments.add(explicitConvertIfNeeded(type, i)); + return AstUtil.join(arguments, COMMA_WITH_SPACE); + } + + @NotNull + private static String explicitConvertIfNeeded(final Type type, @NotNull final Expression i) { + Set doubleOrFloatTypes = new HashSet( + Arrays.asList("double", "float", "java.lang.double", "java.lang.float") + ); + String afterReplace = innerTypeStr(type).replace(">", "").replace("<", "").replace("?", ""); + if (doubleOrFloatTypes.contains(afterReplace)) { + if (i.getKind() == Kind.LITERAL) { + if (i.toKotlin().contains(".")) + return i.toKotlin(); + return i.toKotlin() + DOT + ZERO; + } + return "(" + i.toKotlin() + ")" + getConversion(afterReplace); + } + return i.toKotlin(); + } + + @NotNull + private static String getConversion(@NotNull final String afterReplace) { + if (afterReplace.contains("double")) return DOT + "dbl"; + if (afterReplace.contains("float")) return DOT + "flt"; + return ""; + } + @NotNull @Override public String toKotlin() { - return createArrayFunction(myType) + "(" + AstUtil.joinNodes(myInitializers, COMMA_WITH_SPACE) + ")"; + return createArrayFunction(myType) + "(" + createInitializers(myType, myInitializers) + ")"; } } diff --git a/src/org/jetbrains/jet/j2k/ast/INode.java b/src/org/jetbrains/jet/j2k/ast/INode.java index f3ea8ba8471..d40f7b5080e 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, VARARG, TRAIT, ASSIGNMENT_EXPRESSION, CALL_CHAIN, + UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, VARARG, TRAIT, ASSIGNMENT_EXPRESSION, CALL_CHAIN, LITERAL, } } diff --git a/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java b/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java index 4737458e389..451f22757d0 100644 --- a/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/LiteralExpression.java @@ -12,6 +12,12 @@ public class LiteralExpression extends Expression { myIdentifier = identifier; } + @NotNull + @Override + public Kind getKind() { + return Kind.LITERAL; + } + @NotNull @Override public String toKotlin() { diff --git a/src/org/jetbrains/jet/j2k/ast/Node.java b/src/org/jetbrains/jet/j2k/ast/Node.java index e29f53214c1..80a6b85b4a4 100644 --- a/src/org/jetbrains/jet/j2k/ast/Node.java +++ b/src/org/jetbrains/jet/j2k/ast/Node.java @@ -39,4 +39,5 @@ public abstract class Node implements INode { static final String QUEST = "?"; static final String COMMA_WITH_SPACE = "," + SPACE; static final String STAR = "*"; + public static final String ZERO = "0"; } \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/doubleArray.jav b/testData/ast/arrayInitializerExpression/statement/doubleArray.jav new file mode 100644 index 00000000000..44f26cb4a79 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/doubleArray.jav @@ -0,0 +1 @@ +double[] a = new double[]{1.0, 2, 3} \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/doubleArray.kt b/testData/ast/arrayInitializerExpression/statement/doubleArray.kt new file mode 100644 index 00000000000..c2d0ab03352 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/doubleArray.kt @@ -0,0 +1 @@ +var a : DoubleArray? = doubleArray(1.0, 2.0, 3.0) \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.jav b/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.jav new file mode 100644 index 00000000000..58d0ca95d05 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.jav @@ -0,0 +1,2 @@ +double a = 0, b = 0, c = 0; +double ds[] = {a, b, c}; \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.kt b/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.kt new file mode 100644 index 00000000000..3bbe02106ce --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/doubleArrayWithVariables.kt @@ -0,0 +1,4 @@ +var a : Double = 0 +var b : Double = 0 +var c : Double = 0 +var ds : DoubleArray? = doubleArray((a).dbl, (b).dbl, (c).dbl) \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/floatArray.jav b/testData/ast/arrayInitializerExpression/statement/floatArray.jav new file mode 100644 index 00000000000..36d2afa3425 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/floatArray.jav @@ -0,0 +1 @@ +float[] a = new float[]{1, 2, 3.0} \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/floatArray.kt b/testData/ast/arrayInitializerExpression/statement/floatArray.kt new file mode 100644 index 00000000000..b824bd21e48 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/floatArray.kt @@ -0,0 +1 @@ +var a : FloatArray? = floatArray(1.0, 2.0, 3.0) \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.jav b/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.jav new file mode 100644 index 00000000000..3ebd4af38bd --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.jav @@ -0,0 +1 @@ +java.lang.Double[] a = new java.lang.Double[]{1, 2, 3}; \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.kt b/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.kt new file mode 100644 index 00000000000..c3a5bb91fd6 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/javaLangDoubleArray.kt @@ -0,0 +1 @@ +var a : Array? = array(1.0, 2.0, 3.0) \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.jav b/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.jav new file mode 100644 index 00000000000..b53b4dc9aec --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.jav @@ -0,0 +1 @@ +java.lang.Float[] a = new java.lang.Float[]{1, 2, 3}; \ No newline at end of file diff --git a/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.kt b/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.kt new file mode 100644 index 00000000000..d31d26a7c74 --- /dev/null +++ b/testData/ast/arrayInitializerExpression/statement/javaLangFloatArray.kt @@ -0,0 +1 @@ +var a : Array? = array(1.0, 2.0, 3.0) \ No newline at end of file diff --git a/testData/ast/arrayType/statement/doubleArray.jav b/testData/ast/arrayType/statement/doubleArray.jav deleted file mode 100644 index ff57a8cb89d..00000000000 --- a/testData/ast/arrayType/statement/doubleArray.jav +++ /dev/null @@ -1 +0,0 @@ -double[] a = new double[]{1, 2, 3} \ No newline at end of file diff --git a/testData/ast/arrayType/statement/doubleArray.kt b/testData/ast/arrayType/statement/doubleArray.kt deleted file mode 100644 index c8147ce0a7f..00000000000 --- a/testData/ast/arrayType/statement/doubleArray.kt +++ /dev/null @@ -1 +0,0 @@ -var a : DoubleArray? = doubleArray(1, 2, 3) \ No newline at end of file