package jetbrains.mps.debugger.java.runtime.state; /*Generated by MPS */ import jetbrains.mps.debug.api.AbstractDebugSession; import jetbrains.mps.debugger.java.runtime.engine.events.EventsProcessor; import jetbrains.mps.debugger.java.runtime.evaluation.EvaluationProvider; import com.intellij.openapi.project.Project; import jetbrains.mps.debugger.java.runtime.engine.events.Context; import org.jetbrains.annotations.NotNull; import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes; import jetbrains.mps.debug.api.DebugSessionManagerComponent; import jetbrains.mps.debugger.java.runtime.engine.VMEventsProcessorManagerComponent; import java.util.Set; import jetbrains.mps.debug.api.breakpoints.IBreakpoint; import jetbrains.mps.debugger.java.runtime.engine.RequestManager; import jetbrains.mps.debugger.java.runtime.breakpoints.JavaBreakpoint; import jetbrains.mps.debugger.java.runtime.engine.DebugProcessAdapter; public class DebugSession extends AbstractDebugSession<JavaUiStateImpl> { private final EventsProcessor myEventsProcessor; private volatile boolean myIsMute = false; private EvaluationProvider myEvaluationProvider; public DebugSession(EventsProcessor eventsProcessor, final Project p) { super(p); myEventsProcessor = eventsProcessor; myEventsProcessor.setDebuggableFramesSelector(getDebuggableFramesSelector()); eventsProcessor.addDebugProcessListener(new DebugSession.MyDebugProcessAdapter()); } @Override protected JavaUiStateImpl createUiState() { return new RunningJavaUiState(this); } @Override public void resume() { Context context = getUiState().getContext(); if (context == null) { return; } // context is null => already resumed myEventsProcessor.resume(context); } @Override public void pause() { myEventsProcessor.pause(); } @Override public void stop(boolean terminateTargetVM) { myEventsProcessor.stop(terminateTargetVM); } @Override public void stepOver() { step(EventsProcessor.StepKind.Over); } @Override public void stepInto() { step(EventsProcessor.StepKind.Into); } @Override public void stepOut() { step(EventsProcessor.StepKind.Out); } @Override public boolean canShowEvaluationDialog() { return true; } private void step(EventsProcessor.StepKind kind) { JavaUiStateImpl state = getUiState(); Context context = state.getContext(); assert context != null : "Context is null while debug session state is " + myExecutionState; myEventsProcessor.step(kind, context); } public EventsProcessor getEventsProcessor() { return myEventsProcessor; } private void pause(@NotNull Context suspendContext) { JavaUiStateImpl state = getUiState(); setState(state, state.paused(suspendContext), false); } public void refresh() { myEventsProcessor.schedule(new _FunctionTypes._void_P0_E0() { public void invoke() { JavaUiStateImpl state = getUiState(); JavaUiStateImpl newState = state.paused(state.getContext()); setState(state, newState); } }); } private void resume(Context suspendContext) { JavaUiStateImpl state = getUiState(); setState(state, state.resumed(suspendContext), false); } @Override public void sessionRegistered(DebugSessionManagerComponent manager) { VMEventsProcessorManagerComponent vmManager = manager.getProject().getComponent(VMEventsProcessorManagerComponent.class); vmManager.addDebugSession(this); } @Override public void sessionUnregistered(DebugSessionManagerComponent manager) { } @Override public boolean isMute() { return myIsMute; } @Override public void muteBreakpoints(final boolean mute) { if (myEventsProcessor.isAttached()) { myEventsProcessor.schedule(new _FunctionTypes._void_P0_E0() { public void invoke() { if (myIsMute != mute) { Set<IBreakpoint> breakpoints = myEventsProcessor.getBreakpointManager().getAllIBreakpoints(); RequestManager requestManager = myEventsProcessor.getRequestManager(); for (IBreakpoint bp : breakpoints) { if (bp instanceof JavaBreakpoint) { JavaBreakpoint breakpoint = (JavaBreakpoint) bp; if (mute) { requestManager.deleteRequests(breakpoint); // todo enabling and disabling breakpoints should be symmetrical } else { if (breakpoint.isValid()) { breakpoint.createOrWaitPrepare(myEventsProcessor); } } } } myIsMute = mute; fireSessionMuted(DebugSession.this); } } }); } else { myIsMute = mute; fireSessionMuted(DebugSession.this); } } @Override public EvaluationProvider getEvaluationProvider() { return myEvaluationProvider; } public void setEvaluationProvider(EvaluationProvider evaluationProvider) { myEvaluationProvider = evaluationProvider; } private class MyDebugProcessAdapter extends DebugProcessAdapter { private MyDebugProcessAdapter() { } @Override public void paused(@NotNull Context suspendContext) { myExecutionState = AbstractDebugSession.ExecutionState.Paused; pause(suspendContext); fireSessionPaused(DebugSession.this); } @Override public void resumed(@NotNull Context suspendContext) { myExecutionState = AbstractDebugSession.ExecutionState.Running; resume(suspendContext); fireSessionResumed(DebugSession.this); } @Override public void processAttached(@NotNull EventsProcessor process) { myExecutionState = AbstractDebugSession.ExecutionState.Running; } @Override public void processDetached(@NotNull EventsProcessor process, boolean closedByUser) { myExecutionState = AbstractDebugSession.ExecutionState.Stopped; setState(getUiState(), new RunningJavaUiState(DebugSession.this), false); fireSessionResumed(DebugSession.this); // TODO hack } } }