mirror of
https://github.com/neovim/neovim.git
synced 2025-09-12 22:38:16 +00:00
treesitter: cleanup some luahl stuff
This commit is contained in:
@@ -2612,5 +2612,6 @@ void nvim__put_attr(Integer id, Integer start_row, Integer start_col,
|
|||||||
if (attr == 0) {
|
if (attr == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
decoration_state_add_tmp(attr, start_row, start_col, end_row, end_col);
|
decorations_add_luahl_attr(attr, (int)start_row, (colnr_T)start_col,
|
||||||
|
(int)end_row, (colnr_T)end_col);
|
||||||
}
|
}
|
||||||
|
@@ -296,10 +296,7 @@ void buf_updates_send_splice(buf_T *buf,
|
|||||||
BufUpdateCallbacks cb = kv_A(buf->update_callbacks, i);
|
BufUpdateCallbacks cb = kv_A(buf->update_callbacks, i);
|
||||||
bool keep = true;
|
bool keep = true;
|
||||||
if (cb.on_bytes != LUA_NOREF) {
|
if (cb.on_bytes != LUA_NOREF) {
|
||||||
Array args = ARRAY_DICT_INIT;
|
FIXED_TEMP_ARRAY(args, 8);
|
||||||
Object items[8];
|
|
||||||
args.size = 8;
|
|
||||||
args.items = items;
|
|
||||||
|
|
||||||
// the first argument is always the buffer handle
|
// the first argument is always the buffer handle
|
||||||
args.items[0] = BUFFER_OBJ(buf->handle);
|
args.items[0] = BUFFER_OBJ(buf->handle);
|
||||||
|
@@ -756,17 +756,16 @@ VirtText *extmark_find_virttext(buf_T *buf, int row, uint64_t ns_id)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: use decoration_state prefix
|
bool decorations_redraw_reset(buf_T *buf, DecorationRedrawState *state)
|
||||||
bool extmark_decorations_reset(buf_T *buf, DecorationState *state)
|
|
||||||
{
|
{
|
||||||
state->row = -1;
|
state->row = -1;
|
||||||
kv_size(state->active) = 0;
|
kv_size(state->active) = 0;
|
||||||
// TODO: for tmp decorations!
|
return buf->b_extmark_index || buf->b_luahl;
|
||||||
return buf->b_extmark_index || true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool extmark_decorations_start(buf_T *buf, int top_row, DecorationState *state)
|
bool decorations_redraw_start(buf_T *buf, int top_row,
|
||||||
|
DecorationRedrawState *state)
|
||||||
{
|
{
|
||||||
state->top_row = top_row;
|
state->top_row = top_row;
|
||||||
marktree_itr_get(buf->b_marktree, top_row, 0, state->itr);
|
marktree_itr_get(buf->b_marktree, top_row, 0, state->itr);
|
||||||
@@ -818,17 +817,17 @@ next_mark:
|
|||||||
return true; // TODO(bfredl): check if available in the region
|
return true; // TODO(bfredl): check if available in the region
|
||||||
}
|
}
|
||||||
|
|
||||||
bool extmark_decorations_line(buf_T *buf, int row, DecorationState *state)
|
bool decorations_redraw_line(buf_T *buf, int row, DecorationRedrawState *state)
|
||||||
{
|
{
|
||||||
if (state->row == -1) {
|
if (state->row == -1) {
|
||||||
extmark_decorations_start(buf, row, state);
|
decorations_redraw_start(buf, row, state);
|
||||||
}
|
}
|
||||||
state->row = row;
|
state->row = row;
|
||||||
state->col_until = -1;
|
state->col_until = -1;
|
||||||
return true; // TODO(bfredl): be more precise
|
return true; // TODO(bfredl): be more precise
|
||||||
}
|
}
|
||||||
|
|
||||||
int extmark_decorations_col(buf_T *buf, int col, DecorationState *state)
|
int decorations_redraw_col(buf_T *buf, int col, DecorationRedrawState *state)
|
||||||
{
|
{
|
||||||
if (col <= state->col_until) {
|
if (col <= state->col_until) {
|
||||||
return state->current;
|
return state->current;
|
||||||
@@ -907,9 +906,9 @@ next_mark:
|
|||||||
return attr;
|
return attr;
|
||||||
}
|
}
|
||||||
|
|
||||||
VirtText *extmark_decorations_virt_text(buf_T *buf, DecorationState *state)
|
VirtText *decorations_redraw_virt_text(buf_T *buf, DecorationRedrawState *state)
|
||||||
{
|
{
|
||||||
extmark_decorations_col(buf, MAXCOL, state);
|
decorations_redraw_col(buf, MAXCOL, state);
|
||||||
for (size_t i = 0; i < kv_size(state->active); i++) {
|
for (size_t i = 0; i < kv_size(state->active); i++) {
|
||||||
HlRange item = kv_A(state->active, i);
|
HlRange item = kv_A(state->active, i);
|
||||||
if (item.start_row == state->row && item.virt_text) {
|
if (item.start_row == state->row && item.virt_text) {
|
||||||
|
@@ -83,7 +83,7 @@ typedef struct {
|
|||||||
int col_until;
|
int col_until;
|
||||||
int current;
|
int current;
|
||||||
VirtText *virt_text;
|
VirtText *virt_text;
|
||||||
} DecorationState;
|
} DecorationRedrawState;
|
||||||
|
|
||||||
|
|
||||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||||
|
@@ -634,13 +634,12 @@ bool win_cursorline_standout(const win_T *wp)
|
|||||||
|| (wp->w_p_cole > 0 && (VIsual_active || !conceal_cursor_line(wp)));
|
|| (wp->w_p_cole > 0 && (VIsual_active || !conceal_cursor_line(wp)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static DecorationState decorations;
|
static DecorationRedrawState decorations;
|
||||||
bool decorations_active = false;
|
bool decorations_active = false;
|
||||||
|
|
||||||
// VERY ad-hoc, should be in mark_extended.c?
|
void decorations_add_luahl_attr(int attr_id,
|
||||||
void decoration_state_add_tmp(int attr_id,
|
int start_row, int start_col,
|
||||||
int start_row, int start_col,
|
int end_row, int end_col)
|
||||||
int end_row, int end_col)
|
|
||||||
{
|
{
|
||||||
kv_push(decorations.active,
|
kv_push(decorations.active,
|
||||||
((HlRange){ start_row, start_col, end_row, end_col, attr_id, NULL }));
|
((HlRange){ start_row, start_col, end_row, end_col, attr_id, NULL }));
|
||||||
@@ -1237,6 +1236,8 @@ static void win_update(win_T *wp)
|
|||||||
srow = 0;
|
srow = 0;
|
||||||
lnum = wp->w_topline; // first line shown in window
|
lnum = wp->w_topline; // first line shown in window
|
||||||
|
|
||||||
|
decorations_active = decorations_redraw_reset(buf, &decorations);
|
||||||
|
|
||||||
if (buf->b_luahl && buf->b_luahl_window != LUA_NOREF) {
|
if (buf->b_luahl && buf->b_luahl_window != LUA_NOREF) {
|
||||||
Error err = ERROR_INIT;
|
Error err = ERROR_INIT;
|
||||||
FIXED_TEMP_ARRAY(args, 4);
|
FIXED_TEMP_ARRAY(args, 4);
|
||||||
@@ -1257,7 +1258,6 @@ static void win_update(win_T *wp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
decorations_active = extmark_decorations_reset(buf, &decorations);
|
|
||||||
|
|
||||||
for (;; ) {
|
for (;; ) {
|
||||||
/* stop updating when reached the end of the window (check for _past_
|
/* stop updating when reached the end of the window (check for _past_
|
||||||
@@ -2343,36 +2343,32 @@ win_line (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buf->b_luahl && buf->b_luahl_line != LUA_NOREF) {
|
|
||||||
Error err = ERROR_INIT;
|
|
||||||
// TODO(bfredl): build a macro for the "static array" pattern
|
|
||||||
// in buf_updates_send_changes?
|
|
||||||
FIXED_TEMP_ARRAY(args, 3);
|
|
||||||
args.items[0] = WINDOW_OBJ(wp->handle);
|
|
||||||
args.items[1] = BUFFER_OBJ(buf->handle);
|
|
||||||
args.items[2] = INTEGER_OBJ(lnum-1);
|
|
||||||
lua_attr_active = true;
|
|
||||||
extra_check = true;
|
|
||||||
Object o = executor_exec_lua_cb(buf->b_luahl_line, "line",
|
|
||||||
args, true, &err);
|
|
||||||
lua_attr_active = false;
|
|
||||||
if (o.type == kObjectTypeString) {
|
|
||||||
// TODO(bfredl): this is a bit of a hack. A final API should use an
|
|
||||||
// "unified" interface where luahl can add both bufhl and virttext
|
|
||||||
luatext = o.data.string.data;
|
|
||||||
do_virttext = true;
|
|
||||||
} else if (ERROR_SET(&err)) {
|
|
||||||
ELOG("error in luahl line: %s", err.msg);
|
|
||||||
luatext = err.msg;
|
|
||||||
do_virttext = true;
|
|
||||||
}
|
|
||||||
decorations_active = true; // TODO: huff!
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (decorations_active) {
|
if (decorations_active) {
|
||||||
has_decorations = extmark_decorations_line(wp->w_buffer, lnum-1,
|
if (buf->b_luahl && buf->b_luahl_line != LUA_NOREF) {
|
||||||
&decorations);
|
Error err = ERROR_INIT;
|
||||||
|
FIXED_TEMP_ARRAY(args, 3);
|
||||||
|
args.items[0] = WINDOW_OBJ(wp->handle);
|
||||||
|
args.items[1] = BUFFER_OBJ(buf->handle);
|
||||||
|
args.items[2] = INTEGER_OBJ(lnum-1);
|
||||||
|
lua_attr_active = true;
|
||||||
|
extra_check = true;
|
||||||
|
Object o = executor_exec_lua_cb(buf->b_luahl_line, "line",
|
||||||
|
args, true, &err);
|
||||||
|
lua_attr_active = false;
|
||||||
|
if (o.type == kObjectTypeString) {
|
||||||
|
// TODO(bfredl): this is a bit of a hack. A final API should use an
|
||||||
|
// "unified" interface where luahl can add both bufhl and virttext
|
||||||
|
luatext = o.data.string.data;
|
||||||
|
do_virttext = true;
|
||||||
|
} else if (ERROR_SET(&err)) {
|
||||||
|
ELOG("error in luahl line: %s", err.msg);
|
||||||
|
luatext = err.msg;
|
||||||
|
do_virttext = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
has_decorations = decorations_redraw_line(wp->w_buffer, lnum-1,
|
||||||
|
&decorations);
|
||||||
if (has_decorations) {
|
if (has_decorations) {
|
||||||
extra_check = true;
|
extra_check = true;
|
||||||
}
|
}
|
||||||
@@ -3541,8 +3537,8 @@ win_line (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (has_decorations && v > 0) {
|
if (has_decorations && v > 0) {
|
||||||
int extmark_attr = extmark_decorations_col(wp->w_buffer, (colnr_T)v-1,
|
int extmark_attr = decorations_redraw_col(wp->w_buffer, (colnr_T)v-1,
|
||||||
&decorations);
|
&decorations);
|
||||||
if (extmark_attr != 0) {
|
if (extmark_attr != 0) {
|
||||||
if (!attr_pri) {
|
if (!attr_pri) {
|
||||||
char_attr = hl_combine_attr(char_attr, extmark_attr);
|
char_attr = hl_combine_attr(char_attr, extmark_attr);
|
||||||
@@ -4036,8 +4032,7 @@ win_line (
|
|||||||
kv_push(virt_text, ((VirtTextChunk){ .text = luatext, .hl_id = 0 }));
|
kv_push(virt_text, ((VirtTextChunk){ .text = luatext, .hl_id = 0 }));
|
||||||
do_virttext = true;
|
do_virttext = true;
|
||||||
} else if (has_decorations) {
|
} else if (has_decorations) {
|
||||||
VirtText *vp = extmark_decorations_virt_text(wp->w_buffer,
|
VirtText *vp = decorations_redraw_virt_text(wp->w_buffer, &decorations);
|
||||||
&decorations);
|
|
||||||
if (vp) {
|
if (vp) {
|
||||||
virt_text = *vp;
|
virt_text = *vp;
|
||||||
do_virttext = true;
|
do_virttext = true;
|
||||||
|
Reference in New Issue
Block a user