gen_events.lua (1892B)
1 local fileio_enum_file = arg[1] 2 local names_file = arg[2] 3 local auevents_file = arg[3] 4 5 local hashy = require('gen.hashy') 6 local auevents = loadfile(auevents_file)() 7 local events = auevents.events 8 local aliases = auevents.aliases 9 10 --- @type string[] 11 local names = vim.tbl_keys(vim.tbl_extend('error', events, aliases)) 12 table.sort(names, function(a, b) 13 return a:lower() < b:lower() 14 end) 15 16 local enum_tgt = assert(io.open(fileio_enum_file, 'w')) 17 local names_tgt = assert(io.open(names_file, 'w')) 18 19 enum_tgt:write([[ 20 // IWYU pragma: private, include "nvim/autocmd_defs.h" 21 22 typedef enum auto_event {]]) 23 names_tgt:write([[ 24 static const struct event_name { 25 size_t len; 26 char *name; 27 int event; 28 } event_names[NUM_EVENTS] = {]]) 29 30 for i, name in ipairs(names) do 31 enum_tgt:write(('\n EVENT_%s = %u,'):format(name:upper(), i - 1)) 32 local pref_name = aliases[name] ~= nil and aliases[name] or name 33 local win_local = events[pref_name] 34 assert(win_local ~= nil) 35 -- Events with positive keys aren't allowed in 'eventignorewin'. 36 names_tgt:write( 37 ('\n [EVENT_%s] = {%u, "%s", %sEVENT_%s},'):format( 38 name:upper(), 39 #name, 40 name, 41 win_local and '-' or '', 42 pref_name:upper() 43 ) 44 ) 45 end 46 47 enum_tgt:write(('\n NUM_EVENTS = %u,'):format(#names)) 48 enum_tgt:write('\n} event_T;\n') 49 enum_tgt:close() 50 51 names_tgt:write('\n};\n') 52 names_tgt:write('\nstatic AutoCmdVec autocmds[NUM_EVENTS] = { 0 };\n') 53 54 local hashorder = vim.tbl_map(string.lower, names) 55 local hashfun 56 hashorder, hashfun = hashy.hashy_hash('event_name2nr', hashorder, function(idx) 57 return 'event_names[event_hash[' .. idx .. ']].name' 58 end, true) 59 60 names_tgt:write([[ 61 62 static const event_T event_hash[] = {]]) 63 64 for _, lower_name in ipairs(hashorder) do 65 names_tgt:write(('\n EVENT_%s,'):format(lower_name:upper())) 66 end 67 68 names_tgt:write('\n};\n\n') 69 names_tgt:write('static ' .. hashfun) 70 names_tgt:close()