Hide '$delegate' variables in Kotlin variables mode

This commit is contained in:
Yan Zhulanow
2019-03-01 20:46:26 +03:00
parent 570421b831
commit 723f8df23e
5 changed files with 67 additions and 14 deletions
@@ -32,6 +32,7 @@ import com.intellij.xdebugger.settings.XDebuggerSettingsManager
import com.sun.jdi.* import com.sun.jdi.*
import com.sun.jdi.Type import com.sun.jdi.Type
import org.jetbrains.kotlin.idea.debugger.KotlinDebuggerSettings import org.jetbrains.kotlin.idea.debugger.KotlinDebuggerSettings
import org.jetbrains.kotlin.idea.debugger.ToggleKotlinVariablesState
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
import java.util.* import java.util.*
import com.sun.jdi.Type as JdiType import com.sun.jdi.Type as JdiType
@@ -54,17 +55,18 @@ class KotlinClassWithDelegatedPropertyRenderer(private val rendererSettings: Nod
try { try {
return jdiType.allFields().any { it.name().endsWith(JvmAbi.DELEGATED_PROPERTY_NAME_SUFFIX) } return jdiType.allFields().any { it.name().endsWith(JvmAbi.DELEGATED_PROPERTY_NAME_SUFFIX) }
} } catch (notPrepared: ClassNotPreparedException) {
catch (notPrepared: ClassNotPreparedException) {
LOG.error(notPreparedClassMessage(jdiType), notPrepared) LOG.error(notPreparedClassMessage(jdiType), notPrepared)
} }
return false return false
} }
override fun calcLabel(descriptor: ValueDescriptor, override fun calcLabel(
evaluationContext: EvaluationContext, descriptor: ValueDescriptor,
listener: DescriptorLabelListener): String { evaluationContext: EvaluationContext,
listener: DescriptorLabelListener
): String {
val res = calcToStringLabel(descriptor, evaluationContext, listener) val res = calcToStringLabel(descriptor, evaluationContext, listener)
if (res != null) { if (res != null) {
return res return res
@@ -73,8 +75,10 @@ class KotlinClassWithDelegatedPropertyRenderer(private val rendererSettings: Nod
return super.calcLabel(descriptor, evaluationContext, listener) return super.calcLabel(descriptor, evaluationContext, listener)
} }
private fun calcToStringLabel(descriptor: ValueDescriptor, evaluationContext: EvaluationContext, private fun calcToStringLabel(
listener: DescriptorLabelListener): String? { descriptor: ValueDescriptor, evaluationContext: EvaluationContext,
listener: DescriptorLabelListener
): String? {
val toStringRenderer = rendererSettings.toStringRenderer val toStringRenderer = rendererSettings.toStringRenderer
if (toStringRenderer.isEnabled && DebuggerManagerEx.getInstanceEx(evaluationContext.project).context.isEvaluationPossible) { if (toStringRenderer.isEnabled && DebuggerManagerEx.getInstanceEx(evaluationContext.project).context.isEvaluationPossible) {
if (toStringRenderer.isApplicable(descriptor.type)) { if (toStringRenderer.isApplicable(descriptor.type)) {
@@ -108,18 +112,18 @@ class KotlinClassWithDelegatedPropertyRenderer(private val rendererSettings: Nod
if (field.name().endsWith(JvmAbi.DELEGATED_PROPERTY_NAME_SUFFIX)) { if (field.name().endsWith(JvmAbi.DELEGATED_PROPERTY_NAME_SUFFIX)) {
val shouldRenderDelegatedProperty = KotlinDebuggerSettings.getInstance().DEBUG_RENDER_DELEGATED_PROPERTIES val shouldRenderDelegatedProperty = KotlinDebuggerSettings.getInstance().DEBUG_RENDER_DELEGATED_PROPERTIES
if (shouldRenderDelegatedProperty) { if (shouldRenderDelegatedProperty && !ToggleKotlinVariablesState.getService().kotlinVariableView) {
children.add(nodeManager.createNode(fieldDescriptor, context)) children.add(nodeManager.createNode(fieldDescriptor, context))
} }
val delegatedPropertyDescriptor = DelegatedPropertyFieldDescriptor( val delegatedPropertyDescriptor = DelegatedPropertyFieldDescriptor(
context.debugProcess.project!!, context.debugProcess.project!!,
value, value,
field, field,
shouldRenderDelegatedProperty) shouldRenderDelegatedProperty
)
children.add(nodeManager.createNode(delegatedPropertyDescriptor, context)) children.add(nodeManager.createNode(delegatedPropertyDescriptor, context))
} } else {
else {
children.add(nodeManager.createNode(fieldDescriptor, context)) children.add(nodeManager.createNode(fieldDescriptor, context))
} }
} }
@@ -2,6 +2,7 @@ LineBreakpoint created at evDelegatedProperty.kt:13
Run Java Run Java
Connected to the target VM Connected to the target VM
evDelegatedProperty.kt:13 evDelegatedProperty.kt:13
Compile bytecode for a.prop
frame = main:13, EvDelegatedPropertyKt {evDelegatedProperty} frame = main:13, EvDelegatedPropertyKt {evDelegatedProperty}
local = args: java.lang.String[] = {java.lang.String[0]@uniqueID} (sp = evDelegatedProperty.kt, 9) local = args: java.lang.String[] = {java.lang.String[0]@uniqueID} (sp = evDelegatedProperty.kt, 9)
local = a: evDelegatedProperty.A = {evDelegatedProperty.A@uniqueID} (sp = evDelegatedProperty.kt, 10) local = a: evDelegatedProperty.A = {evDelegatedProperty.A@uniqueID} (sp = evDelegatedProperty.kt, 10)
@@ -0,0 +1,28 @@
package delegatedPropertyInClassKotlinVariables
import kotlin.properties.Delegates
import kotlin.reflect.KProperty
fun main(args: Array<String>) {
val a = A()
//Breakpoint!
args.size
}
class A {
val prop by MyDelegate()
val propEx by MyDelegateThrowsException()
}
class MyDelegate {
operator fun getValue(t: Any?, p: KProperty<*>): Int = 1
}
class MyDelegateThrowsException {
operator fun getValue(t: Any?, p: KProperty<*>): Int = throw IllegalStateException()
}
// SHOW_KOTLIN_VARIABLES
// PRINT_FRAME
// SKIP: suppressedExceptions
// SKIP: stackTrace
@@ -0,0 +1,15 @@
LineBreakpoint created at delegatedPropertyInClassKotlinVariables.kt:9
Run Java
Connected to the target VM
delegatedPropertyInClassKotlinVariables.kt:9
Compile bytecode for args.size
frame = main:9, DelegatedPropertyInClassKotlinVariablesKt {delegatedPropertyInClassKotlinVariables}
local = args: java.lang.String[] = {java.lang.String[0]@uniqueID} (sp = delegatedPropertyInClassKotlinVariables.kt, 6)
local = a: delegatedPropertyInClassKotlinVariables.A = {delegatedPropertyInClassKotlinVariables.A@uniqueID} (sp = delegatedPropertyInClassKotlinVariables.kt, 7)
field = prop: int = 1 (sp = delegatedPropertyInClassKotlinVariables.kt, 13)
field = propEx: int = {java.lang.IllegalStateException@uniqueID}java.lang.IllegalStateException (sp = delegatedPropertyInClassKotlinVariables.kt, 14)
field = detailMessage: java.lang.String = null (sp = Throwable.!EXT!)
field = cause: java.lang.Throwable = {java.lang.IllegalStateException@uniqueID}java.lang.IllegalStateException (sp = Throwable.!EXT!)
Disconnected from the target VM
Process finished with exit code 0
@@ -660,6 +660,11 @@ public class KotlinEvaluateExpressionTestGenerated extends AbstractKotlinEvaluat
runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/frame/delegatedPropertyInClass.kt"); runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/frame/delegatedPropertyInClass.kt");
} }
@TestMetadata("delegatedPropertyInClassKotlinVariables.kt")
public void testDelegatedPropertyInClassKotlinVariables() throws Exception {
runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/frame/delegatedPropertyInClassKotlinVariables.kt");
}
@TestMetadata("delegatedPropertyInClassWithToString.kt") @TestMetadata("delegatedPropertyInClassWithToString.kt")
public void testDelegatedPropertyInClassWithToString() throws Exception { public void testDelegatedPropertyInClassWithToString() throws Exception {
runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/frame/delegatedPropertyInClassWithToString.kt"); runTest("idea/testData/debugger/tinyApp/src/evaluate/singleBreakpoint/frame/delegatedPropertyInClassWithToString.kt");