IDEA-75922 Debugging lazy loaded JPA entity attributes: added option to suppress auto expressions sin Variables view

This commit is contained in:
Eugene Zhuravlev
2012-02-06 13:30:25 +01:00
parent 15381ffa3c
commit 14f5a60023
4 changed files with 45 additions and 27 deletions
@@ -53,6 +53,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
private StateRestoringCheckBox myCbShowStaticFinalFields;
private final ArrayRendererConfigurable myArrayRendererConfigurable;
private JCheckBox myCbEnableAutoExpressions;
private JCheckBox myCbEnableAlternateViews;
private JCheckBox myCbEnableToString;
@@ -92,6 +93,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
myCbShowStatic = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.static.fields"));
myCbShowStaticFinalFields = new StateRestoringCheckBox(DebuggerBundle.message("label.base.renderer.configurable.show.static.final.fields"));
myCbEnableAlternateViews = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.alternate.view"));
myCbEnableAutoExpressions = new JCheckBox(DebuggerBundle.message("label.base.renderer.configurable.auto.expressions"));
myCbShowStatic.addChangeListener(new ChangeListener(){
public void stateChanged(ChangeEvent e) {
if(myCbShowStatic.isSelected()) {
@@ -163,7 +165,8 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
arraysPanel.setBorder(IdeBorderFactory.createTitledBorder("Arrays", false, true, true));
panel.add(arraysPanel, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 3, 1, 1.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, new Insets(0, 0, 0, 0), 0, 0));
panel.add(myCbEnableAlternateViews, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 10), 0, 0));
panel.add(myCbEnableAutoExpressions, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 0, 0, 10), 0, 0));
panel.add(myCbEnableAlternateViews, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 0.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 10), 0, 0));
// starting 4-th row
panel.add(myCbEnableToString, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 3, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(4, 0, 0, 0), 0, 0));
panel.add(myRbAllThatOverride, new GridBagConstraints(0, GridBagConstraints.RELATIVE, 3, 1, 1.0, 0.0, GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0, 12, 0, 0), 0, 0));
@@ -189,6 +192,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
generalSettings.AUTOSCROLL_TO_NEW_LOCALS = myCbAutoscroll.isSelected();
rendererSettings.setAlternateCollectionViewsEnabled(myCbEnableAlternateViews.isSelected());
generalSettings.HIDE_NULL_ARRAY_ELEMENTS = myCbHideNullArrayElements.isSelected();
generalSettings.ENABLE_AUTO_EXPRESSIONS = myCbEnableAutoExpressions.isSelected();
final ClassRenderer classRenderer = rendererSettings.getClassRenderer();
classRenderer.SORT_ASCENDING = myCbSort.isSelected();
@@ -219,6 +223,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
myCbAutoscroll.setSelected(generalSettings.AUTOSCROLL_TO_NEW_LOCALS);
myCbHideNullArrayElements.setSelected(generalSettings.HIDE_NULL_ARRAY_ELEMENTS);
myCbEnableAlternateViews.setSelected(rendererSettings.areAlternateCollectionViewsEnabled());
myCbEnableAutoExpressions.setSelected(generalSettings.ENABLE_AUTO_EXPRESSIONS);
ClassRenderer classRenderer = rendererSettings.getClassRenderer();
@@ -264,6 +269,7 @@ public class DebuggerDataViewsConfigurable implements SearchableConfigurable {
ViewsGeneralSettings generalSettings = ViewsGeneralSettings.getInstance();
return
(generalSettings.AUTOSCROLL_TO_NEW_LOCALS != myCbAutoscroll.isSelected()) ||
(generalSettings.ENABLE_AUTO_EXPRESSIONS != myCbEnableAutoExpressions.isSelected()) ||
(generalSettings.HIDE_NULL_ARRAY_ELEMENTS != myCbHideNullArrayElements.isSelected()) || myAutoTooltip.isChanged();
}
@@ -35,6 +35,7 @@ public class ViewsGeneralSettings implements PersistentStateComponent<Element> {
public boolean SHOW_OBJECTID = true;
public boolean HIDE_NULL_ARRAY_ELEMENTS = true;
public boolean AUTOSCROLL_TO_NEW_LOCALS = true;
public boolean ENABLE_AUTO_EXPRESSIONS = true;
public ViewsGeneralSettings() {
}
@@ -128,29 +128,35 @@ public class FrameVariablesTree extends DebuggerTree {
return;
}
try {
final Map<String, LocalVariableProxyImpl> visibleVariables = getVisibleVariables(stackDescriptor);
final EvaluationContextImpl evalContext = debuggerContext.createEvaluationContext();
final Pair<Set<String>, Set<TextWithImports>> usedVars =
ApplicationManager.getApplication().runReadAction(new Computable<Pair<Set<String>, Set<TextWithImports>>>() {
public Pair<Set<String>, Set<TextWithImports>> compute() {
return findReferencedVars(visibleVariables.keySet(), sourcePosition, evalContext);
}
});
// add locals
if (myAutoWatchMode) {
for (String var : usedVars.first) {
final LocalVariableDescriptorImpl descriptor = myNodeManager.getLocalVariableDescriptor(stackDescriptor, visibleVariables.get(var));
myChildren.add(myNodeManager.createNode(descriptor, evaluationContext));
}
}
else {
if (!ViewsGeneralSettings.getInstance().ENABLE_AUTO_EXPRESSIONS && !myAutoWatchMode) {
// optimization
super.buildVariables(stackDescriptor, evaluationContext);
}
// add expressions
final EvaluationContextImpl evalContextCopy = evaluationContext.createEvaluationContext(evaluationContext.getThisObject());
evalContextCopy.setAutoLoadClasses(false);
for (TextWithImports text : usedVars.second) {
myChildren.add(myNodeManager.createNode(myNodeManager.getWatchItemDescriptor(stackDescriptor, text, null), evalContextCopy));
else {
final Map<String, LocalVariableProxyImpl> visibleVariables = getVisibleVariables(stackDescriptor);
final EvaluationContextImpl evalContext = debuggerContext.createEvaluationContext();
final Pair<Set<String>, Set<TextWithImports>> usedVars =
ApplicationManager.getApplication().runReadAction(new Computable<Pair<Set<String>, Set<TextWithImports>>>() {
public Pair<Set<String>, Set<TextWithImports>> compute() {
return findReferencedVars(visibleVariables.keySet(), sourcePosition, evalContext);
}
});
// add locals
if (myAutoWatchMode) {
for (String var : usedVars.first) {
final LocalVariableDescriptorImpl descriptor = myNodeManager.getLocalVariableDescriptor(stackDescriptor, visibleVariables.get(var));
myChildren.add(myNodeManager.createNode(descriptor, evaluationContext));
}
}
else {
super.buildVariables(stackDescriptor, evaluationContext);
}
// add expressions
final EvaluationContextImpl evalContextCopy = evaluationContext.createEvaluationContext(evaluationContext.getThisObject());
evalContextCopy.setAutoLoadClasses(false);
for (TextWithImports text : usedVars.second) {
myChildren.add(myNodeManager.createNode(myNodeManager.getWatchItemDescriptor(stackDescriptor, text, null), evalContextCopy));
}
}
}
catch (EvaluateException e) {
@@ -450,6 +456,7 @@ public class FrameVariablesTree extends DebuggerTree {
private final Set<String> myVars;
private final SourcePosition myPosition;
private final EvaluationContextImpl myEvalContext;
private final boolean myCollectExpressions;
public VariablesCollector(final Set<String> visibleLocals,
final TextRange lineRange,
@@ -462,6 +469,7 @@ public class FrameVariablesTree extends DebuggerTree {
myVars = vars;
myPosition = position;
myEvalContext = evalContext;
myCollectExpressions = ViewsGeneralSettings.getInstance().ENABLE_AUTO_EXPRESSIONS;
}
@Override
@@ -473,9 +481,11 @@ public class FrameVariablesTree extends DebuggerTree {
@Override
public void visitMethodCallExpression(final PsiMethodCallExpression expression) {
final PsiMethod psiMethod = expression.resolveMethod();
if (psiMethod != null && !DebuggerUtils.hasSideEffectsOrReferencesMissingVars(expression, myVisibleLocals)) {
myExpressions.add(new TextWithImportsImpl(expression));
if (myCollectExpressions) {
final PsiMethod psiMethod = expression.resolveMethod();
if (psiMethod != null && !DebuggerUtils.hasSideEffectsOrReferencesMissingVars(expression, myVisibleLocals)) {
myExpressions.add(new TextWithImportsImpl(expression));
}
}
super.visitMethodCallExpression(expression);
}
@@ -487,7 +497,7 @@ public class FrameVariablesTree extends DebuggerTree {
if (psiElement instanceof PsiVariable) {
final PsiVariable var = (PsiVariable)psiElement;
if (var instanceof PsiField) {
if (!DebuggerUtils.hasSideEffectsOrReferencesMissingVars(reference, myVisibleLocals)) {
if (myCollectExpressions && !DebuggerUtils.hasSideEffectsOrReferencesMissingVars(reference, myVisibleLocals)) {
/*
if (var instanceof PsiEnumConstant && reference.getQualifier() == null) {
final PsiClass enumClass = ((PsiEnumConstant)var).getContainingClass();
@@ -532,7 +542,7 @@ public class FrameVariablesTree extends DebuggerTree {
@Override
public void visitArrayAccessExpression(final PsiArrayAccessExpression expression) {
if (!DebuggerUtils.hasSideEffectsOrReferencesMissingVars(expression, myVisibleLocals)) {
if (myCollectExpressions && !DebuggerUtils.hasSideEffectsOrReferencesMissingVars(expression, myVisibleLocals)) {
myExpressions.add(new TextWithImportsImpl(expression));
}
super.visitArrayAccessExpression(expression);