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; } }