aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/decoration.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/decoration.c')
-rw-r--r--src/nvim/decoration.c52
1 files changed, 27 insertions, 25 deletions
diff --git a/src/nvim/decoration.c b/src/nvim/decoration.c
index b13ec25f50..a593b8eda1 100644
--- a/src/nvim/decoration.c
+++ b/src/nvim/decoration.c
@@ -919,7 +919,9 @@ int decor_virt_lines(win_T *wp, linenr_T lnum, VirtLines *lines, TriState has_fo
}
/// This assumes maximum one entry of each kind, which will not always be the case.
-void decor_to_dict_legacy(Dictionary *dict, DecorInline decor, bool hl_name)
+///
+/// NB: assumes caller has allocated enough space in dict for all fields!
+void decor_to_dict_legacy(Dictionary *dict, DecorInline decor, bool hl_name, Arena *arena)
{
DecorSignHighlight sh_hl = DECOR_SIGN_HIGHLIGHT_INIT;
DecorSignHighlight sh_sign = DECOR_SIGN_HIGHLIGHT_INIT;
@@ -953,58 +955,58 @@ void decor_to_dict_legacy(Dictionary *dict, DecorInline decor, bool hl_name)
}
if (sh_hl.hl_id) {
- PUT(*dict, "hl_group", hl_group_name(sh_hl.hl_id, hl_name));
- PUT(*dict, "hl_eol", BOOLEAN_OBJ(sh_hl.flags & kSHHlEol));
+ PUT_C(*dict, "hl_group", hl_group_name(sh_hl.hl_id, hl_name));
+ PUT_C(*dict, "hl_eol", BOOLEAN_OBJ(sh_hl.flags & kSHHlEol));
priority = sh_hl.priority;
}
if (sh_hl.flags & kSHConceal) {
char buf[MAX_SCHAR_SIZE];
schar_get(buf, sh_hl.text[0]);
- PUT(*dict, "conceal", CSTR_TO_OBJ(buf));
+ PUT_C(*dict, "conceal", CSTR_TO_ARENA_OBJ(arena, buf));
}
if (sh_hl.flags & kSHSpellOn) {
- PUT(*dict, "spell", BOOLEAN_OBJ(true));
+ PUT_C(*dict, "spell", BOOLEAN_OBJ(true));
} else if (sh_hl.flags & kSHSpellOff) {
- PUT(*dict, "spell", BOOLEAN_OBJ(false));
+ PUT_C(*dict, "spell", BOOLEAN_OBJ(false));
}
if (sh_hl.flags & kSHUIWatched) {
- PUT(*dict, "ui_watched", BOOLEAN_OBJ(true));
+ PUT_C(*dict, "ui_watched", BOOLEAN_OBJ(true));
}
if (sh_hl.url != NULL) {
- PUT(*dict, "url", STRING_OBJ(cstr_to_string(sh_hl.url)));
+ PUT_C(*dict, "url", STRING_OBJ(cstr_as_string((char *)sh_hl.url)));
}
if (virt_text) {
if (virt_text->hl_mode) {
- PUT(*dict, "hl_mode", CSTR_TO_OBJ(hl_mode_str[virt_text->hl_mode]));
+ PUT_C(*dict, "hl_mode", CSTR_AS_OBJ((char *)hl_mode_str[virt_text->hl_mode]));
}
- Array chunks = virt_text_to_array(virt_text->data.virt_text, hl_name);
- PUT(*dict, "virt_text", ARRAY_OBJ(chunks));
- PUT(*dict, "virt_text_hide", BOOLEAN_OBJ(virt_text->flags & kVTHide));
- PUT(*dict, "virt_text_repeat_linebreak", BOOLEAN_OBJ(virt_text->flags & kVTRepeatLinebreak));
+ Array chunks = virt_text_to_array(virt_text->data.virt_text, hl_name, arena);
+ PUT_C(*dict, "virt_text", ARRAY_OBJ(chunks));
+ PUT_C(*dict, "virt_text_hide", BOOLEAN_OBJ(virt_text->flags & kVTHide));
+ PUT_C(*dict, "virt_text_repeat_linebreak", BOOLEAN_OBJ(virt_text->flags & kVTRepeatLinebreak));
if (virt_text->pos == kVPosWinCol) {
- PUT(*dict, "virt_text_win_col", INTEGER_OBJ(virt_text->col));
+ PUT_C(*dict, "virt_text_win_col", INTEGER_OBJ(virt_text->col));
}
- PUT(*dict, "virt_text_pos", CSTR_TO_OBJ(virt_text_pos_str[virt_text->pos]));
+ PUT_C(*dict, "virt_text_pos", CSTR_AS_OBJ((char *)virt_text_pos_str[virt_text->pos]));
priority = virt_text->priority;
}
if (virt_lines) {
- Array all_chunks = ARRAY_DICT_INIT;
+ Array all_chunks = arena_array(arena, kv_size(virt_lines->data.virt_lines));
bool virt_lines_leftcol = false;
for (size_t i = 0; i < kv_size(virt_lines->data.virt_lines); i++) {
virt_lines_leftcol = kv_A(virt_lines->data.virt_lines, i).left_col;
- Array chunks = virt_text_to_array(kv_A(virt_lines->data.virt_lines, i).line, hl_name);
+ Array chunks = virt_text_to_array(kv_A(virt_lines->data.virt_lines, i).line, hl_name, arena);
ADD(all_chunks, ARRAY_OBJ(chunks));
}
- PUT(*dict, "virt_lines", ARRAY_OBJ(all_chunks));
- PUT(*dict, "virt_lines_above", BOOLEAN_OBJ(virt_lines->flags & kVTLinesAbove));
- PUT(*dict, "virt_lines_leftcol", BOOLEAN_OBJ(virt_lines_leftcol));
+ PUT_C(*dict, "virt_lines", ARRAY_OBJ(all_chunks));
+ PUT_C(*dict, "virt_lines_above", BOOLEAN_OBJ(virt_lines->flags & kVTLinesAbove));
+ PUT_C(*dict, "virt_lines_leftcol", BOOLEAN_OBJ(virt_lines_leftcol));
priority = virt_lines->priority;
}
@@ -1012,11 +1014,11 @@ void decor_to_dict_legacy(Dictionary *dict, DecorInline decor, bool hl_name)
if (sh_sign.text[0]) {
char buf[SIGN_WIDTH * MAX_SCHAR_SIZE];
describe_sign_text(buf, sh_sign.text);
- PUT(*dict, "sign_text", CSTR_TO_OBJ(buf));
+ PUT_C(*dict, "sign_text", CSTR_TO_ARENA_OBJ(arena, buf));
}
if (sh_sign.sign_name) {
- PUT(*dict, "sign_name", CSTR_TO_OBJ(sh_sign.sign_name));
+ PUT_C(*dict, "sign_name", CSTR_AS_OBJ(sh_sign.sign_name));
}
// uncrustify:off
@@ -1033,14 +1035,14 @@ void decor_to_dict_legacy(Dictionary *dict, DecorInline decor, bool hl_name)
for (int j = 0; hls[j].name; j++) {
if (hls[j].val) {
- PUT(*dict, hls[j].name, hl_group_name(hls[j].val, hl_name));
+ PUT_C(*dict, hls[j].name, hl_group_name(hls[j].val, hl_name));
}
}
priority = sh_sign.priority;
}
if (priority != -1) {
- PUT(*dict, "priority", INTEGER_OBJ(priority));
+ PUT_C(*dict, "priority", INTEGER_OBJ(priority));
}
}
@@ -1068,7 +1070,7 @@ uint16_t decor_type_flags(DecorInline decor)
Object hl_group_name(int hl_id, bool hl_name)
{
if (hl_name) {
- return CSTR_TO_OBJ(syn_id2name(hl_id));
+ return CSTR_AS_OBJ(syn_id2name(hl_id));
} else {
return INTEGER_OBJ(hl_id);
}