Debugger: Allow super calls (KT-20560)

This commit is contained in:
Yan Zhulanow
2019-04-16 23:59:20 +03:00
parent cbbb3c35da
commit 38dba20e24
9 changed files with 103 additions and 4 deletions
@@ -63,7 +63,18 @@ class CodeFragmentCodegen private constructor(
override fun generateBody() {
genConstructor()
genMethod(classContext.intoFunction(methodDescriptor))
val methodContext = object : MethodContext(methodDescriptor, classContext.contextKind, classContext, null, false) {
override fun <D : CallableMemberDescriptor> getAccessorForSuperCallIfNeeded(
descriptor: D,
superCallTarget: ClassDescriptor?,
state: GenerationState
): D {
return descriptor
}
}
genMethod(methodContext)
}
override fun generateKotlinMetadataAnnotation() {
@@ -169,8 +169,16 @@ class CodeFragmentParameterAnalyzer(
return null
}
override fun visitSuperExpression(expression: KtSuperExpression, data: Unit?): Void {
throw EvaluateExceptionUtil.createEvaluateException("Evaluation of 'super' call expression is not supported")
override fun visitSuperExpression(expression: KtSuperExpression, data: Unit?): Void? {
val type = bindingContext[BindingContext.THIS_TYPE_FOR_SUPER_EXPRESSION, expression] ?: return null
val descriptor = type.constructor.declarationDescriptor as? ClassDescriptor ?: return null
parameters.getOrPut(descriptor) {
val name = descriptor.name.asString()
Smart(Dumb(Kind.DISPATCH_RECEIVER, "", "super@$name"), type, descriptor)
}
return null
}
}, Unit)
@@ -28,4 +28,4 @@ open class Base {
// RESULT: Expecting an element; looking at ERROR_ELEMENT '(1,6) in /fragment.kt
// EXPRESSION: super.baseFun()
// RESULT: Evaluation of 'super' call expression is not supported
// RESULT: VOID_VALUE
@@ -2,6 +2,7 @@ LineBreakpoint created at errors.kt:13
Run Java
Connected to the target VM
errors.kt:13
Compile bytecode for super.baseFun()
Compile bytecode for prop += 1
prop2 +=2
prop + prop2
@@ -0,0 +1,29 @@
package superCallsCaptured
fun main() {
Bar().foo()
}
open class Foo {
open fun foo() = 5
}
class Bar : Foo() {
override fun foo(): Int {
block {
//Breakpoint!
val a = this@Bar
}
return 6
}
}
fun block(block: () -> Unit) {
block()
}
// EXPRESSION: foo()
// RESULT: 6: I
// EXPRESSION: super.foo()
// RESULT: 5: I
@@ -0,0 +1,9 @@
LineBreakpoint created at superCallsCaptured.kt:15
Run Java
Connected to the target VM
superCallsCaptured.kt:15
Compile bytecode for foo()
Compile bytecode for super.foo()
Disconnected from the target VM
Process finished with exit code 0
@@ -0,0 +1,22 @@
package superCallsSimple
fun main() {
Bar().foo()
}
open class Foo {
open fun foo() = 5
}
class Bar : Foo() {
override fun foo(): Int {
//Breakpoint!
return 6
}
}
// EXPRESSION: foo()
// RESULT: 6: I
// EXPRESSION: super.foo()
// RESULT: 5: I
@@ -0,0 +1,9 @@
LineBreakpoint created at superCallsSimple.kt:14
Run Java
Connected to the target VM
superCallsSimple.kt:14
Compile bytecode for foo()
Compile bytecode for super.foo()
Disconnected from the target VM
Process finished with exit code 0
@@ -396,6 +396,16 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat
runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/stdlib.kt");
}
@TestMetadata("superCallsCaptured.kt")
public void testSuperCallsCaptured() throws Exception {
runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/superCallsCaptured.kt");
}
@TestMetadata("superCallsSimple.kt")
public void testSuperCallsSimple() throws Exception {
runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/superCallsSimple.kt");
}
@TestMetadata("synchronizedBlock.kt")
public void testSynchronizedBlock() throws Exception {
runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/synchronizedBlock.kt");