backport: 16.1.1

This commit is contained in:
FalsePattern 2024-07-25 23:20:11 +02:00
parent b707d6299c
commit b662179dcd
Signed by: falsepattern
GPG key ID: E930CDEC50C50E23
7 changed files with 62 additions and 10 deletions

View file

@ -17,6 +17,17 @@ Changelog structure reference:
## [Unreleased]
## [16.1.1]
### Fixed
- Zig
- Standard library override always auto-enabling
- Better toolchain autodetect
- ZLS
- Better language server autodetect
## [16.1.0]
### Added

View file

@ -11,7 +11,7 @@ baseIDE=clion
ideaVersion=2023.2.7
clionVersion=2023.2.4
pluginVersion=16.1.0
pluginVersion=16.1.1
# Gradle Releases -> https://github.com/gradle/gradle/releases
gradleVersion=8.9

View file

@ -89,7 +89,7 @@ public class ZigProjectSettingsPanel implements MyDisposable {
.map(PathUtil::pathFromString)
.map(ZigToolchainProvider::findToolchain)
.orElse(null);
return new ZigProjectSettings(StringUtil.blankToNull(pathToStdField.getText()), toolchain);
return new ZigProjectSettings(stdFieldOverride.isSelected() ? StringUtil.blankToNull(pathToStdField.getText()) : null, toolchain);
}
public void setData(ZigProjectSettings value) {
@ -115,7 +115,6 @@ public class ZigProjectSettingsPanel implements MyDisposable {
r.button("Autodetect", $f(this::autodetect));
});
p2.cell("Toolchain version", toolchainVersion);
p2.cell("Override standard library path", stdFieldOverride);
p2.row("Standard library location", row -> {
row.cell(pathToStdField).resizableColumn().align(AlignX.FILL);
row.cell(stdFieldOverride);

View file

@ -36,7 +36,7 @@ public class ZigProjectSettings {
public String toolchainHomeDirectory;
public ZigProjectSettings(String explicitPathToStd, AbstractZigToolchain toolchain) {
this(true, explicitPathToStd, (String)null);
this(explicitPathToStd != null, explicitPathToStd, null);
setToolchain(toolchain);
}

View file

@ -30,9 +30,14 @@ public class ToolchainZLSConfigProvider implements ZLSConfigProvider {
public void getEnvironment(Project project, ZLSConfig.ZLSConfigBuilder builder) {
val svc = ZigProjectSettingsService.getInstance(project);
val state = svc.getState();
val toolchain = state.getToolchain();
if (toolchain == null)
var toolchain = state.getToolchain();
if (toolchain == null) {
toolchain = AbstractZigToolchain.suggest();
if (toolchain == null) {
return;
}
state.setToolchain(toolchain);
}
val projectDir = ProjectUtil.guessProjectDir(project);
val env = toolchain.zig().getEnv(projectDir == null ? Path.of(".") : projectDir.toNioPath());
env.ifPresent(e -> builder.zig_exe_path(e.zigExecutable()).zig_lib_path(state.overrideStdPath ? Path.of(state.explicitPathToStd).getParent().toString() : e.libDirectory()));

View file

@ -31,6 +31,6 @@ public class ZLSLanguageServerFactory implements LanguageServerFactory, Language
@Override
public void setEnabled(boolean enabled, @NotNull Project project) {
this.enabled = enabled && ZLSStreamConnectionProvider.getCommand(project) != null;
this.enabled = enabled;
}
}

View file

@ -7,9 +7,12 @@ import com.google.gson.Gson;
import com.intellij.notification.Notification;
import com.intellij.notification.NotificationType;
import com.intellij.notification.Notifications;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.project.ProjectUtil;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.redhat.devtools.lsp4ij.server.ProcessStreamConnectionProvider;
import lombok.val;
@ -19,17 +22,39 @@ import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
public class ZLSStreamConnectionProvider extends ProcessStreamConnectionProvider {
private static final Logger LOG = Logger.getInstance(ZLSStreamConnectionProvider.class);
public ZLSStreamConnectionProvider(Project project) {
super.setCommands(getCommand(project));
val command = getCommand(project);
val projectDir = ProjectUtil.guessProjectDir(project);
if (projectDir != null) {
setWorkingDirectory(projectDir.getPath());
}
try {
setCommands(command.get());
} catch (InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
}
public static List<String> getCommand(Project project) {
private static List<String> doGetCommand(Project project) {
var svc = ZLSProjectSettingsService.getInstance(project);
val state = svc.getState();
var zlsPath = state.zlsPath;
if (StringUtil.isEmpty(zlsPath)) {
zlsPath = com.falsepattern.zigbrains.common.util.FileUtil.findExecutableOnPATH("zls").map(Path::toString).orElse(null);
if (zlsPath == null) {
Notifications.Bus.notify(new Notification("ZigBrains.ZLS", "Could not detect ZLS binary! Please configure it!",
NotificationType.ERROR));
return null;
}
state.setZlsPath(zlsPath);
}
if (!validatePath("ZLS Binary", zlsPath, false)) {
return null;
}
@ -87,6 +112,18 @@ public class ZLSStreamConnectionProvider extends ProcessStreamConnectionProvider
return cmd;
}
public static Future<List<String>> getCommand(Project project) {
val future = new CompletableFuture<List<String>>();
ApplicationManager.getApplication().executeOnPooledThread(() -> {
try {
future.complete(doGetCommand(project));
} catch (Throwable t) {
future.completeExceptionally(t);
}
});
return future;
}
private static boolean validatePath(String name, String pathTxt, boolean dir) {
if (pathTxt == null || pathTxt.isBlank()) {
return false;