chore: Simplify debugger driver config pipeline

This commit is contained in:
FalsePattern 2024-06-20 01:34:09 +02:00
parent 79481eb6f3
commit 998697dcb6
Signed by: falsepattern
GPG key ID: E930CDEC50C50E23
5 changed files with 26 additions and 41 deletions

View file

@ -1,9 +0,0 @@
package com.falsepattern.zigbrains.common;
import org.jetbrains.annotations.NotNull;
/**
* Evil hack for bypassing plugin verifier restrictions via generics. Unfortunately this is necessary due to public api limitations.
*/
public record ObjectHolder<T>(@NotNull T value) {
}

View file

@ -16,7 +16,6 @@
package com.falsepattern.zigbrains.clion; package com.falsepattern.zigbrains.clion;
import com.falsepattern.zigbrains.common.ObjectHolder;
import com.falsepattern.zigbrains.debugbridge.ZigDebuggerDriverConfigurationProvider; import com.falsepattern.zigbrains.debugbridge.ZigDebuggerDriverConfigurationProvider;
import com.falsepattern.zigbrains.debugger.settings.ZigDebuggerSettings; import com.falsepattern.zigbrains.debugger.settings.ZigDebuggerSettings;
import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.diagnostic.Logger;
@ -29,11 +28,13 @@ import com.jetbrains.cidr.execution.debugger.backend.DebuggerDriverConfiguration
import lombok.val; import lombok.val;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.function.Supplier;
public class ZigClionDebuggerDriverConfigurationProvider implements ZigDebuggerDriverConfigurationProvider { public class ZigClionDebuggerDriverConfigurationProvider implements ZigDebuggerDriverConfigurationProvider {
private static final Logger LOG = Logger.getInstance(ZigClionDebuggerDriverConfigurationProvider.class); private static final Logger LOG = Logger.getInstance(ZigClionDebuggerDriverConfigurationProvider.class);
@Override @Override
public @Nullable ObjectHolder<DebuggerDriverConfiguration> getDebuggerConfiguration(Project project, boolean isElevated, boolean emulateTerminal) { public @Nullable Supplier<DebuggerDriverConfiguration> getDebuggerConfiguration(Project project, boolean isElevated, boolean emulateTerminal) {
if (SystemInfo.isWindows) if (SystemInfo.isWindows)
return null; return null;
@ -51,9 +52,10 @@ public class ZigClionDebuggerDriverConfigurationProvider implements ZigDebuggerD
return null; return null;
} }
CPPToolchains.Toolchain finalToolchain = toolchain;
return switch (toolchain.getDebuggerKind()) { return switch (toolchain.getDebuggerKind()) {
case CUSTOM_GDB, BUNDLED_GDB -> new ObjectHolder<>(new CLionGDBDriverConfiguration(project, toolchain)); case CUSTOM_GDB, BUNDLED_GDB -> () -> new CLionGDBDriverConfiguration(project, finalToolchain);
case BUNDLED_LLDB -> new ObjectHolder<>(new CLionLLDBDriverConfiguration(project, toolchain)); case BUNDLED_LLDB -> () -> new CLionLLDBDriverConfiguration(project, finalToolchain);
}; };
} }
} }

View file

@ -16,27 +16,26 @@
package com.falsepattern.zigbrains.debugbridge; package com.falsepattern.zigbrains.debugbridge;
import com.falsepattern.zigbrains.common.ObjectHolder;
import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.project.Project; import com.intellij.openapi.project.Project;
import com.jetbrains.cidr.execution.debugger.backend.DebuggerDriverConfiguration; import com.jetbrains.cidr.execution.debugger.backend.DebuggerDriverConfiguration;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.util.Optional; import java.util.Objects;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.stream.Stream; import java.util.stream.Stream;
public interface ZigDebuggerDriverConfigurationProvider { public interface ZigDebuggerDriverConfigurationProvider {
ExtensionPointName<ZigDebuggerDriverConfigurationProvider> EXTENSION_POINT_NAME = ExtensionPointName.create("com.falsepattern.zigbrains.debuggerDriverProvider"); ExtensionPointName<ZigDebuggerDriverConfigurationProvider> EXTENSION_POINT_NAME = ExtensionPointName.create("com.falsepattern.zigbrains.debuggerDriverProvider");
static @NotNull Stream<Supplier<DebuggerDriverConfiguration>> findDebuggerConfigurations(Project project, boolean isElevated, boolean emulateTerminal) { static @NotNull Stream<DebuggerDriverConfiguration> findDebuggerConfigurations(Project project, boolean isElevated, boolean emulateTerminal) {
return EXTENSION_POINT_NAME.getExtensionList() return EXTENSION_POINT_NAME.getExtensionList()
.stream() .stream()
.map(it -> (Supplier<DebuggerDriverConfiguration>) () -> Optional.ofNullable(it.getDebuggerConfiguration(project, isElevated, emulateTerminal)) .map(it -> it.getDebuggerConfiguration(project, isElevated, emulateTerminal))
.map(ObjectHolder::value) .filter(Objects::nonNull)
.orElse(null)); .map(Supplier::get);
} }
@Nullable ObjectHolder<DebuggerDriverConfiguration> getDebuggerConfiguration(Project project, boolean isElevated, boolean emulateTerminal); @Nullable Supplier<DebuggerDriverConfiguration> getDebuggerConfiguration(Project project, boolean isElevated, boolean emulateTerminal);
} }

View file

