From 74c98c0f41fe87a4059d19061d8c039f49923858 Mon Sep 17 00:00:00 2001 From: Sergey Ignatov Date: Mon, 31 Oct 2011 15:24:45 +0400 Subject: [PATCH] ContinueStatement and BreakStatement added --- src/org/jetbrains/jet/j2k/Converter.java | 18 ++++++++--- .../jetbrains/jet/j2k/ast/BreakStatement.java | 31 +++++++++++++++++++ .../jet/j2k/ast/ContinueStatement.java | 31 +++++++++++++++++++ src/org/jetbrains/jet/j2k/ast/INode.java | 2 +- src/org/jetbrains/jet/j2k/ast/Identifier.java | 1 + .../jet/j2k/visitors/StatementVisitor.java | 12 +++++++ .../jet/j2k/ast/BreakStatementTest.java | 23 ++++++++++++++ .../jet/j2k/ast/ContinueStatementTest.java | 23 ++++++++++++++ 8 files changed, 135 insertions(+), 6 deletions(-) create mode 100644 src/org/jetbrains/jet/j2k/ast/BreakStatement.java create mode 100644 src/org/jetbrains/jet/j2k/ast/ContinueStatement.java create mode 100644 test/org/jetbrains/jet/j2k/ast/BreakStatementTest.java create mode 100644 test/org/jetbrains/jet/j2k/ast/ContinueStatementTest.java diff --git a/src/org/jetbrains/jet/j2k/Converter.java b/src/org/jetbrains/jet/j2k/Converter.java index 684a29a8d27..898bd78a75b 100644 --- a/src/org/jetbrains/jet/j2k/Converter.java +++ b/src/org/jetbrains/jet/j2k/Converter.java @@ -2,6 +2,7 @@ package org.jetbrains.jet.j2k; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.j2k.ast.*; import org.jetbrains.jet.j2k.ast.Class; import org.jetbrains.jet.j2k.ast.Enum; @@ -120,12 +121,12 @@ public class Converter { } @NotNull - public static Statement statementToStatement(PsiStatement t) { - if (t == null) + public static Statement statementToStatement(@Nullable PsiStatement s) { + if (s == null) return Statement.EMPTY_STATEMENT; final StatementVisitor statementVisitor = new StatementVisitor(); - t.accept(statementVisitor); - System.out.println(t.getClass()); + s.accept(statementVisitor); + System.out.println(s.getClass()); return statementVisitor.getStatement(); } @@ -139,7 +140,7 @@ public class Converter { } @NotNull - public static Expression expressionToExpression(PsiExpression e) { + public static Expression expressionToExpression(@Nullable PsiExpression e) { if (e == null) return new EmptyExpression(); final ExpressionVisitor expressionVisitor = new ExpressionVisitor(); @@ -215,4 +216,11 @@ public class Converter { typeToType(parameter.getType()) ); } + + @NotNull + public static Identifier identifierToIdentifier(@Nullable PsiIdentifier identifier) { + if (identifier == null) + return Identifier.EMPTY_IDENTIFIER; + return new IdentifierImpl(identifier.getText()); + } } diff --git a/src/org/jetbrains/jet/j2k/ast/BreakStatement.java b/src/org/jetbrains/jet/j2k/ast/BreakStatement.java new file mode 100644 index 00000000000..e48b8ad5b5d --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/BreakStatement.java @@ -0,0 +1,31 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class BreakStatement extends Statement { + private Identifier myLabel = Identifier.EMPTY_IDENTIFIER; + + public BreakStatement(Identifier label) { + myLabel = label; + } + + public BreakStatement() { + } + + @NotNull + @Override + public Kind getKind() { + return Kind.BREAK; + } + + @NotNull + @Override + public String toKotlin() { + if (myLabel.isEmpty()) + return "break"; + return "break" + AT + myLabel.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/ContinueStatement.java b/src/org/jetbrains/jet/j2k/ast/ContinueStatement.java new file mode 100644 index 00000000000..bfed924d439 --- /dev/null +++ b/src/org/jetbrains/jet/j2k/ast/ContinueStatement.java @@ -0,0 +1,31 @@ +package org.jetbrains.jet.j2k.ast; + +import org.jetbrains.annotations.NotNull; + +/** + * @author ignatov + */ +public class ContinueStatement extends Statement { + private Identifier myLabel = Identifier.EMPTY_IDENTIFIER; + + public ContinueStatement(Identifier label) { + myLabel = label; + } + + public ContinueStatement() { + } + + @NotNull + @Override + public Kind getKind() { + return Kind.CONTINUE; + } + + @NotNull + @Override + public String toKotlin() { + if (myLabel.isEmpty()) + return "continue"; + return "continue" + AT + myLabel.toKotlin(); + } +} diff --git a/src/org/jetbrains/jet/j2k/ast/INode.java b/src/org/jetbrains/jet/j2k/ast/INode.java index f8f359ee55a..3a861da7f37 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, + UNDEFINED, TYPE, CONSTRUCTOR, BREAK, CONTINUE, } } diff --git a/src/org/jetbrains/jet/j2k/ast/Identifier.java b/src/org/jetbrains/jet/j2k/ast/Identifier.java index 777a842dc44..bc9f0677ba0 100644 --- a/src/org/jetbrains/jet/j2k/ast/Identifier.java +++ b/src/org/jetbrains/jet/j2k/ast/Identifier.java @@ -4,6 +4,7 @@ package org.jetbrains.jet.j2k.ast; * @author ignatov */ public interface Identifier extends INode { + public static Identifier EMPTY_IDENTIFIER = new IdentifierImpl(""); public String getName(); public boolean isEmpty(); diff --git a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java index 818bdfafe0c..d5acdebd1f3 100644 --- a/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java +++ b/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.java @@ -39,11 +39,23 @@ public class StatementVisitor extends ElementVisitor implements Visitor { @Override public void visitBreakStatement(PsiBreakStatement statement) { super.visitBreakStatement(statement); + if (statement.getLabelIdentifier() == null) + myResult = new BreakStatement(); + else + myResult = new BreakStatement( + identifierToIdentifier(statement.getLabelIdentifier()) + ); } @Override public void visitContinueStatement(PsiContinueStatement statement) { super.visitContinueStatement(statement); + if (statement.getLabelIdentifier() == null) + myResult = new ContinueStatement(); + else + myResult = new ContinueStatement( + identifierToIdentifier(statement.getLabelIdentifier()) + ); } @Override diff --git a/test/org/jetbrains/jet/j2k/ast/BreakStatementTest.java b/test/org/jetbrains/jet/j2k/ast/BreakStatementTest.java new file mode 100644 index 00000000000..e8e7c8907a7 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/BreakStatementTest.java @@ -0,0 +1,23 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class BreakStatementTest extends JetTestCaseBase { + public void testBreakWithoutLabel() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("break;"), + "break" + ); + } + + public void testBreakWithLabel() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("break label;"), + "break@label" + ); + } +} diff --git a/test/org/jetbrains/jet/j2k/ast/ContinueStatementTest.java b/test/org/jetbrains/jet/j2k/ast/ContinueStatementTest.java new file mode 100644 index 00000000000..c7e62f4e123 --- /dev/null +++ b/test/org/jetbrains/jet/j2k/ast/ContinueStatementTest.java @@ -0,0 +1,23 @@ +package org.jetbrains.jet.j2k.ast; + +import junit.framework.Assert; +import org.jetbrains.jet.j2k.JetTestCaseBase; + +/** + * @author ignatov + */ +public class ContinueStatementTest extends JetTestCaseBase { + public void testContinueWithoutLabel() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("continue;"), + "continue" + ); + } + + public void testContinueWithLabel() throws Exception { + Assert.assertEquals( + statementToSingleLineKotlin("continue label;"), + "continue@label" + ); + } +}