From 7dd0fbf7b4d73aa31a7084cbbef5d773d055637f Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Tue, 29 Oct 2024 20:42:00 +0100 Subject: [PATCH] feat: add syntax.refresh_from_string utility function --- src/syntax/src/syntax.zig | 41 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/syntax/src/syntax.zig b/src/syntax/src/syntax.zig index 41a3e18..c348c14 100644 --- a/src/syntax/src/syntax.zig +++ b/src/syntax/src/syntax.zig @@ -111,6 +111,47 @@ pub fn refresh_from_buffer(self: *Self, buffer: anytype, metrics: anytype) !void self.tree = try self.parser.parse(old_tree, input); } +pub fn refresh_from_string(self: *Self, content: [:0]const u8) !void { + const old_tree = self.tree; + defer if (old_tree) |tree| tree.destroy(); + + const State = struct { + content: @TypeOf(content), + }; + var state: State = .{ + .content = content, + }; + + const input: Input = .{ + .payload = &state, + .read = struct { + fn read(payload: ?*anyopaque, _: u32, position: treez.Point, bytes_read: *u32) callconv(.C) [*:0]const u8 { + bytes_read.* = 0; + const ctx: *State = @ptrCast(@alignCast(payload orelse return "")); + const pos = (find_line_begin(ctx.content, position.row) orelse return "") + position.column; + if (pos >= ctx.content.len) return ""; + bytes_read.* = @intCast(ctx.content.len - pos); + return ctx.content[pos..].ptr; + } + }.read, + .encoding = .utf_8, + }; + self.tree = try self.parser.parse(old_tree, input); +} + +fn find_line_begin(s: []const u8, line: usize) ?usize { + var idx: usize = 0; + var at_line: usize = 0; + while (idx < s.len) { + if (at_line == line) + return idx; + if (s[idx] == '\n') + at_line += 1; + idx += 1; + } + return null; +} + 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; }