diff options
author | bfredl <bjorn.linse@gmail.com> | 2024-02-26 18:00:46 +0100 |
---|---|---|
committer | bfredl <bjorn.linse@gmail.com> | 2024-02-28 11:00:38 +0100 |
commit | de5cf09cf98e20d8d3296ad6933ff2741acf83f7 (patch) | |
tree | 138b11577f1896643fb593481a41c9b841be6362 /src/nvim/api/private/helpers.c | |
parent | 07b4b7524fc7faefb69e5c94d2512eb0807f0593 (diff) | |
download | rneovim-de5cf09cf98e20d8d3296ad6933ff2741acf83f7.tar.gz rneovim-de5cf09cf98e20d8d3296ad6933ff2741acf83f7.tar.bz2 rneovim-de5cf09cf98e20d8d3296ad6933ff2741acf83f7.zip |
refactor(metadata): generate all metadata in lua
Then we can just load metadata in C as a single msgpack blob. Which also
can be used directly as binarly data, instead of first unpacking all the
functions and ui_events metadata to immediately pack it again, which was
a bit of a silly walk (and one extra usecase of `msgpack_rpc_from_object`
which will get yak shaved in the next PR)
Diffstat (limited to 'src/nvim/api/private/helpers.c')
-rw-r--r-- | src/nvim/api/private/helpers.c | 74 |
1 files changed, 8 insertions, 66 deletions
diff --git a/src/nvim/api/private/helpers.c b/src/nvim/api/private/helpers.c index 14f4046a56..97ba15e871 100644 --- a/src/nvim/api/private/helpers.c +++ b/src/nvim/api/private/helpers.c @@ -38,9 +38,8 @@ #include "nvim/version.h" #ifdef INCLUDE_GENERATED_DECLARATIONS -# include "api/private/funcs_metadata.generated.h" +# include "api/private/api_metadata.generated.h" # include "api/private/helpers.c.generated.h" -# include "api/private/ui_events_metadata.generated.h" #endif /// Start block that may cause Vimscript exceptions while evaluating another code @@ -653,83 +652,26 @@ void api_clear_error(Error *value) static ArenaMem mem_for_metadata = NULL; /// @returns a shared value. caller must not modify it! -Dictionary api_metadata(void) +Object api_metadata(void) { - static Dictionary metadata = ARRAY_DICT_INIT; + static Object metadata = OBJECT_INIT; - if (!metadata.size) { + if (metadata.type == kObjectTypeNil) { Arena arena = ARENA_EMPTY; Error err = ERROR_INIT; - metadata = arena_dict(&arena, 6); - PUT_C(metadata, "version", DICTIONARY_OBJ(version_dict(&arena))); - PUT_C(metadata, "functions", - unpack((char *)funcs_metadata, sizeof(funcs_metadata), &arena, &err)); - if (ERROR_SET(&err)) { + metadata = unpack((char *)packed_api_metadata, sizeof(packed_api_metadata), &arena, &err); + if (ERROR_SET(&err) || metadata.type != kObjectTypeDictionary) { abort(); } - PUT_C(metadata, "ui_events", - unpack((char *)ui_events_metadata, sizeof(ui_events_metadata), &arena, &err)); - if (ERROR_SET(&err)) { - abort(); - } - PUT_C(metadata, "ui_options", ARRAY_OBJ(ui_options_metadata(&arena))); - PUT_C(metadata, "error_types", DICTIONARY_OBJ(error_type_metadata(&arena))); - PUT_C(metadata, "types", DICTIONARY_OBJ(type_metadata(&arena))); mem_for_metadata = arena_finish(&arena); } return metadata; } -static Array ui_options_metadata(Arena *arena) -{ - Array ui_options = arena_array(arena, kUIExtCount + 1); - ADD_C(ui_options, CSTR_AS_OBJ("rgb")); - for (UIExtension i = 0; i < kUIExtCount; i++) { - if (ui_ext_names[i][0] != '_') { - ADD_C(ui_options, CSTR_AS_OBJ(ui_ext_names[i])); - } - } - return ui_options; -} - -static Dictionary error_type_metadata(Arena *arena) +String api_metadata_raw(void) { - Dictionary types = arena_dict(arena, 2); - - Dictionary exception_metadata = arena_dict(arena, 1); - PUT_C(exception_metadata, "id", INTEGER_OBJ(kErrorTypeException)); - - Dictionary validation_metadata = arena_dict(arena, 1); - PUT_C(validation_metadata, "id", INTEGER_OBJ(kErrorTypeValidation)); - - PUT_C(types, "Exception", DICTIONARY_OBJ(exception_metadata)); - PUT_C(types, "Validation", DICTIONARY_OBJ(validation_metadata)); - - return types; -} - -static Dictionary type_metadata(Arena *arena) -{ - Dictionary types = arena_dict(arena, 3); - - Dictionary buffer_metadata = arena_dict(arena, 2); - PUT_C(buffer_metadata, "id", INTEGER_OBJ(kObjectTypeBuffer - EXT_OBJECT_TYPE_SHIFT)); - PUT_C(buffer_metadata, "prefix", CSTR_AS_OBJ("nvim_buf_")); - - Dictionary window_metadata = arena_dict(arena, 2); - PUT_C(window_metadata, "id", INTEGER_OBJ(kObjectTypeWindow - EXT_OBJECT_TYPE_SHIFT)); - PUT_C(window_metadata, "prefix", CSTR_AS_OBJ("nvim_win_")); - - Dictionary tabpage_metadata = arena_dict(arena, 2); - PUT_C(tabpage_metadata, "id", INTEGER_OBJ(kObjectTypeTabpage - EXT_OBJECT_TYPE_SHIFT)); - PUT_C(tabpage_metadata, "prefix", CSTR_AS_OBJ("nvim_tabpage_")); - - PUT_C(types, "Buffer", DICTIONARY_OBJ(buffer_metadata)); - PUT_C(types, "Window", DICTIONARY_OBJ(window_metadata)); - PUT_C(types, "Tabpage", DICTIONARY_OBJ(tabpage_metadata)); - - return types; + return cbuf_as_string((char *)packed_api_metadata, sizeof(packed_api_metadata)); } // all the copy_[object] functions allow arena=NULL, |