From b885fc6602f9ee04b1fe9ea286ace110c8c4708c Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Sat, 19 Jul 2025 00:03:30 +0200 Subject: [PATCH 1/2] refactor: improve create pattern to avoid leaks --- src/QueryCache.zig | 1 + src/syntax.zig | 6 +++++- src/ts_serializer.zig | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/QueryCache.zig b/src/QueryCache.zig index 816d8bc..7b011d5 100644 --- a/src/QueryCache.zig +++ b/src/QueryCache.zig @@ -62,6 +62,7 @@ pub const Error = CacheError || QueryParseError || QuerySerializeError; pub fn create(allocator: std.mem.Allocator, opts: struct { lock: bool = false }) !*Self { const self = try allocator.create(Self); + errdefer allocator.destroy(self); self.* = .{ .allocator = allocator, .mutex = if (opts.lock) .{} else null, diff --git a/src/syntax.zig b/src/syntax.zig index bd67ccf..5225155 100644 --- a/src/syntax.zig +++ b/src/syntax.zig @@ -29,9 +29,13 @@ tree: ?*treez.Tree = null, pub fn create(file_type: FileType, allocator: std.mem.Allocator, query_cache: *QueryCache) !*Self { const query = try query_cache.get(file_type, .highlights); + errdefer query_cache.release(query, .highlights); const errors_query = try query_cache.get(file_type, .errors); + errdefer query_cache.release(errors_query, .highlights); const injections = try query_cache.get(file_type, .injections); + errdefer if (injections) |injections_| query_cache.release(injections_, .injections); const self = try allocator.create(Self); + errdefer allocator.destroy(self); self.* = .{ .allocator = allocator, .lang = file_type.lang_fn() orelse std.debug.panic("tree-sitter parser function failed for language: {s}", .{file_type.name}), @@ -40,7 +44,6 @@ pub fn create(file_type: FileType, allocator: std.mem.Allocator, query_cache: *Q .errors_query = errors_query, .injections = injections, }; - errdefer self.destroy(query_cache); try self.parser.setLanguage(self.lang); return self; } @@ -58,6 +61,7 @@ pub fn static_create_guess_file_type_static(allocator: std.mem.Allocator, conten pub fn destroy(self: *Self, query_cache: *QueryCache) void { if (self.tree) |tree| tree.destroy(); query_cache.release(self.query, .highlights); + query_cache.release(self.errors_query, .highlights); if (self.injections) |injections| query_cache.release(injections, .injections); self.parser.destroy(); self.allocator.destroy(self); diff --git a/src/ts_serializer.zig b/src/ts_serializer.zig index 90c5865..928f60b 100644 --- a/src/ts_serializer.zig +++ b/src/ts_serializer.zig @@ -285,6 +285,7 @@ pub const DeserializeError = error{ pub fn fromCbor(cb: []const u8, allocator: std.mem.Allocator) DeserializeError!struct { *TSQuery, *std.heap.ArenaAllocator } { var arena = try allocator.create(std.heap.ArenaAllocator); + errdefer allocator.destroy(arena); arena.* = std.heap.ArenaAllocator.init(allocator); errdefer arena.deinit(); const query = try arena.allocator().create(TSQuery); From 410d19e633f237cd1602175450bd7d3bb03a1898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 16 Aug 2025 17:36:36 +0200 Subject: [PATCH 2/2] file_types: invoke OmniSharp instead of omnisharp The former is the canonical executable name, and also what Helix uses. Seems reasonable to standardize on that. --- src/file_types.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/file_types.zig b/src/file_types.zig index efb8ca2..e75ad4a 100644 --- a/src/file_types.zig +++ b/src/file_types.zig @@ -41,7 +41,7 @@ pub const @"c-sharp" = .{ .icon = "󰌛", .extensions = .{"cs"}, .comment = "//", - .language_server = .{ "omnisharp", "-lsp" }, + .language_server = .{ "OmniSharp", "-lsp" }, .formatter = .{ "csharpier", "format" }, };