package jetbrains.mps.debug.api;
/*Generated by MPS */
import com.intellij.execution.process.ProcessHandler;
import java.util.List;
import java.util.ArrayList;
import java.util.concurrent.atomic.AtomicReference;
import com.intellij.openapi.project.Project;
import jetbrains.mps.textgen.trace.TraceInfoProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import jetbrains.mps.debug.api.evaluation.IEvaluationProvider;
import jetbrains.mps.ide.project.ProjectHelper;
import jetbrains.mps.textgen.trace.DefaultTraceInfoProvider;
public abstract class AbstractDebugSession<State extends AbstractUiState> {
protected ProcessHandler myProcessHandler;
private final List<SessionChangeListener> myListeners = new ArrayList<SessionChangeListener>();
protected AbstractDebugSession.ExecutionState myExecutionState = AbstractDebugSession.ExecutionState.WaitingAttach;
protected final AtomicReference<State> myUiState = new AtomicReference<State>(createUiState());
protected final IDebuggableFramesSelector myDebuggableFramesSelector;
protected final Project myProject;
private TraceInfoProvider myTraceProvider;
public AbstractDebugSession(Project p) {
myProject = p;
myDebuggableFramesSelector = new DebuggableFramesSelector(p, this);
}
protected abstract State createUiState();
public abstract void resume();
public abstract void pause();
public abstract void stop(boolean terminateTargetProcess);
public abstract void stepOver();
public abstract void stepInto();
public abstract void stepOut();
protected void setState(State oldState, @NotNull State newState) {
setState(oldState, newState, true);
}
protected void setState(State oldState, @NotNull State newState, boolean fireEvents) {
while (!(myUiState.compareAndSet(oldState, newState))) {
// TODO we do not care here if user selected something, we just replace old state. But we might do something more clever, like remember what user selected.
oldState = getUiState();
}
if (fireEvents) {
fireStateChanged();
}
}
public boolean isPaused() {
return myExecutionState.equals(AbstractDebugSession.ExecutionState.Paused);
}
public boolean isRunning() {
return myExecutionState.equals(AbstractDebugSession.ExecutionState.Running);
}
public boolean isStopped() {
return myExecutionState.equals(AbstractDebugSession.ExecutionState.Stopped);
}
public boolean isStepEnabled() {
return isPaused() && getUiState().isPausedOnBreakpoint();
}
public void setProcessHandler(ProcessHandler processHandler) {
myProcessHandler = processHandler;
}
public ProcessHandler getProcessHandler() {
return myProcessHandler;
}
public IDebuggableFramesSelector getDebuggableFramesSelector() {
return myDebuggableFramesSelector;
}
private List<SessionChangeListener> getListeners() {
List<SessionChangeListener> listeners = new ArrayList<SessionChangeListener>();
listeners.addAll(myListeners);
return listeners;
}
protected void fireStateChanged() {
for (SessionChangeListener listener : getListeners()) {
listener.stateChanged(this);
}
}
protected void fireSessionPaused(AbstractDebugSession debugSession) {
for (SessionChangeListener listener : getListeners()) {
listener.paused(debugSession);
}
}
protected void fireSessionResumed(AbstractDebugSession debugSession) {
for (SessionChangeListener listener : getListeners()) {
listener.resumed(debugSession);
}
}
protected void fireSessionMuted(AbstractDebugSession debugSession) {
for (SessionChangeListener listener : getListeners()) {
listener.muted(debugSession);
}
}
public void addChangeListener(@NotNull SessionChangeListener listener) {
myListeners.add(listener);
}
public void removeChangeListener(@NotNull SessionChangeListener listener) {
myListeners.remove(listener);
}
public void trySetState(State oldState, State newState) {
// use from AbstractUiState only
if (myUiState.compareAndSet(oldState, newState)) {
fireStateChanged();
}
}
public State getUiState() {
return myUiState.get();
}
public boolean canShowEvaluationDialog() {
return false;
}
public AbstractDebugSession.ExecutionState getExecutionState() {
return myExecutionState;
}
@Nullable
public IEvaluationProvider getEvaluationProvider() {
return null;
}
public void sessionRegistered(DebugSessionManagerComponent manager) {
}
public void sessionUnregistered(DebugSessionManagerComponent manager) {
}
public void muteBreakpoints(boolean mute) {
}
public boolean isMute() {
return false;
}
public Project getIdeaProject() {
return myProject;
}
public jetbrains.mps.project.Project getProject() {
return ProjectHelper.fromIdeaProject(myProject);
}
@NotNull
public TraceInfoProvider getTraceProvider() {
if (myTraceProvider == null) {
myTraceProvider = new DefaultTraceInfoProvider(getProject().getRepository());
}
return myTraceProvider;
}
public enum ExecutionState {
Stopped(),
Running(),
Paused(),
WaitingAttach();
private ExecutionState() {
}
}
}