From 99a908e8fe2fc52fd5efcb2bd74281e92b1790ee Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 22 Nov 2012 15:44:18 +0400 Subject: [PATCH] If-then-else statements & correct line numbers #KT-3036 Fixed --- .../jetbrains/jet/codegen/ExpressionCodegen.java | 7 ++----- .../testData/codegen/statements/ifThenElse.kt | 9 +++++++++ .../codegen/statements/ifThenElseEmpty.kt | 5 +++++ compiler/testData/lineNumber/custom/ifThenElse.kt | 15 +++++++++++++++ .../org/jetbrains/jet/codegen/LineNumberTest.java | 4 ++++ .../jetbrains/jet/codegen/StatementGenTest.java | 8 ++++++++ 6 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/codegen/statements/ifThenElse.kt create mode 100644 compiler/testData/codegen/statements/ifThenElseEmpty.kt create mode 100644 compiler/testData/lineNumber/custom/ifThenElse.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 19eda466eb5..bf8e479f17d 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -362,7 +362,7 @@ public class ExpressionCodegen extends JetVisitor implem } /* package */ StackValue generateIfExpression(JetIfExpression expression, boolean isStatement) { - Type asmType = expressionType(expression); + Type asmType = isStatement ? Type.VOID_TYPE : expressionType(expression); StackValue condition = gen(expression.getCondition()); JetExpression thenExpression = expression.getThen(); @@ -374,9 +374,6 @@ public class ExpressionCodegen extends JetVisitor implem if (isEmptyExpression(thenExpression)) { if (isEmptyExpression(elseExpression)) { - if (!asmType.equals(JET_TUPLE0_TYPE)) { - throw new CompilationException("Completely empty 'if' is expected to have Unit type", null, expression); - } condition.put(asmType, v); return StackValue.onStack(asmType); } @@ -388,7 +385,6 @@ public class ExpressionCodegen extends JetVisitor implem } } - Label elseLabel = new Label(); condition.condJump(elseLabel, true, v); // == 0, i.e. false @@ -401,6 +397,7 @@ public class ExpressionCodegen extends JetVisitor implem gen(elseExpression, asmType); + markLineNumber(expression); v.mark(end); return StackValue.onStack(asmType); diff --git a/compiler/testData/codegen/statements/ifThenElse.kt b/compiler/testData/codegen/statements/ifThenElse.kt new file mode 100644 index 00000000000..72afa7658a9 --- /dev/null +++ b/compiler/testData/codegen/statements/ifThenElse.kt @@ -0,0 +1,9 @@ +fun z(b: Boolean) {} + +fun foo(b: Boolean) { + if (b) { + z(b) + } else { + z(b) + } +} diff --git a/compiler/testData/codegen/statements/ifThenElseEmpty.kt b/compiler/testData/codegen/statements/ifThenElseEmpty.kt new file mode 100644 index 00000000000..d7ac5e5d21f --- /dev/null +++ b/compiler/testData/codegen/statements/ifThenElseEmpty.kt @@ -0,0 +1,5 @@ +fun foo(b: Boolean) { + if (b) { + } else { + } +} diff --git a/compiler/testData/lineNumber/custom/ifThenElse.kt b/compiler/testData/lineNumber/custom/ifThenElse.kt new file mode 100644 index 00000000000..e6949f39c57 --- /dev/null +++ b/compiler/testData/lineNumber/custom/ifThenElse.kt @@ -0,0 +1,15 @@ +fun foo() { + if (0 < 1) { + System.out?.println() + } else { + System.out?.println() + } + + val b = if (1 < 2) { + System.out?.println() + } else { + System.out?.println() + } +} + +// 2 3 5 8 9 11 8 diff --git a/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java b/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java index 779e0b24468..fe85c3182b4 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java @@ -299,6 +299,10 @@ public class LineNumberTest extends TestCaseWithTmpdir { doTestCustom(); } + public void testIfThenElse() { + doTestCustom(); + } + public void testStaticDelegate() { JetFile foo = createPsiFile("staticDelegate/foo.kt"); JetFile bar = createPsiFile("staticDelegate/bar.kt"); diff --git a/compiler/tests/org/jetbrains/jet/codegen/StatementGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/StatementGenTest.java index 0f1642600bf..583418e6337 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/StatementGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/StatementGenTest.java @@ -40,4 +40,12 @@ public class StatementGenTest extends CodegenTestCase { public void testIfSingleBranch() { doTest(); } + + public void testIfThenElse() { + doTest(); + } + + public void testIfThenElseEmpty() { + doTest(); + } }