summaryrefslogtreecommitdiff
path: root/ide-code-action.c
diff options
context:
space:
mode:
Diffstat (limited to 'ide-code-action.c')
-rw-r--r--ide-code-action.c33
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);
}