feat(keysets): teach Union and LuaRefOf

This commit is contained in:
Lewis Russell
2024-11-24 10:40:56 +00:00
committed by Lewis Russell
parent 99e7323aa3
commit 8d55cc218c
11 changed files with 258 additions and 109 deletions

View File

@@ -631,7 +631,7 @@ Integer nvim_create_augroup(uint64_t channel_id, String name, Dict(create_augrou
FUNC_API_SINCE(9)
{
char *augroup_name = name.data;
bool clear_autocmds = api_object_to_bool(opts->clear, "clear", true, err);
bool clear_autocmds = GET_BOOL_OR_TRUE(opts, create_augroup, clear);
int augroup = -1;
WITH_SCRIPT_CONTEXT(channel_id, {

View File

@@ -226,8 +226,8 @@ Dict(cmd) nvim_parse_cmd(String str, Dict(empty) *opts, Arena *arena, Error *err
addr = "?";
break;
}
PUT_KEY(result, cmd, addr, CSTR_AS_OBJ(addr));
PUT_KEY(result, cmd, nextcmd, CSTR_AS_OBJ(ea.nextcmd));
PUT_KEY(result, cmd, addr, cstr_as_string(addr));
PUT_KEY(result, cmd, nextcmd, cstr_as_string(ea.nextcmd));
// TODO(bfredl): nested keydict would be nice..
Dict mods = arena_dict(arena, 20);

View File

@@ -8,18 +8,18 @@ typedef struct {
typedef struct {
OptionalKeys is_set__context_;
Array types;
ArrayOf(String) types;
} Dict(context);
typedef struct {
OptionalKeys is_set__set_decoration_provider_;
LuaRef on_start;
LuaRef on_buf;
LuaRef on_win;
LuaRef on_line;
LuaRef on_end;
LuaRef _on_hl_def;
LuaRef _on_spell_nav;
LuaRefOf(("start" _, Integer tick)) on_start;
LuaRefOf(("buf" _, Integer bufnr, Integer tick)) on_buf;
LuaRefOf(("win" _, Integer winid, Integer bufnr, Integer toprow, Integer botrow)) on_win;
LuaRefOf(("line" _, Integer winid, Integer bufnr, Integer row)) on_line;
LuaRefOf(("end" _, Integer tick)) on_end;
LuaRefOf(("hl_def" _)) _on_hl_def;
LuaRefOf(("spell_nav" _)) _on_spell_nav;
} Dict(set_decoration_provider);
typedef struct {
@@ -116,7 +116,7 @@ typedef struct {
String relative;
String split;
Window win;
Array bufpos;
ArrayOf(Integer) bufpos;
Boolean external;
Boolean focusable;
Boolean mouse;
@@ -172,17 +172,17 @@ typedef struct {
Boolean altfont;
Boolean nocombine;
Boolean default_ DictKey(default);
Object cterm;
Object foreground;
Object fg;
Object background;
Object bg;
Object ctermfg;
Object ctermbg;
Object special;
Object sp;
Object link;
Object global_link;
Union(Integer, String) cterm;
Union(Integer, String) foreground;
Union(Integer, String) fg;
Union(Integer, String) background;
Union(Integer, String) bg;
Union(Integer, String) ctermfg;
Union(Integer, String) ctermbg;
Union(Integer, String) special;
Union(Integer, String) sp;
HLGroupID link;
HLGroupID global_link;
Boolean fallback;
Integer blend;
Boolean fg_indexed;
@@ -230,9 +230,9 @@ typedef struct {
typedef struct {
OptionalKeys is_set__clear_autocmds_;
Buffer buffer;
Object event;
Object group;
Object pattern;
Union(String, ArrayOf(String)) event;
Union(Integer, String) group;
Union(String, ArrayOf(String)) pattern;
} Dict(clear_autocmds);
typedef struct {
@@ -241,31 +241,32 @@ typedef struct {
Object callback;
String command;
String desc;
Object group;
Union(Integer, String) group;
Boolean nested;
Boolean once;
Object pattern;
Union(String, ArrayOf(String)) pattern;
} Dict(create_autocmd);
typedef struct {
OptionalKeys is_set__exec_autocmds_;
Buffer buffer;
Object group;
Union(Integer, String) group;
Boolean modeline;
Object pattern;
Union(String, ArrayOf(String)) pattern;
Object data;
} Dict(exec_autocmds);
typedef struct {
OptionalKeys is_set__get_autocmds_;
Object event;
Object group;
Object pattern;
Object buffer;
Union(String, ArrayOf(String)) event;
Union(Integer, String) group;
Union(String, ArrayOf(String)) pattern;
Union(Integer, ArrayOf(Integer)) buffer;
} Dict(get_autocmds);
typedef struct {
Object clear;
OptionalKeys is_set__create_augroup_;
Boolean clear;
} Dict(create_augroup);
typedef struct {
@@ -275,12 +276,12 @@ typedef struct {
Integer count;
String reg;
Boolean bang;
Array args;
ArrayOf(String) args;
Dict magic;
Dict mods;
Object nargs;
Object addr;
Object nextcmd;
Union(Integer, String) nargs;
String addr;
String nextcmd;
} Dict(cmd);
typedef struct {
@@ -333,11 +334,30 @@ typedef struct {
typedef struct {
OptionalKeys is_set__buf_attach_;
LuaRef on_lines;
LuaRef on_bytes;
LuaRef on_changedtick;
LuaRef on_detach;
LuaRef on_reload;
LuaRefOf(("lines" _,
Integer bufnr,
Integer changedtick,
Integer first,
Integer last_old,
Integer last_new,
Integer byte_count,
Integer *deleted_codepoints,
Integer *deleted_codeunits), *Boolean) on_lines;
LuaRefOf(("bytes" _,
Integer bufnr,
Integer changedtick,
Integer start_row,
Integer start_col,
Integer start_byte,
Integer old_end_row,
Integer old_end_col,
Integer old_end_byte,
Integer new_end_row,
Integer new_end_col,
Integer new_end_byte), *Boolean) on_bytes;
LuaRefOf(("changedtick" _, Integer bufnr, Integer changedtick)) on_changedtick;
LuaRefOf(("detach" _, Integer bufnr)) on_detach;
LuaRefOf(("reload" _, Integer bufnr)) on_reload;
Boolean utf_sizes;
Boolean preview;
} Dict(buf_attach);
@@ -350,7 +370,7 @@ typedef struct {
typedef struct {
OptionalKeys is_set__open_term_;
LuaRef on_input;
LuaRefOf(("input" _, Integer term, Integer bufnr, any data)) on_input;
Boolean force_crlf;
} Dict(open_term);
@@ -361,12 +381,13 @@ typedef struct {
typedef struct {
OptionalKeys is_set__xdl_diff_;
LuaRef on_hunk;
LuaRefOf((Integer start_a, Integer count_a, Integer start_b, Integer count_b),
*Integer) on_hunk;
String result_type;
String algorithm;
Integer ctxlen;
Integer interhunkctxlen;
Object linematch;
Union(Boolean, Integer) linematch;
Boolean ignore_whitespace;
Boolean ignore_whitespace_change;
Boolean ignore_whitespace_change_at_eol;

View File

@@ -21,6 +21,8 @@
# define Dict(name) KeyDict_##name
# define DictHash(name) KeyDict_##name##_get_field
# define DictKey(name)
# define LuaRefOf(...) LuaRef
# define Union(...) Object
# include "api/private/defs.h.inline.generated.h"
#endif

View File

@@ -3,7 +3,7 @@ local lpeg = vim.lpeg
-- lpeg grammar for building api metadata from a set of header files. It
-- ignores comments and preprocessor commands and parses a very small subset
-- of C prototypes with a limited set of types
local P, R, S = lpeg.P, lpeg.R, lpeg.S
local P, R, S, V = lpeg.P, lpeg.R, lpeg.S, lpeg.V
local C, Ct, Cc, Cg = lpeg.C, lpeg.Ct, lpeg.Cc, lpeg.Cg
--- @param pat vim.lpeg.Pattern
@@ -35,9 +35,39 @@ local cdoc_comment = P('///') * opt(Ct(Cg(rep(space) * rep(not_nl), 'comment')))
local c_preproc = P('#') * rep(not_nl)
local dllexport = P('DLLEXPORT') * rep1(ws)
local typed_container = ((P('ArrayOf(') + P('DictOf(') + P('Dict(')) * rep1(any - P(')')) * P(')'))
--- @param x vim.lpeg.Pattern
local function comma1(x)
return x * rep(fill * P(',') * fill * x)
end
local c_id = (typed_container + (letter * rep(alpha)))
-- Define the grammar
local basic_id = letter * rep(alpha)
local str = P('"') * rep(any - P('"')) * P('"')
--- @param x vim.lpeg.Pattern
local function paren(x)
return P('(') * fill * x * fill * P(')')
end
-- stylua: ignore start
local typed_container = P({
'S',
ID = V('S') + basic_id,
S = (
(P('Union') * paren(comma1(V('ID'))))
+ (P('ArrayOf') * paren(basic_id * opt(P(',') * fill * rep1(num))))
+ (P('DictOf') * paren(basic_id))
+ (P('LuaRefOf') * paren(
paren(comma1((V('ID') + str) * rep1(ws) * opt(P('*')) * basic_id))
* opt(P(',') * fill * opt(P('*')) * V('ID'))
))
+ (P('Dict') * paren(basic_id))),
})
-- stylua: ignore end
local c_id = typed_container + basic_id
local c_void = P('void')
local c_param_type = (

View File

@@ -347,12 +347,16 @@ for _, k in ipairs(keysets) do
local function typename(type)
if type == 'HLGroupID' then
return 'kObjectTypeInteger'
elseif not type or vim.startswith(type, 'Union') then
return 'kObjectTypeNil'
elseif vim.startswith(type, 'LuaRefOf') then
return 'kObjectTypeLuaRef'
elseif type == 'StringArray' then
return 'kUnpackTypeStringArray'
elseif type ~= nil then
return 'kObjectType' .. type
elseif vim.startswith(type, 'ArrayOf') then
return 'kObjectTypeArray'
else
return 'kObjectTypeNil'
return 'kObjectType' .. type
end
end

View File

@@ -1075,10 +1075,10 @@ HlAttrs dict2hlattrs(Dict(highlight) *dict, bool use_rgb, int *link_id, Error *e
return hlattrs;
}
if (HAS_KEY_X(dict, global_link)) {
*link_id = object_to_hl_id(dict->global_link, "link", err);
*link_id = (int)dict->global_link;
mask |= HL_GLOBAL;
} else {
*link_id = object_to_hl_id(dict->link, "link", err);
*link_id = (int)dict->link;
}
if (ERROR_SET(err)) {