mirror of
https://github.com/neovim/neovim.git
synced 2025-10-01 15:38:33 +00:00
refactor(ui): make auto-generated ui client handlers typesafe
This commit is contained in:
@@ -51,8 +51,25 @@ local function write_arglist(output, ev, need_copy)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function extract_and_write_arglist(output, ev)
|
local function call_ui_event_method(output, ev)
|
||||||
|
output:write('void ui_client_event_'..ev.name..'(Array args)\n{\n')
|
||||||
|
|
||||||
local hlattrs_args_count = 0
|
local hlattrs_args_count = 0
|
||||||
|
if #ev.parameters > 0 then
|
||||||
|
output:write(' if (args.size < '..(#ev.parameters))
|
||||||
|
for j = 1, #ev.parameters do
|
||||||
|
local kind = ev.parameters[j][1]
|
||||||
|
if kind ~= "Object" then
|
||||||
|
if kind == 'HlAttrs' then kind = 'Dictionary' end
|
||||||
|
output:write('\n || args.items['..(j-1)..'].type != kObjectType'..kind..'')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
output:write(') {\n')
|
||||||
|
output:write(' ELOG("Error handling ui event \''..ev.name..'\'");\n')
|
||||||
|
output:write(' return;\n')
|
||||||
|
output:write(' }\n')
|
||||||
|
end
|
||||||
|
|
||||||
for j = 1, #ev.parameters do
|
for j = 1, #ev.parameters do
|
||||||
local param = ev.parameters[j]
|
local param = ev.parameters[j]
|
||||||
local kind = param[1]
|
local kind = param[1]
|
||||||
@@ -67,9 +84,7 @@ local function extract_and_write_arglist(output, ev)
|
|||||||
output:write('args.items['..(j-1)..'].data.'..string.lower(kind)..';\n')
|
output:write('args.items['..(j-1)..'].data.'..string.lower(kind)..';\n')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
local function call_ui_event_method(output, ev)
|
|
||||||
output:write(' ui_call_'..ev.name..'(')
|
output:write(' ui_call_'..ev.name..'(')
|
||||||
for j = 1, #ev.parameters do
|
for j = 1, #ev.parameters do
|
||||||
output:write('arg_'..j)
|
output:write('arg_'..j)
|
||||||
@@ -78,6 +93,8 @@ local function call_ui_event_method(output, ev)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
output:write(');\n')
|
output:write(');\n')
|
||||||
|
|
||||||
|
output:write('}\n\n')
|
||||||
end
|
end
|
||||||
|
|
||||||
for i = 1, #events do
|
for i = 1, #events do
|
||||||
@@ -192,10 +209,7 @@ for i = 1, #events do
|
|||||||
end
|
end
|
||||||
|
|
||||||
if (not ev.remote_only) and (not ev.noexport) and (not ev.client_impl) then
|
if (not ev.remote_only) and (not ev.noexport) and (not ev.client_impl) then
|
||||||
client_output:write('void ui_client_event_'..ev.name..'(Array args)\n{\n')
|
|
||||||
extract_and_write_arglist(client_output, ev)
|
|
||||||
call_ui_event_method(client_output, ev)
|
call_ui_event_method(client_output, ev)
|
||||||
client_output:write('}\n\n')
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@@ -112,7 +112,14 @@ static HlAttrs ui_client_dict2hlattrs(Dictionary d, bool rgb)
|
|||||||
|
|
||||||
void ui_client_event_grid_resize(Array args)
|
void ui_client_event_grid_resize(Array args)
|
||||||
{
|
{
|
||||||
// TODO: typesafe!
|
if (args.size < 3
|
||||||
|
|| args.items[0].type != kObjectTypeInteger
|
||||||
|
|| args.items[1].type != kObjectTypeInteger
|
||||||
|
|| args.items[2].type != kObjectTypeInteger) {
|
||||||
|
ELOG("Error handling ui event 'grid_resize'");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Integer grid = args.items[0].data.integer;
|
Integer grid = args.items[0].data.integer;
|
||||||
Integer width = args.items[1].data.integer;
|
Integer width = args.items[1].data.integer;
|
||||||
Integer height = args.items[2].data.integer;
|
Integer height = args.items[2].data.integer;
|
||||||
@@ -189,7 +196,7 @@ void ui_client_event_grid_line(Array args)
|
|||||||
if (j >= buf_size) {
|
if (j >= buf_size) {
|
||||||
goto error; // _YIKES_
|
goto error; // _YIKES_
|
||||||
}
|
}
|
||||||
STRCPY(buf_char[j], schar);
|
STRLCPY(buf_char[j], schar, sizeof(schar_T));
|
||||||
buf_attr[j++] = cur_attr;
|
buf_attr[j++] = cur_attr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -199,9 +206,9 @@ void ui_client_event_grid_line(Array args)
|
|||||||
clear_attr = cur_attr;
|
clear_attr = cur_attr;
|
||||||
|
|
||||||
ui_call_raw_line(grid, row, startcol, endcol, clearcol, clear_attr, lineflags,
|
ui_call_raw_line(grid, row, startcol, endcol, clearcol, clear_attr, lineflags,
|
||||||
buf_char, buf_attr);
|
(const schar_T *)buf_char, (const sattr_T *)buf_attr);
|
||||||
return;
|
return;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
ELOG("malformatted 'grid_line' event");
|
ELOG("Error handling ui event 'grid_line'");
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user