diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index fe5e447064f..f2da85ef0e7 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -403,7 +403,8 @@ public class ExpressionCodegen extends JetVisitor implem gen(elseExpression, asmType); - markLineNumber(expression); + markExpressionLineNumber(expression, isStatement); + v.mark(end); return StackValue.onStack(asmType); @@ -1216,10 +1217,10 @@ public class ExpressionCodegen extends JetVisitor implem Label end = new Label(); v.goTo(end); - markLineNumber(ifExpression); v.mark(elseLabel); StackValue.putUnitInstance(v); + markLineNumber(ifExpression); v.mark(end); return StackValue.onStack(targetType); } @@ -1546,6 +1547,12 @@ public class ExpressionCodegen extends JetVisitor implem }); } + public void markExpressionLineNumber(@NotNull JetElement element, boolean isStatement) { + if (!isStatement) { + markLineNumber(element); + } + } + public void markLineNumber(@NotNull JetElement statement) { Document document = statement.getContainingFile().getViewProvider().getDocument(); if (document != null) { @@ -3609,7 +3616,7 @@ The "returned" value of try expression with no finally is either the last expres generateExceptionTable(defaultCatchStart, defaultCatchRegions, null); } - markLineNumber(expression); + markExpressionLineNumber(expression, isStatement); v.mark(end); if (!isStatement) { @@ -3822,7 +3829,7 @@ The "returned" value of try expression with no finally is either the last expres } } - markLineNumber(expression); + markExpressionLineNumber(expression, isStatement); v.mark(end); myFrameMap.leaveTemp(subjectType); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/when/SwitchCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/when/SwitchCodegen.java index 78a53a7f68a..44bdf17f41b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/when/SwitchCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/when/SwitchCodegen.java @@ -86,7 +86,7 @@ abstract public class SwitchCodegen { codegen.putUnitInstanceOntoStackForNonExhaustiveWhen(expression); } - codegen.markLineNumber(expression); + codegen.markExpressionLineNumber(expression, isStatement); v.mark(endLabel); } diff --git a/compiler/testData/codegen/bytecodeText/lineNumbers/ifElse.kt b/compiler/testData/codegen/bytecodeText/lineNumbers/ifElse.kt new file mode 100644 index 00000000000..302c4d2b588 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/lineNumbers/ifElse.kt @@ -0,0 +1,8 @@ +fun foo() { + if (0 < 1) { + System.out?.println() + } else { + System.out?.println() + } +} +// 1 LINENUMBER 2 \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeText/lineNumbers/singleThen.kt b/compiler/testData/codegen/bytecodeText/lineNumbers/singleThen.kt new file mode 100644 index 00000000000..a92db8cec9e --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/lineNumbers/singleThen.kt @@ -0,0 +1,6 @@ +fun foo() { + if (0 < 1) { + System.out?.println() + } +} +// 1 LINENUMBER 2 \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeText/lineNumbers/tryCatch.kt b/compiler/testData/codegen/bytecodeText/lineNumbers/tryCatch.kt new file mode 100644 index 00000000000..0fdc13a0e6b --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/lineNumbers/tryCatch.kt @@ -0,0 +1,8 @@ +fun foo() { + try { + System.out?.println() + } catch(e: Exception) { + System.out?.println() + } +} +// 1 LINENUMBER 2 \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeText/lineNumbers/when.kt b/compiler/testData/codegen/bytecodeText/lineNumbers/when.kt new file mode 100644 index 00000000000..53ad35cd814 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/lineNumbers/when.kt @@ -0,0 +1,8 @@ +fun foo() { + val p = 1 + when (p) { + 0 -> System.out?.println() + else -> System.out?.println() + } +} +// 1 LINENUMBER 3 \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java index fd4e7de786a..cc83da65085 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java @@ -30,7 +30,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("compiler/testData/codegen/bytecodeText") @TestDataPath("$PROJECT_ROOT") -@InnerTestClasses({BytecodeTextTestGenerated.BoxingOptimization.class, BytecodeTextTestGenerated.Constants.class, BytecodeTextTestGenerated.DirectInvoke.class, BytecodeTextTestGenerated.Inline.class, BytecodeTextTestGenerated.Statements.class, BytecodeTextTestGenerated.StoreStackBeforeInline.class, BytecodeTextTestGenerated.When.class, BytecodeTextTestGenerated.WhenEnumOptimization.class, BytecodeTextTestGenerated.WhenStringOptimization.class}) +@InnerTestClasses({BytecodeTextTestGenerated.BoxingOptimization.class, BytecodeTextTestGenerated.Constants.class, BytecodeTextTestGenerated.DirectInvoke.class, BytecodeTextTestGenerated.Inline.class, BytecodeTextTestGenerated.LineNumbers.class, BytecodeTextTestGenerated.Statements.class, BytecodeTextTestGenerated.StoreStackBeforeInline.class, BytecodeTextTestGenerated.When.class, BytecodeTextTestGenerated.WhenEnumOptimization.class, BytecodeTextTestGenerated.WhenStringOptimization.class}) @RunWith(JUnit3RunnerWithInners.class) public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { @TestMetadata("accessorForProtected.kt") @@ -343,6 +343,39 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { } } + @TestMetadata("compiler/testData/codegen/bytecodeText/lineNumbers") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class LineNumbers extends AbstractBytecodeTextTest { + public void testAllFilesPresentInLineNumbers() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/bytecodeText/lineNumbers"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("ifElse.kt") + public void testIfElse() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/lineNumbers/ifElse.kt"); + doTest(fileName); + } + + @TestMetadata("singleThen.kt") + public void testSingleThen() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/lineNumbers/singleThen.kt"); + doTest(fileName); + } + + @TestMetadata("tryCatch.kt") + public void testTryCatch() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/lineNumbers/tryCatch.kt"); + doTest(fileName); + } + + @TestMetadata("when.kt") + public void testWhen() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/lineNumbers/when.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/codegen/bytecodeText/statements") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)