Merge branch 'liana/simplified_debugger'
[idea/community.git] / python / edu / src / com / jetbrains / python / edu / debugger / PyEduDebugProcess.java
1 package com.jetbrains.python.edu.debugger;
2
3 import com.google.common.base.Predicate;
4 import com.google.common.collect.Collections2;
5 import com.intellij.execution.process.ProcessHandler;
6 import com.intellij.execution.ui.ExecutionConsole;
7 import com.intellij.xdebugger.XDebugSession;
8 import com.jetbrains.python.PythonHelpersLocator;
9 import com.jetbrains.python.debugger.*;
10 import org.jetbrains.annotations.NotNull;
11 import org.jetbrains.annotations.Nullable;
12
13 import java.net.ServerSocket;
14 import java.util.ArrayList;
15 import java.util.Collection;
16 import java.util.Collections;
17 import java.util.List;
18
19 class PyEduDebugProcess extends PyDebugProcess {
20
21   private final String myScriptName;
22   private final int myLine;
23
24   public PyEduDebugProcess(@NotNull XDebugSession session,
25                            @NotNull ServerSocket serverSocket,
26                            @NotNull ExecutionConsole executionConsole,
27                            @Nullable ProcessHandler processHandler, boolean multiProcess,
28                            String scriptName,
29                            int line) {
30     super(session, serverSocket, executionConsole, processHandler, multiProcess);
31     myScriptName = scriptName;
32     myLine = line;
33   }
34
35   @Override
36   public PyStackFrame createStackFrame(PyStackFrameInfo frameInfo) {
37     return new PyEduStackFrame(getSession().getProject(), this, frameInfo,
38                                getPositionConverter().convertFromPython(frameInfo.getPosition()));
39   }
40
41   @Override
42   public void init() {
43     super.init();
44     addTemporaryBreakpoint(PyLineBreakpointType.ID, myScriptName, myLine);
45   }
46
47   @NotNull
48   @Override
49   protected PySuspendContext createSuspendContext(PyThreadInfo threadInfo) {
50     threadInfo.updateState(threadInfo.getState(), new ArrayList<PyStackFrameInfo>(filterFrames(threadInfo.getFrames())));
51     return new PySuspendContext(this, threadInfo);
52   }
53
54   public Collection<PyStackFrameInfo> filterFrames(@Nullable List<PyStackFrameInfo> frames) {
55     if (frames == null) {
56       return Collections.emptyList();
57     }
58     final String debugger = PythonHelpersLocator.getHelperPath(PyDebugRunner.DEBUGGER_MAIN);
59     return Collections2.filter(frames, new Predicate<PyStackFrameInfo>() {
60       @Override
61       public boolean apply(PyStackFrameInfo frame) {
62         String file = frame.getPosition().getFile();
63         return !debugger.equals(file);
64       }
65     });
66   }
67 }