From 8f1727882a6c090a4aafe6c9e36e2c0afc60c3b3 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 7 Nov 2011 15:22:36 +0400 Subject: [PATCH] nullable safe calls supported (only for fields) --- src/org/jetbrains/jet/j2k/ast/CallChain.java | 32 +++++++++++++++++++ src/org/jetbrains/jet/j2k/ast/Expression.java | 13 ++++++++ .../jetbrains/jet/j2k/ast/IdentifierImpl.java | 11 +++++++ src/org/jetbrains/jet/j2k/ast/Node.java | 1 + .../jet/j2k/visitors/ExpressionVisitor.java | 6 +++- .../ast/callChain/file/libraryFieldCall.jav | 9 ++++++ .../ast/callChain/file/libraryFieldCall.kt | 12 +++++++ testData/ast/callChain/statement/sout.jav | 1 + testData/ast/callChain/statement/sout.kt | 1 + .../ast/enum/class/runnableImplementation.kt | 2 +- .../complicatedExampleFromJavaTutorial.kt | 2 +- .../expression/parenthesized2.jav | 2 +- .../expression/parenthesized2.kt | 2 +- 13 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/CallChain.java create mode 100644 testData/ast/callChain/file/libraryFieldCall.jav create mode 100644 testData/ast/callChain/file/libraryFieldCall.kt create mode 100644 testData/ast/callChain/statement/sout.jav create mode 100644 testData/ast/callChain/statement/sout.kt diff --git a/src/org/jetbrains/jet/j2k/ast/CallChain.java b/src/org/jetbrains/jet/j2k/ast/CallChain.java new file mode 100644 index 00000000000..e53d6f85bb6 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/CallChain.java @@ -0,0 +1,32 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class CallChain extends Expression { + private Expression myExpression; + private IdentifierImpl myIdentifier; + + public CallChain(Expression expression, IdentifierImpl identifier) { + myExpression = expression; + myIdentifier = identifier; + } + + @Override + public boolean isNullable() { + return myIdentifier.isNullable(); + } + + @NotNull + @Override + public String toKotlin() { + if (!myExpression.isEmpty()) + if (myExpression.isNullable()) + return myExpression.toKotlin() + QUESTDOT + myIdentifier.toKotlin(); + else + return myExpression.toKotlin() + DOT + myIdentifier.toKotlin(); + return myIdentifier.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/Expression.java b/src/org/jetbrains/jet/j2k/ast/Expression.java index a18e4322dfd..b557b85ad63 100644 --- a/src/org/jetbrains/jet/j2k/ast/Expression.java +++ b/src/org/jetbrains/jet/j2k/ast/Expression.java @@ -17,5 +17,18 @@ public abstract class Expression extends Statement { public String toKotlin() { return EMPTY; } + + @Override + public boolean isEmpty() { + return true; + } + } + + public boolean isNullable() { + return false; + } + + public boolean isEmpty() { + return false; } } diff --git a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java index a17b486ed9b..dd631e04846 100644 --- a/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java +++ b/src/org/jetbrains/jet/j2k/ast/IdentifierImpl.java @@ -7,11 +7,17 @@ import org.jetbrains.annotations.NotNull; */ public class IdentifierImpl extends Expression implements Identifier { private final String myName; + private boolean myNullable = true; public IdentifierImpl(String name) { myName = name; } + public IdentifierImpl(String name, boolean nullable) { + myName = name; + myNullable = nullable; + } + @Override public String getName() { return myName; @@ -26,6 +32,11 @@ public class IdentifierImpl extends Expression implements Identifier { return BACKTICK + str + BACKTICK; } + @Override + public boolean isNullable() { + return myNullable; + } + @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 954a77ba3b8..17f454d112a 100644 --- a/src/org/jetbrains/jet/j2k/ast/Node.java +++ b/src/org/jetbrains/jet/j2k/ast/Node.java @@ -33,6 +33,7 @@ public abstract class Node implements INode { static final String EQUAL = "="; static final String EMPTY = ""; static final String DOT = "."; + static final String QUESTDOT = "?."; static final String COLON = ":"; static final String IN = "in"; static final String AT = "@"; diff --git a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java index 522f06a5398..947e9550a65 100644 --- a/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.java @@ -225,7 +225,11 @@ public class ExpressionVisitor extends StatementVisitor implements Visitor { @Override public void visitReferenceExpression(PsiReferenceExpression expression) { super.visitReferenceExpression(expression); - myResult = new IdentifierImpl(expression.getQualifiedName()); // TODO + final IdentifierImpl identifier = expression.getType() != null ? // TODO: if type exists so id is nullable + new IdentifierImpl(expression.getReferenceName()) : + new IdentifierImpl(expression.getReferenceName(), false); + + myResult = new CallChain(expressionToExpression(expression.getQualifierExpression()), identifier); } @Override diff --git a/testData/ast/callChain/file/libraryFieldCall.jav b/testData/ast/callChain/file/libraryFieldCall.jav new file mode 100644 index 00000000000..2278e35a1bc --- /dev/null +++ b/testData/ast/callChain/file/libraryFieldCall.jav @@ -0,0 +1,9 @@ +class Library { + final static java.io.PrintStream ourOut; +} + +class User { + void main() { + Library.ourOut.print(); + } +} \ No newline at end of file diff --git a/testData/ast/callChain/file/libraryFieldCall.kt b/testData/ast/callChain/file/libraryFieldCall.kt new file mode 100644 index 00000000000..c77bf3464a2 --- /dev/null +++ b/testData/ast/callChain/file/libraryFieldCall.kt @@ -0,0 +1,12 @@ +namespace { +open class Library { +class object { +val ourOut : PrintStream? +} +} +open class User { +fun main() : Unit { +Library.ourOut?.print() +} +} +} \ No newline at end of file diff --git a/testData/ast/callChain/statement/sout.jav b/testData/ast/callChain/statement/sout.jav new file mode 100644 index 00000000000..a16cbe89562 --- /dev/null +++ b/testData/ast/callChain/statement/sout.jav @@ -0,0 +1 @@ +System.out.println("Hello, world"); \ No newline at end of file diff --git a/testData/ast/callChain/statement/sout.kt b/testData/ast/callChain/statement/sout.kt new file mode 100644 index 00000000000..fcb68d6e04d --- /dev/null +++ b/testData/ast/callChain/statement/sout.kt @@ -0,0 +1 @@ +System.`out`?.println("Hello, world") \ No newline at end of file diff --git a/testData/ast/enum/class/runnableImplementation.kt b/testData/ast/enum/class/runnableImplementation.kt index 912272d9e94..36d35060e78 100644 --- a/testData/ast/enum/class/runnableImplementation.kt +++ b/testData/ast/enum/class/runnableImplementation.kt @@ -5,6 +5,6 @@ RED YELLOW BLUE override public fun run() : Unit { -System.out.println(("name()=" + name() + ", toString()=" + toString())) +System.`out`?.println(("name()=" + name() + ", toString()=" + toString())) } } \ No newline at end of file diff --git a/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt b/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt index 9451018950a..4959a4593a2 100644 --- a/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt +++ b/testData/ast/labelStatement/statement/complicatedExampleFromJavaTutorial.kt @@ -21,7 +21,7 @@ break@test } } } -System.out.println((if (foundIt) +System.`out`?.println((if (foundIt) "Found it" else "Didn't find it")) \ No newline at end of file diff --git a/testData/ast/parenthesizedExpression/expression/parenthesized2.jav b/testData/ast/parenthesizedExpression/expression/parenthesized2.jav index 390ddb6f123..01d3d19b7d8 100644 --- a/testData/ast/parenthesizedExpression/expression/parenthesized2.jav +++ b/testData/ast/parenthesizedExpression/expression/parenthesized2.jav @@ -1 +1 @@ -(o.toString() + "abc") \ No newline at end of file +(str.toString() + "abc") \ No newline at end of file diff --git a/testData/ast/parenthesizedExpression/expression/parenthesized2.kt b/testData/ast/parenthesizedExpression/expression/parenthesized2.kt index 53aa2923a2c..42a621de6bb 100644 --- a/testData/ast/parenthesizedExpression/expression/parenthesized2.kt +++ b/testData/ast/parenthesizedExpression/expression/parenthesized2.kt @@ -1 +1 @@ -((o.toString() + "abc")) \ No newline at end of file +((str.toString() + "abc")) \ No newline at end of file