diff --git a/CHANGELOG.md b/CHANGELOG.md index a5bbae90..35460755 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,11 @@ Changelog structure reference: - Project - New project panel is now much more compact +### Fixed + +- Zig + - `zig env` failure causes an IDE error + ## [20.3.0] - Zig diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/project/settings/ZigProjectSettingsPanel.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/project/settings/ZigProjectSettingsPanel.kt index 7f965470..80d1dae8 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/project/settings/ZigProjectSettingsPanel.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/project/settings/ZigProjectSettingsPanel.kt @@ -166,7 +166,7 @@ class ZigProjectSettingsPanel(private val project: Project) : ZigProjectConfigur val toolchain = pathToToolchain?.let { LocalZigToolchain(it) } val zig = toolchain?.zig if (zig?.path()?.toFile()?.exists() != true) { - toolchainVersion.text = "" + toolchainVersion.text = "[zig binary not found]" if (!stdFieldOverride.isSelected) { pathToStd.text = "" @@ -174,6 +174,13 @@ class ZigProjectSettingsPanel(private val project: Project) : ZigProjectConfigur return } val env = zig.getEnv(project) + if (env == null) { + toolchainVersion.text = "[failed to run zig env]" + if (!stdFieldOverride.isSelected) { + pathToStd.text = "" + } + return + } val version = env.version val stdPath = env.stdPath(toolchain, project) toolchainVersion.text = version diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/stdlib/ZigSyntheticLibrary.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/stdlib/ZigSyntheticLibrary.kt index 54d4932f..7dd8e449 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/stdlib/ZigSyntheticLibrary.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/stdlib/ZigSyntheticLibrary.kt @@ -76,7 +76,7 @@ private fun getName( project: Project ): String { val tc = state.toolchain ?: return "Zig" - val version = runBlocking { tc.zig.getEnv(project).version } + val version = runBlocking { tc.zig.getEnv(project)?.version } ?: return "Zig" return "Zig $version" } @@ -100,7 +100,7 @@ private fun getRoots( } } if (toolchain != null) { - val stdPath = runBlocking { toolchain.zig.getEnv(project) }.stdPath(toolchain, project) ?: return emptySet() + val stdPath = runBlocking { toolchain.zig.getEnv(project) }?.stdPath(toolchain, project) ?: return emptySet() val roots = stdPath.refreshAndFindVirtualDirectory() ?: return emptySet() return setOf(roots) } diff --git a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/tools/ZigCompilerTool.kt b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/tools/ZigCompilerTool.kt index e3e64037..37a5f726 100644 --- a/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/tools/ZigCompilerTool.kt +++ b/core/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/tools/ZigCompilerTool.kt @@ -25,6 +25,7 @@ package com.falsepattern.zigbrains.project.toolchain.tools import com.falsepattern.zigbrains.project.toolchain.AbstractZigToolchain import com.falsepattern.zigbrains.project.toolchain.ZigToolchainEnvironmentSerializable import com.intellij.openapi.project.Project +import kotlinx.serialization.SerializationException import kotlinx.serialization.json.Json import java.nio.file.Path @@ -36,8 +37,13 @@ class ZigCompilerTool(toolchain: AbstractZigToolchain) : ZigTool(toolchain) { return toolchain.pathToExecutable(toolName) } - suspend fun getEnv(project: Project?): ZigToolchainEnvironmentSerializable { - return envJson.decodeFromString(callWithArgs(toolchain.workingDirectory(project), "env").stdout) + suspend fun getEnv(project: Project?): ZigToolchainEnvironmentSerializable? { + val stdout = callWithArgs(toolchain.workingDirectory(project), "env").stdout + return try { + envJson.decodeFromString(stdout) + } catch (e: SerializationException) { + null + } } } diff --git a/lsp/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ToolchainZLSConfigProvider.kt b/lsp/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ToolchainZLSConfigProvider.kt index a4b2f878..410a5bb8 100644 --- a/lsp/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ToolchainZLSConfigProvider.kt +++ b/lsp/src/main/kotlin/com/falsepattern/zigbrains/project/toolchain/ToolchainZLSConfigProvider.kt @@ -41,6 +41,15 @@ class ToolchainZLSConfigProvider: SuspendingZLSConfigProvider { val env = toolchain.zig.getEnv(project) + if (env == null) { + Notification( + "zigbrains-lsp", + "Failed to evaluate zig env", + NotificationType.ERROR + ).notify(project) + return previous + } + val exe = env.zigExecutable.toNioPathOrNull() ?: run { Notification( "zigbrains-lsp", @@ -52,7 +61,7 @@ class ToolchainZLSConfigProvider: SuspendingZLSConfigProvider { if (!exe.toFile().exists()) { Notification( "zigbrains-lsp", - "Zig executable does not exiust: $exe", + "Zig executable does not exist: $exe", NotificationType.ERROR ).notify(project) return previous