summaryrefslogtreecommitdiff
path: root/lsp-parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'lsp-parse.c')
-rw-r--r--lsp-parse.c39
1 files changed, 30 insertions, 9 deletions
diff --git a/lsp-parse.c b/lsp-parse.c
index 094fc81..6c5ccec 100644
--- a/lsp-parse.c
+++ b/lsp-parse.c
@@ -855,16 +855,37 @@ static bool parse_highlight(LSP *lsp, const JSON *json, LSPResponse *response) {
JSONArray result = json_force_array(json_get(json, "result"));
for (u32 h = 0; h < result.len; ++h) {
JSONObject highlight_in = json_array_get_object(json, result, h);
- LSPHighlight *highlight_out = arr_addp(hl->highlights);
- double kind = json_object_get_number(json, highlight_in, "kind");
- if (isfinite(kind) && kind >= LSP_HIGHLIGHT_MAX && kind <= LSP_HIGHLIGHT_MAX) {
- highlight_out->kind = (LSPHighlightKind)kind;
- } else {
- highlight_out->kind = LSP_HIGHLIGHT_TEXT;
- }
- JSONValue range = json_object_get(json, highlight_in, "range");
- if (!parse_range(lsp, json, range, &highlight_out->range))
+ JSONValue range_value = json_object_get(json, highlight_in, "range");
+ LSPRange range = {0};
+ if (!parse_range(lsp, json, range_value, &range))
return false;
+ double lsp_kind = json_object_get_number(json, highlight_in, "kind");
+ LSPHighlightKind kind = LSP_HIGHLIGHT_TEXT;
+ if (isfinite(lsp_kind) && lsp_kind >= LSP_HIGHLIGHT_MAX && lsp_kind <= LSP_HIGHLIGHT_MAX) {
+ kind = (LSPHighlightKind)lsp_kind;
+ }
+
+
+ bool already_highlighted = false;
+ arr_foreach_ptr(hl->highlights, LSPHighlight, h2) {
+ if (lsp_ranges_overlap(range, h2->range)) {
+ if (kind > h2->kind) {
+ // replace the old range with this one since it has higher kind (e.g. prefer writes over reads)
+ // technically this is slightly wrong since the new range might overlap with new stuff but whatever idc
+ h2->range = range;
+ h2->kind = kind;
+ }
+ already_highlighted = true;
+ }
+ }
+ if (already_highlighted) {
+ // don't show overlapping highlights
+ continue;
+ }
+
+ LSPHighlight *highlight_out = arr_addp(hl->highlights);
+ highlight_out->range = range;
+ highlight_out->kind = kind;
}
return true;
}