From 8de9b9568caf088e9f75d880fae7105661d9e0dc Mon Sep 17 00:00:00 2001 From: pommicket Date: Wed, 5 Mar 2025 20:31:30 -0500 Subject: add support for textDocument/prepareRename --- lsp-parse.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) (limited to 'lsp-parse.c') diff --git a/lsp-parse.c b/lsp-parse.c index 72c6b88..5a38453 100644 --- a/lsp-parse.c +++ b/lsp-parse.c @@ -249,9 +249,15 @@ static void parse_capabilities(LSP *lsp, const JSON *json, JSONObject capabiliti // check for textDocument/rename support JSONValue rename_value = json_object_get(json, capabilities, "renameProvider"); if (rename_value.type != JSON_UNDEFINED && rename_value.type != JSON_FALSE) { + if (rename_value.type == JSON_OBJECT) { + JSONValue rename_prepare_value = json_object_get(json, rename_value.val.object, "prepareProvider"); + if (rename_prepare_value.type != JSON_UNDEFINED && rename_prepare_value.type != JSON_FALSE) { + cap->prepare_rename_support = true; + } + } cap->rename_support = true; } - + // check for textDocument/documentLink support JSONValue document_link_value = json_object_get(json, capabilities, "documentLinkProvider"); if (document_link_value.type == JSON_OBJECT) { @@ -938,6 +944,33 @@ static bool parse_rename_response(LSP *lsp, const JSON *json, LSPResponse *respo return parse_workspace_edit(lsp, response, json, result, &response->data.rename); } +static bool parse_prepare_rename_response(LSP *lsp, const JSON *json, LSPResponse *response) { + LSPResponsePrepareRename *prep = &response->data.prepare_rename; + JSONValue result_value = json_get(json, "result"); + if (result_value.type == JSON_NULL) + return false; // invalid rename + if (result_value.type != JSON_OBJECT) { + lsp_set_error(lsp, "Bad result type for textDocument/prepareRename response."); + return false; + } + JSONObject result = result_value.val.object; + JSONValue range_value = json_object_get(json, result, "range"); + if (json_object_get(json, result, "start").type != JSON_UNDEFINED) { + // result is a Range + prep->use_range = true; + return parse_range(lsp, json, result_value, &prep->range); + } else if (range_value.type != JSON_UNDEFINED) { + prep->use_range = true; + return parse_range(lsp, json, range_value, &prep->range); + } else if (json_object_get(json, result, "defaultBehavior").type == JSON_TRUE) { + prep->use_range = false; + return true; + } else { + lsp_set_error(lsp, "Unrecognizable response for textDocument/prepareRename."); + return false; + } +} + static bool parse_highlight_response(LSP *lsp, const JSON *json, LSPResponse *response) { LSPResponseHighlight *hl = &response->data.highlight; JSONArray result = json_force_array(json_get(json, "result")); @@ -1121,6 +1154,9 @@ void process_message(LSP *lsp, JSON *json) { case LSP_REQUEST_RENAME: add_to_messages = parse_rename_response(lsp, json, &response); break; + case LSP_REQUEST_PREPARE_RENAME: + add_to_messages = parse_prepare_rename_response(lsp, json, &response); + break; case LSP_REQUEST_FORMATTING: case LSP_REQUEST_RANGE_FORMATTING: add_to_messages = parse_formatting_response(lsp, json, &response); -- cgit v1.2.3