Debugger: Generate line numbers for class initializers with a number on the 'init' keyword (KT-16277)

Debugger tests not absent as they use the bootstrap version of kotlinc.
Obviously, this change is not present in it yet.
This commit is contained in:
Yan Zhulanow
2019-07-16 19:44:59 +09:00
parent bebc8974b2
commit 076166c22f
7 changed files with 29 additions and 6 deletions
@@ -1473,7 +1473,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
markLineNumber(element, false); markLineNumber(element, false);
} }
public void markLineNumber(@NotNull KtElement statement, boolean markEndOffset) { public void markLineNumber(@NotNull PsiElement statement, boolean markEndOffset) {
if (!shouldMarkLineNumbers) return; if (!shouldMarkLineNumbers) return;
Integer lineNumber = CodegenUtil.getLineNumberForElement(statement, markEndOffset); Integer lineNumber = CodegenUtil.getLineNumberForElement(statement, markEndOffset);
@@ -507,9 +507,18 @@ public abstract class MemberCodegen<T extends KtPureElement/* TODO: & KtDeclarat
if (i == declarations.size() - 1 && this instanceof ScriptCodegen) { if (i == declarations.size() - 1 && this instanceof ScriptCodegen) {
bodyExpressionType = expressionCodegen.expressionType(body); bodyExpressionType = expressionCodegen.expressionType(body);
} }
if (declaration instanceof KtClassInitializer) {
KtClassInitializer classInitializer = (KtClassInitializer) declaration;
expressionCodegen.markLineNumber(classInitializer.getInitKeyword(), true);
expressionCodegen.v.nop();
}
expressionCodegen.gen(body, bodyExpressionType); expressionCodegen.gen(body, bodyExpressionType);
expressionCodegen.markLineNumber(declaration, true); if (declaration instanceof KtClassInitializer) {
nopSeparatorNeeded = true; expressionCodegen.markLineNumber(declaration, true);
nopSeparatorNeeded = true;
}
} }
} }
} }
+13 -1
View File
@@ -28,7 +28,19 @@ class Boo {
} }
} }
class Zoo {
init { val a = 5 }
init { val b = 6 }
init {
val c = 7
}
init { val d = 8 }
}
fun x() = "" fun x() = ""
// IGNORE_BACKEND: JVM_IR // IGNORE_BACKEND: JVM_IR
// 2 2 1 5 6 9 11 12 15 16 24 19 21 22 24 27 28 31 // 2 2 1 4 5 6 9 10 11 12 14 15 16 24 19 20 21 22 24 26 27 28 31 32 34 36 37 38 40 43
@@ -15,4 +15,4 @@ fun main() {
Foo() Foo()
} }
// STEP_OVER: 5 // STEP_OVER: 6
@@ -3,6 +3,7 @@ Run Java
Connected to the target VM Connected to the target VM
initBlocks.kt:6 initBlocks.kt:6
initBlocks.kt:7 initBlocks.kt:7
initBlocks.kt:9
initBlocks.kt:10 initBlocks.kt:10
initBlocks.kt:11 initBlocks.kt:11
initBlocks.kt:15 initBlocks.kt:15
@@ -13,4 +13,4 @@ class A {
} }
// SKIP_CONSTRUCTORS: false // SKIP_CONSTRUCTORS: false
// STEP_INTO: 3 // STEP_INTO: 4
@@ -3,6 +3,7 @@ Run Java
Connected to the target VM Connected to the target VM
doNotSkipConstructors.kt:5 doNotSkipConstructors.kt:5
doNotSkipConstructors.kt:9 doNotSkipConstructors.kt:9
doNotSkipConstructors.kt:10
doNotSkipConstructors.kt:11 doNotSkipConstructors.kt:11
doNotSkipConstructors.kt:12 doNotSkipConstructors.kt:12
Disconnected from the target VM Disconnected from the target VM