package jetbrains.mps.debugger.java.runtime.state;
/*Generated by MPS */
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.debugger.java.runtime.engine.events.Context;
import java.util.List;
import jetbrains.mps.debug.api.programState.IWatchable;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.ArrayList;
import jetbrains.mps.internal.collections.runtime.IVisitor;
import jetbrains.mps.debugger.java.api.state.proxy.JavaThread;
import com.sun.jdi.ThreadReference;
import org.jetbrains.annotations.Nullable;
import com.sun.jdi.ObjectReference;
import jetbrains.mps.debugger.java.api.state.proxy.JavaStackFrame;
import jetbrains.mps.baseLanguage.closures.runtime._FunctionTypes;
import jetbrains.mps.debug.api.AbstractUiState;
import jetbrains.mps.debug.api.programState.IStackFrame;
import jetbrains.mps.debugger.java.runtime.engine.events.EventContext;
import com.sun.jdi.event.EventSet;
import jetbrains.mps.debugger.java.runtime.state.watchables.EventWatchablesCreator;
import com.sun.jdi.event.Event;
import com.sun.jdi.StackFrame;
public class PausedJavaUiState extends JavaUiStateImpl {
@NotNull
private final Context myContext;
private final int myStackFrameIndex;
private final List<IWatchable> myWatchables = ListSequence.fromList(new ArrayList<IWatchable>());
/*package*/ PausedJavaUiState(@NotNull Context context, @NotNull DebugSession debugSession) {
super(debugSession);
myContext = context;
initializeThreads();
myThreadIndex = findThreadIndex();
assert myThreadIndex >= 0;
ListSequence.fromList(getThreads()).visitAll(new IVisitor<JavaThread>() {
public void visit(JavaThread it) {
it.initializeFrames();
}
});
myStackFrameIndex = findStackFrameIndex();
check_vzg6vq_a01a3(getStackFrame(), this);
ListSequence.fromList(myWatchables).addSequence(ListSequence.fromList(getAdditionalWatchables()));
}
/**
* This constructor is called when user selects some thread from ui
*/
/*package*/ PausedJavaUiState(@NotNull JavaUiStateImpl previousState, DebugSession debugSession, int currentThreadIndex) {
super(debugSession, currentThreadIndex);
myContext = findContext(previousState);
assert myContext != null;
myStackFrameIndex = findStackFrameIndex();
check_vzg6vq_a5a4(getStackFrame(), this);
ListSequence.fromList(myWatchables).addSequence(ListSequence.fromList(getAdditionalWatchables()));
}
/**
* This constructor is called when user selects some frame from ui
*/
private PausedJavaUiState(@NotNull PausedJavaUiState previousState, int frameIndex, DebugSession debugSession) {
super(debugSession);
assert frameIndex == NO_FRAME || (frameIndex >= 0 && frameIndex < previousState.getCurrentThread().getFramesCount());
myContext = previousState.myContext;
myThreadIndex = previousState.myThreadIndex;
myStackFrameIndex = frameIndex;
initializeThreads();
ListSequence.fromList(getThreads()).visitAll(new IVisitor<JavaThread>() {
public void visit(JavaThread it) {
it.initializeFrames();
}
});
getStackFrame().initializeWatchables();
ListSequence.fromList(myWatchables).addSequence(ListSequence.fromList(getAdditionalWatchables()));
}
private int findThreadIndex() {
List<ThreadReference> threads = getEventProcessor().getVirtualMachine().allThreads();
ThreadReference thread = myContext.getThread();
if (thread != null) {
return threads.indexOf(thread);
}
for (ThreadReference t : threads) {
// TODO this is a hack to filter out system threads
if (!(t.threadGroup().name().equals("system"))) {
return threads.indexOf(t);
}
}
return 0;
}
@Nullable
@Override
public ObjectReference getThisObject() {
JavaStackFrame javaStackFrame = getStackFrame();
if (javaStackFrame != null) {
return check_vzg6vq_a0a1a7(javaStackFrame.getStackFrame());
}
return null;
}
@Override
protected PausedJavaUiState selectFrameInternal(int frame) {
if (myStackFrameIndex != frame) {
return new PausedJavaUiState(this, frame, myDebugSession);
}
return this;
}
@Override
public void selectFrame(final int frame) {
myDebugSession.getEventsProcessor().schedule(new _FunctionTypes._void_P0_E0() {
public void invoke() {
PausedJavaUiState newState = selectFrameInternal(frame);
if (newState != PausedJavaUiState.this) {
myAbstractDebugSession.trySetState(PausedJavaUiState.this, newState);
}
}
});
}
@NotNull
@Override
public Context getContext() {
return myContext;
}
@Override
public boolean isPausedOnBreakpoint() {
return getEventProcessor().getContextManager().isPausedOnEvent(myContext);
}
@Nullable
@Override
public synchronized JavaStackFrame getStackFrame() {
if (myStackFrameIndex == AbstractUiState.NO_FRAME) {
return null;
}
assert myThreadIndex >= 0;
// if we have a frame then we have a thread
return (JavaStackFrame) ListSequence.fromList(myThreads).getElement(myThreadIndex).getFrames().get(myStackFrameIndex);
}
@Override
public IStackFrame getStackFrame(int index) {
JavaThread thread = getThread();
if (thread == null) {
return null;
}
return thread.getFrame(index);
}
@NotNull
private List<IWatchable> getAdditionalWatchables() {
List<IWatchable> watchables = new ArrayList<IWatchable>();
if (myContext != null && myContext instanceof EventContext) {
// todo move out
EventSet eventSet = ((EventContext) myContext).getEventSet();
ThreadReference threadReference = check_vzg6vq_a0c0b0o(getThread(), this);
if (threadReference == null) {
return watchables;
}
EventWatchablesCreator watchablesCreator = new EventWatchablesCreator();
for (Event event : eventSet) {
watchablesCreator.addWatchablesFromEvent(event, watchables, threadReference);
}
}
return watchables;
}
@NotNull
@Override
public synchronized List<IWatchable> getWatchables() {
List<IWatchable> watchables = new ArrayList<IWatchable>();
watchables.addAll(super.getWatchables());
watchables.addAll(myWatchables);
return watchables;
}
private static void check_vzg6vq_a01a3(JavaStackFrame checkedDotOperand, PausedJavaUiState checkedDotThisExpression) {
if (null != checkedDotOperand) {
checkedDotOperand.initializeWatchables();
}
}
private static void check_vzg6vq_a5a4(JavaStackFrame checkedDotOperand, PausedJavaUiState checkedDotThisExpression) {
if (null != checkedDotOperand) {
checkedDotOperand.initializeWatchables();
}
}
private static ObjectReference check_vzg6vq_a0a1a7(StackFrame checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.thisObject();
}
return null;
}
private static ThreadReference check_vzg6vq_a0c0b0o(JavaThread checkedDotOperand, PausedJavaUiState checkedDotThisExpression) {
if (null != checkedDotOperand) {
return checkedDotOperand.getThread();
}
return null;
}
}