From 9d3907ff982ab5e0d13cc61cfaaf537979017e37 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Thu, 22 Nov 2012 18:51:30 +0400 Subject: [PATCH] When-statements & correct line numbers --- .../jet/codegen/CodegenStatementVisitor.java | 5 +++++ .../jetbrains/jet/codegen/ExpressionCodegen.java | 8 +++++++- compiler/testData/codegen/statements/when.kt | 9 +++++++++ .../testData/codegen/statements/whenSubject.kt | 9 +++++++++ compiler/testData/lineNumber/custom/when.kt | 15 +++++++++++++++ .../testData/lineNumber/custom/whenSubject.kt | 15 +++++++++++++++ .../org/jetbrains/jet/codegen/LineNumberTest.java | 8 ++++++++ .../jetbrains/jet/codegen/StatementGenTest.java | 8 ++++++++ 8 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/statements/when.kt create mode 100644 compiler/testData/codegen/statements/whenSubject.kt create mode 100644 compiler/testData/lineNumber/custom/when.kt create mode 100644 compiler/testData/lineNumber/custom/whenSubject.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenStatementVisitor.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenStatementVisitor.java index ac16828fdbd..6ec899f7f33 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenStatementVisitor.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenStatementVisitor.java @@ -39,4 +39,9 @@ public class CodegenStatementVisitor extends JetVisitor public StackValue visitTryExpression(JetTryExpression expression, StackValue data) { return codegen.generateTryExpression(expression, true); } + + @Override + public StackValue visitWhenExpression(JetWhenExpression expression, StackValue data) { + return codegen.generateWhenExpression(expression, true); + } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index ed8bc777477..05be1fecd03 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -3378,10 +3378,14 @@ The "returned" value of try expression with no finally is either the last expres @Override public StackValue visitWhenExpression(JetWhenExpression expression, StackValue receiver) { + return generateWhenExpression(expression, false); + } + + public StackValue generateWhenExpression(JetWhenExpression expression, boolean isStatement) { JetExpression expr = expression.getSubjectExpression(); JetType subjectJetType = bindingContext.get(BindingContext.EXPRESSION_TYPE, expr); final Type subjectType = asmTypeOrVoid(subjectJetType); - final Type resultType = expressionType(expression); + final Type resultType = isStatement ? Type.VOID_TYPE : expressionType(expression); final int subjectLocal = expr != null ? myFrameMap.enterTemp(subjectType) : -1; if (subjectLocal != -1) { gen(expr, subjectType); @@ -3432,6 +3436,8 @@ The "returned" value of try expression with no finally is either the last expres v.mark(nextCondition); throwNewException(CLASS_NO_PATTERN_MATCHED_EXCEPTION); } + + markLineNumber(expression); v.mark(end); myFrameMap.leaveTemp(subjectType); diff --git a/compiler/testData/codegen/statements/when.kt b/compiler/testData/codegen/statements/when.kt new file mode 100644 index 00000000000..307393f9929 --- /dev/null +++ b/compiler/testData/codegen/statements/when.kt @@ -0,0 +1,9 @@ +fun z() {} + +fun foo(x: Int) { + when { + x == 21 -> z() + x == 42 -> z() + else -> {} + } +} diff --git a/compiler/testData/codegen/statements/whenSubject.kt b/compiler/testData/codegen/statements/whenSubject.kt new file mode 100644 index 00000000000..918b208630a --- /dev/null +++ b/compiler/testData/codegen/statements/whenSubject.kt @@ -0,0 +1,9 @@ +fun z() {} + +fun foo(x: Int) { + when (x) { + 21 -> z() + 42 -> z() + else -> {} + } +} diff --git a/compiler/testData/lineNumber/custom/when.kt b/compiler/testData/lineNumber/custom/when.kt new file mode 100644 index 00000000000..6ca520b0d75 --- /dev/null +++ b/compiler/testData/lineNumber/custom/when.kt @@ -0,0 +1,15 @@ +fun foo(x: Int) { + when { + x == 21 -> foo(x) + x == 42 -> foo(x) + else -> foo(x) + } + + val t = when { + x == 21 -> foo(x) + x == 42 -> foo(x) + else -> foo(x) + } +} + +// 3 4 5 9 10 11 8 diff --git a/compiler/testData/lineNumber/custom/whenSubject.kt b/compiler/testData/lineNumber/custom/whenSubject.kt new file mode 100644 index 00000000000..9962712b759 --- /dev/null +++ b/compiler/testData/lineNumber/custom/whenSubject.kt @@ -0,0 +1,15 @@ +fun foo(x: Int) { + when (x) { + 21 -> foo(x) + 42 -> foo(x) + else -> foo(x) + } + + val t = when (x) { + 21 -> foo(x) + 42 -> foo(x) + else -> foo(x) + } +} + +// 2 3 4 5 8 9 10 11 8 diff --git a/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java b/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java index eb1b837659e..db64420f88d 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java @@ -319,6 +319,14 @@ public class LineNumberTest extends TestCaseWithTmpdir { doTestCustom(); } + public void testWhen() { + doTestCustom(); + } + + public void testWhenSubject() { + 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 41907edf79b..95aa812aea0 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/StatementGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/StatementGenTest.java @@ -52,4 +52,12 @@ public class StatementGenTest extends CodegenTestCase { public void testTryCatchFinally() { doTest(); } + + public void testWhen() { + doTest(); + } + + public void testWhenSubject() { + doTest(); + } }