diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/FieldRemapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/FieldRemapper.java index 39ff97d369e..1f69245ba50 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/FieldRemapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/FieldRemapper.java @@ -122,4 +122,8 @@ public class FieldRemapper { CapturedParamInfo field = MethodInliner.findCapturedField(node, this); return field.getRemapValue(); } + + public boolean isInsideInliningLambda() { + return !isRoot() && parent.isInsideInliningLambda(); + } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/InlinedLambdaRemapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/InlinedLambdaRemapper.java index 0aa19f63a0d..28b1aae1a26 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/InlinedLambdaRemapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/InlinedLambdaRemapper.java @@ -47,4 +47,9 @@ public class InlinedLambdaRemapper extends FieldRemapper { return parent.findField(fieldInsnNode, captured); } + + @Override + public boolean isInsideInliningLambda() { + return true; + } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/MethodInliner.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/MethodInliner.java index 66683d98131..122e9b548d0 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/MethodInliner.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/MethodInliner.java @@ -229,6 +229,8 @@ public class MethodInliner { node.instructions.resetLabels(); MethodNode transformedNode = new MethodNode(node.access, node.name, Type.getMethodDescriptor(returnType, allTypes), node.signature, null) { + private final boolean keepLineNumbers = nodeRemapper.isInsideInliningLambda(); + @Override public void visitVarInsn(int opcode, int var) { int newIndex; @@ -255,6 +257,13 @@ public class MethodInliner { public void visitMaxs(int maxStack, int maxLocals) { super.visitMaxs(maxStack, maxLocals + capturedParamsSize); } + + @Override + public void visitLineNumber(int line, Label start) { + if(keepLineNumbers) { + super.visitLineNumber(line, start); + } + } }; node.accept(transformedNode); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/RemapVisitor.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/RemapVisitor.java index f556da2431c..0577bd5e29c 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/RemapVisitor.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/RemapVisitor.java @@ -33,7 +33,13 @@ public class RemapVisitor extends InstructionAdapter { private final boolean remapReturn; private FieldRemapper nodeRemapper; - protected RemapVisitor(MethodVisitor mv, Label end, VarRemapper.ParamRemapper remapper, boolean remapReturn, FieldRemapper nodeRemapper) { + protected RemapVisitor( + MethodVisitor mv, + Label end, + VarRemapper.ParamRemapper remapper, + boolean remapReturn, + FieldRemapper nodeRemapper + ) { super(InlineCodegenUtil.API, mv); this.end = end; this.remapper = remapper; @@ -106,9 +112,4 @@ public class RemapVisitor extends InstructionAdapter { return null; } - //TODO not skip for lambdas - @Override - public void visitLineNumber(int line, Label start) { - - } } diff --git a/compiler/testData/lineNumber/inlineSimpleCall.kt b/compiler/testData/lineNumber/inlineSimpleCall.kt new file mode 100644 index 00000000000..db31de8fbb8 --- /dev/null +++ b/compiler/testData/lineNumber/inlineSimpleCall.kt @@ -0,0 +1,21 @@ +inline fun inlineFun(s: () -> Unit) { + s() +} + +fun main(args: Array) { + inlineFun ({ + test.lineNumber() + }) + + inlineFun { + test.lineNumber() + } + + inlineFun { + test.lineNumber() + + inlineFun { + test.lineNumber() + } + } +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java b/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java index 62dbfd9bd7d..6804b348f99 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/LineNumberTest.java @@ -293,6 +293,10 @@ public class LineNumberTest extends TestCaseWithTmpdir { doTest(); } + public void testInlineSimpleCall() { + doTest(); + } + public void testCompileTimeConstant() { doTestCustom(); }