package org.jetbrains.plugins.ruby.motion.run;
import com.intellij.execution.ExecutionException;
import com.intellij.execution.Executor;
import com.intellij.execution.configurations.RunProfileState;
import com.intellij.execution.filters.TextConsoleBuilder;
import com.intellij.execution.process.ProcessHandler;
import com.intellij.execution.ui.ConsoleView;
import com.intellij.openapi.module.Module;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.xdebugger.XDebugSession;
import com.intellij.xdebugger.breakpoints.XBreakpointHandler;
import com.jetbrains.cidr.execution.debugger.CidrDebuggerLog;
import com.jetbrains.cidr.execution.debugger.IPhoneSimulatorDebugProcess;
import com.jetbrains.cidr.execution.debugger.breakpoints.CidrBreakpointHandler;
import com.jetbrains.cidr.execution.debugger.breakpoints.CidrExceptionBreakpointHandler;
import com.jetbrains.cidr.execution.debugger.breakpoints.CidrSymbolicBreakpointHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.ruby.motion.RubyMotionUtil;
import org.jetbrains.plugins.ruby.ruby.run.configuration.RubyAbstractCommandLineState;
import java.util.List;
/**
* @author Dennis.Ushakov
*/
public abstract class RubyMotionSimulatorDebugProcess extends IPhoneSimulatorDebugProcess {
private final RunProfileState myState;
private final Executor myExecutor;
private final ProcessHandler myServerProcessHandler;
public RubyMotionSimulatorDebugProcess(XDebugSession session,
RunProfileState state,
Executor executor, TextConsoleBuilder consoleBuilder,
ProcessHandler serverProcessHandler)
throws ExecutionException {
super(new MotionAppRunParameters(false, serverProcessHandler), session, consoleBuilder, false);
myState = state;
myExecutor = executor;
myServerProcessHandler = serverProcessHandler;
}
@NotNull
@Override
public XBreakpointHandler<?>[] getBreakpointHandlers() {
final List<XBreakpointHandler<?>> handlerList = ContainerUtil.filter(super.getBreakpointHandlers(),
handler -> !(handler instanceof CidrSymbolicBreakpointHandler));
return handlerList.toArray(new XBreakpointHandler[handlerList.size()]);
}
@NotNull
@Override
protected CidrBreakpointHandler createBreakpointHandler() {
return new CidrBreakpointHandler(this, MotionLineBreakpointType.class);
}
@NotNull
@Override
protected CidrExceptionBreakpointHandler createExceptionHandler() {
return new CidrExceptionBreakpointHandler(this, MotionExceptionBreakpointType.class);
}
@NotNull
@Override
public ConsoleView createConsole() {
myConsole.attachToProcess(myServerProcessHandler);
try {
if (myState instanceof RubyAbstractCommandLineState) {
return ((RubyAbstractCommandLineState)myState).createAndAttachConsole(getSession().getProject(), getProcessHandler(), myExecutor);
}
}
catch (ExecutionException e) {
CidrDebuggerLog.LOG.info("Error while creating console: " + e);
}
return myConsole;
}
@Override
public boolean isDetachDefault() {
if (!(myState instanceof RubyAbstractCommandLineState)) {
return super.isDetachDefault();
}
final Module module = ((RubyAbstractCommandLineState)myState).getConfig().getModule();
assert module != null;
return !RubyMotionUtil.getInstance().isOSX(module);
}
}