From 2cb055a3bdfc35bf9bc97176f63e55b69f08bbe4 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Wed, 16 Oct 2019 17:59:05 +0900 Subject: [PATCH] Debugger: Log evaluation status from Java contexts IntelliJ doesn't call KotlinDebuggerEvaluator from Java contexts; instead, it calls JavaDebuggerEvaluator. Unfortunately, there seems to be no way to figure out the exact evaluation type for Java contexts. However, we can at least log the evaluation status itself. --- .../debugger/evaluate/KotlinCodeFragmentFactory.kt | 11 +++++++++-- .../idea/debugger/evaluate/KotlinDebuggerEvaluator.kt | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/idea/jvm-debugger/jvm-debugger-evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinCodeFragmentFactory.kt b/idea/jvm-debugger/jvm-debugger-evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinCodeFragmentFactory.kt index 6b4c403304a..7ef9559a0e7 100644 --- a/idea/jvm-debugger/jvm-debugger-evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinCodeFragmentFactory.kt +++ b/idea/jvm-debugger/jvm-debugger-evaluation/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinCodeFragmentFactory.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.debugger.evaluate import com.intellij.debugger.DebuggerManagerEx import com.intellij.debugger.engine.DebugProcessImpl +import com.intellij.debugger.engine.JavaDebuggerEvaluator import com.intellij.debugger.engine.evaluation.CodeFragmentFactory import com.intellij.debugger.engine.evaluation.TextWithImports import com.intellij.debugger.engine.events.DebuggerCommandImpl @@ -146,10 +147,16 @@ class KotlinCodeFragmentFactory : CodeFragmentFactory() { DebugLabelPropertyDescriptorProvider(codeFragment, debugProcess).supplyDebugLabels() + @Suppress("MoveVariableDeclarationIntoWhen") val evaluator = debugProcess.session.xDebugSession?.currentStackFrame?.evaluator - if (evaluator is KotlinDebuggerEvaluator) { - codeFragment.putUserData(EVALUATION_TYPE, evaluator.getType(item)) + + val evaluationType = when (evaluator) { + is KotlinDebuggerEvaluator -> evaluator.getType(item) + is JavaDebuggerEvaluator -> KotlinDebuggerEvaluator.EvaluationType.FROM_JAVA + else -> KotlinDebuggerEvaluator.EvaluationType.UNKNOWN } + + codeFragment.putUserData(EVALUATION_TYPE, evaluationType) } private fun getDebugProcess(project: Project, context: PsiElement?): DebugProcessImpl? { diff --git a/idea/jvm-debugger/jvm-debugger-util/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinDebuggerEvaluator.kt b/idea/jvm-debugger/jvm-debugger-util/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinDebuggerEvaluator.kt index c61f060b179..619e63daf1a 100644 --- a/idea/jvm-debugger/jvm-debugger-util/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinDebuggerEvaluator.kt +++ b/idea/jvm-debugger/jvm-debugger-util/src/org/jetbrains/kotlin/idea/debugger/evaluate/KotlinDebuggerEvaluator.kt @@ -72,6 +72,7 @@ class KotlinDebuggerEvaluator( WATCH(WatchNodeImpl::class.java), WINDOW(EvaluatingExpressionRootNode::class.java), POPUP(XValueHint::class.java), + FROM_JAVA(null), UNKNOWN(null); } } \ No newline at end of file