neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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()