IDEA-245393 Convenient representation of String in quick evaluate popup

added new popup for strings, unified inline and `quick evaluate` popups

GitOrigin-RevId: daa403b0772a5bd2c4b25859f635bd97b0f19d8c
This commit is contained in:
Elizaveta Sidorova
2021-12-27 15:12:06 +03:00
committed by intellij-monorepo-bot
parent 1cedae5882
commit d97e619698
21 changed files with 1176 additions and 414 deletions

View File

@@ -0,0 +1,26 @@
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.debugger.actions;
import com.intellij.debugger.engine.DebuggerUtils;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.util.NlsContexts;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.xdebugger.impl.breakpoints.XExpressionImpl;
import com.intellij.xdebugger.impl.inline.SetTextValueActionBase;
import com.intellij.xdebugger.impl.ui.DebuggerUIUtil;
import com.intellij.xdebugger.impl.ui.tree.nodes.XValueNodeImpl;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
@ApiStatus.Experimental
public class SetTextValueAction extends SetTextValueActionBase {
@Override
protected void setTextValue(@NotNull XValueNodeImpl node, @NotNull String text) {
DebuggerUIUtil.setTreeNodeValue(node,
XExpressionImpl.fromText(
StringUtil.wrapWithDoubleQuote(DebuggerUtils.translateStringValue(text))),
(@NlsContexts.DialogMessage String errorMessage) -> Messages.showErrorDialog(node.getTree(),
errorMessage));
}
}

View File

@@ -33,7 +33,6 @@ import com.intellij.xdebugger.evaluation.XDebuggerEvaluator;
import com.intellij.xdebugger.impl.breakpoints.XExpressionImpl;
import com.intellij.xdebugger.impl.evaluate.quick.XDebuggerPsiEvaluator;
import com.intellij.xdebugger.impl.ui.DebuggerUIUtil;
import com.sun.jdi.Value;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.concurrency.Promise;
@@ -148,8 +147,8 @@ public class JavaDebuggerEvaluator extends XDebuggerEvaluator implements XDebugg
throw ex;
}
});
Value value = evaluator.evaluate(evalContext);
WatchItemDescriptor descriptor = new WatchItemDescriptor(project, text.get(), value, evalContext);
WatchItemDescriptor descriptor = new WatchItemDescriptor(project, text.get(), evaluator);
descriptor.setContext(evalContext);
callback.evaluated(JavaValue.create(null, descriptor, evalContext, process.getNodeManager(), true));
}
catch (EvaluateException e) {

View File

@@ -564,6 +564,11 @@ public class JavaValue extends XNamedValue implements NodeDescriptorProvider, XV
return myValueDescriptor.getValueText();
}
@Override
public boolean isShowsTextValue() {
return myValueDescriptor.isString();
}
@Nullable
@Override
public XReferrersProvider getReferrersProvider() {

View File

@@ -26,6 +26,7 @@ import com.intellij.psi.*;
import com.intellij.xdebugger.XExpression;
import com.intellij.xdebugger.frame.XValueModifier;
import com.sun.jdi.*;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -34,6 +35,7 @@ import org.jetbrains.annotations.Nullable;
*/
public abstract class EvaluationDescriptor extends ValueDescriptorImpl {
private Modifier myModifier;
private ExpressionEvaluator myEvaluator;
protected TextWithImports myText;
protected EvaluationDescriptor(TextWithImports text, Project project, Value value) {
@@ -47,6 +49,12 @@ public abstract class EvaluationDescriptor extends ValueDescriptorImpl {
myText = text;
}
@ApiStatus.Experimental
protected EvaluationDescriptor(TextWithImports text, Project project, ExpressionEvaluator evaluator) {
this(text, project);
myEvaluator = evaluator;
}
protected abstract EvaluationContextImpl getEvaluationContext(EvaluationContextImpl evaluationContext);
protected abstract PsiCodeFragment getEvaluationCode(StackFrameContext context) throws EvaluateException;
@@ -64,20 +72,23 @@ public abstract class EvaluationDescriptor extends ValueDescriptorImpl {
EvaluationContextImpl thisEvaluationContext = getEvaluationContext(evaluationContext);
SourcePosition position = ContextUtil.getSourcePosition(evaluationContext);
ExpressionEvaluator evaluator = ReadAction.compute(() -> {
PsiCodeFragment code = getEvaluationCode(thisEvaluationContext);
PsiElement psiContext = ContextUtil.getContextElement(evaluationContext, position);
try {
return DebuggerUtilsEx.findAppropriateCodeFragmentFactory(getEvaluationText(), psiContext).getEvaluatorBuilder().build(code, position);
}
catch (UnsupportedExpressionException ex) {
ExpressionEvaluator eval = CompilingEvaluatorImpl.create(myProject, code.getContext(), element -> code);
if (eval != null) {
return eval;
ExpressionEvaluator evaluator = myEvaluator;
if (evaluator == null) {
evaluator = ReadAction.compute(() -> {
PsiCodeFragment code = getEvaluationCode(thisEvaluationContext);
PsiElement psiContext = ContextUtil.getContextElement(evaluationContext, position);
try {
return DebuggerUtilsEx.findAppropriateCodeFragmentFactory(getEvaluationText(), psiContext).getEvaluatorBuilder().build(code, position);
}
throw ex;
}
});
catch (UnsupportedExpressionException ex) {
ExpressionEvaluator eval = CompilingEvaluatorImpl.create(myProject, code.getContext(), element -> code);
if (eval != null) {
return eval;
}
throw ex;
}
});
}
if (!thisEvaluationContext.getDebugProcess().isAttached()) {
throw EvaluateExceptionUtil.PROCESS_EXITED;
@@ -164,4 +175,4 @@ public abstract class EvaluationDescriptor extends ValueDescriptorImpl {
}
};
}
}
}

View File

@@ -9,11 +9,13 @@ package com.intellij.debugger.ui.impl.watch;
import com.intellij.debugger.engine.StackFrameContext;
import com.intellij.debugger.engine.evaluation.EvaluationContextImpl;
import com.intellij.debugger.engine.evaluation.TextWithImports;
import com.intellij.debugger.engine.evaluation.expression.ExpressionEvaluator;
import com.intellij.debugger.impl.PositionUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.psi.PsiCodeFragment;
import com.sun.jdi.Value;
import org.jetbrains.annotations.ApiStatus;
public class WatchItemDescriptor extends EvaluationDescriptor {
public WatchItemDescriptor(Project project, TextWithImports text) {
@@ -32,6 +34,12 @@ public class WatchItemDescriptor extends EvaluationDescriptor {
myStoredEvaluationContext = evaluationContext;
}
@ApiStatus.Experimental
public WatchItemDescriptor(Project project, TextWithImports text, ExpressionEvaluator evaluator) {
super(text, project, evaluator);
setValueLabel("");
}
@Override
public String getName() {
return getEvaluationText().getText();