diff --git a/python/educational-python/gen/icons/PythonEducationalIcons.java b/python/educational-python/gen/icons/PythonEducationalIcons.java index fb04abc3c3eb..c8828ed8ae68 100644 --- a/python/educational-python/gen/icons/PythonEducationalIcons.java +++ b/python/educational-python/gen/icons/PythonEducationalIcons.java @@ -14,5 +14,4 @@ public class PythonEducationalIcons { } public static final Icon Field = load("/icons/com/jetbrains/edu/Field.png"); // 16x16 - public static final Icon SpecialVar = load("/icons/com/jetbrains/edu/specialVar.png"); // 16x16 } diff --git a/python/educational-python/src/com/jetbrains/python/edu/debugger/PyEduStackFrame.java b/python/educational-python/src/com/jetbrains/python/edu/debugger/PyEduStackFrame.java index 966f7f6048d2..1d15dc812e82 100644 --- a/python/educational-python/src/com/jetbrains/python/edu/debugger/PyEduStackFrame.java +++ b/python/educational-python/src/com/jetbrains/python/edu/debugger/PyEduStackFrame.java @@ -13,6 +13,7 @@ import com.jetbrains.python.debugger.PyFrameAccessor; import com.jetbrains.python.debugger.PyStackFrame; import com.jetbrains.python.debugger.PyStackFrameInfo; import icons.PythonEducationalIcons; +import icons.PythonIcons; import icons.PythonPsiApiIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -97,7 +98,7 @@ public class PyEduStackFrame extends PyStackFrame { @Nullable @Override public Icon getIcon() { - return PythonEducationalIcons.SpecialVar; + return PythonIcons.Python.Debug.SpecialVar; } @Override diff --git a/python/gen/icons/PythonIcons.java b/python/gen/icons/PythonIcons.java index a3bea3f88f87..f1af1ccdc43c 100644 --- a/python/gen/icons/PythonIcons.java +++ b/python/gen/icons/PythonIcons.java @@ -44,6 +44,7 @@ public class PythonIcons { public static class Debug { public static final Icon CommandLine = load("/icons/com/jetbrains/python/debug/commandLine.png"); // 16x16 + public static final Icon SpecialVar = load("/icons/com/jetbrains/python/debug/specialVar.png"); // 16x16 public static final Icon StepIntoMyCode = load("/icons/com/jetbrains/python/debug/StepIntoMyCode.png"); // 16x16 } diff --git a/python/educational-python/resources/icons/com/jetbrains/edu/specialVar.png b/python/resources/icons/com/jetbrains/python/debug/specialVar.png similarity index 100% rename from python/educational-python/resources/icons/com/jetbrains/edu/specialVar.png rename to python/resources/icons/com/jetbrains/python/debug/specialVar.png diff --git a/python/educational-python/resources/icons/com/jetbrains/edu/specialVar@2x.png b/python/resources/icons/com/jetbrains/python/debug/specialVar@2x.png similarity index 100% rename from python/educational-python/resources/icons/com/jetbrains/edu/specialVar@2x.png rename to python/resources/icons/com/jetbrains/python/debug/specialVar@2x.png diff --git a/python/src/com/jetbrains/python/debugger/PyStackFrame.java b/python/src/com/jetbrains/python/debugger/PyStackFrame.java index 98c780fb9396..549ab26263bc 100644 --- a/python/src/com/jetbrains/python/debugger/PyStackFrame.java +++ b/python/src/com/jetbrains/python/debugger/PyStackFrame.java @@ -30,6 +30,7 @@ import com.intellij.ui.SimpleTextAttributes; import com.intellij.xdebugger.XSourcePosition; import com.intellij.xdebugger.evaluation.XDebuggerEvaluator; import com.intellij.xdebugger.frame.*; +import icons.PythonIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -44,6 +45,7 @@ public class PyStackFrame extends XStackFrame { private static final Logger LOG = Logger.getInstance("#com.jetbrains.python.pydev.PyStackFrame"); private static final Object STACK_FRAME_EQUALITY_OBJECT = new Object(); + public static final String DOUBLE_UNDERSCORE = "__"; private Project myProject; private final PyFrameAccessor myDebugProcess; @@ -144,20 +146,27 @@ public class PyStackFrame extends XStackFrame { XValueChildrenList filteredChildren = new XValueChildrenList(); final HashMap returnedValues = new HashMap<>(); + final HashMap specialValues = new HashMap<>(); for (int i = 0; i < children.size(); i++) { XValue value = children.getValue(i); String name = children.getName(i); if ((value instanceof PyDebugValue) && ((PyDebugValue)value).isReturnedVal()) { returnedValues.put(name, value); } + else if (name.startsWith(DOUBLE_UNDERSCORE) && (name.endsWith(DOUBLE_UNDERSCORE))) { + specialValues.put(name, value); + } else { filteredChildren.add(name, value); } } - node.addChildren(filteredChildren, returnedValues.isEmpty()); + node.addChildren(filteredChildren, returnedValues.isEmpty() && specialValues.isEmpty()); if (!returnedValues.isEmpty()) { addReturnedValuesGroup(node, returnedValues); } + if (!specialValues.isEmpty()) { + addSpecialValuesGroup(node, specialValues); + } } private static void addReturnedValuesGroup(@NotNull final XCompositeNode node, Map returnedValues) { @@ -181,6 +190,27 @@ public class PyStackFrame extends XStackFrame { node.addChildren(XValueChildrenList.topGroups(group), true); } + private static void addSpecialValuesGroup(@NotNull final XCompositeNode node, Map specialValues) { + final ArrayList group = Lists.newArrayList(); + group.add(new XValueGroup("Special Variables") { + @Override + public void computeChildren(@NotNull XCompositeNode node) { + XValueChildrenList list = new XValueChildrenList(); + for (Map.Entry entry : specialValues.entrySet()) { + list.add(entry.getKey(), entry.getValue()); + } + node.addChildren(list, true); + } + + @Nullable + @Override + public Icon getIcon() { + return PythonIcons.Python.Debug.SpecialVar; + } + }); + node.addChildren(XValueChildrenList.topGroups(group), true); + } + public String getThreadId() { return myFrameInfo.getThreadId(); }