diff --git a/Makefile b/Makefile index 27e1699907..a229237268 100644 --- a/Makefile +++ b/Makefile @@ -160,6 +160,7 @@ iwyu: build/.ran-cmake |src/nvim/ascii.h\ |src/nvim/assert.h\ |src/nvim/autocmd.h\ + |src/nvim/autocmd_defs.h\ |src/nvim/base64.h\ |src/nvim/buffer.h\ |src/nvim/buffer_defs.h\ diff --git a/cmake.config/iwyu/mapping.imp b/cmake.config/iwyu/mapping.imp index c56c9c0352..5f79addf04 100644 --- a/cmake.config/iwyu/mapping.imp +++ b/cmake.config/iwyu/mapping.imp @@ -171,8 +171,6 @@ # Generated to normal headers with a different name: header.h.generated.h -> nvim/some_other_header.h { include: [ '"api/private/dispatch_wrappers.h.generated.h"', private, '"nvim/api/private/dispatch.h"', public ] }, - { include: [ '"auevents_enum.generated.h"', private, '"nvim/autocmd.h"', public ] }, - { include: [ '"ex_cmds_enum.generated.h"', private, '"nvim/ex_cmds_defs.h"', public ] }, { include: [ '"keysets.h.generated.h"', private, '"nvim/api/private/helpers.h"', public ] }, { include: [ '"keysets_defs.generated.h"', private, '"nvim/api/private/defs.h"', public ] }, { include: [ '"os/env.h.generated.h"', private, '"nvim/os/os.h"', public ] }, diff --git a/src/clint.py b/src/clint.py index 6e4d419b38..293545199b 100755 --- a/src/clint.py +++ b/src/clint.py @@ -915,6 +915,7 @@ def CheckIncludes(filename, lines, error): "src/nvim/ascii.h", "src/nvim/assert.h", "src/nvim/autocmd.h", + "src/nvim/autocmd_defs.h", "src/nvim/base64.h", "src/nvim/buffer.h", "src/nvim/buffer_defs.h", diff --git a/src/nvim/autocmd.c b/src/nvim/autocmd.c index 80c9ad9465..1fd22f7060 100644 --- a/src/nvim/autocmd.c +++ b/src/nvim/autocmd.c @@ -1,10 +1,13 @@ // autocmd.c: Autocommand related functions #include +#include +#include #include #include #include +#include "klib/kvec.h" #include "nvim/api/private/helpers.h" #include "nvim/ascii.h" #include "nvim/autocmd.h" diff --git a/src/nvim/autocmd.h b/src/nvim/autocmd.h index 57e2e15fc3..52256a953f 100644 --- a/src/nvim/autocmd.h +++ b/src/nvim/autocmd.h @@ -1,77 +1,19 @@ #pragma once #include +#include #include -#include "nvim/api/private/defs.h" +#include "nvim/api/private/defs.h" // IWYU pragma: keep +#include "nvim/autocmd_defs.h" // IWYU pragma: export #include "nvim/buffer_defs.h" -#include "nvim/cmdexpand_defs.h" -#include "nvim/eval/typval_defs.h" -#include "nvim/ex_cmds_defs.h" +#include "nvim/cmdexpand_defs.h" // IWYU pragma: keep +#include "nvim/eval/typval_defs.h" // IWYU pragma: keep +#include "nvim/ex_cmds_defs.h" // IWYU pragma: keep #include "nvim/macros.h" -#include "nvim/regexp_defs.h" +#include "nvim/pos.h" #include "nvim/types.h" -struct AutoPatCmd_S; - -// event_T definition -#ifdef INCLUDE_GENERATED_DECLARATIONS -# include "auevents_enum.generated.h" -#endif - -// Struct to save values in before executing autocommands for a buffer that is -// not the current buffer. -typedef struct { - buf_T *save_curbuf; ///< saved curbuf - int use_aucmd_win_idx; ///< index in aucmd_win[] if >= 0 - handle_T save_curwin_handle; ///< ID of saved curwin - handle_T new_curwin_handle; ///< ID of new curwin - handle_T save_prevwin_handle; ///< ID of saved prevwin - bufref_T new_curbuf; ///< new curbuf - char *globaldir; ///< saved value of globaldir - bool save_VIsual_active; ///< saved VIsual_active - int save_State; ///< saved State -} aco_save_T; - -typedef struct { - size_t refcount; ///< Reference count (freed when reaches zero) - char *pat; ///< Pattern as typed - regprog_T *reg_prog; ///< Compiled regprog for pattern - int group; ///< Group ID - int patlen; ///< strlen() of pat - int buflocal_nr; ///< !=0 for buffer-local AutoPat - char allow_dirs; ///< Pattern may match whole path -} AutoPat; - -typedef struct { - AucmdExecutable exec; ///< Command or callback function - AutoPat *pat; ///< Pattern reference (NULL when autocmd was removed) - int64_t id; ///< ID used for uniquely tracking an autocmd - char *desc; ///< Description for the autocmd - sctx_T script_ctx; ///< Script context where it is defined - bool once; ///< "One shot": removed after execution - bool nested; ///< If autocommands nest here -} AutoCmd; - -/// Struct used to keep status while executing autocommands for an event. -typedef struct AutoPatCmd_S AutoPatCmd; -struct AutoPatCmd_S { - AutoPat *lastpat; ///< Last matched AutoPat - size_t auidx; ///< Current autocmd index to execute - size_t ausize; ///< Saved AutoCmd vector size - char *fname; ///< Fname to match with - char *sfname; ///< Sfname to match with - char *tail; ///< Tail of fname - int group; ///< Group being used - event_T event; ///< Current event - sctx_T script_ctx; ///< Script context where it is defined - int arg_bufnr; ///< Initially equal to , set to zero when buf is deleted - Object *data; ///< Arbitrary data - AutoPatCmd *next; ///< Chain of active apc-s for auto-invalidation -}; - -typedef kvec_t(AutoCmd) AutoCmdVec; - // Set by the apply_autocmds_group function if the given event is equal to // EVENT_FILETYPE. Used by the readfile function in order to determine if // EVENT_BUFREADPOST triggered the EVENT_FILETYPE. diff --git a/src/nvim/autocmd_defs.h b/src/nvim/autocmd_defs.h new file mode 100644 index 0000000000..2979c49b67 --- /dev/null +++ b/src/nvim/autocmd_defs.h @@ -0,0 +1,71 @@ +#pragma once + +#include +#include +#include + +#include "klib/kvec.h" +#include "nvim/api/private/defs.h" +#include "nvim/buffer_defs.h" +#include "nvim/eval/typval_defs.h" +#include "nvim/ex_cmds_defs.h" +#include "nvim/regexp_defs.h" +#include "nvim/types.h" + +// event_T definition +#ifdef INCLUDE_GENERATED_DECLARATIONS +# include "auevents_enum.generated.h" +#endif + +/// Struct to save values in before executing autocommands for a buffer that is +/// not the current buffer. +typedef struct { + buf_T *save_curbuf; ///< saved curbuf + int use_aucmd_win_idx; ///< index in aucmd_win[] if >= 0 + handle_T save_curwin_handle; ///< ID of saved curwin + handle_T new_curwin_handle; ///< ID of new curwin + handle_T save_prevwin_handle; ///< ID of saved prevwin + bufref_T new_curbuf; ///< new curbuf + char *globaldir; ///< saved value of globaldir + bool save_VIsual_active; ///< saved VIsual_active + int save_State; ///< saved State +} aco_save_T; + +typedef struct { + size_t refcount; ///< Reference count (freed when reaches zero) + char *pat; ///< Pattern as typed + regprog_T *reg_prog; ///< Compiled regprog for pattern + int group; ///< Group ID + int patlen; ///< strlen() of pat + int buflocal_nr; ///< !=0 for buffer-local AutoPat + char allow_dirs; ///< Pattern may match whole path +} AutoPat; + +typedef struct { + AucmdExecutable exec; ///< Command or callback function + AutoPat *pat; ///< Pattern reference (NULL when autocmd was removed) + int64_t id; ///< ID used for uniquely tracking an autocmd + char *desc; ///< Description for the autocmd + sctx_T script_ctx; ///< Script context where it is defined + bool once; ///< "One shot": removed after execution + bool nested; ///< If autocommands nest here +} AutoCmd; + +/// Struct used to keep status while executing autocommands for an event. +typedef struct AutoPatCmd_S AutoPatCmd; +struct AutoPatCmd_S { + AutoPat *lastpat; ///< Last matched AutoPat + size_t auidx; ///< Current autocmd index to execute + size_t ausize; ///< Saved AutoCmd vector size + char *fname; ///< Fname to match with + char *sfname; ///< Sfname to match with + char *tail; ///< Tail of fname + int group; ///< Group being used + event_T event; ///< Current event + sctx_T script_ctx; ///< Script context where it is defined + int arg_bufnr; ///< Initially equal to , set to zero when buf is deleted + Object *data; ///< Arbitrary data + AutoPatCmd *next; ///< Chain of active apc-s for auto-invalidation +}; + +typedef kvec_t(AutoCmd) AutoCmdVec; diff --git a/src/nvim/edit.h b/src/nvim/edit.h index e64e45bec1..c50b3bb0fb 100644 --- a/src/nvim/edit.h +++ b/src/nvim/edit.h @@ -1,6 +1,6 @@ #pragma once -#include "nvim/autocmd.h" +#include "nvim/autocmd_defs.h" #include "nvim/vim.h" // Values for in_cinkeys() diff --git a/src/nvim/generators/gen_events.lua b/src/nvim/generators/gen_events.lua index 0eb231f012..4763a2f463 100644 --- a/src/nvim/generators/gen_events.lua +++ b/src/nvim/generators/gen_events.lua @@ -8,7 +8,10 @@ local aliases = auevents.aliases local enum_tgt = io.open(fileio_enum_file, 'w') local names_tgt = io.open(names_file, 'w') -enum_tgt:write('typedef enum auto_event {') +enum_tgt:write([[ +// IWYU pragma: private, include "nvim/autocmd_defs.h" + +typedef enum auto_event {]]) names_tgt:write([[ static const struct event_name { size_t len; diff --git a/src/nvim/generators/gen_ex_cmds.lua b/src/nvim/generators/gen_ex_cmds.lua index 61767583ec..ae8c952648 100644 --- a/src/nvim/generators/gen_ex_cmds.lua +++ b/src/nvim/generators/gen_ex_cmds.lua @@ -34,6 +34,8 @@ static const uint8_t cmdidxs2[%u][%u] = { ]], a_to_z, a_to_z) enumfile:write([[ +// IWYU pragma: private, include "nvim/ex_cmds_defs.h" + typedef enum CMD_index { ]]) defsfile:write(string.format([[ diff --git a/src/nvim/runtime.h b/src/nvim/runtime.h index 6f77f7fcd4..f4b8897c3e 100644 --- a/src/nvim/runtime.h +++ b/src/nvim/runtime.h @@ -3,7 +3,7 @@ #include #include "klib/kvec.h" -#include "nvim/autocmd.h" +#include "nvim/autocmd_defs.h" #include "nvim/cmdexpand_defs.h" #include "nvim/eval/typval_defs.h" #include "nvim/ex_cmds_defs.h"