From ea0b053b73f7fd31da486dd9853fab234181121f Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Tue, 23 Jul 2024 22:17:35 +0200 Subject: [PATCH] feat: add refresh_from_buffer function --- src/syntax.zig | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/syntax.zig b/src/syntax.zig index 5fd572e..4212772 100644 --- a/src/syntax.zig +++ b/src/syntax.zig @@ -54,15 +54,11 @@ pub fn destroy(self: *Self) void { self.a.destroy(self); } -fn parse(self: *Self, content: []const u8) !void { +pub fn refresh_full(self: *Self, content: []const u8) !void { if (self.tree) |tree| tree.destroy(); self.tree = try self.parser.parseString(null, content); } -pub fn refresh_full(self: *Self, content: []const u8) !void { - return self.parse(content); -} - pub fn edit(self: *Self, ed: Edit) void { if (self.tree) |tree| tree.edit(&ed); } @@ -73,6 +69,37 @@ pub fn refresh(self: *Self, content: []const u8) !void { self.tree = try self.parser.parseString(old_tree, content); } +pub fn refresh_from_buffer(self: *Self, buffer: anytype, metrics: anytype) !void { + const old_tree = self.tree; + defer if (old_tree) |tree| tree.destroy(); + + const State = struct { + buffer: @TypeOf(buffer), + metrics: @TypeOf(metrics), + syntax: *Self, + result_buf: [1024]u8 = undefined, + }; + var state: State = .{ + .buffer = buffer, + .metrics = metrics, + .syntax = self, + }; + + const input: treez.Input = .{ + .payload = &state, + .read = struct { + fn read(payload: ?*anyopaque, _: u32, position: treez.Point, bytes_read: *u32) callconv(.C) [*:0]const u8 { + const ctx: *State = @ptrCast(@alignCast(payload orelse return "")); + const result = ctx.buffer.get_from_pos(.{ .row = position.row, .col = position.column }, &ctx.result_buf, ctx.metrics); + bytes_read.* = @intCast(result.len); + return @ptrCast(result.ptr); + } + }.read, + .encoding = .utf_8, + }; + self.tree = try self.parser.parse(old_tree, input); +} + fn CallBack(comptime T: type) type { return fn (ctx: T, sel: Range, scope: []const u8, id: u32, capture_idx: usize, node: *const Node) error{Stop}!void; }