summaryrefslogtreecommitdiff
path: root/lsp.c
diff options
context:
space:
mode:
Diffstat (limited to 'lsp.c')
-rw-r--r--lsp.c42
1 files changed, 31 insertions, 11 deletions
diff --git a/lsp.c b/lsp.c
index 2004bb7..13e9862 100644
--- a/lsp.c
+++ b/lsp.c
@@ -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);