zls 0.14 build on save diagnostic not refreshing on macOS 15.3.1
Zig Version
0.14.0
ZLS Version
0.14.0
Client / Code Editor / Extensions
nvim 0.10.4 with nvim-lspconfig
Steps to Reproduce and Observed Behavior
- clone https://github.com/Sped0n/zh (commit 13832c3)
- open
src/input.zig, go to line 143, change.pop()to.popOrNull() - save file, no build on save error appeared (it works in 0.13)
- restart lsp, it give build on save error (
zls: no field or member function named 'popOrNull' in 'array_list.ArrayListAligned(u8,null)') - change
.popOrNull()back to.pop(), then save - after saved, build on save error persist (doesnt refresh)
- restart lsp, build on save error no longer shows
Expected Behavior
build on save diagnostic could refresh normally after save
Relevant log output
----- zls log -----
info ( main ): Starting ZLS 0.14.0 @ '/Users/spedon/.local/share/mise/installs/zls/0.14.0/zls'
info ( main ): Log File: /Users/spedon/Library/Caches/zls/zls.log (info)
info (server): Client Info: Neovim-0.10.4
info (server): Autofix Mode: source.fixall
info (server): added Workspace Folder: file:///Users/spedon/eden/zig/zh
info (server): Set config option 'builtin_path' to "/Users/spedon/Library/Caches/zls/builtin.zig"
info (server): Set config option 'zig_lib_path' to "/Users/spedon/.local/share/mise/installs/zig/0.14.0/lib"
info (server): Set config option 'zig_exe_path' to "/Users/spedon/.local/share/mise/installs/zig/0.14.0/bin/zig"
info (server): Set config option 'build_runner_path' to "/Users/spedon/Library/Caches/zls/build_runner/66ed948cb34b142db738951608c6140d/build_runner.zig"
info (server): Set config option 'global_cache_path' to "/Users/spedon/Library/Caches/zls"
info (server): Loaded config: /Users/spedon/Library/Application Support/zls.json
info (server): Set config option 'enable_build_on_save' to true
info (store ): Loaded build file 'file:///Users/spedon/eden/zig/zh/build.zig'
info (server): trying to start Build-On-Save for 'file:///Users/spedon/eden/zig/zh'
info ( main ): Starting ZLS 0.14.0 @ '/Users/spedon/.local/share/mise/installs/zls/0.14.0/zls'
info ( main ): Log File: /Users/spedon/Library/Caches/zls/zls.log (info)
info (server): Client Info: Neovim-0.10.4
info (server): Autofix Mode: source.fixall
info (server): added Workspace Folder: file:///Users/spedon/eden/zig/zh
info (server): Set config option 'builtin_path' to "/Users/spedon/Library/Caches/zls/builtin.zig"
info (server): Set config option 'zig_lib_path' to "/Users/spedon/.local/share/mise/installs/zig/0.14.0/lib"
info (server): Set config option 'zig_exe_path' to "/Users/spedon/.local/share/mise/installs/zig/0.14.0/bin/zig"
info (server): Set config option 'build_runner_path' to "/Users/spedon/Library/Caches/zls/build_runner/66ed948cb34b142db738951608c6140d/build_runner.zig"
info (server): Set config option 'global_cache_path' to "/Users/spedon/Library/Caches/zls"
info (server): Loaded config: /Users/spedon/Library/Application Support/zls.json
info (server): Set config option 'enable_build_on_save' to true
info (store ): Loaded build file 'file:///Users/spedon/eden/zig/zh/build.zig'
info (server): trying to start Build-On-Save for 'file:///Users/spedon/eden/zig/zh'
info ( main ): Starting ZLS 0.14.0 @ '/Users/spedon/.local/share/mise/installs/zls/0.14.0/zls'
info ( main ): Log File: /Users/spedon/Library/Caches/zls/zls.log (info)
info (server): Client Info: Neovim-0.10.4
info (server): Autofix Mode: source.fixall
info (server): added Workspace Folder: file:///Users/spedon/eden/zig/zh
info (server): Set config option 'builtin_path' to "/Users/spedon/Library/Caches/zls/builtin.zig"
info (server): Set config option 'zig_lib_path' to "/Users/spedon/.local/share/mise/installs/zig/0.14.0/lib"
info (server): Set config option 'zig_exe_path' to "/Users/spedon/.local/share/mise/installs/zig/0.14.0/bin/zig"
info (server): Set config option 'build_runner_path' to "/Users/spedon/Library/Caches/zls/build_runner/66ed948cb34b142db738951608c6140d/build_runner.zig"
info (server): Set config option 'global_cache_path' to "/Users/spedon/Library/Caches/zls"
info (server): Loaded config: /Users/spedon/Library/Application Support/zls.json
info (server): Set config option 'enable_build_on_save' to true
info (store ): Loaded build file 'file:///Users/spedon/eden/zig/zh/build.zig'
info (server): trying to start Build-On-Save for 'file:///Users/spedon/eden/zig/zh'
Download vscode to test and get the same weird behaviour
Have done some investigations myself, it seems the behaviour is caused by the watch implementation
After force it use manual implementation instead of zig's builtin watch, refreshing works normally.
Also,
zig build --watchfailed to detect file changes made by neovim(havn't try other editor yet), kinda like what happens in https://github.com/ziglang/zig/issues/21905 (my laptop is on macOS 15.3.1 though).
Maybe we can provide a config option to disable watch implementation? I'm willing to make a pr.
Edited
Below is my monkey patch diff, just for those who are impatient just like me
diff --git a/src/Server.zig b/src/Server.zig
index 13ae7d1..96aa565 100644
--- a/src/Server.zig
+++ b/src/Server.zig
@@ -765,7 +765,7 @@ const Workspace = struct {
if (args.server.runtime_zig_version) |runtime_zig_version| {
workspace.build_on_save_mode = switch (BuildOnSaveSupport.isSupportedRuntime(runtime_zig_version)) {
- .supported => .watch,
+ .supported => .manual,
// If if build on save has been explicitly enabled, fallback to the implementation with manual updates
else => if (args.server.config.enable_build_on_save orelse false) .manual else null,
};
diff --git a/src/build_runner/0.14.0.zig b/src/build_runner/0.14.0.zig
index d3480df..6c2dfca 100644
--- a/src/build_runner/0.14.0.zig
+++ b/src/build_runner/0.14.0.zig
@@ -468,30 +468,21 @@ const Watch = struct {
fn init() !Watch {
return .{
.fs_watch = if (@TypeOf(std.Build.Watch) != void) try std.Build.Watch.init() else {},
- .supports_fs_watch = @TypeOf(std.Build.Watch) != void and shared.BuildOnSaveSupport.isSupportedRuntime(builtin.zig_version) == .supported,
+ .supports_fs_watch = false,
.manual_event = .{},
.steps = &.{},
};
}
- fn update(w: *Watch, gpa: Allocator, steps: []const *Step) !void {
- if (@TypeOf(std.Build.Watch) != void and w.supports_fs_watch) {
- return try w.fs_watch.update(gpa, steps);
- }
+ fn update(w: *Watch, _: Allocator, steps: []const *Step) !void {
w.steps = steps;
}
fn trigger(w: *Watch) void {
- if (w.supports_fs_watch) {
- @panic("received manualy filesystem event even though std.Build.Watch is supported");
- }
w.manual_event.set();
}
fn wait(w: *Watch, gpa: Allocator, timeout: std.Build.Watch.Timeout) !std.Build.Watch.WaitResult {
- if (@TypeOf(std.Build.Watch) != void and w.supports_fs_watch) {
- return try w.fs_watch.wait(gpa, timeout);
- }
switch (timeout) {
.none => w.manual_event.wait(),
.ms => |ms| w.manual_event.timedWait(@as(u64, ms) * std.time.ns_per_ms) catch return .timeout,
After my tracking it seems manual impl is the best way for now, rather than keep it broken right now.
see https://github.com/ziglang/zig/issues/21905, https://github.com/ziglang/zig/pull/1333, https://github.com/ziglang/zig/issues/1349 and https://github.com/tpoechtrager/osxcross.
My patch here, added new config item build_on_save_alternative_watch to force zls use manual way.
Works for me. Thank you @GreyElaina!
I'm getting this issue too but errors do not show up in test declarations and doesn't get updated there but is updated elsewhere
The underlying Zig issue has been fixed. Updating to Zig 0.15.1 and ZLS 0.15.0 should resolve this issue.
@Techatrix I don't see any release for zig 0.15.0 and 0.15.1 on GitHub, but I do see it on the website, is there a reason for this?
https://github.com/ziglang/zig/releases/tag/0.15.1