diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java b/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java index a7ca9742535..7eef1d9bed1 100644 --- a/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/ArrayInitializerExpression.java @@ -20,9 +20,9 @@ public class ArrayInitializerExpression extends Expression { @NotNull private static String createArrayFunction(@NotNull final Type type) { String sType = innerTypeStr(type); - if (!sType.equals("any") && PRIMITIVE_TYPES.contains(sType)) - return sType + "Array"; - return AstUtil.lowerFirstCharacter(type.convertedToNotNull().toKotlin()); + if (PRIMITIVE_TYPES.contains(sType)) + return sType + "Array"; // intArray + return AstUtil.lowerFirstCharacter(type.convertedToNotNull().toKotlin()); // array } @NotNull diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayType.java b/src/org/jetbrains/jet/j2k/ast/ArrayType.java index 970535a327f..d78994faf55 100644 --- a/src/org/jetbrains/jet/j2k/ast/ArrayType.java +++ b/src/org/jetbrains/jet/j2k/ast/ArrayType.java @@ -12,6 +12,16 @@ public class ArrayType extends Type { myType = type; } + public Type getInnerType() { + return myType; + } + + @NotNull + @Override + public Kind getKind() { + return Kind.ARRAY_TYPE; + } + @NotNull @Override public String toKotlin() { diff --git a/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java b/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java new file mode 100644 index 00000000000..c4ddf5ac24b --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ArrayWithoutInitializationExpression.java @@ -0,0 +1,52 @@ +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 ArrayWithoutInitializationExpression extends Expression { + private final Type myType; + private final List myExpressions; + + public ArrayWithoutInitializationExpression(Type type, List expressions) { + myType = type; + myExpressions = expressions; + } + + @NotNull + @Override + public String toKotlin() { + if (myType.getKind() == Kind.ARRAY_TYPE) { + if (myExpressions.size() == 1) + return oneDim(myType, myExpressions.get(0)); + if (myExpressions.size() == 2) { + Type innerType = ((ArrayType) myType).getInnerType(); + return oneDim(myType, myExpressions.get(0), "{" + SPACE + + oneDim(innerType, myExpressions.get(1)) + SPACE + "}"); + } + } + return getConstructorName(myType); + } + + private static String oneDim(Type type, Expression size) { + return oneDim(type, size, EMPTY); + } + + private static String oneDim(Type type, Expression size, String init) { + String commaWithInit = init.isEmpty() ? EMPTY : COMMA_WITH_SPACE + init; + return getConstructorName(type) + "(" + size.toKotlin() + commaWithInit + ")"; + } + + public static String getConstructorName(Type type) { +// if (type instanceof ArrayType) { +// String innerTypeStr = ((ArrayType) type).getInnerType().toKotlin().toLowerCase(); +// if (PRIMITIVE_TYPES.contains(innerTypeStr)) +// return innerTypeStr + "Array"; +// } + return AstUtil.replaceLastQuest(type.toKotlin()); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/INode.java b/src/org/jetbrains/jet/j2k/ast/INode.java index d40f7b5080e..a0ce67afaae 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, LITERAL, + UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, VARARG, TRAIT, ASSIGNMENT_EXPRESSION, CALL_CHAIN, LITERAL, ARRAY_TYPE, } } diff --git a/src/org/jetbrains/jet/j2k/util/AstUtil.java b/src/org/jetbrains/jet/j2k/util/AstUtil.java index 21c991ad932..e9d114a7fd5 100644 --- a/src/org/jetbrains/jet/j2k/util/AstUtil.java +++ b/src/org/jetbrains/jet/j2k/util/AstUtil.java @@ -87,4 +87,10 @@ public class AstUtil { return map.get(e); return orElse; } + + public static String replaceLastQuest(String str) { + if (str.endsWith("?")) + return str.substring(0, str.length() - 1); + return str; + } } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index eb9a541fbac..80ee20ce3c1 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -214,11 +214,10 @@ public class ExpressionVisitor extends StatementVisitor { @Override public void visitNewExpression(@NotNull PsiNewExpression expression) { super.visitNewExpression(expression); - - if (expression.getArrayInitializer() != null) // new Foo[] {} + if (expression.getArrayInitializer() != null) // new Foo[] {Foo(1), Foo(2)} myResult = createNewEmptyArray(expression); else if (expression.getArrayDimensions().length > 0) { // new Foo[5] - myResult = createNewNonEmptyArray(expression); + myResult = createNewEmptyArrayWithoutInitialization(expression); } else { // new Class(): common case myResult = createNewClassExpression(expression); } @@ -254,12 +253,10 @@ public class ExpressionVisitor extends StatementVisitor { } @NotNull - private static NewClassExpression createNewNonEmptyArray(@NotNull PsiNewExpression expression) { - final List callExpression = expressionsToExpressionList(expression.getArrayDimensions()); - callExpression.add(new IdentifierImpl("{null}")); // TODO: remove - return new NewClassExpression( - typeToType(expression.getType()), - callExpression + private static Expression createNewEmptyArrayWithoutInitialization(@NotNull PsiNewExpression expression) { + return new ArrayWithoutInitializationExpression( + typeToType(expression.getType(), true), + expressionsToExpressionList(expression.getArrayDimensions()) ); } diff --git a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.kt b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.kt index 3add329fe03..ea4fcc7e35e 100644 --- a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.kt +++ b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimension.kt @@ -1 +1 @@ -var d2 : Array? = Array?(5, {null}) \ No newline at end of file +var d2 : Array? = Array(5) \ No newline at end of file diff --git a/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.jav b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.jav new file mode 100644 index 00000000000..fe4a268f124 --- /dev/null +++ b/testData/ast/arrayType/statement/arrayInitializationStatementWithDimensionExplicit.jav @@ -0,0 +1 @@ +int [][] d2 = new int[5][5]; \ No newline at end of file diff --git a/testData/ast/arrayType/statement/d2StringEmptyArray.jav b/testData/ast/arrayType/statement/d2StringEmptyArray.jav new file mode 100644 index 00000000000..d49028c3fe0 --- /dev/null +++ b/testData/ast/arrayType/statement/d2StringEmptyArray.jav @@ -0,0 +1 @@ +String [][] ss = new String[5][5]; \ No newline at end of file diff --git a/testData/ast/for/statement/forRangeWithLE.kt b/testData/ast/for/statement/forRangeWithLE.kt index 125e3d65192..79c11ab6288 100644 --- a/testData/ast/for/statement/forRangeWithLE.kt +++ b/testData/ast/for/statement/forRangeWithLE.kt @@ -1,4 +1,4 @@ -var array : IntArray? = IntArray?(10, {null}) +var array : IntArray? = IntArray(10) for (i in 0..10) { array[i] = i } \ No newline at end of file diff --git a/testData/ast/for/statement/forRangeWithLT.kt b/testData/ast/for/statement/forRangeWithLT.kt index a5a4520c43a..e1431c409fb 100644 --- a/testData/ast/for/statement/forRangeWithLT.kt +++ b/testData/ast/for/statement/forRangeWithLT.kt @@ -1,4 +1,4 @@ -var array : IntArray? = IntArray?(10, {null}) +var array : IntArray? = IntArray(10) for (i in 0..(10 - 1)) { array[i] = i } \ No newline at end of file diff --git a/testData/ast/for/statement/forWithBlock.kt b/testData/ast/for/statement/forWithBlock.kt index a5a4520c43a..e1431c409fb 100644 --- a/testData/ast/for/statement/forWithBlock.kt +++ b/testData/ast/for/statement/forWithBlock.kt @@ -1,4 +1,4 @@ -var array : IntArray? = IntArray?(10, {null}) +var array : IntArray? = IntArray(10) for (i in 0..(10 - 1)) { array[i] = i } \ No newline at end of file