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

View file

@ -16,27 +16,26 @@
package com.falsepattern.zigbrains.debugbridge;
import com.falsepattern.zigbrains.common.ObjectHolder;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.project.Project;
import com.jetbrains.cidr.execution.debugger.backend.DebuggerDriverConfiguration;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Optional;
import java.util.Objects;
import java.util.function.Supplier;
import java.util.stream.Stream;
public interface ZigDebuggerDriverConfigurationProvider {
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()
.stream()
.map(it -> (Supplier<DebuggerDriverConfiguration>) () -> Optional.ofNullable(it.getDebuggerConfiguration(project, isElevated, emulateTerminal))
.map(ObjectHolder::value)
.orElse(null));
.map(it -> it.getDebuggerConfiguration(project, isElevated, emulateTerminal))
.filter(Objects::nonNull)
.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;
import com.falsepattern.zigbrains.ZigBundle;
import com.falsepattern.zigbrains.common.ObjectHolder;
import com.falsepattern.zigbrains.debugbridge.ZigDebuggerDriverConfigurationProvider;
import com.falsepattern.zigbrains.debugger.settings.ZigDebuggerSettings;
import com.falsepattern.zigbrains.debugger.toolchain.DebuggerAvailability;
@ -26,6 +25,7 @@ import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.nio.file.Path;
import java.util.function.Supplier;
public class ZigDefaultDebuggerDriverConfigurationProvider implements ZigDebuggerDriverConfigurationProvider {
private static boolean availabilityCheck(Project project, DebuggerKind kind) {
@ -79,7 +79,7 @@ public class ZigDefaultDebuggerDriverConfigurationProvider implements ZigDebugge
}
@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 service = ZigDebuggerToolchainService.getInstance();
val kind = settings.debuggerKind;
@ -88,14 +88,14 @@ public class ZigDefaultDebuggerDriverConfigurationProvider implements ZigDebugge
}
val availability = service.debuggerAvailability(kind);
return switch (availability.kind()) {
case Bundled -> new ObjectHolder<>(switch (kind) {
case Bundled -> () -> (switch (kind) {
case LLDB -> new ZigLLDBDriverConfiguration(isElevated, emulateTerminal);
case GDB -> new ZigGDBDriverConfiguration(isElevated, emulateTerminal);
case MSVC -> throw new AssertionError("MSVC is never bundled");
});
case Binaries -> {
val bin = (DebuggerAvailability.Binaries) availability;
yield new ObjectHolder<>(switch (bin.binariesKind()) {
yield () -> (switch (bin.binariesKind()) {
case LLDB -> new ZigCustomBinariesLLDBDriverConfiguration((LLDBBinaries) bin, isElevated, emulateTerminal);
case GDB -> new ZigCustomBinariesGDBDriverConfiguration((GDBBinaries) bin, isElevated, emulateTerminal);
case MSVC -> new ZigMSVCDriverConfiguration((MSVCBinaries) bin, isElevated, emulateTerminal);

View file

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