package com.jetbrains.lang.dart.ide.runner.server.vmService.frame; import com.intellij.icons.AllIcons; import com.intellij.xdebugger.frame.XExecutionStack; import com.intellij.xdebugger.frame.XStackFrame; import com.jetbrains.lang.dart.ide.runner.server.vmService.DartVmServiceDebugProcess; import org.dartlang.vm.service.element.Frame; import org.dartlang.vm.service.element.InstanceRef; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collections; public class DartVmServiceExecutionStack extends XExecutionStack { private final DartVmServiceDebugProcess myDebugProcess; private final String myIsolateId; @Nullable private final XStackFrame myTopFrame; @Nullable private final InstanceRef myException; public DartVmServiceExecutionStack(@NotNull final DartVmServiceDebugProcess debugProcess, @NotNull final String isolateId, @NotNull final String isolateName, @Nullable final Frame topFrame, @Nullable final InstanceRef exception) { // topFrame is not null for (and only for) the active execution stack super(debugProcess.isIsolateSuspended(isolateId) ? beautify(isolateName) : beautify(isolateName) + " (running)", topFrame != null ? AllIcons.Debugger.ThreadCurrent : debugProcess.isIsolateSuspended(isolateId) ? AllIcons.Debugger.ThreadAtBreakpoint : AllIcons.Debugger.ThreadRunning); myDebugProcess = debugProcess; myIsolateId = isolateId; myException = exception; myTopFrame = topFrame == null ? null : new DartVmServiceStackFrame(debugProcess, isolateId, topFrame, null, exception); } @NotNull private static String beautify(@NotNull final String isolateName) { // in tests it is "foo_test.dart%22%20as%20test;%0A%0A%20%20%20%20%20%20%20%20void%20main(_,%20SendPort%20message)..." final int index = isolateName.indexOf(".dart%22%20as%20test;"); return index > 0 ? isolateName.substring(0, index + ".dart".length()) : isolateName; } @Nullable @Override public XStackFrame getTopFrame() { // engine calls getTopFrame for active execution stack only, for which myTopFrame is calculated in constructor return myTopFrame; } @Override public void computeStackFrames(final int firstFrameIndex, @NotNull final XStackFrameContainer container) { if (myDebugProcess.isIsolateSuspended(myIsolateId)) { myDebugProcess.getVmServiceWrapper().computeStackFrames(myIsolateId, firstFrameIndex, container, myException); } else { container.addStackFrames(Collections.emptyList(), true); } } public String getIsolateId() { return myIsolateId; } }