package com.jetbrains.lang.dart.ide.runner.server.vmService.frame; import com.intellij.xdebugger.frame.XExecutionStack; import com.intellij.xdebugger.frame.XSuspendContext; import com.jetbrains.lang.dart.ide.runner.server.vmService.DartVmServiceDebugProcess; import com.jetbrains.lang.dart.ide.runner.server.vmService.IsolatesInfo; import org.dartlang.vm.service.element.Frame; import org.dartlang.vm.service.element.InstanceRef; import org.dartlang.vm.service.element.IsolateRef; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class DartVmServiceSuspendContext extends XSuspendContext { @NotNull private final DartVmServiceDebugProcess myDebugProcess; @NotNull private final DartVmServiceExecutionStack myActiveExecutionStack; private List<XExecutionStack> myExecutionStacks; private boolean myAtAsyncSuspension; public DartVmServiceSuspendContext(@NotNull final DartVmServiceDebugProcess debugProcess, @NotNull final IsolateRef isolateRef, @NotNull final Frame topFrame, @Nullable final InstanceRef exception, boolean atAsyncSuspension) { myDebugProcess = debugProcess; myActiveExecutionStack = new DartVmServiceExecutionStack(debugProcess, isolateRef.getId(), isolateRef.getName(), topFrame, exception); myAtAsyncSuspension = atAsyncSuspension; } @NotNull @Override public XExecutionStack getActiveExecutionStack() { return myActiveExecutionStack; } public boolean getAtAsyncSuspension() { return myAtAsyncSuspension; } @Override public void computeExecutionStacks(@NotNull final XExecutionStackContainer container) { if (myExecutionStacks == null) { final Collection<IsolatesInfo.IsolateInfo> isolateInfos = myDebugProcess.getIsolateInfos(); myExecutionStacks = new ArrayList<>(isolateInfos.size()); for (IsolatesInfo.IsolateInfo isolateInfo : isolateInfos) { if (isolateInfo.getIsolateId().equals(myActiveExecutionStack.getIsolateId())) { myExecutionStacks.add(myActiveExecutionStack); } else { myExecutionStacks .add(new DartVmServiceExecutionStack(myDebugProcess, isolateInfo.getIsolateId(), isolateInfo.getIsolateName(), null, null)); } } } container.addExecutionStack(myExecutionStacks, true); } }