diff options
Diffstat (limited to 'lsp.c')
-rw-r--r-- | lsp.c | 42 |
1 files changed, 31 insertions, 11 deletions
@@ -136,6 +136,10 @@ void lsp_request_free(LSPRequest *r) { case LSP_REQUEST_PREPARE_RENAME: case LSP_REQUEST_WORKSPACE_SYMBOLS: break; + case LSP_REQUEST_CODE_ACTION: { + LSPRequestCodeAction *c = &r->data.code_action; + arr_free(c->raw_diagnostics); + } break; case LSP_REQUEST_DID_CHANGE: { LSPRequestDidChange *c = &r->data.change; arr_free(c->changes); @@ -149,6 +153,15 @@ void lsp_request_free(LSPRequest *r) { memset(r, 0, sizeof *r); } +void lsp_workspace_edit_free(LSPWorkspaceEdit *edit) { + arr_foreach_ptr(edit->changes, LSPWorkspaceChange, c) { + if (c->type == LSP_CHANGE_EDITS) { + arr_free(c->data.edit.edits); + } + } + arr_free(edit->changes); +} + void lsp_response_free(LSPResponse *r) { lsp_message_base_free(&r->base); switch (r->request.type) { @@ -166,12 +179,7 @@ void lsp_response_free(LSPResponse *r) { break; case LSP_REQUEST_RENAME: { LSPResponseRename *rename = &r->data.rename; - arr_foreach_ptr(rename->changes, LSPWorkspaceChange, c) { - if (c->type == LSP_CHANGE_EDITS) { - arr_free(c->data.edit.edits); - } - } - arr_free(r->data.rename.changes); + lsp_workspace_edit_free(rename); } break; case LSP_REQUEST_HIGHLIGHT: arr_free(r->data.highlight.highlights); @@ -185,6 +193,19 @@ void lsp_response_free(LSPResponse *r) { case LSP_REQUEST_FORMATTING: arr_free(r->data.formatting.edits); break; + case LSP_REQUEST_CODE_ACTION: { + LSPResponseCodeAction *c = &r->data.code_action; + arr_foreach_ptr(c->actions, LSPCodeAction, action) { + switch (action->command.kind) { + case LSP_COMMAND_WORKSPACE_EDIT: + lsp_workspace_edit_free(&action->command.data.edit); + break; + default: break; + } + lsp_workspace_edit_free(&action->edit); + } + arr_free(c->actions); + } break; default: break; } @@ -237,6 +258,8 @@ static bool lsp_supports_request(LSP *lsp, const LSPRequest *request) { return cap->open_close_support; case LSP_REQUEST_DID_CHANGE: return cap->sync_support; + case LSP_REQUEST_CODE_ACTION: + return cap->code_action_support; case LSP_REQUEST_INITIALIZE: case LSP_REQUEST_INITIALIZED: case LSP_REQUEST_CANCEL: @@ -320,6 +343,7 @@ static bool request_type_is_notification(LSPRequestType type) { case LSP_REQUEST_DOCUMENT_LINK: case LSP_REQUEST_FORMATTING: case LSP_REQUEST_RANGE_FORMATTING: + case LSP_REQUEST_CODE_ACTION: return false; } assert(0); @@ -447,7 +471,7 @@ static bool lsp_receive(LSP *lsp, size_t max_size) { arr_hdr_(lsp->received_data)->len = (u32)received_so_far; lsp->received_data[received_so_far] = '\0';// null terminate #if LSP_SHOW_S2C - const int limit = 1000; + const int limit = 10000; debug_println("%s%.*s%s%s",term_italics(stdout),limit,lsp->received_data, strlen(lsp->received_data) > (size_t)limit ? "..." : "", term_clear(stdout)); @@ -474,10 +498,6 @@ static bool lsp_receive(LSP *lsp, size_t max_size) { json_free(&json); } size_t leftover_data_len = arr_len(lsp->received_data) - (response_offset + response_size); - - //printf("arr_cap = %u response_offset = %u, response_size = %zu, leftover len = %u\n", - // arr_hdr_(lsp->received_data)->cap, - // response_offset, response_size, leftover_data_len); memmove(lsp->received_data, lsp->received_data + response_offset + response_size, leftover_data_len); arr_set_len(lsp->received_data, leftover_data_len); |