diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java index 0cb9987c79e7..6d5a9bd4b73a 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/DebuggerDataViewsConfigurable.java @@ -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(); } diff --git a/java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java b/java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java index 6558a3f97422..21d717b66c7b 100644 --- a/java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java +++ b/java/debugger/impl/src/com/intellij/debugger/settings/ViewsGeneralSettings.java @@ -35,6 +35,7 @@ public class ViewsGeneralSettings implements PersistentStateComponent { 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() { } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java b/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java index 4cea2454b898..9afbfde4d121 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/impl/FrameVariablesTree.java @@ -128,29 +128,35 @@ public class FrameVariablesTree extends DebuggerTree { return; } try { - final Map visibleVariables = getVisibleVariables(stackDescriptor); - final EvaluationContextImpl evalContext = debuggerContext.createEvaluationContext(); - final Pair, Set> usedVars = - ApplicationManager.getApplication().runReadAction(new Computable, Set>>() { - public Pair, Set> 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 visibleVariables = getVisibleVariables(stackDescriptor); + final EvaluationContextImpl evalContext = debuggerContext.createEvaluationContext(); + final Pair, Set> usedVars = + ApplicationManager.getApplication().runReadAction(new Computable, Set>>() { + public Pair, Set> 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 myVars; private final SourcePosition myPosition; private final EvaluationContextImpl myEvalContext; + private final boolean myCollectExpressions; public VariablesCollector(final Set 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); diff --git a/resources-en/src/messages/DebuggerBundle.properties b/resources-en/src/messages/DebuggerBundle.properties index 1e872a490d1e..dfa2fa8b5b58 100644 --- a/resources-en/src/messages/DebuggerBundle.properties +++ b/resources-en/src/messages/DebuggerBundle.properties @@ -183,6 +183,7 @@ label.base.renderer.configurable.show.static.final.fields=Static &final fields label.base.renderer.configurable.show.declared.type=Declared &type label.base.renderer.configurable.show.fq.names=Fully &qualified names label.base.renderer.configurable.show.object.id=Object &id +label.base.renderer.configurable.auto.expressions=Enable auto expressions in Variables view label.base.renderer.configurable.alternate.view=Enable alternative view for Coll&ections classes label.base.renderer.configurable.enable.tostring=Enable 't&oString()' object view: label.base.renderer.configurable.all.overridding=For all classes that override 'toString()' method