From e597fee2e594ee6099a666cde501290752a93fcd Mon Sep 17 00:00:00 2001 From: CJ van den Berg Date: Thu, 16 Jan 2025 21:45:46 +0100 Subject: [PATCH] feat(lsp): rename_symbol: decode and normalize file uri --- src/Project.zig | 4 +++- src/tui/mainview.zig | 24 ++++++++++-------------- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/Project.zig b/src/Project.zig index f0b0e1e..cee242f 100644 --- a/src/Project.zig +++ b/src/Project.zig @@ -815,8 +815,10 @@ pub fn rename_symbol(self: *Self, from: tp.pid_ref, file_path: []const u8, row: try cbor.writeValue(w, "rename_symbol_item"); try cbor.writeArrayHeader(w, renames.items.len); for (renames.items) |rename| { + var file_path_buf: [std.fs.max_path_bytes]u8 = undefined; + const file_path_ = std.Uri.percentDecodeBackwards(&file_path_buf, rename.uri[7..]); try cbor.writeValue(w, .{ - rename.uri, + file_path_, rename.range.start.line, rename.range.start.character, rename.range.end.line, diff --git a/src/tui/mainview.zig b/src/tui/mainview.zig index 707378f..611cac5 100644 --- a/src/tui/mainview.zig +++ b/src/tui/mainview.zig @@ -564,8 +564,8 @@ const cmds = struct { while (len != 0) { len -= 1; std.debug.assert(try cbor.decodeArrayHeader(&iter) == 6); - var file_uri: []const u8 = undefined; - if (!try cbor.matchString(&iter, &file_uri)) return error.MissingArgument; + var file_path: []const u8 = undefined; + if (!try cbor.matchString(&iter, &file_path)) return error.MissingArgument; var sel: ed.Selection = .{}; if (!try cbor.matchInt(usize, &iter, &sel.begin.row)) return error.MissingArgument; if (!try cbor.matchInt(usize, &iter, &sel.begin.col)) return error.MissingArgument; @@ -574,18 +574,14 @@ const cmds = struct { var new_text: []const u8 = undefined; if (!try cbor.matchString(&iter, &new_text)) return error.MissingArgument; - if (self.get_active_editor()) |editor| { - // TODO match file_uri correctly. endsWith() isn't correct because 'path' is a - // short, relative path while 'file_uri' is an absolute path starting with 'file://' - const match = if (editor.file_path) |path| std.mem.endsWith(u8, file_uri, path) else false; - if (match) { - try editor.rename_symbol_item(sel, new_text, &mroot, len == 0); - } else { - const logger = log.logger("LSP"); - defer logger.deinit(); - logger.print("TODO perform renames in other files\n", .{}); - } - } + file_path = project_manager.normalize_file_path(file_path); + if (self.get_active_editor()) |editor| if (std.mem.eql(u8, file_path, editor.file_path orelse "")) { + try editor.rename_symbol_item(sel, new_text, &mroot, len == 0); + } else { + const logger = log.logger("LSP"); + defer logger.deinit(); + logger.print("TODO perform renames in other files\n", .{}); + }; } } pub const rename_symbol_item_meta = .{ .arguments = &.{.array} };