fix: Windows exe discovery

This commit is contained in:
FalsePattern 2024-07-18 10:52:48 +02:00
parent 905df582e4
commit db14dbe4fa
Signed by: falsepattern
GPG key ID: E930CDEC50C50E23
2 changed files with 19 additions and 5 deletions

View file

@ -21,6 +21,7 @@ Changelog structure reference:
- Debugger - Debugger
- Added fallback metadata for windows debugger downloading - Added fallback metadata for windows debugger downloading
- Automatic exe path discovery for zig build run debugging on windows
- Zig - Zig
- Color settings has more accurate color preview text. - Color settings has more accurate color preview text.

View file

@ -23,6 +23,7 @@ import com.falsepattern.zigbrains.debugger.runner.base.ZigDebugParametersBase;
import com.falsepattern.zigbrains.project.execution.build.ProfileStateBuild; import com.falsepattern.zigbrains.project.execution.build.ProfileStateBuild;
import com.falsepattern.zigbrains.project.toolchain.AbstractZigToolchain; import com.falsepattern.zigbrains.project.toolchain.AbstractZigToolchain;
import com.intellij.execution.ExecutionException; import com.intellij.execution.ExecutionException;
import com.intellij.openapi.util.SystemInfo;
import com.jetbrains.cidr.execution.Installer; import com.jetbrains.cidr.execution.Installer;
import com.jetbrains.cidr.execution.debugger.backend.DebuggerDriverConfiguration; import com.jetbrains.cidr.execution.debugger.backend.DebuggerDriverConfiguration;
import lombok.val; import lombok.val;
@ -32,6 +33,8 @@ import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.List;
import java.util.stream.Stream;
public class ZigDebugParametersBuild extends ZigDebugParametersBase<ProfileStateBuild> implements PreLaunchAware { public class ZigDebugParametersBuild extends ZigDebugParametersBase<ProfileStateBuild> implements PreLaunchAware {
private static final String BoilerplateNotice = "\nPlease edit this intellij build configuration and specify the path of the executable created by \"zig build\" directly!"; private static final String BoilerplateNotice = "\nPlease edit this intellij build configuration and specify the path of the executable created by \"zig build\" directly!";
@ -61,11 +64,7 @@ public class ZigDebugParametersBuild extends ZigDebugParametersBase<ProfileState
throw new ExecutionException("Could not auto-detect default executable output directory \"zig-out/bin\"!" + BoilerplateNotice); throw new ExecutionException("Could not auto-detect default executable output directory \"zig-out/bin\"!" + BoilerplateNotice);
} }
try (val filesInOutput = Files.list(expectedOutputDir)) { try (val filesInOutput = Files.list(expectedOutputDir)) {
val executables = filesInOutput.filter(Files::isRegularFile).filter(Files::isExecutable).toList(); exe = getExe(filesInOutput);
if (executables.size() > 1) {
throw new ExecutionException("Multiple executables found!" + BoilerplateNotice);
}
exe = executables.get(0);
} catch (IOException e) { } catch (IOException e) {
throw new ExecutionException("Could not scan output directory \"" + expectedOutputDir + "\"!" + BoilerplateNotice); throw new ExecutionException("Could not scan output directory \"" + expectedOutputDir + "\"!" + BoilerplateNotice);
} }
@ -82,6 +81,20 @@ public class ZigDebugParametersBuild extends ZigDebugParametersBase<ProfileState
return exe.toFile(); return exe.toFile();
} }
private static @NotNull Path getExe(Stream<Path> files) throws ExecutionException {
files = files.filter(Files::isRegularFile);
if (SystemInfo.isWindows) {
files = files.filter(file -> file.getFileName().toString().endsWith(".exe"));
} else {
files = files.filter(Files::isExecutable);
}
val executables = files.toList();
if (executables.size() > 1) {
throw new ExecutionException("Multiple executables found!" + BoilerplateNotice);
}
return executables.get(0);
}
@Override @Override
public void preLaunch() throws Exception { public void preLaunch() throws Exception {
this.executableFile = compileExe(); this.executableFile = compileExe();