diff options
author | pommicket <pommicket@gmail.com> | 2025-03-05 20:31:30 -0500 |
---|---|---|
committer | pommicket <pommicket@gmail.com> | 2025-03-05 20:48:59 -0500 |
commit | 8de9b9568caf088e9f75d880fae7105661d9e0dc (patch) | |
tree | 696b5447b6da7b5f3a816f3bed5f5cae2ad5bcd3 /ide-rename-symbol.c | |
parent | 4d7533828738401b76bab5be2e22f0d4a69e30b1 (diff) |
add support for textDocument/prepareRename
Diffstat (limited to 'ide-rename-symbol.c')
-rw-r--r-- | ide-rename-symbol.c | 56 |
1 files changed, 50 insertions, 6 deletions
diff --git a/ide-rename-symbol.c b/ide-rename-symbol.c index ff96311..dbbed0f 100644 --- a/ide-rename-symbol.c +++ b/ide-rename-symbol.c @@ -2,11 +2,17 @@ struct RenameSymbol { LSPServerRequestID request_id; + bool sent_rename; + bool have_range; + BufferPos range_start; + BufferPos range_end; }; static void rename_symbol_clear(Ted *ted) { RenameSymbol *rs = ted->rename_symbol; ted_cancel_lsp_request(ted, &rs->request_id); + rs->sent_rename = false; + rs->have_range = false; } void rename_symbol_quit(Ted *ted) { @@ -15,21 +21,37 @@ void rename_symbol_quit(Ted *ted) { ted->rename_symbol = NULL; } +void rename_symbol_start(Ted *ted) { + RenameSymbol *rs = ted->rename_symbol; + TextBuffer *buffer = ted_active_buffer(ted); + LSP *lsp = ted_active_lsp(ted); + if (!buffer || !lsp) { + ted_flash_error_cursor(ted); + return; + } + if (lsp_has_prepare_rename(lsp)) { + LSPRequest request = {.type = LSP_REQUEST_PREPARE_RENAME}; + LSPRequestPrepareRename *data = &request.data.prepare_rename; + data->position = buffer_cursor_pos_as_lsp_document_position(buffer); + rs->request_id = lsp_send_request(lsp, &request); + } + menu_open(ted, MENU_RENAME_SYMBOL); +} + void rename_symbol_at_cursor(Ted *ted, TextBuffer *buffer, const char *new_name) { if (!buffer) return; RenameSymbol *rs = ted->rename_symbol; LSP *lsp = buffer_lsp(buffer); if (!lsp) return; - - if (!rs->request_id.id) { + if (!rs->sent_rename) { // send the request LSPRequest request = {.type = LSP_REQUEST_RENAME}; LSPRequestRename *data = &request.data.rename; data->position = buffer_cursor_pos_as_lsp_document_position(buffer); data->new_name = lsp_request_add_string(&request, new_name); rs->request_id = lsp_send_request(lsp, &request); + rs->sent_rename = true; } - } void rename_symbol_frame(Ted *ted) { @@ -61,7 +83,7 @@ static void rename_symbol_menu_render(Ted *ted) { menu_close(ted); return; } - if (rs->request_id.id) { + if (rs->sent_rename) { // already entered a new name return; } @@ -80,6 +102,10 @@ static void rename_symbol_menu_render(Ted *ted) { .line = cursor_pos.line, .index = sym_end }; + if (rs->have_range) { + bpos0 = rs->range_start; + bpos1 = rs->range_end; + } // symbol should span from pos0 to pos1 vec2 p0 = buffer_pos_to_pixels(buffer, bpos0); vec2 p1 = buffer_pos_to_pixels(buffer, bpos1); @@ -114,10 +140,28 @@ static bool rename_symbol_menu_close(Ted *ted) { void rename_symbol_process_lsp_response(Ted *ted, const LSPResponse *response) { RenameSymbol *rs = ted->rename_symbol; - if (response->request.type != LSP_REQUEST_RENAME - || response->request.id != rs->request_id.id) { + if (response->request.id != rs->request_id.id) { return; } + if (response->request.type == LSP_REQUEST_PREPARE_RENAME) { + if (lsp_response_is_error(response)) { + // prepareRename returned an error + menu_close(ted); + ted_flash_error_cursor(ted); + return; + } + const LSPResponsePrepareRename *prep = &response->data.prepare_rename; + if (prep->use_range) { + TextBuffer *buffer = ted_active_buffer_behind_menu(ted); + if (!buffer) return; + rs->range_start = buffer_pos_from_lsp(buffer, prep->range.start); + rs->range_end = buffer_pos_from_lsp(buffer, prep->range.end); + rs->have_range = true; + } + return; + } + if (response->request.type != LSP_REQUEST_RENAME) + return; LSP *lsp = ted_get_lsp_by_id(ted, rs->request_id.lsp); if (menu_is_open(ted, MENU_RENAME_SYMBOL)) |