From 96aced06ee88ad86897f6748c000da37e599d8a0 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Wed, 14 Dec 2011 12:33:41 +0400 Subject: [PATCH] KT-824 Add explicit conversion in conditions --- src/org/jetbrains/jet/j2k/Converter.java | 11 ++++---- src/org/jetbrains/jet/j2k/ast/Field.java | 11 ++------ .../jetbrains/jet/j2k/ast/LocalVariable.java | 6 ++--- .../jet/j2k/ast/SureCallChainExpression.java | 27 +++++++++++++++++++ .../jet/j2k/visitors/ElementVisitor.java | 3 +-- .../jet/j2k/visitors/ExpressionVisitor.java | 6 ++++- .../jet/j2k/visitors/StatementVisitor.java | 20 ++++++++++---- testData/ast/issues/file/kt-824.jav | 25 +++++++++++++++++ testData/ast/issues/file/kt-824.kt | 26 ++++++++++++++++++ 9 files changed, 108 insertions(+), 27 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/SureCallChainExpression.java create mode 100644 testData/ast/issues/file/kt-824.jav create mode 100644 testData/ast/issues/file/kt-824.kt diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index c198eeb5688..b5eb951ec58 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -275,8 +275,7 @@ public class Converter { new IdentifierImpl(field.getName()), // TODO modifiers, typeToType(field.getType()), - expressionToExpression(field.getInitializer()), // TODO: add modifiers - createConversionForCallChains(field.getInitializer(), field.getType()) + createSureCallOnlyForChain(field.getInitializer(), field.getType()) // TODO: add modifiers ); } @@ -651,9 +650,9 @@ public class Converter { // } @NotNull - public static String createConversionForCallChains(PsiExpression initializer, PsiType type) { - if (initializer != null && initializer instanceof PsiReferenceExpression && ((PsiReferenceExpression) initializer).isQualified()) - return createConversionForExpression(initializer, type); - return ""; + public static SureCallChainExpression createSureCallOnlyForChain(PsiExpression expression, PsiType type) { + String conversion = (expression != null && expression instanceof PsiReferenceExpression && ((PsiReferenceExpression) expression).isQualified()) ? + createConversionForExpression(expression, type) : ""; + return new SureCallChainExpression(expressionToExpression(expression), conversion); } } \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/Field.java b/src/org/jetbrains/jet/j2k/ast/Field.java index c0593ffd9eb..8c2bbde5b94 100644 --- a/src/org/jetbrains/jet/j2k/ast/Field.java +++ b/src/org/jetbrains/jet/j2k/ast/Field.java @@ -14,23 +14,16 @@ import static org.jetbrains.jet.j2k.Converter.getDefaultInitializer; */ public class Field extends Member { final Identifier myIdentifier; - @NotNull - private final String myConversion; final Type myType; final Element myInitializer; - public Field(Identifier identifier, Set modifiers, Type type, Element initializer, @NotNull String conversionForCallChains) { + public Field(Identifier identifier, Set modifiers, Type type, Element initializer) { myIdentifier = identifier; - myConversion = conversionForCallChains; myModifiers = modifiers; myType = type; myInitializer = initializer; } - public Field(Identifier identifier, Set modifiers, Type type, Element initializer) { - this(identifier, modifiers, type, initializer, ""); - } - public Element getInitializer() { return myInitializer; } @@ -78,6 +71,6 @@ public class Field extends Member { return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + EQUAL + SPACE + getDefaultInitializer(this); return modifier + myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + - EQUAL + SPACE + myInitializer.toKotlin() + myConversion; + EQUAL + SPACE + myInitializer.toKotlin(); } } \ No newline at end of file diff --git a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java index c377b9af56d..0c561827a18 100644 --- a/src/org/jetbrains/jet/j2k/ast/LocalVariable.java +++ b/src/org/jetbrains/jet/j2k/ast/LocalVariable.java @@ -12,14 +12,12 @@ public class LocalVariable extends Expression { private final Set myModifiersSet; private final Type myType; private final Expression myInitializer; - private final String myConversion; - public LocalVariable(Identifier identifier, Set modifiersSet, Type type, Expression initializer, @NotNull String conversionForExpression) { + public LocalVariable(Identifier identifier, Set modifiersSet, Type type, Expression initializer) { myIdentifier = identifier; myModifiersSet = modifiersSet; myType = type; myInitializer = initializer; - myConversion = conversionForExpression; } public boolean hasModifier(String modifier) { @@ -33,6 +31,6 @@ public class LocalVariable extends Expression { return myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin(); return myIdentifier.toKotlin() + SPACE + COLON + SPACE + myType.toKotlin() + SPACE + - EQUAL + SPACE + myInitializer.toKotlin() + myConversion; + EQUAL + SPACE + myInitializer.toKotlin(); } } diff --git a/src/org/jetbrains/jet/j2k/ast/SureCallChainExpression.java b/src/org/jetbrains/jet/j2k/ast/SureCallChainExpression.java new file mode 100644 index 00000000000..f570fcce81c --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/SureCallChainExpression.java @@ -0,0 +1,27 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class SureCallChainExpression extends Expression { + private final Expression myExpression; + private final String myConversion; + + public SureCallChainExpression(Expression expression, String conversion) { + myExpression = expression; + myConversion = conversion; + } + + @Override + public boolean isEmpty() { + return myExpression.isEmpty(); + } + + @NotNull + @Override + public String toKotlin() { + return myExpression.toKotlin() + myConversion; + } +} diff --git a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java index cda41ceba8b..29d888bd2c4 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.java @@ -30,8 +30,7 @@ public class ElementVisitor extends JavaElementVisitor { new IdentifierImpl(variable.getName()), // TODO modifiersListToModifiersSet(variable.getModifierList()), typeToType(variable.getType(), Converter.isNotNull(variable.getModifierList())), - expressionToExpression(variable.getInitializer()), - createConversionForCallChains(variable.getInitializer(), variable.getType()) + createSureCallOnlyForChain(variable.getInitializer(), variable.getType()) ); } diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 6311bea2780..eb9a541fbac 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -136,9 +136,13 @@ public class ExpressionVisitor extends StatementVisitor { @Override public void visitConditionalExpression(@NotNull PsiConditionalExpression expression) { super.visitConditionalExpression(expression); + PsiExpression condition = expression.getCondition(); + Expression e = condition.getType() != null ? + createSureCallOnlyForChain(condition, condition.getType()) : + expressionToExpression(condition); myResult = new ParenthesizedExpression( new IfStatement( - expressionToExpression(expression.getCondition()), + e, expressionToExpression(expression.getThenExpression()), expressionToExpression(expression.getElseExpression()) ) diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index d7d1ea178aa..53f34e4004a 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -15,8 +15,6 @@ import java.util.LinkedList; import java.util.List; import static org.jetbrains.jet.j2k.Converter.*; -import static org.jetbrains.jet.j2k.Converter.getPrimitiveTypeConversion; -import static org.jetbrains.jet.j2k.Converter.isConversionNeeded; /** * @author ignatov @@ -81,8 +79,12 @@ public class StatementVisitor extends ElementVisitor { @Override public void visitDoWhileStatement(@NotNull PsiDoWhileStatement statement) { super.visitDoWhileStatement(statement); + PsiExpression condition = statement.getCondition(); + Expression expression = condition != null && condition.getType() != null ? + createSureCallOnlyForChain(condition, condition.getType()) : + expressionToExpression(condition); myResult = new DoWhileStatement( - expressionToExpression(statement.getCondition()), + expression, statementToStatement(statement.getBody()) ); } @@ -176,8 +178,12 @@ public class StatementVisitor extends ElementVisitor { @Override public void visitIfStatement(@NotNull PsiIfStatement statement) { super.visitIfStatement(statement); + PsiExpression condition = statement.getCondition(); + Expression expression = condition != null && condition.getType() != null ? + createSureCallOnlyForChain(condition, condition.getType()) : + expressionToExpression(condition); myResult = new IfStatement( - expressionToExpression(statement.getCondition()), + expression, statementToStatement(statement.getThenBranch()), statementToStatement(statement.getElseBranch()) ); @@ -327,8 +333,12 @@ public class StatementVisitor extends ElementVisitor { @Override public void visitWhileStatement(@NotNull PsiWhileStatement statement) { super.visitWhileStatement(statement); + PsiExpression condition = statement.getCondition(); + Expression expression = condition != null && condition.getType() != null ? + createSureCallOnlyForChain(condition, condition.getType()) : + expressionToExpression(condition); myResult = new WhileStatement( - expressionToExpression(statement.getCondition()), + expression, statementToStatement(statement.getBody()) ); } diff --git a/testData/ast/issues/file/kt-824.jav b/testData/ast/issues/file/kt-824.jav new file mode 100644 index 00000000000..4e0a95754fd --- /dev/null +++ b/testData/ast/issues/file/kt-824.jav @@ -0,0 +1,25 @@ +package demo; + +class Container { + boolean myBoolean = true; +} + +class One { + static Container myContainer = new Container(); +} + +class Test { + void test() { + if (One.myContainer.myBoolean) + System.out.println("Ok"); + + String s = One.myContainer.myBoolean ? "YES" : "NO"; + + while (One.myContainer.myBoolean) + System.out.println("Ok"); + + do { + System.out.println("Ok"); + } while (One.myContainer.myBoolean) + } +} \ No newline at end of file diff --git a/testData/ast/issues/file/kt-824.kt b/testData/ast/issues/file/kt-824.kt new file mode 100644 index 00000000000..87e1d165317 --- /dev/null +++ b/testData/ast/issues/file/kt-824.kt @@ -0,0 +1,26 @@ +namespace demo +open class Container() { +var myBoolean : Boolean = true +} +open class One() { +class object { +var myContainer : Container? = Container() +} +} +open class Test() { +open fun test() : Unit { +if (One.myContainer?.myBoolean.sure()) +System.out?.println("Ok") +var s : String? = (if (One.myContainer?.myBoolean.sure()) +"YES" +else +"NO") +while (One.myContainer?.myBoolean.sure()) +System.out?.println("Ok") +do +{ +System.out?.println("Ok") +} +while (One.myContainer?.myBoolean.sure()) +} +} \ No newline at end of file