From 95f8bbba5c942733d4165391c93a6ae686c2ee36 Mon Sep 17 00:00:00 2001 From: ignatov Date: Mon, 26 Dec 2011 15:56:32 +0400 Subject: [PATCH] KT-852 Apply sure() call for expressions inside polyadic expression --- src/org/jetbrains/jet/j2k/Converter.java | 36 +++++++++++++++---- .../jet/j2k/ast/BinaryExpression.java | 13 ++++++- .../jet/j2k/ast/PolyadicExpression.java | 7 ++-- src/org/jetbrains/jet/j2k/util/AstUtil.java | 5 ++- .../jet/j2k/visitors/ExpressionVisitor.java | 6 ++-- testData/ast/issues/file/kt-809-string.jav | 2 +- testData/ast/issues/file/kt-852.jav | 16 +++++++++ testData/ast/issues/file/kt-852.kt | 13 +++++++ 8 files changed, 82 insertions(+), 16 deletions(-) create mode 100644 testData/ast/issues/file/kt-852.jav create mode 100644 testData/ast/issues/file/kt-852.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index f34f43f1fc3..a94f30c6cd2 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -601,9 +601,9 @@ public class Converter { @NotNull public static List createConversions(@NotNull PsiCallExpression expression) { - List conversions = new LinkedList(); PsiExpressionList argumentList = expression.getArgumentList(); PsiExpression[] arguments = argumentList != null ? argumentList.getExpressions() : new PsiExpression[]{}; + List conversions = new LinkedList(); //noinspection UnusedDeclaration for (final PsiExpression a : arguments) { conversions.add(""); @@ -628,19 +628,41 @@ public class Converter { return conversions; } + @NotNull + public static List createConversions(@NotNull PsiPolyadicExpression expression, PsiType expectedType) { + PsiExpression[] arguments = expression.getOperands(); + int length = arguments.length; + List conversions = new LinkedList(); + + List expectedTypes = Collections.nCopies(length, expectedType); + List actualTypes = new LinkedList(); + + for (PsiExpression e : arguments) + actualTypes.add(e.getType()); + + assert actualTypes.size() == expectedTypes.size() : "The type list must have the same length"; + + for (int i = 0; i < actualTypes.size(); i++) + conversions.add(i, createConversionForExpression(arguments[i], expectedTypes.get(i))); + + return conversions; + } + @NotNull private static String createConversionForExpression(@Nullable PsiExpression expression, @NotNull PsiType expectedType) { String conversion = ""; if (expression != null) { PsiType actualType = expression.getType(); - if (actualType != null) { - if (Node.PRIMITIVE_TYPES.contains(actualType.getCanonicalText()) && (expression instanceof PsiReferenceExpression - && ((PsiReferenceExpression) expression).isQualified() || expression instanceof PsiMethodCallExpression) - && expressionToExpression(expression).toKotlin().contains("?.")) - conversion += ".sure()"; + boolean isPrimitiveTypeOrNull = actualType == null || Node.PRIMITIVE_TYPES.contains(actualType.getCanonicalText()); + boolean isRef = (expression instanceof PsiReferenceExpression && ((PsiReferenceExpression) expression).isQualified() || expression instanceof PsiMethodCallExpression); + boolean containsQuestDot = expressionToExpression(expression).toKotlin().contains("?."); + + if (isPrimitiveTypeOrNull && isRef && containsQuestDot) + conversion += ".sure()"; + + if (actualType != null) if (isConversionNeeded(actualType, expectedType)) conversion += getPrimitiveTypeConversion(expectedType.getCanonicalText()); - } } return conversion; } diff --git a/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java b/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java index 5be8a82d2be..72baea6e515 100644 --- a/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/BinaryExpression.java @@ -1,6 +1,10 @@ package org.jetbrains.jet.j2k.ast; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.j2k.util.AstUtil; + +import java.util.Arrays; +import java.util.List; /** * @author ignatov @@ -9,16 +13,23 @@ public class BinaryExpression extends Expression { private final Expression myLeft; private final Expression myRight; private final String myOp; + private final List myConversions; public BinaryExpression(Expression left, Expression right, String op) { + this(left, right, op, Arrays.asList("", "")); + } + + public BinaryExpression(Expression left, Expression right, String op, List conversions) { myLeft = left; myRight = right; myOp = op; + myConversions = conversions; } @NotNull @Override public String toKotlin() { - return "(" + myLeft.toKotlin() + SPACE + myOp + SPACE + myRight.toKotlin() + ")"; + List expressionsWithConversions = AstUtil.applyConversions(AstUtil.nodesToKotlin(Arrays.asList(myLeft, myRight)), myConversions); + return "(" + AstUtil.join(expressionsWithConversions, SPACE + myOp + SPACE) + ")"; } } diff --git a/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java b/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java index f8d1abad90d..f5872539874 100644 --- a/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java +++ b/src/org/jetbrains/jet/j2k/ast/PolyadicExpression.java @@ -11,16 +11,19 @@ import java.util.List; public class PolyadicExpression extends Expression { private final List myExpressions; private final String myToken; + private final List myConversions; - public PolyadicExpression(List expressions, String token) { + public PolyadicExpression(List expressions, String token, List conversions) { super(); myExpressions = expressions; myToken = token; + myConversions = conversions; } @NotNull @Override public String toKotlin() { - return "(" + AstUtil.joinNodes(myExpressions, SPACE + myToken + SPACE) + ")"; + List expressionsWithConversions = AstUtil.applyConversions(AstUtil.nodesToKotlin(myExpressions), myConversions); + return "(" + AstUtil.join(expressionsWithConversions, SPACE + myToken + SPACE) + ")"; } } diff --git a/src/org/jetbrains/jet/j2k/util/AstUtil.java b/src/org/jetbrains/jet/j2k/util/AstUtil.java index 3f4718a8da5..fade672d1e9 100644 --- a/src/org/jetbrains/jet/j2k/util/AstUtil.java +++ b/src/org/jetbrains/jet/j2k/util/AstUtil.java @@ -2,7 +2,6 @@ package org.jetbrains.jet.j2k.util; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.j2k.ast.Expression; import org.jetbrains.jet.j2k.ast.INode; import java.util.LinkedList; @@ -57,10 +56,10 @@ public class AstUtil { } @NotNull - public static List createListWithEmptyString(@NotNull final List arguments) { + public static List createListWithEmptyString(@NotNull final List arguments) { final List conversions = new LinkedList(); //noinspection UnusedDeclaration - for (Expression argument : arguments) conversions.add(""); + for (T argument : arguments) conversions.add(""); return conversions; } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 5563e8a12b7..ff754c17393 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -125,7 +125,8 @@ public class ExpressionVisitor extends StatementVisitor { new BinaryExpression( expressionToExpression(expression.getLOperand()), expressionToExpression(expression.getROperand()), - getOperatorString(expression.getOperationSign().getTokenType()) + getOperatorString(expression.getOperationSign().getTokenType()), + createConversions(expression, PsiType.BOOLEAN) ); } @@ -449,7 +450,8 @@ public class ExpressionVisitor extends StatementVisitor { super.visitPolyadicExpression(expression); myResult = new PolyadicExpression( expressionsToExpressionList(expression.getOperands()), - getOperatorString(expression.getOperationTokenType()) + getOperatorString(expression.getOperationTokenType()), + createConversions(expression, PsiType.BOOLEAN) ); } } \ No newline at end of file diff --git a/testData/ast/issues/file/kt-809-string.jav b/testData/ast/issues/file/kt-809-string.jav index 71913e2dfab..5e60a8c8552 100644 --- a/testData/ast/issues/file/kt-809-string.jav +++ b/testData/ast/issues/file/kt-809-string.jav @@ -1,7 +1,7 @@ package demo; class Container { - String myString = 1; + String myString = "1"; } class One { diff --git a/testData/ast/issues/file/kt-852.jav b/testData/ast/issues/file/kt-852.jav new file mode 100644 index 00000000000..b9abf40fe36 --- /dev/null +++ b/testData/ast/issues/file/kt-852.jav @@ -0,0 +1,16 @@ +package demo; + +class Test { + String test() { + String s1 = ""; + String s2 = ""; + String s3 = ""; + if (s1.isEmpty() && s2.isEmpty()) + return "OK"; + + if (s1.isEmpty() && s2.isEmpty() && s3.isEmpty()) + return "OOOK"; + + return ""; + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-852.kt b/testData/ast/issues/file/kt-852.kt new file mode 100644 index 00000000000..be058a4976f --- /dev/null +++ b/testData/ast/issues/file/kt-852.kt @@ -0,0 +1,13 @@ +package demo +open class Test() { +open fun test() : String? { +var s1 : String? = "" +var s2 : String? = "" +var s3 : String? = "" +if (((s1?.isEmpty()).sure() && (s2?.isEmpty()).sure())) +return "OK" +if (((s1?.isEmpty()).sure() && (s2?.isEmpty()).sure() && (s3?.isEmpty()).sure())) +return "OOOK" +return "" +} +} \ No newline at end of file