diff options
Diffstat (limited to 'ide-code-action.c')
-rw-r--r-- | ide-code-action.c | 33 |
1 files changed, 31 insertions, 2 deletions
diff --git a/ide-code-action.c b/ide-code-action.c index 678c046..13a1b36 100644 --- a/ide-code-action.c +++ b/ide-code-action.c @@ -1,18 +1,47 @@ #include "ted-internal.h" +static bool ranges_touch(BufferPos p1, BufferPos p2, BufferPos q1, BufferPos q2) { + int cmp21 = buffer_pos_cmp(p2, q1); + if (cmp21 < 0) { + // p is entirely before q + return false; + } + int cmp12 = buffer_pos_cmp(p1, q2); + if (cmp12 > 0) { + // p is entirely after q + return false; + } + return true; +} + void code_action_start(Ted *ted) { TextBuffer *buffer = ted_active_buffer(ted); LSP *lsp = buffer_lsp(buffer); + BufferPos range_start = {0}, range_end = {0}; LSPRange range = {0}; - if (buffer_has_selection(buffer)) + if (buffer_selection_pos(buffer, &range_start)) { range = buffer_selection_as_lsp_range(buffer); - else + range_end = buffer_cursor_pos(buffer); + if (buffer_pos_cmp(range_start, range_end) > 0) { + BufferPos tmp = range_start; + range_start = range_end; + range_end = tmp; + } + } else { + range_start = range_end = buffer_cursor_pos(buffer); range.start = range.end = buffer_cursor_pos_as_lsp_position(buffer); + } LSPRequest req = { .type = LSP_REQUEST_CODE_ACTION, }; LSPRequestCodeAction *code_action_req = &req.data.code_action; code_action_req->document = buffer_lsp_document_id(buffer); code_action_req->range = range; + arr_foreach_ptr(buffer_diagnostics(buffer), const Diagnostic, d) { + if (ranges_touch(range_start, range_end, d->pos, d->end)) { + LSPString raw = lsp_request_add_string(&req, d->raw); + arr_add(code_action_req->raw_diagnostics, raw); + } + } lsp_send_request(lsp, &req); } |