@ -1,7 +1,6 @@
package com.falsepattern.zigbrains.debugger; package com.falsepattern.zigbrains.debugger;
import com.falsepattern.zigbrains.ZigBundle; import com.falsepattern.zigbrains.ZigBundle;
import com.falsepattern.zigbrains.common.ObjectHolder;
import com.falsepattern.zigbrains.debugbridge.ZigDebuggerDriverConfigurationProvider; import com.falsepattern.zigbrains.debugbridge.ZigDebuggerDriverConfigurationProvider;
import com.falsepattern.zigbrains.debugger.settings.ZigDebuggerSettings; import com.falsepattern.zigbrains.debugger.settings.ZigDebuggerSettings;
import com.falsepattern.zigbrains.debugger.toolchain.DebuggerAvailability; import com.falsepattern.zigbrains.debugger.toolchain.DebuggerAvailability;
@ -26,6 +25,7 @@ import org.jetbrains.annotations.Nullable;
import java.io.File; import java.io.File;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.function.Supplier;
public class ZigDefaultDebuggerDriverConfigurationProvider implements ZigDebuggerDriverConfigurationProvider { public class ZigDefaultDebuggerDriverConfigurationProvider implements ZigDebuggerDriverConfigurationProvider {
private static boolean availabilityCheck(Project project, DebuggerKind kind) { private static boolean availabilityCheck(Project project, DebuggerKind kind) {
@ -79,7 +79,7 @@ public class ZigDefaultDebuggerDriverConfigurationProvider implements ZigDebugge
} }
@Override @Override
public @Nullable ObjectHolder<DebuggerDriverConfiguration> getDebuggerConfiguration(Project project, boolean isElevated, boolean emulateTerminal) { public @Nullable Supplier<DebuggerDriverConfiguration> getDebuggerConfiguration(Project project, boolean isElevated, boolean emulateTerminal) {
val settings = ZigDebuggerSettings.getInstance(); val settings = ZigDebuggerSettings.getInstance();
val service = ZigDebuggerToolchainService.getInstance(); val service = ZigDebuggerToolchainService.getInstance();
val kind = settings.debuggerKind; val kind = settings.debuggerKind;
@ -88,14 +88,14 @@ public class ZigDefaultDebuggerDriverConfigurationProvider implements ZigDebugge
} }
val availability = service.debuggerAvailability(kind); val availability = service.debuggerAvailability(kind);
return switch (availability.kind()) { return switch (availability.kind()) {
case Bundled -> new ObjectHolder<>(switch (kind) { case Bundled -> () -> (switch (kind) {
case LLDB -> new ZigLLDBDriverConfiguration(isElevated, emulateTerminal); case LLDB -> new ZigLLDBDriverConfiguration(isElevated, emulateTerminal);
case GDB -> new ZigGDBDriverConfiguration(isElevated, emulateTerminal); case GDB -> new ZigGDBDriverConfiguration(isElevated, emulateTerminal);
case MSVC -> throw new AssertionError("MSVC is never bundled"); case MSVC -> throw new AssertionError("MSVC is never bundled");
}); });
case Binaries -> { case Binaries -> {
val bin = (DebuggerAvailability.Binaries) availability; val bin = (DebuggerAvailability.Binaries) availability;
yield new ObjectHolder<>(switch (bin.binariesKind()) { yield () -> (switch (bin.binariesKind()) {
case LLDB -> new ZigCustomBinariesLLDBDriverConfiguration((LLDBBinaries) bin, isElevated, emulateTerminal); case LLDB -> new ZigCustomBinariesLLDBDriverConfiguration((LLDBBinaries) bin, isElevated, emulateTerminal);
case GDB -> new ZigCustomBinariesGDBDriverConfiguration((GDBBinaries) bin, isElevated, emulateTerminal); case GDB -> new ZigCustomBinariesGDBDriverConfiguration((GDBBinaries) bin, isElevated, emulateTerminal);
case MSVC -> new ZigMSVCDriverConfiguration((MSVCBinaries) bin, isElevated, emulateTerminal); case MSVC -> new ZigMSVCDriverConfiguration((MSVCBinaries) bin, isElevated, emulateTerminal);

View file

@ -66,26 +66,19 @@ public abstract class ZigDebugRunnerBase<ProfileState extends ProfileStateBase<?
protected RunContentDescriptor doExecute(ProfileState state, AbstractZigToolchain toolchain, ExecutionEnvironment environment) protected RunContentDescriptor doExecute(ProfileState state, AbstractZigToolchain toolchain, ExecutionEnvironment environment)
throws ExecutionException { throws ExecutionException {
val project = environment.getProject(); val project = environment.getProject();
val providers = ZigDebuggerDriverConfigurationProvider.findDebuggerConfigurations(project, false, false) val drivers = ZigDebuggerDriverConfigurationProvider.findDebuggerConfigurations(project, false, false)
.toList(); .toList();
DebuggerDriverConfiguration debuggerDriver = null; for (val debuggerDriver: drivers) {
if (debuggerDriver == null)
for (val provider: providers) { continue;
debuggerDriver = provider.get(); ZigDebugParametersBase<ProfileState> runParameters = getDebugParameters(state, environment, debuggerDriver, toolchain);
if (debuggerDriver != null) if (runParameters == null) {
break; continue;
}
return startSession(environment, new ZigLocalDebugProcessStarter(runParameters, state, environment));
} }
return null;
if (debuggerDriver == null) {
return null;
}
ZigDebugParametersBase<ProfileState> runParameters = getDebugParameters(state, environment, debuggerDriver, toolchain);
if (runParameters == null) {
return null;
}
return startSession(environment, new ZigLocalDebugProcessStarter(runParameters, state, environment));
} }
@Override @Override