package com.siberika.idea.pascal.debugger; import com.intellij.execution.ExecutionException; import com.intellij.execution.ExecutionResult; import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.configurations.RunProfileState; import com.intellij.execution.executors.DefaultDebugExecutor; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.runners.GenericProgramRunner; import com.intellij.execution.ui.RunContentDescriptor; import com.intellij.openapi.module.Module; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.xdebugger.XDebugProcess; import com.intellij.xdebugger.XDebugProcessStarter; import com.intellij.xdebugger.XDebugSession; import com.intellij.xdebugger.XDebuggerManager; import com.siberika.idea.pascal.debugger.gdb.GdbXDebugProcess; import com.siberika.idea.pascal.run.PascalRunConfiguration; import com.siberika.idea.pascal.sdk.FPCSdkType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class PascalDebugRunner extends GenericProgramRunner { @NotNull public String getRunnerId() { return "com.siberika.idea.pascal.run.PascalDebugRunner"; } @Nullable @Override protected RunContentDescriptor doExecute(@NotNull RunProfileState state, @NotNull final ExecutionEnvironment environment) throws ExecutionException { XDebuggerManager xDebuggerManager = XDebuggerManager.getInstance(environment.getProject()); final ExecutionResult executionResult = state.execute(environment.getExecutor(), this); return xDebuggerManager.startSession(environment, new XDebugProcessStarter() { @NotNull @Override public XDebugProcess start(@NotNull XDebugSession session) throws ExecutionException { return new GdbXDebugProcess(session, environment, executionResult); } }).getRunContentDescriptor(); } public boolean canRun(@NotNull String executorId, @NotNull RunProfile profile) { if (profile instanceof PascalRunConfiguration) { Module module = ((PascalRunConfiguration) profile).getConfigurationModule().getModule(); Sdk sdk = module != null ? ModuleRootManager.getInstance(module).getSdk() : null; return ((null == sdk) || (sdk.getSdkType() instanceof FPCSdkType)) && executorId.equals(DefaultDebugExecutor.EXECUTOR_ID); } else { return false; } } }