feat: add more tracy zones to project_manager.did_change

This commit is contained in:
CJ van den Berg 2024-10-29 20:58:22 +01:00
parent 45bba616df
commit d05fbcae37
Signed by: neurocyte
GPG key ID: 8EB1E1BB660E3FB9

View file

@ -6,6 +6,7 @@ const root = @import("root");
const dizzy = @import("dizzy"); const dizzy = @import("dizzy");
const Buffer = @import("Buffer"); const Buffer = @import("Buffer");
const fuzzig = @import("fuzzig"); const fuzzig = @import("fuzzig");
const tracy = @import("tracy");
const builtin = @import("builtin"); const builtin = @import("builtin");
const LSP = @import("LSP.zig"); const LSP = @import("LSP.zig");
@ -327,70 +328,88 @@ pub fn did_change(self: *Self, file_path: []const u8, version: usize, root_dst_a
const writer = edits_cb.writer(); const writer = edits_cb.writer();
defer { defer {
const frame = tracy.initZone(@src(), .{ .name = "deinit" });
edits_cb.deinit(); edits_cb.deinit();
dst.deinit(); dst.deinit();
src.deinit(); src.deinit();
scratch.deinit(self.allocator); scratch.deinit(self.allocator);
dizzy_edits.deinit(self.allocator); dizzy_edits.deinit(self.allocator);
frame.deinit();
}
{
const frame = tracy.initZone(@src(), .{ .name = "store" });
defer frame.deinit();
try root_dst.store(dst.writer(), eol_mode);
try root_src.store(src.writer(), eol_mode);
} }
try root_dst.store(dst.writer(), eol_mode);
try root_src.store(src.writer(), eol_mode);
const scratch_len = 4 * (dst.items.len + src.items.len) + 2; const scratch_len = 4 * (dst.items.len + src.items.len) + 2;
try scratch.ensureTotalCapacity(self.allocator, scratch_len); {
const frame = tracy.initZone(@src(), .{ .name = "scratch" });
defer frame.deinit();
try scratch.ensureTotalCapacity(self.allocator, scratch_len);
}
scratch.items.len = scratch_len; scratch.items.len = scratch_len;
try dizzy.PrimitiveSliceDiffer(u8).diff(self.allocator, &dizzy_edits, src.items, dst.items, scratch.items); {
const frame = tracy.initZone(@src(), .{ .name = "diff" });
defer frame.deinit();
try dizzy.PrimitiveSliceDiffer(u8).diff(self.allocator, &dizzy_edits, src.items, dst.items, scratch.items);
}
var lines_dst: usize = 0; var lines_dst: usize = 0;
var last_offset: usize = 0; var last_offset: usize = 0;
var edits_count: usize = 0; var edits_count: usize = 0;
for (dizzy_edits.items) |dizzy_edit| { {
switch (dizzy_edit.kind) { const frame = tracy.initZone(@src(), .{ .name = "transform" });
.equal => { defer frame.deinit();
scan_char(src.items[dizzy_edit.range.start..dizzy_edit.range.end], &lines_dst, '\n', &last_offset); for (dizzy_edits.items) |dizzy_edit| {
}, switch (dizzy_edit.kind) {
.insert => { .equal => {
const line_start_dst: usize = lines_dst; scan_char(src.items[dizzy_edit.range.start..dizzy_edit.range.end], &lines_dst, '\n', &last_offset);
try cbor.writeValue(writer, .{ },
.range = .{ .insert => {
.start = .{ .line = line_start_dst, .character = last_offset }, const line_start_dst: usize = lines_dst;
.end = .{ .line = line_start_dst, .character = last_offset }, try cbor.writeValue(writer, .{
}, .range = .{
.text = dst.items[dizzy_edit.range.start..dizzy_edit.range.end], .start = .{ .line = line_start_dst, .character = last_offset },
}); .end = .{ .line = line_start_dst, .character = last_offset },
edits_count += 1; },
scan_char(dst.items[dizzy_edit.range.start..dizzy_edit.range.end], &lines_dst, '\n', &last_offset); .text = dst.items[dizzy_edit.range.start..dizzy_edit.range.end],
}, });
.delete => { edits_count += 1;
var line_end_dst: usize = lines_dst; scan_char(dst.items[dizzy_edit.range.start..dizzy_edit.range.end], &lines_dst, '\n', &last_offset);
var offset_end_dst: usize = last_offset; },
scan_char(src.items[dizzy_edit.range.start..dizzy_edit.range.end], &line_end_dst, '\n', &offset_end_dst); .delete => {
try cbor.writeValue(writer, .{ var line_end_dst: usize = lines_dst;
.range = .{ var offset_end_dst: usize = last_offset;
.start = .{ .line = lines_dst, .character = last_offset }, scan_char(src.items[dizzy_edit.range.start..dizzy_edit.range.end], &line_end_dst, '\n', &offset_end_dst);
.end = .{ .line = line_end_dst, .character = offset_end_dst }, try cbor.writeValue(writer, .{
}, .range = .{
.text = "", .start = .{ .line = lines_dst, .character = last_offset },
}); .end = .{ .line = line_end_dst, .character = offset_end_dst },
edits_count += 1; },
}, .text = "",
});
edits_count += 1;
},
}
} }
} }
{
const frame = tracy.initZone(@src(), .{ .name = "send" });
defer frame.deinit();
var msg = std.ArrayList(u8).init(self.allocator);
defer msg.deinit();
const msg_writer = msg.writer();
try cbor.writeMapHeader(msg_writer, 2);
try cbor.writeValue(msg_writer, "textDocument");
try cbor.writeValue(msg_writer, .{ .uri = uri, .version = version });
try cbor.writeValue(msg_writer, "contentChanges");
try cbor.writeArrayHeader(msg_writer, edits_count);
_ = try msg_writer.write(edits_cb.items);
var msg = std.ArrayList(u8).init(self.allocator); lsp.send_notification_raw("textDocument/didChange", msg.items) catch return error.LspFailed;
defer msg.deinit(); }
const msg_writer = msg.writer();
try cbor.writeMapHeader(msg_writer, 2);
try cbor.writeValue(msg_writer, "textDocument");
try cbor.writeValue(msg_writer, .{ .uri = uri, .version = version });
try cbor.writeValue(msg_writer, "contentChanges");
try cbor.writeArrayHeader(msg_writer, edits_count);
_ = try msg_writer.write(edits_cb.items);
lsp.send_notification_raw("textDocument/didChange", msg.items) catch return error.LspFailed;
} }
fn scan_char(chars: []const u8, lines: *usize, char: u8, last_offset: ?*usize) void { fn scan_char(chars: []const u8, lines: *usize, char: u8, last_offset: ?*usize) void {