[debugger] Make EvaluationContextImpl to be UserDataHolder and add evaluation origin to it

IDEA-362361

(cherry picked from commit de48128651bafab7f170ca204c58adafe4fda403)


IJ-CR-151042

GitOrigin-RevId: 7b7ff87217b5ab89ba068c9177774a997951f1e9
This commit is contained in:
Alexey.Merkulov
2024-12-09 18:30:49 +00:00
committed by intellij-monorepo-bot
parent 3eea2c8961
commit 0dbb5fdb10
4 changed files with 39 additions and 10 deletions
@@ -68,7 +68,8 @@ public class JavaDebuggerEvaluator extends XDebuggerEvaluator implements XDebugg
@Override
public void threadAction(@NotNull SuspendContextImpl suspendContext) {
ReportingEvaluationCallback callback = wrapToReportingCallback(baseCallback, myDebugProcess.getProject());
XEvaluationOrigin origin = getOrigin(baseCallback);
ReportingEvaluationCallback callback = new ReportingEvaluationCallback(myDebugProcess.getProject(), baseCallback, origin);
WatchItemDescriptor descriptor = null;
try {
if (DebuggerUIUtil.isObsolete(callback)) {
@@ -88,6 +89,7 @@ public class JavaDebuggerEvaluator extends XDebuggerEvaluator implements XDebugg
callback.errorOccurred(JavaDebuggerBundle.message("error.context.not.available"), descriptor);
return;
}
XEvaluationOrigin.setOrigin(evalContext, origin);
descriptor.setContext(evalContext);
EvaluateException exception = descriptor.getEvaluateException();
if (exception != null && descriptor.getValue() == null) {
@@ -116,7 +118,8 @@ public class JavaDebuggerEvaluator extends XDebuggerEvaluator implements XDebugg
@Override
public void threadAction(@NotNull SuspendContextImpl suspendContext) {
ReportingEvaluationCallback callback = wrapToReportingCallback(baseCallback, myDebugProcess.getProject());
XEvaluationOrigin origin = getOrigin(baseCallback);
ReportingEvaluationCallback callback = new ReportingEvaluationCallback(myDebugProcess.getProject(), baseCallback, origin);
if (DebuggerUIUtil.isObsolete(callback)) {
return;
}
@@ -135,6 +138,7 @@ public class JavaDebuggerEvaluator extends XDebuggerEvaluator implements XDebugg
callback.errorOccurred(JavaDebuggerBundle.message("error.context.not.available"), descriptor);
return;
}
XEvaluationOrigin.setOrigin(evalContext, origin);
try {
Project project = myDebugProcess.getProject();
@@ -171,12 +175,10 @@ public class JavaDebuggerEvaluator extends XDebuggerEvaluator implements XDebugg
});
}
@NotNull
private static ReportingEvaluationCallback wrapToReportingCallback(final XEvaluationCallback callback, final Project project) {
if (callback instanceof XEvaluationCallbackWithOrigin callbackWithOrigin) {
return new ReportingEvaluationCallback(project, callback, callbackWithOrigin.getOrigin());
}
return new ReportingEvaluationCallback(project, callback, XEvaluationOrigin.UNSPECIFIED);
private static @NotNull XEvaluationOrigin getOrigin(@NotNull XEvaluationCallback callback) {
return callback instanceof XEvaluationCallbackWithOrigin callbackWithOrigin ?
callbackWithOrigin.getOrigin() : XEvaluationOrigin.UNSPECIFIED;
}
@Override
@@ -10,6 +10,7 @@ import com.intellij.debugger.jdi.StackFrameProxyImpl;
import com.intellij.debugger.jdi.ThreadReferenceProxyImpl;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.ThrowableComputable;
import com.intellij.openapi.util.UserDataHolderBase;
import com.sun.jdi.ClassLoaderReference;
import com.sun.jdi.ObjectReference;
import com.sun.jdi.Value;
@@ -18,7 +19,7 @@ import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public final class EvaluationContextImpl implements EvaluationContext {
public final class EvaluationContextImpl extends UserDataHolderBase implements EvaluationContext {
private final DebuggerComputableValue myThisObject;
private final @NotNull SuspendContextImpl mySuspendContext;
private final StackFrameProxyImpl myFrameProxy;
@@ -474,13 +474,17 @@ public abstract class Breakpoint<P extends JavaBreakpointProperties> implements
condition,
this::createConditionCodeFragment));
});
XEvaluationOrigin originBackup = XEvaluationOrigin.getOrigin(context);
boolean evaluationResult;
try {
if (Registry.is("debugger.retry.conditional.breakpoints", true)) {
XEvaluationOrigin.setOrigin(context, XEvaluationOrigin.BREAKPOINT_CONDITION);
context.setMayRetryEvaluation(true);
}
evaluationResult = DebuggerUtilsEx.evaluateBoolean(evaluator, context);
} finally {
XEvaluationOrigin.setOrigin(context, originBackup);
context.setMayRetryEvaluation(false);
}
JavaDebuggerEvaluatorStatisticsCollector.logEvaluationResult(myProject, evaluator, true, XEvaluationOrigin.BREAKPOINT_CONDITION);
@@ -1,6 +1,10 @@
// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.xdebugger.impl.ui.tree.nodes
import com.intellij.openapi.util.Key
import com.intellij.openapi.util.UserDataHolderBase
import org.jetbrains.annotations.ApiStatus
enum class XEvaluationOrigin {
INLINE,
DIALOG,
@@ -11,5 +15,23 @@ enum class XEvaluationOrigin {
RENDERER,
EDITOR, // both on hover and on quick evaluate
UNSPECIFIED,
UNSPECIFIED_WATCH
UNSPECIFIED_WATCH;
@ApiStatus.Internal
companion object {
@JvmStatic
private val ORIGIN_KEY: Key<XEvaluationOrigin> = Key<XEvaluationOrigin>("XEvaluationOrigin")
@ApiStatus.Internal
@JvmStatic
fun getOrigin(holder: UserDataHolderBase): XEvaluationOrigin {
return ORIGIN_KEY.get(holder, UNSPECIFIED)
}
@ApiStatus.Internal
@JvmStatic
fun setOrigin(holder: UserDataHolderBase, origin: XEvaluationOrigin) {
ORIGIN_KEY.set(holder, origin.takeIf { it != UNSPECIFIED })
}
}
}